sqlqueries.go 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095
  1. // Copyright (C) 2019-2023 Nicola Murino
  2. //
  3. // This program is free software: you can redistribute it and/or modify
  4. // it under the terms of the GNU Affero General Public License as published
  5. // by the Free Software Foundation, version 3.
  6. //
  7. // This program is distributed in the hope that it will be useful,
  8. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. // GNU Affero General Public License for more details.
  11. //
  12. // You should have received a copy of the GNU Affero General Public License
  13. // along with this program. If not, see <https://www.gnu.org/licenses/>.
  14. package dataprovider
  15. import (
  16. "fmt"
  17. "strconv"
  18. "strings"
  19. "github.com/drakkan/sftpgo/v2/internal/vfs"
  20. )
  21. const (
  22. selectUserFields = "u.id,u.username,u.password,u.public_keys,u.home_dir,u.uid,u.gid,u.max_sessions,u.quota_size,u.quota_files," +
  23. "u.permissions,u.used_quota_size,u.used_quota_files,u.last_quota_update,u.upload_bandwidth,u.download_bandwidth," +
  24. "u.expiration_date,u.last_login,u.status,u.filters,u.filesystem,u.additional_info,u.description,u.email,u.created_at," +
  25. "u.updated_at,u.upload_data_transfer,u.download_data_transfer,u.total_data_transfer," +
  26. "u.used_upload_data_transfer,u.used_download_data_transfer,u.deleted_at,u.first_download,u.first_upload,r.name,u.last_password_change"
  27. selectFolderFields = "id,path,used_quota_size,used_quota_files,last_quota_update,name,description,filesystem"
  28. selectAdminFields = "a.id,a.username,a.password,a.status,a.email,a.permissions,a.filters,a.additional_info,a.description,a.created_at,a.updated_at,a.last_login,r.name"
  29. selectAPIKeyFields = "key_id,name,api_key,scope,created_at,updated_at,last_use_at,expires_at,description,user_id,admin_id"
  30. selectShareFields = "s.share_id,s.name,s.description,s.scope,s.paths,u.username,s.created_at,s.updated_at,s.last_use_at," +
  31. "s.expires_at,s.password,s.max_tokens,s.used_tokens,s.allow_from"
  32. selectGroupFields = "id,name,description,created_at,updated_at,user_settings"
  33. selectEventActionFields = "id,name,description,type,options"
  34. selectRoleFields = "id,name,description,created_at,updated_at"
  35. selectMinimalFields = "id,name"
  36. )
  37. func getSQLPlaceholders() []string {
  38. var placeholders []string
  39. for i := 1; i <= 50; i++ {
  40. if config.Driver == PGSQLDataProviderName || config.Driver == CockroachDataProviderName {
  41. placeholders = append(placeholders, fmt.Sprintf("$%d", i))
  42. } else {
  43. placeholders = append(placeholders, "?")
  44. }
  45. }
  46. return placeholders
  47. }
  48. func getSQLQuotedName(name string) string {
  49. if config.Driver == MySQLDataProviderName {
  50. return fmt.Sprintf("`%s`", name)
  51. }
  52. return fmt.Sprintf(`"%s"`, name)
  53. }
  54. func getSelectEventRuleFields() string {
  55. if config.Driver == MySQLDataProviderName {
  56. return "id,name,description,created_at,updated_at,`trigger`,conditions,deleted_at"
  57. }
  58. return `id,name,description,created_at,updated_at,"trigger",conditions,deleted_at`
  59. }
  60. func getCoalesceDefaultForRole(role string) string {
  61. if role != "" {
  62. return "0"
  63. }
  64. return "NULL"
  65. }
  66. func getAddSessionQuery() string {
  67. if config.Driver == MySQLDataProviderName {
  68. return fmt.Sprintf("INSERT INTO %s (`key`,`data`,`type`,`timestamp`) VALUES (%s,%s,%s,%s) "+
  69. "ON DUPLICATE KEY UPDATE `data`=VALUES(`data`), `timestamp`=VALUES(`timestamp`)",
  70. sqlTableSharedSessions, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  71. }
  72. return fmt.Sprintf(`INSERT INTO %s (key,data,type,timestamp) VALUES (%s,%s,%s,%s) ON CONFLICT(key) DO UPDATE SET data=
  73. EXCLUDED.data, timestamp=EXCLUDED.timestamp`,
  74. sqlTableSharedSessions, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  75. }
  76. func getDeleteSessionQuery() string {
  77. if config.Driver == MySQLDataProviderName {
  78. return fmt.Sprintf("DELETE FROM %s WHERE `key` = %s", sqlTableSharedSessions, sqlPlaceholders[0])
  79. }
  80. return fmt.Sprintf(`DELETE FROM %s WHERE key = %s`, sqlTableSharedSessions, sqlPlaceholders[0])
  81. }
  82. func getSessionQuery() string {
  83. if config.Driver == MySQLDataProviderName {
  84. return fmt.Sprintf("SELECT `key`,`data`,`type`,`timestamp` FROM %s WHERE `key` = %s", sqlTableSharedSessions,
  85. sqlPlaceholders[0])
  86. }
  87. return fmt.Sprintf(`SELECT key,data,type,timestamp FROM %s WHERE key = %s`, sqlTableSharedSessions,
  88. sqlPlaceholders[0])
  89. }
  90. func getCleanupSessionsQuery() string {
  91. return fmt.Sprintf(`DELETE from %s WHERE type = %s AND timestamp < %s`,
  92. sqlTableSharedSessions, sqlPlaceholders[0], sqlPlaceholders[1])
  93. }
  94. func getAddDefenderHostQuery() string {
  95. if config.Driver == MySQLDataProviderName {
  96. return fmt.Sprintf("INSERT INTO %s (`ip`,`updated_at`,`ban_time`) VALUES (%s,%s,0) ON DUPLICATE KEY UPDATE `updated_at`=VALUES(`updated_at`)",
  97. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  98. }
  99. return fmt.Sprintf(`INSERT INTO %s (ip,updated_at,ban_time) VALUES (%s,%s,0) ON CONFLICT (ip) DO UPDATE SET updated_at = EXCLUDED.updated_at RETURNING id`,
  100. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  101. }
  102. func getAddDefenderEventQuery() string {
  103. return fmt.Sprintf(`INSERT INTO %s (date_time,score,host_id) VALUES (%s,%s,(SELECT id from %s WHERE ip = %s))`,
  104. sqlTableDefenderEvents, sqlPlaceholders[0], sqlPlaceholders[1], sqlTableDefenderHosts, sqlPlaceholders[2])
  105. }
  106. func getDefenderHostsQuery() string {
  107. return fmt.Sprintf(`SELECT id,ip,ban_time FROM %s WHERE updated_at >= %s OR ban_time > 0 ORDER BY updated_at DESC LIMIT %s`,
  108. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  109. }
  110. func getDefenderHostQuery() string {
  111. return fmt.Sprintf(`SELECT id,ip,ban_time FROM %s WHERE ip = %s AND (updated_at >= %s OR ban_time > 0)`,
  112. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  113. }
  114. func getDefenderEventsQuery(hostIDS []int64) string {
  115. var sb strings.Builder
  116. for _, hID := range hostIDS {
  117. if sb.Len() == 0 {
  118. sb.WriteString("(")
  119. } else {
  120. sb.WriteString(",")
  121. }
  122. sb.WriteString(strconv.FormatInt(hID, 10))
  123. }
  124. if sb.Len() > 0 {
  125. sb.WriteString(")")
  126. } else {
  127. sb.WriteString("(0)")
  128. }
  129. return fmt.Sprintf(`SELECT host_id,SUM(score) FROM %s WHERE date_time >= %s AND host_id IN %s GROUP BY host_id`,
  130. sqlTableDefenderEvents, sqlPlaceholders[0], sb.String())
  131. }
  132. func getDefenderIsHostBannedQuery() string {
  133. return fmt.Sprintf(`SELECT id FROM %s WHERE ip = %s AND ban_time >= %s`,
  134. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  135. }
  136. func getDefenderIncrementBanTimeQuery() string {
  137. return fmt.Sprintf(`UPDATE %s SET ban_time = ban_time + %s WHERE ip = %s`,
  138. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  139. }
  140. func getDefenderSetBanTimeQuery() string {
  141. return fmt.Sprintf(`UPDATE %s SET ban_time = %s WHERE ip = %s`,
  142. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  143. }
  144. func getDeleteDefenderHostQuery() string {
  145. return fmt.Sprintf(`DELETE FROM %s WHERE ip = %s`, sqlTableDefenderHosts, sqlPlaceholders[0])
  146. }
  147. func getDefenderHostsCleanupQuery() string {
  148. return fmt.Sprintf(`DELETE FROM %s WHERE ban_time < %s AND NOT EXISTS (
  149. SELECT id FROM %s WHERE %s.host_id = %s.id AND %s.date_time > %s)`,
  150. sqlTableDefenderHosts, sqlPlaceholders[0], sqlTableDefenderEvents, sqlTableDefenderEvents, sqlTableDefenderHosts,
  151. sqlTableDefenderEvents, sqlPlaceholders[1])
  152. }
  153. func getDefenderEventsCleanupQuery() string {
  154. return fmt.Sprintf(`DELETE FROM %s WHERE date_time < %s`, sqlTableDefenderEvents, sqlPlaceholders[0])
  155. }
  156. func getRoleByNameQuery() string {
  157. return fmt.Sprintf(`SELECT %s FROM %s WHERE name = %s`, selectRoleFields, sqlTableRoles,
  158. sqlPlaceholders[0])
  159. }
  160. func getRolesQuery(order string, minimal bool) string {
  161. var fieldSelection string
  162. if minimal {
  163. fieldSelection = selectMinimalFields
  164. } else {
  165. fieldSelection = selectRoleFields
  166. }
  167. return fmt.Sprintf(`SELECT %s FROM %s ORDER BY name %s LIMIT %s OFFSET %s`, fieldSelection,
  168. sqlTableRoles, order, sqlPlaceholders[0], sqlPlaceholders[1])
  169. }
  170. func getUsersWithRolesQuery(roles []Role) string {
  171. var sb strings.Builder
  172. for _, r := range roles {
  173. if sb.Len() == 0 {
  174. sb.WriteString("(")
  175. } else {
  176. sb.WriteString(",")
  177. }
  178. sb.WriteString(strconv.FormatInt(r.ID, 10))
  179. }
  180. if sb.Len() > 0 {
  181. sb.WriteString(")")
  182. }
  183. return fmt.Sprintf(`SELECT r.id, u.username FROM %s u INNER JOIN %s r ON u.role_id = r.id WHERE u.role_id IN %s`,
  184. sqlTableUsers, sqlTableRoles, sb.String())
  185. }
  186. func getAdminsWithRolesQuery(roles []Role) string {
  187. var sb strings.Builder
  188. for _, r := range roles {
  189. if sb.Len() == 0 {
  190. sb.WriteString("(")
  191. } else {
  192. sb.WriteString(",")
  193. }
  194. sb.WriteString(strconv.FormatInt(r.ID, 10))
  195. }
  196. if sb.Len() > 0 {
  197. sb.WriteString(")")
  198. }
  199. return fmt.Sprintf(`SELECT r.id, a.username FROM %s a INNER JOIN %s r ON a.role_id = r.id WHERE a.role_id IN %s`,
  200. sqlTableAdmins, sqlTableRoles, sb.String())
  201. }
  202. func getDumpRolesQuery() string {
  203. return fmt.Sprintf(`SELECT %s FROM %s`, selectRoleFields, sqlTableRoles)
  204. }
  205. func getAddRoleQuery() string {
  206. return fmt.Sprintf(`INSERT INTO %s (name,description,created_at,updated_at)
  207. VALUES (%s,%s,%s,%s)`, sqlTableRoles, sqlPlaceholders[0], sqlPlaceholders[1],
  208. sqlPlaceholders[2], sqlPlaceholders[3])
  209. }
  210. func getUpdateRoleQuery() string {
  211. return fmt.Sprintf(`UPDATE %s SET description=%s,updated_at=%s
  212. WHERE name = %s`, sqlTableRoles, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2])
  213. }
  214. func getDeleteRoleQuery() string {
  215. return fmt.Sprintf(`DELETE FROM %s WHERE name = %s`, sqlTableRoles, sqlPlaceholders[0])
  216. }
  217. func getGroupByNameQuery() string {
  218. return fmt.Sprintf(`SELECT %s FROM %s WHERE name = %s`, selectGroupFields, getSQLQuotedName(sqlTableGroups),
  219. sqlPlaceholders[0])
  220. }
  221. func getGroupsQuery(order string, minimal bool) string {
  222. var fieldSelection string
  223. if minimal {
  224. fieldSelection = selectMinimalFields
  225. } else {
  226. fieldSelection = selectGroupFields
  227. }
  228. return fmt.Sprintf(`SELECT %s FROM %s ORDER BY name %s LIMIT %s OFFSET %s`, fieldSelection,
  229. getSQLQuotedName(sqlTableGroups), order, sqlPlaceholders[0], sqlPlaceholders[1])
  230. }
  231. func getGroupsWithNamesQuery(numArgs int) string {
  232. var sb strings.Builder
  233. for idx := 0; idx < numArgs; idx++ {
  234. if sb.Len() == 0 {
  235. sb.WriteString("(")
  236. } else {
  237. sb.WriteString(",")
  238. }
  239. sb.WriteString(sqlPlaceholders[idx])
  240. }
  241. if sb.Len() > 0 {
  242. sb.WriteString(")")
  243. } else {
  244. sb.WriteString("('')")
  245. }
  246. return fmt.Sprintf(`SELECT %s FROM %s WHERE name in %s`, selectGroupFields, getSQLQuotedName(sqlTableGroups), sb.String())
  247. }
  248. func getUsersInGroupsQuery(numArgs int) string {
  249. var sb strings.Builder
  250. for idx := 0; idx < numArgs; idx++ {
  251. if sb.Len() == 0 {
  252. sb.WriteString("(")
  253. } else {
  254. sb.WriteString(",")
  255. }
  256. sb.WriteString(sqlPlaceholders[idx])
  257. }
  258. if sb.Len() > 0 {
  259. sb.WriteString(")")
  260. } else {
  261. sb.WriteString("('')")
  262. }
  263. return fmt.Sprintf(`SELECT username FROM %s WHERE id IN (SELECT user_id from %s WHERE group_id IN (SELECT id FROM %s WHERE name IN (%s)))`,
  264. sqlTableUsers, sqlTableUsersGroupsMapping, getSQLQuotedName(sqlTableGroups), sb.String())
  265. }
  266. func getDumpGroupsQuery() string {
  267. return fmt.Sprintf(`SELECT %s FROM %s`, selectGroupFields, getSQLQuotedName(sqlTableGroups))
  268. }
  269. func getAddGroupQuery() string {
  270. return fmt.Sprintf(`INSERT INTO %s (name,description,created_at,updated_at,user_settings)
  271. VALUES (%s,%s,%s,%s,%s)`, getSQLQuotedName(sqlTableGroups), sqlPlaceholders[0], sqlPlaceholders[1],
  272. sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4])
  273. }
  274. func getUpdateGroupQuery() string {
  275. return fmt.Sprintf(`UPDATE %s SET description=%s,user_settings=%s,updated_at=%s
  276. WHERE name = %s`, getSQLQuotedName(sqlTableGroups), sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2],
  277. sqlPlaceholders[3])
  278. }
  279. func getDeleteGroupQuery() string {
  280. return fmt.Sprintf(`DELETE FROM %s WHERE name = %s`, getSQLQuotedName(sqlTableGroups), sqlPlaceholders[0])
  281. }
  282. func getAdminByUsernameQuery() string {
  283. return fmt.Sprintf(`SELECT %s FROM %s a LEFT JOIN %s r on r.id = a.role_id WHERE a.username = %s`,
  284. selectAdminFields, sqlTableAdmins, sqlTableRoles, sqlPlaceholders[0])
  285. }
  286. func getAdminsQuery(order string) string {
  287. return fmt.Sprintf(`SELECT %s FROM %s a LEFT JOIN %s r on r.id = a.role_id ORDER BY a.username %s LIMIT %s OFFSET %s`,
  288. selectAdminFields, sqlTableAdmins, sqlTableRoles, order, sqlPlaceholders[0], sqlPlaceholders[1])
  289. }
  290. func getDumpAdminsQuery() string {
  291. return fmt.Sprintf(`SELECT %s FROM %s a LEFT JOIN %s r on r.id = a.role_id`,
  292. selectAdminFields, sqlTableAdmins, sqlTableRoles)
  293. }
  294. func getAddAdminQuery(role string) string {
  295. return fmt.Sprintf(`INSERT INTO %s (username,password,status,email,permissions,filters,additional_info,description,created_at,updated_at,last_login,role_id)
  296. VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,0,COALESCE((SELECT id from %s WHERE name = %s),%s))`,
  297. sqlTableAdmins, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  298. sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9],
  299. sqlTableRoles, sqlPlaceholders[10], getCoalesceDefaultForRole(role))
  300. }
  301. func getUpdateAdminQuery(role string) string {
  302. return fmt.Sprintf(`UPDATE %s SET password=%s,status=%s,email=%s,permissions=%s,filters=%s,additional_info=%s,description=%s,updated_at=%s,
  303. role_id=COALESCE((SELECT id from %s WHERE name = %s),%s) WHERE username = %s`, sqlTableAdmins, sqlPlaceholders[0],
  304. sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6],
  305. sqlPlaceholders[7], sqlTableRoles, sqlPlaceholders[8], getCoalesceDefaultForRole(role), sqlPlaceholders[9])
  306. }
  307. func getDeleteAdminQuery() string {
  308. return fmt.Sprintf(`DELETE FROM %s WHERE username = %s`, sqlTableAdmins, sqlPlaceholders[0])
  309. }
  310. func getShareByIDQuery(filterUser bool) string {
  311. if filterUser {
  312. return fmt.Sprintf(`SELECT %s FROM %s s INNER JOIN %s u ON s.user_id = u.id WHERE s.share_id = %s AND u.username = %s`,
  313. selectShareFields, sqlTableShares, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1])
  314. }
  315. return fmt.Sprintf(`SELECT %s FROM %s s INNER JOIN %s u ON s.user_id = u.id WHERE s.share_id = %s`,
  316. selectShareFields, sqlTableShares, sqlTableUsers, sqlPlaceholders[0])
  317. }
  318. func getSharesQuery(order string) string {
  319. return fmt.Sprintf(`SELECT %s FROM %s s INNER JOIN %s u ON s.user_id = u.id WHERE u.username = %s ORDER BY s.share_id %s LIMIT %s OFFSET %s`,
  320. selectShareFields, sqlTableShares, sqlTableUsers, sqlPlaceholders[0], order, sqlPlaceholders[1], sqlPlaceholders[2])
  321. }
  322. func getDumpSharesQuery() string {
  323. return fmt.Sprintf(`SELECT %s FROM %s s INNER JOIN %s u ON s.user_id = u.id`,
  324. selectShareFields, sqlTableShares, sqlTableUsers)
  325. }
  326. func getAddShareQuery() string {
  327. return fmt.Sprintf(`INSERT INTO %s (share_id,name,description,scope,paths,created_at,updated_at,last_use_at,
  328. expires_at,password,max_tokens,used_tokens,allow_from,user_id) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)`,
  329. sqlTableShares, sqlPlaceholders[0], sqlPlaceholders[1],
  330. sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6],
  331. sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9], sqlPlaceholders[10], sqlPlaceholders[11],
  332. sqlPlaceholders[12], sqlPlaceholders[13])
  333. }
  334. func getUpdateShareRestoreQuery() string {
  335. return fmt.Sprintf(`UPDATE %s SET name=%s,description=%s,scope=%s,paths=%s,created_at=%s,updated_at=%s,
  336. last_use_at=%s,expires_at=%s,password=%s,max_tokens=%s,used_tokens=%s,allow_from=%s,user_id=%s WHERE share_id = %s`, sqlTableShares,
  337. sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  338. sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9],
  339. sqlPlaceholders[10], sqlPlaceholders[11], sqlPlaceholders[12], sqlPlaceholders[13])
  340. }
  341. func getUpdateShareQuery() string {
  342. return fmt.Sprintf(`UPDATE %s SET name=%s,description=%s,scope=%s,paths=%s,updated_at=%s,expires_at=%s,
  343. password=%s,max_tokens=%s,allow_from=%s,user_id=%s WHERE share_id = %s`, sqlTableShares,
  344. sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  345. sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9],
  346. sqlPlaceholders[10])
  347. }
  348. func getDeleteShareQuery() string {
  349. return fmt.Sprintf(`DELETE FROM %s WHERE share_id = %s`, sqlTableShares, sqlPlaceholders[0])
  350. }
  351. func getAPIKeyByIDQuery() string {
  352. return fmt.Sprintf(`SELECT %s FROM %s WHERE key_id = %s`, selectAPIKeyFields, sqlTableAPIKeys, sqlPlaceholders[0])
  353. }
  354. func getAPIKeysQuery(order string) string {
  355. return fmt.Sprintf(`SELECT %s FROM %s ORDER BY key_id %s LIMIT %s OFFSET %s`, selectAPIKeyFields, sqlTableAPIKeys,
  356. order, sqlPlaceholders[0], sqlPlaceholders[1])
  357. }
  358. func getDumpAPIKeysQuery() string {
  359. return fmt.Sprintf(`SELECT %s FROM %s`, selectAPIKeyFields, sqlTableAPIKeys)
  360. }
  361. func getAddAPIKeyQuery() string {
  362. return fmt.Sprintf(`INSERT INTO %s (key_id,name,api_key,scope,created_at,updated_at,last_use_at,expires_at,description,user_id,admin_id)
  363. VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)`, sqlTableAPIKeys, sqlPlaceholders[0], sqlPlaceholders[1],
  364. sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6],
  365. sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9], sqlPlaceholders[10])
  366. }
  367. func getUpdateAPIKeyQuery() string {
  368. return fmt.Sprintf(`UPDATE %s SET name=%s,scope=%s,expires_at=%s,user_id=%s,admin_id=%s,description=%s,updated_at=%s
  369. WHERE key_id = %s`, sqlTableAPIKeys, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2],
  370. sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7])
  371. }
  372. func getDeleteAPIKeyQuery() string {
  373. return fmt.Sprintf(`DELETE FROM %s WHERE key_id = %s`, sqlTableAPIKeys, sqlPlaceholders[0])
  374. }
  375. func getRelatedUsersForAPIKeysQuery(apiKeys []APIKey) string {
  376. var sb strings.Builder
  377. for _, k := range apiKeys {
  378. if k.userID == 0 {
  379. continue
  380. }
  381. if sb.Len() == 0 {
  382. sb.WriteString("(")
  383. } else {
  384. sb.WriteString(",")
  385. }
  386. sb.WriteString(strconv.FormatInt(k.userID, 10))
  387. }
  388. if sb.Len() > 0 {
  389. sb.WriteString(")")
  390. } else {
  391. sb.WriteString("(0)")
  392. }
  393. return fmt.Sprintf(`SELECT id,username FROM %s WHERE id IN %s`, sqlTableUsers, sb.String())
  394. }
  395. func getRelatedAdminsForAPIKeysQuery(apiKeys []APIKey) string {
  396. var sb strings.Builder
  397. for _, k := range apiKeys {
  398. if k.adminID == 0 {
  399. continue
  400. }
  401. if sb.Len() == 0 {
  402. sb.WriteString("(")
  403. } else {
  404. sb.WriteString(",")
  405. }
  406. sb.WriteString(strconv.FormatInt(k.adminID, 10))
  407. }
  408. if sb.Len() > 0 {
  409. sb.WriteString(")")
  410. } else {
  411. sb.WriteString("(0)")
  412. }
  413. return fmt.Sprintf(`SELECT id,username FROM %s WHERE id IN %s`, sqlTableAdmins, sb.String())
  414. }
  415. func getUserByUsernameQuery(role string) string {
  416. if role == "" {
  417. return fmt.Sprintf(`SELECT %s FROM %s u LEFT JOIN %s r on r.id = u.role_id WHERE u.username = %s AND u.deleted_at = 0`,
  418. selectUserFields, sqlTableUsers, sqlTableRoles, sqlPlaceholders[0])
  419. }
  420. return fmt.Sprintf(`SELECT %s FROM %s u LEFT JOIN %s r on r.id = u.role_id WHERE u.username = %s AND u.deleted_at = 0
  421. AND u.role_id is NOT NULL AND r.name = %s`,
  422. selectUserFields, sqlTableUsers, sqlTableRoles, sqlPlaceholders[0], sqlPlaceholders[1])
  423. }
  424. func getUsersQuery(order, role string) string {
  425. if role == "" {
  426. return fmt.Sprintf(`SELECT %s FROM %s u LEFT JOIN %s r on r.id = u.role_id WHERE
  427. u.deleted_at = 0 ORDER BY u.username %s LIMIT %s OFFSET %s`,
  428. selectUserFields, sqlTableUsers, sqlTableRoles, order, sqlPlaceholders[0], sqlPlaceholders[1])
  429. }
  430. return fmt.Sprintf(`SELECT %s FROM %s u LEFT JOIN %s r on r.id = u.role_id WHERE
  431. u.deleted_at = 0 AND u.role_id is NOT NULL AND r.name = %s ORDER BY u.username %s LIMIT %s OFFSET %s`,
  432. selectUserFields, sqlTableUsers, sqlTableRoles, sqlPlaceholders[0], order, sqlPlaceholders[1], sqlPlaceholders[2])
  433. }
  434. func getUsersForQuotaCheckQuery(numArgs int) string {
  435. var sb strings.Builder
  436. for idx := 0; idx < numArgs; idx++ {
  437. if sb.Len() == 0 {
  438. sb.WriteString("(")
  439. } else {
  440. sb.WriteString(",")
  441. }
  442. sb.WriteString(sqlPlaceholders[idx])
  443. }
  444. if sb.Len() > 0 {
  445. sb.WriteString(")")
  446. }
  447. return fmt.Sprintf(`SELECT id,username,quota_size,used_quota_size,total_data_transfer,upload_data_transfer,
  448. download_data_transfer,used_upload_data_transfer,used_download_data_transfer,filters FROM %s WHERE username IN %s`,
  449. sqlTableUsers, sb.String())
  450. }
  451. func getRecentlyUpdatedUsersQuery() string {
  452. return fmt.Sprintf(`SELECT %s FROM %s u LEFT JOIN %s r on r.id = u.role_id WHERE u.updated_at >= %s OR u.deleted_at > 0`,
  453. selectUserFields, sqlTableUsers, sqlTableRoles, sqlPlaceholders[0])
  454. }
  455. func getDumpUsersQuery() string {
  456. return fmt.Sprintf(`SELECT %s FROM %s u LEFT JOIN %s r on r.id = u.role_id WHERE u.deleted_at = 0`,
  457. selectUserFields, sqlTableUsers, sqlTableRoles)
  458. }
  459. func getDumpFoldersQuery() string {
  460. return fmt.Sprintf(`SELECT %s FROM %s`, selectFolderFields, sqlTableFolders)
  461. }
  462. func getUpdateTransferQuotaQuery(reset bool) string {
  463. if reset {
  464. return fmt.Sprintf(`UPDATE %s SET used_upload_data_transfer = %s,used_download_data_transfer = %s,last_quota_update = %s
  465. WHERE username = %s`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  466. }
  467. return fmt.Sprintf(`UPDATE %s SET used_upload_data_transfer = used_upload_data_transfer + %s,
  468. used_download_data_transfer = used_download_data_transfer + %s,last_quota_update = %s
  469. WHERE username = %s`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  470. }
  471. func getUpdateQuotaQuery(reset bool) string {
  472. if reset {
  473. return fmt.Sprintf(`UPDATE %s SET used_quota_size = %s,used_quota_files = %s,last_quota_update = %s
  474. WHERE username = %s`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  475. }
  476. return fmt.Sprintf(`UPDATE %s SET used_quota_size = used_quota_size + %s,used_quota_files = used_quota_files + %s,last_quota_update = %s
  477. WHERE username = %s`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  478. }
  479. func getSetUpdateAtQuery() string {
  480. return fmt.Sprintf(`UPDATE %s SET updated_at = %s WHERE username = %s`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1])
  481. }
  482. func getSetFirstUploadQuery() string {
  483. return fmt.Sprintf(`UPDATE %s SET first_upload = %s WHERE username = %s AND first_upload = 0`,
  484. sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1])
  485. }
  486. func getSetFirstDownloadQuery() string {
  487. return fmt.Sprintf(`UPDATE %s SET first_download = %s WHERE username = %s AND first_download = 0`,
  488. sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1])
  489. }
  490. func getUpdateLastLoginQuery() string {
  491. return fmt.Sprintf(`UPDATE %s SET last_login = %s WHERE username = %s`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1])
  492. }
  493. func getUpdateAdminLastLoginQuery() string {
  494. return fmt.Sprintf(`UPDATE %s SET last_login = %s WHERE username = %s`, sqlTableAdmins, sqlPlaceholders[0], sqlPlaceholders[1])
  495. }
  496. func getUpdateAPIKeyLastUseQuery() string {
  497. return fmt.Sprintf(`UPDATE %s SET last_use_at = %s WHERE key_id = %s`, sqlTableAPIKeys, sqlPlaceholders[0], sqlPlaceholders[1])
  498. }
  499. func getUpdateShareLastUseQuery() string {
  500. return fmt.Sprintf(`UPDATE %s SET last_use_at = %s, used_tokens = used_tokens +%s WHERE share_id = %s`,
  501. sqlTableShares, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2])
  502. }
  503. func getQuotaQuery() string {
  504. return fmt.Sprintf(`SELECT used_quota_size,used_quota_files,used_upload_data_transfer,
  505. used_download_data_transfer FROM %s WHERE username = %s`,
  506. sqlTableUsers, sqlPlaceholders[0])
  507. }
  508. func getAddUserQuery(role string) string {
  509. return fmt.Sprintf(`INSERT INTO %s (username,password,public_keys,home_dir,uid,gid,max_sessions,quota_size,quota_files,permissions,
  510. used_quota_size,used_quota_files,last_quota_update,upload_bandwidth,download_bandwidth,status,last_login,expiration_date,filters,
  511. filesystem,additional_info,description,email,created_at,updated_at,upload_data_transfer,download_data_transfer,total_data_transfer,
  512. used_upload_data_transfer,used_download_data_transfer,deleted_at,first_download,first_upload,role_id,last_password_change)
  513. VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,0,0,0,%s,%s,%s,0,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,0,0,0,0,0,
  514. COALESCE((SELECT id from %s WHERE name=%s),%s),%s)`,
  515. sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  516. sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9],
  517. sqlPlaceholders[10], sqlPlaceholders[11], sqlPlaceholders[12], sqlPlaceholders[13], sqlPlaceholders[14],
  518. sqlPlaceholders[15], sqlPlaceholders[16], sqlPlaceholders[17], sqlPlaceholders[18], sqlPlaceholders[19],
  519. sqlPlaceholders[20], sqlPlaceholders[21], sqlPlaceholders[22], sqlPlaceholders[23], sqlTableRoles,
  520. sqlPlaceholders[24], getCoalesceDefaultForRole(role), sqlPlaceholders[25])
  521. }
  522. func getUpdateUserQuery(role string) string {
  523. return fmt.Sprintf(`UPDATE %s SET password=%s,public_keys=%s,home_dir=%s,uid=%s,gid=%s,max_sessions=%s,quota_size=%s,
  524. quota_files=%s,permissions=%s,upload_bandwidth=%s,download_bandwidth=%s,status=%s,expiration_date=%s,filters=%s,filesystem=%s,
  525. additional_info=%s,description=%s,email=%s,updated_at=%s,upload_data_transfer=%s,download_data_transfer=%s,
  526. total_data_transfer=%s,role_id=COALESCE((SELECT id from %s WHERE name=%s),%s),last_password_change=%s WHERE id = %s`,
  527. sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  528. sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9],
  529. sqlPlaceholders[10], sqlPlaceholders[11], sqlPlaceholders[12], sqlPlaceholders[13], sqlPlaceholders[14],
  530. sqlPlaceholders[15], sqlPlaceholders[16], sqlPlaceholders[17], sqlPlaceholders[18], sqlPlaceholders[19],
  531. sqlPlaceholders[20], sqlPlaceholders[21], sqlTableRoles, sqlPlaceholders[22], getCoalesceDefaultForRole(role),
  532. sqlPlaceholders[23], sqlPlaceholders[24])
  533. }
  534. func getUpdateUserPasswordQuery() string {
  535. return fmt.Sprintf(`UPDATE %s SET password=%s WHERE username = %s`,
  536. sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1])
  537. }
  538. func getDeleteUserQuery(softDelete bool) string {
  539. if softDelete {
  540. return fmt.Sprintf(`UPDATE %s SET updated_at=%s,deleted_at=%s WHERE username = %s`,
  541. sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2])
  542. }
  543. return fmt.Sprintf(`DELETE FROM %s WHERE id = %s`, sqlTableUsers, sqlPlaceholders[0])
  544. }
  545. func getRemoveSoftDeletedUserQuery() string {
  546. return fmt.Sprintf(`DELETE FROM %s WHERE username = %s AND deleted_at > 0`, sqlTableUsers, sqlPlaceholders[0])
  547. }
  548. func getFolderByNameQuery() string {
  549. return fmt.Sprintf(`SELECT %s FROM %s WHERE name = %s`, selectFolderFields, sqlTableFolders, sqlPlaceholders[0])
  550. }
  551. func getAddFolderQuery() string {
  552. return fmt.Sprintf(`INSERT INTO %s (path,used_quota_size,used_quota_files,last_quota_update,name,description,filesystem)
  553. VALUES (%s,%s,%s,%s,%s,%s,%s)`, sqlTableFolders, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2],
  554. sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6])
  555. }
  556. func getUpdateFolderQuery() string {
  557. return fmt.Sprintf(`UPDATE %s SET path=%s,description=%s,filesystem=%s WHERE name = %s`, sqlTableFolders, sqlPlaceholders[0],
  558. sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  559. }
  560. func getDeleteFolderQuery() string {
  561. return fmt.Sprintf(`DELETE FROM %s WHERE id = %s`, sqlTableFolders, sqlPlaceholders[0])
  562. }
  563. func getUpsertFolderQuery() string {
  564. if config.Driver == MySQLDataProviderName {
  565. return fmt.Sprintf("INSERT INTO %s (`path`,`used_quota_size`,`used_quota_files`,`last_quota_update`,`name`,"+
  566. "`description`,`filesystem`) VALUES (%s,%s,%s,%s,%s,%s,%s) ON DUPLICATE KEY UPDATE "+
  567. "`path`=VALUES(`path`),`description`=VALUES(`description`),`filesystem`=VALUES(`filesystem`)",
  568. sqlTableFolders, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  569. sqlPlaceholders[5], sqlPlaceholders[6])
  570. }
  571. return fmt.Sprintf(`INSERT INTO %s (path,used_quota_size,used_quota_files,last_quota_update,name,description,filesystem)
  572. VALUES (%s,%s,%s,%s,%s,%s,%s) ON CONFLICT (name) DO UPDATE SET path = EXCLUDED.path,description=EXCLUDED.description,
  573. filesystem=EXCLUDED.filesystem`, sqlTableFolders, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2],
  574. sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6])
  575. }
  576. func getClearUserGroupMappingQuery() string {
  577. return fmt.Sprintf(`DELETE FROM %s WHERE user_id = (SELECT id FROM %s WHERE username = %s)`, sqlTableUsersGroupsMapping,
  578. sqlTableUsers, sqlPlaceholders[0])
  579. }
  580. func getAddUserGroupMappingQuery() string {
  581. return fmt.Sprintf(`INSERT INTO %s (user_id,group_id,group_type) VALUES ((SELECT id FROM %s WHERE username = %s),
  582. (SELECT id FROM %s WHERE name = %s),%s)`,
  583. sqlTableUsersGroupsMapping, sqlTableUsers, sqlPlaceholders[0], getSQLQuotedName(sqlTableGroups),
  584. sqlPlaceholders[1], sqlPlaceholders[2])
  585. }
  586. func getClearAdminGroupMappingQuery() string {
  587. return fmt.Sprintf(`DELETE FROM %s WHERE admin_id = (SELECT id FROM %s WHERE username = %s)`, sqlTableAdminsGroupsMapping,
  588. sqlTableAdmins, sqlPlaceholders[0])
  589. }
  590. func getAddAdminGroupMappingQuery() string {
  591. return fmt.Sprintf(`INSERT INTO %s (admin_id,group_id,options) VALUES ((SELECT id FROM %s WHERE username = %s),
  592. (SELECT id FROM %s WHERE name = %s),%s)`,
  593. sqlTableAdminsGroupsMapping, sqlTableAdmins, sqlPlaceholders[0], getSQLQuotedName(sqlTableGroups),
  594. sqlPlaceholders[1], sqlPlaceholders[2])
  595. }
  596. func getClearGroupFolderMappingQuery() string {
  597. return fmt.Sprintf(`DELETE FROM %s WHERE group_id = (SELECT id FROM %s WHERE name = %s)`, sqlTableGroupsFoldersMapping,
  598. getSQLQuotedName(sqlTableGroups), sqlPlaceholders[0])
  599. }
  600. func getAddGroupFolderMappingQuery() string {
  601. return fmt.Sprintf(`INSERT INTO %s (virtual_path,quota_size,quota_files,folder_id,group_id)
  602. VALUES (%s,%s,%s,(SELECT id FROM %s WHERE name = %s),(SELECT id FROM %s WHERE name = %s))`,
  603. sqlTableGroupsFoldersMapping, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlTableFolders,
  604. sqlPlaceholders[3], getSQLQuotedName(sqlTableGroups), sqlPlaceholders[4])
  605. }
  606. func getClearUserFolderMappingQuery() string {
  607. return fmt.Sprintf(`DELETE FROM %s WHERE user_id = (SELECT id FROM %s WHERE username = %s)`, sqlTableUsersFoldersMapping,
  608. sqlTableUsers, sqlPlaceholders[0])
  609. }
  610. func getAddUserFolderMappingQuery() string {
  611. return fmt.Sprintf(`INSERT INTO %s (virtual_path,quota_size,quota_files,folder_id,user_id)
  612. VALUES (%s,%s,%s,(SELECT id FROM %s WHERE name = %s),(SELECT id FROM %s WHERE username = %s))`,
  613. sqlTableUsersFoldersMapping, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlTableFolders,
  614. sqlPlaceholders[3], sqlTableUsers, sqlPlaceholders[4])
  615. }
  616. func getFoldersQuery(order string, minimal bool) string {
  617. var fieldSelection string
  618. if minimal {
  619. fieldSelection = selectMinimalFields
  620. } else {
  621. fieldSelection = selectFolderFields
  622. }
  623. return fmt.Sprintf(`SELECT %s FROM %s ORDER BY name %s LIMIT %s OFFSET %s`, fieldSelection, sqlTableFolders,
  624. order, sqlPlaceholders[0], sqlPlaceholders[1])
  625. }
  626. func getUpdateFolderQuotaQuery(reset bool) string {
  627. if reset {
  628. return fmt.Sprintf(`UPDATE %s SET used_quota_size = %s,used_quota_files = %s,last_quota_update = %s
  629. WHERE name = %s`, sqlTableFolders, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  630. }
  631. return fmt.Sprintf(`UPDATE %s SET used_quota_size = used_quota_size + %s,used_quota_files = used_quota_files + %s,last_quota_update = %s
  632. WHERE name = %s`, sqlTableFolders, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  633. }
  634. func getQuotaFolderQuery() string {
  635. return fmt.Sprintf(`SELECT used_quota_size,used_quota_files FROM %s WHERE name = %s`, sqlTableFolders,
  636. sqlPlaceholders[0])
  637. }
  638. func getRelatedGroupsForUsersQuery(users []User) string {
  639. var sb strings.Builder
  640. for _, u := range users {
  641. if sb.Len() == 0 {
  642. sb.WriteString("(")
  643. } else {
  644. sb.WriteString(",")
  645. }
  646. sb.WriteString(strconv.FormatInt(u.ID, 10))
  647. }
  648. if sb.Len() > 0 {
  649. sb.WriteString(")")
  650. }
  651. return fmt.Sprintf(`SELECT g.name,ug.group_type,ug.user_id FROM %s g INNER JOIN %s ug ON g.id = ug.group_id WHERE
  652. ug.user_id IN %s ORDER BY ug.user_id`, getSQLQuotedName(sqlTableGroups), sqlTableUsersGroupsMapping, sb.String())
  653. }
  654. func getRelatedGroupsForAdminsQuery(admins []Admin) string {
  655. var sb strings.Builder
  656. for _, a := range admins {
  657. if sb.Len() == 0 {
  658. sb.WriteString("(")
  659. } else {
  660. sb.WriteString(",")
  661. }
  662. sb.WriteString(strconv.FormatInt(a.ID, 10))
  663. }
  664. if sb.Len() > 0 {
  665. sb.WriteString(")")
  666. }
  667. return fmt.Sprintf(`SELECT g.name,ag.options,ag.admin_id FROM %s g INNER JOIN %s ag ON g.id = ag.group_id WHERE
  668. ag.admin_id IN %s ORDER BY ag.admin_id`, getSQLQuotedName(sqlTableGroups), sqlTableAdminsGroupsMapping, sb.String())
  669. }
  670. func getRelatedFoldersForUsersQuery(users []User) string {
  671. var sb strings.Builder
  672. for _, u := range users {
  673. if sb.Len() == 0 {
  674. sb.WriteString("(")
  675. } else {
  676. sb.WriteString(",")
  677. }
  678. sb.WriteString(strconv.FormatInt(u.ID, 10))
  679. }
  680. if sb.Len() > 0 {
  681. sb.WriteString(")")
  682. }
  683. return fmt.Sprintf(`SELECT f.id,f.name,f.path,f.used_quota_size,f.used_quota_files,f.last_quota_update,fm.virtual_path,
  684. fm.quota_size,fm.quota_files,fm.user_id,f.filesystem,f.description FROM %s f INNER JOIN %s fm ON f.id = fm.folder_id WHERE
  685. fm.user_id IN %s ORDER BY fm.user_id`, sqlTableFolders, sqlTableUsersFoldersMapping, sb.String())
  686. }
  687. func getRelatedUsersForFoldersQuery(folders []vfs.BaseVirtualFolder) string {
  688. var sb strings.Builder
  689. for _, f := range folders {
  690. if sb.Len() == 0 {
  691. sb.WriteString("(")
  692. } else {
  693. sb.WriteString(",")
  694. }
  695. sb.WriteString(strconv.FormatInt(f.ID, 10))
  696. }
  697. if sb.Len() > 0 {
  698. sb.WriteString(")")
  699. }
  700. return fmt.Sprintf(`SELECT fm.folder_id,u.username FROM %s fm INNER JOIN %s u ON fm.user_id = u.id
  701. WHERE fm.folder_id IN %s ORDER BY fm.folder_id`, sqlTableUsersFoldersMapping, sqlTableUsers, sb.String())
  702. }
  703. func getRelatedGroupsForFoldersQuery(folders []vfs.BaseVirtualFolder) string {
  704. var sb strings.Builder
  705. for _, f := range folders {
  706. if sb.Len() == 0 {
  707. sb.WriteString("(")
  708. } else {
  709. sb.WriteString(",")
  710. }
  711. sb.WriteString(strconv.FormatInt(f.ID, 10))
  712. }
  713. if sb.Len() > 0 {
  714. sb.WriteString(")")
  715. }
  716. return fmt.Sprintf(`SELECT fm.folder_id,g.name FROM %s fm INNER JOIN %s g ON fm.group_id = g.id
  717. WHERE fm.folder_id IN %s ORDER BY fm.folder_id`, sqlTableGroupsFoldersMapping, getSQLQuotedName(sqlTableGroups),
  718. sb.String())
  719. }
  720. func getRelatedUsersForGroupsQuery(groups []Group) string {
  721. var sb strings.Builder
  722. for _, g := range groups {
  723. if sb.Len() == 0 {
  724. sb.WriteString("(")
  725. } else {
  726. sb.WriteString(",")
  727. }
  728. sb.WriteString(strconv.FormatInt(g.ID, 10))
  729. }
  730. if sb.Len() > 0 {
  731. sb.WriteString(")")
  732. }
  733. return fmt.Sprintf(`SELECT um.group_id,u.username FROM %s um INNER JOIN %s u ON um.user_id = u.id
  734. WHERE um.group_id IN %s ORDER BY um.group_id`, sqlTableUsersGroupsMapping, sqlTableUsers, sb.String())
  735. }
  736. func getRelatedAdminsForGroupsQuery(groups []Group) string {
  737. var sb strings.Builder
  738. for _, g := range groups {
  739. if sb.Len() == 0 {
  740. sb.WriteString("(")
  741. } else {
  742. sb.WriteString(",")
  743. }
  744. sb.WriteString(strconv.FormatInt(g.ID, 10))
  745. }
  746. if sb.Len() > 0 {
  747. sb.WriteString(")")
  748. }
  749. return fmt.Sprintf(`SELECT am.group_id,a.username FROM %s am INNER JOIN %s a ON am.admin_id = a.id
  750. WHERE am.group_id IN %s ORDER BY am.group_id`, sqlTableAdminsGroupsMapping, sqlTableAdmins, sb.String())
  751. }
  752. func getRelatedFoldersForGroupsQuery(groups []Group) string {
  753. var sb strings.Builder
  754. for _, g := range groups {
  755. if sb.Len() == 0 {
  756. sb.WriteString("(")
  757. } else {
  758. sb.WriteString(",")
  759. }
  760. sb.WriteString(strconv.FormatInt(g.ID, 10))
  761. }
  762. if sb.Len() > 0 {
  763. sb.WriteString(")")
  764. }
  765. return fmt.Sprintf(`SELECT f.id,f.name,f.path,f.used_quota_size,f.used_quota_files,f.last_quota_update,fm.virtual_path,
  766. fm.quota_size,fm.quota_files,fm.group_id,f.filesystem,f.description FROM %s f INNER JOIN %s fm ON f.id = fm.folder_id WHERE
  767. fm.group_id IN %s ORDER BY fm.group_id`, sqlTableFolders, sqlTableGroupsFoldersMapping, sb.String())
  768. }
  769. func getActiveTransfersQuery() string {
  770. return fmt.Sprintf(`SELECT transfer_id,connection_id,transfer_type,username,folder_name,ip,truncated_size,
  771. current_ul_size,current_dl_size,created_at,updated_at FROM %s WHERE updated_at > %s`,
  772. sqlTableActiveTransfers, sqlPlaceholders[0])
  773. }
  774. func getAddActiveTransferQuery() string {
  775. return fmt.Sprintf(`INSERT INTO %s (transfer_id,connection_id,transfer_type,username,folder_name,ip,truncated_size,
  776. current_ul_size,current_dl_size,created_at,updated_at) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)`,
  777. sqlTableActiveTransfers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3],
  778. sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8],
  779. sqlPlaceholders[9], sqlPlaceholders[10])
  780. }
  781. func getUpdateActiveTransferSizesQuery() string {
  782. return fmt.Sprintf(`UPDATE %s SET current_ul_size=%s,current_dl_size=%s,updated_at=%s WHERE connection_id = %s AND transfer_id = %s`,
  783. sqlTableActiveTransfers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4])
  784. }
  785. func getRemoveActiveTransferQuery() string {
  786. return fmt.Sprintf(`DELETE FROM %s WHERE connection_id = %s AND transfer_id = %s`,
  787. sqlTableActiveTransfers, sqlPlaceholders[0], sqlPlaceholders[1])
  788. }
  789. func getCleanupActiveTransfersQuery() string {
  790. return fmt.Sprintf(`DELETE FROM %s WHERE updated_at < %s`, sqlTableActiveTransfers, sqlPlaceholders[0])
  791. }
  792. func getRelatedRulesForActionsQuery(actions []BaseEventAction) string {
  793. var sb strings.Builder
  794. for _, a := range actions {
  795. if sb.Len() == 0 {
  796. sb.WriteString("(")
  797. } else {
  798. sb.WriteString(",")
  799. }
  800. sb.WriteString(strconv.FormatInt(a.ID, 10))
  801. }
  802. if sb.Len() > 0 {
  803. sb.WriteString(")")
  804. }
  805. return fmt.Sprintf(`SELECT am.action_id,r.name FROM %s am INNER JOIN %s r ON am.rule_id = r.id
  806. WHERE am.action_id IN %s ORDER BY r.name ASC`, sqlTableRulesActionsMapping, sqlTableEventsRules, sb.String())
  807. }
  808. func getEventsActionsQuery(order string, minimal bool) string {
  809. var fieldSelection string
  810. if minimal {
  811. fieldSelection = selectMinimalFields
  812. } else {
  813. fieldSelection = selectEventActionFields
  814. }
  815. return fmt.Sprintf(`SELECT %s FROM %s ORDER BY name %s LIMIT %s OFFSET %s`, fieldSelection,
  816. sqlTableEventsActions, order, sqlPlaceholders[0], sqlPlaceholders[1])
  817. }
  818. func getDumpEventActionsQuery() string {
  819. return fmt.Sprintf(`SELECT %s FROM %s`, selectEventActionFields, sqlTableEventsActions)
  820. }
  821. func getEventActionByNameQuery() string {
  822. return fmt.Sprintf(`SELECT %s FROM %s WHERE name = %s`, selectEventActionFields, sqlTableEventsActions,
  823. sqlPlaceholders[0])
  824. }
  825. func getAddEventActionQuery() string {
  826. return fmt.Sprintf(`INSERT INTO %s (name,description,type,options) VALUES (%s,%s,%s,%s)`,
  827. sqlTableEventsActions, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  828. }
  829. func getUpdateEventActionQuery() string {
  830. return fmt.Sprintf(`UPDATE %s SET description=%s,type=%s,options=%s WHERE name = %s`, sqlTableEventsActions,
  831. sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  832. }
  833. func getDeleteEventActionQuery() string {
  834. return fmt.Sprintf(`DELETE FROM %s WHERE name = %s`, sqlTableEventsActions, sqlPlaceholders[0])
  835. }
  836. func getEventRulesQuery(order string) string {
  837. return fmt.Sprintf(`SELECT %s FROM %s WHERE deleted_at = 0 ORDER BY name %s LIMIT %s OFFSET %s`,
  838. getSelectEventRuleFields(), sqlTableEventsRules, order, sqlPlaceholders[0], sqlPlaceholders[1])
  839. }
  840. func getDumpEventRulesQuery() string {
  841. return fmt.Sprintf(`SELECT %s FROM %s WHERE deleted_at = 0`, getSelectEventRuleFields(), sqlTableEventsRules)
  842. }
  843. func getRecentlyUpdatedRulesQuery() string {
  844. return fmt.Sprintf(`SELECT %s FROM %s WHERE updated_at >= %s OR deleted_at > 0`, getSelectEventRuleFields(),
  845. sqlTableEventsRules, sqlPlaceholders[0])
  846. }
  847. func getEventRulesByNameQuery() string {
  848. return fmt.Sprintf(`SELECT %s FROM %s WHERE name = %s AND deleted_at = 0`, getSelectEventRuleFields(), sqlTableEventsRules,
  849. sqlPlaceholders[0])
  850. }
  851. func getAddEventRuleQuery() string {
  852. return fmt.Sprintf(`INSERT INTO %s (name,description,created_at,updated_at,%s,conditions,deleted_at)
  853. VALUES (%s,%s,%s,%s,%s,%s,0)`,
  854. sqlTableEventsRules, getSQLQuotedName("trigger"), sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2],
  855. sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5])
  856. }
  857. func getUpdateEventRuleQuery() string {
  858. return fmt.Sprintf(`UPDATE %s SET description=%s,updated_at=%s,%s=%s,conditions=%s WHERE name = %s`,
  859. sqlTableEventsRules, sqlPlaceholders[0], sqlPlaceholders[1], getSQLQuotedName("trigger"), sqlPlaceholders[2],
  860. sqlPlaceholders[3], sqlPlaceholders[4])
  861. }
  862. func getDeleteEventRuleQuery(softDelete bool) string {
  863. if softDelete {
  864. return fmt.Sprintf(`UPDATE %s SET updated_at=%s,deleted_at=%s WHERE name = %s`,
  865. sqlTableEventsRules, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2])
  866. }
  867. return fmt.Sprintf(`DELETE FROM %s WHERE name = %s`, sqlTableEventsRules, sqlPlaceholders[0])
  868. }
  869. func getRemoveSoftDeletedRuleQuery() string {
  870. return fmt.Sprintf(`DELETE FROM %s WHERE name = %s AND deleted_at > 0`, sqlTableEventsRules, sqlPlaceholders[0])
  871. }
  872. func getClearRuleActionMappingQuery() string {
  873. return fmt.Sprintf(`DELETE FROM %s WHERE rule_id = (SELECT id FROM %s WHERE name = %s)`, sqlTableRulesActionsMapping,
  874. sqlTableEventsRules, sqlPlaceholders[0])
  875. }
  876. func getUpdateRulesTimestampQuery() string {
  877. return fmt.Sprintf(`UPDATE %s SET updated_at=%s WHERE id IN (SELECT rule_id FROM %s WHERE action_id = %s)`,
  878. sqlTableEventsRules, sqlPlaceholders[0], sqlTableRulesActionsMapping, sqlPlaceholders[1])
  879. }
  880. func getRelatedActionsForRulesQuery(rules []EventRule) string {
  881. var sb strings.Builder
  882. for _, r := range rules {
  883. if sb.Len() == 0 {
  884. sb.WriteString("(")
  885. } else {
  886. sb.WriteString(",")
  887. }
  888. sb.WriteString(strconv.FormatInt(r.ID, 10))
  889. }
  890. if sb.Len() > 0 {
  891. sb.WriteString(")")
  892. }
  893. return fmt.Sprintf(`SELECT a.id,a.name,a.description,a.type,a.options,am.options,am.%s,
  894. am.rule_id FROM %s a INNER JOIN %s am ON a.id = am.action_id WHERE am.rule_id IN %s ORDER BY am.%s ASC`,
  895. getSQLQuotedName("order"), sqlTableEventsActions, sqlTableRulesActionsMapping, sb.String(),
  896. getSQLQuotedName("order"))
  897. }
  898. func getAddRuleActionMappingQuery() string {
  899. return fmt.Sprintf(`INSERT INTO %s (rule_id,action_id,%s,options) VALUES ((SELECT id FROM %s WHERE name = %s),
  900. (SELECT id FROM %s WHERE name = %s),%s,%s)`,
  901. sqlTableRulesActionsMapping, getSQLQuotedName("order"), sqlTableEventsRules, sqlPlaceholders[0],
  902. sqlTableEventsActions, sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  903. }
  904. func getTaskByNameQuery() string {
  905. return fmt.Sprintf(`SELECT updated_at,version FROM %s WHERE name = %s`, sqlTableTasks, sqlPlaceholders[0])
  906. }
  907. func getAddTaskQuery() string {
  908. return fmt.Sprintf(`INSERT INTO %s (name,updated_at,version) VALUES (%s,%s,0)`,
  909. sqlTableTasks, sqlPlaceholders[0], sqlPlaceholders[1])
  910. }
  911. func getUpdateTaskQuery() string {
  912. return fmt.Sprintf(`UPDATE %s SET updated_at=%s,version = version + 1 WHERE name = %s AND version = %s`,
  913. sqlTableTasks, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2])
  914. }
  915. func getUpdateTaskTimestampQuery() string {
  916. return fmt.Sprintf(`UPDATE %s SET updated_at=%s WHERE name = %s`,
  917. sqlTableTasks, sqlPlaceholders[0], sqlPlaceholders[1])
  918. }
  919. func getDeleteTaskQuery() string {
  920. return fmt.Sprintf(`DELETE FROM %s WHERE name = %s`, sqlTableTasks, sqlPlaceholders[0])
  921. }
  922. func getAddNodeQuery() string {
  923. if config.Driver == MySQLDataProviderName {
  924. return fmt.Sprintf("INSERT INTO %s (`name`,`data`,created_at,`updated_at`) VALUES (%s,%s,%s,%s) ON DUPLICATE KEY UPDATE "+
  925. "`data`=VALUES(`data`), `created_at`=VALUES(`created_at`), `updated_at`=VALUES(`updated_at`)",
  926. sqlTableNodes, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  927. }
  928. return fmt.Sprintf(`INSERT INTO %s (name,data,created_at,updated_at) VALUES (%s,%s,%s,%s) ON CONFLICT(name)
  929. DO UPDATE SET data=EXCLUDED.data, created_at=EXCLUDED.created_at, updated_at=EXCLUDED.updated_at`,
  930. sqlTableNodes, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  931. }
  932. func getUpdateNodeTimestampQuery() string {
  933. return fmt.Sprintf(`UPDATE %s SET updated_at=%s WHERE name = %s`,
  934. sqlTableNodes, sqlPlaceholders[0], sqlPlaceholders[1])
  935. }
  936. func getNodeByNameQuery() string {
  937. return fmt.Sprintf(`SELECT name,data,created_at,updated_at FROM %s WHERE name = %s AND updated_at > %s`,
  938. sqlTableNodes, sqlPlaceholders[0], sqlPlaceholders[1])
  939. }
  940. func getNodesQuery() string {
  941. return fmt.Sprintf(`SELECT name,data,created_at,updated_at FROM %s WHERE name != %s AND updated_at > %s`,
  942. sqlTableNodes, sqlPlaceholders[0], sqlPlaceholders[1])
  943. }
  944. func getCleanupNodesQuery() string {
  945. return fmt.Sprintf(`DELETE FROM %s WHERE updated_at < %s`, sqlTableNodes, sqlPlaceholders[0])
  946. }
  947. func getDatabaseVersionQuery() string {
  948. return fmt.Sprintf("SELECT version from %s LIMIT 1", sqlTableSchemaVersion)
  949. }
  950. func getUpdateDBVersionQuery() string {
  951. return fmt.Sprintf(`UPDATE %s SET version=%s`, sqlTableSchemaVersion, sqlPlaceholders[0])
  952. }