sqlqueries.go 40 KB

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