sqlqueries.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. package dataprovider
  2. import (
  3. "fmt"
  4. "strconv"
  5. "strings"
  6. "github.com/drakkan/sftpgo/v2/vfs"
  7. )
  8. const (
  9. selectUserFields = "id,username,password,public_keys,home_dir,uid,gid,max_sessions,quota_size,quota_files,permissions,used_quota_size," +
  10. "used_quota_files,last_quota_update,upload_bandwidth,download_bandwidth,expiration_date,last_login,status,filters,filesystem," +
  11. "additional_info,description,email,created_at,updated_at,upload_data_transfer,download_data_transfer,total_data_transfer," +
  12. "used_upload_data_transfer,used_download_data_transfer"
  13. selectFolderFields = "id,path,used_quota_size,used_quota_files,last_quota_update,name,description,filesystem"
  14. selectAdminFields = "id,username,password,status,email,permissions,filters,additional_info,description,created_at,updated_at,last_login"
  15. selectAPIKeyFields = "key_id,name,api_key,scope,created_at,updated_at,last_use_at,expires_at,description,user_id,admin_id"
  16. selectShareFields = "s.share_id,s.name,s.description,s.scope,s.paths,u.username,s.created_at,s.updated_at,s.last_use_at," +
  17. "s.expires_at,s.password,s.max_tokens,s.used_tokens,s.allow_from"
  18. )
  19. func getSQLPlaceholders() []string {
  20. var placeholders []string
  21. for i := 1; i <= 50; i++ {
  22. if config.Driver == PGSQLDataProviderName || config.Driver == CockroachDataProviderName {
  23. placeholders = append(placeholders, fmt.Sprintf("$%v", i))
  24. } else {
  25. placeholders = append(placeholders, "?")
  26. }
  27. }
  28. return placeholders
  29. }
  30. func getAddDefenderHostQuery() string {
  31. if config.Driver == MySQLDataProviderName {
  32. return fmt.Sprintf("INSERT INTO %v (`ip`,`updated_at`,`ban_time`) VALUES (%v,%v,0) ON DUPLICATE KEY UPDATE `updated_at`=VALUES(`updated_at`)",
  33. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  34. }
  35. return fmt.Sprintf(`INSERT INTO %v (ip,updated_at,ban_time) VALUES (%v,%v,0) ON CONFLICT (ip) DO UPDATE SET updated_at = EXCLUDED.updated_at RETURNING id`,
  36. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  37. }
  38. func getAddDefenderEventQuery() string {
  39. return fmt.Sprintf(`INSERT INTO %v (date_time,score,host_id) VALUES (%v,%v,(SELECT id from %v WHERE ip = %v))`,
  40. sqlTableDefenderEvents, sqlPlaceholders[0], sqlPlaceholders[1], sqlTableDefenderHosts, sqlPlaceholders[2])
  41. }
  42. func getDefenderHostsQuery() string {
  43. return fmt.Sprintf(`SELECT id,ip,ban_time FROM %v WHERE updated_at >= %v OR ban_time > 0 ORDER BY updated_at DESC LIMIT %v`,
  44. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  45. }
  46. func getDefenderHostQuery() string {
  47. return fmt.Sprintf(`SELECT id,ip,ban_time FROM %v WHERE ip = %v AND updated_at >= %v`,
  48. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  49. }
  50. func getDefenderEventsQuery(hostIDS []int64) string {
  51. var sb strings.Builder
  52. for _, hID := range hostIDS {
  53. if sb.Len() == 0 {
  54. sb.WriteString("(")
  55. } else {
  56. sb.WriteString(",")
  57. }
  58. sb.WriteString(strconv.FormatInt(hID, 10))
  59. }
  60. if sb.Len() > 0 {
  61. sb.WriteString(")")
  62. } else {
  63. sb.WriteString("(0)")
  64. }
  65. return fmt.Sprintf(`SELECT host_id,SUM(score) FROM %v WHERE date_time >= %v AND host_id IN %v GROUP BY host_id`,
  66. sqlTableDefenderEvents, sqlPlaceholders[0], sb.String())
  67. }
  68. func getDefenderIsHostBannedQuery() string {
  69. return fmt.Sprintf(`SELECT id FROM %v WHERE ip = %v AND ban_time >= %v`,
  70. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  71. }
  72. func getDefenderIncrementBanTimeQuery() string {
  73. return fmt.Sprintf(`UPDATE %v SET ban_time = ban_time + %v WHERE ip = %v`,
  74. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  75. }
  76. func getDefenderSetBanTimeQuery() string {
  77. return fmt.Sprintf(`UPDATE %v SET ban_time = %v WHERE ip = %v`,
  78. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  79. }
  80. func getDeleteDefenderHostQuery() string {
  81. return fmt.Sprintf(`DELETE FROM %v WHERE ip = %v`, sqlTableDefenderHosts, sqlPlaceholders[0])
  82. }
  83. func getDefenderHostsCleanupQuery() string {
  84. return fmt.Sprintf(`DELETE FROM %v WHERE ban_time < %v AND NOT EXISTS (
  85. SELECT id FROM %v WHERE %v.host_id = %v.id AND %v.date_time > %v)`,
  86. sqlTableDefenderHosts, sqlPlaceholders[0], sqlTableDefenderEvents, sqlTableDefenderEvents, sqlTableDefenderHosts,
  87. sqlTableDefenderEvents, sqlPlaceholders[1])
  88. }
  89. func getDefenderEventsCleanupQuery() string {
  90. return fmt.Sprintf(`DELETE FROM %v WHERE date_time < %v`, sqlTableDefenderEvents, sqlPlaceholders[0])
  91. }
  92. func getAdminByUsernameQuery() string {
  93. return fmt.Sprintf(`SELECT %v FROM %v WHERE username = %v`, selectAdminFields, sqlTableAdmins, sqlPlaceholders[0])
  94. }
  95. func getAdminsQuery(order string) string {
  96. return fmt.Sprintf(`SELECT %v FROM %v ORDER BY username %v LIMIT %v OFFSET %v`, selectAdminFields, sqlTableAdmins,
  97. order, sqlPlaceholders[0], sqlPlaceholders[1])
  98. }
  99. func getDumpAdminsQuery() string {
  100. return fmt.Sprintf(`SELECT %v FROM %v`, selectAdminFields, sqlTableAdmins)
  101. }
  102. func getAddAdminQuery() string {
  103. return fmt.Sprintf(`INSERT INTO %v (username,password,status,email,permissions,filters,additional_info,description,created_at,updated_at,last_login)
  104. VALUES (%v,%v,%v,%v,%v,%v,%v,%v,%v,%v,0)`, sqlTableAdmins, sqlPlaceholders[0], sqlPlaceholders[1],
  105. sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7],
  106. sqlPlaceholders[8], sqlPlaceholders[9])
  107. }
  108. func getUpdateAdminQuery() string {
  109. return fmt.Sprintf(`UPDATE %v SET password=%v,status=%v,email=%v,permissions=%v,filters=%v,additional_info=%v,description=%v,updated_at=%v
  110. WHERE username = %v`, sqlTableAdmins, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2],
  111. sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8])
  112. }
  113. func getDeleteAdminQuery() string {
  114. return fmt.Sprintf(`DELETE FROM %v WHERE username = %v`, sqlTableAdmins, sqlPlaceholders[0])
  115. }
  116. func getShareByIDQuery(filterUser bool) string {
  117. if filterUser {
  118. return fmt.Sprintf(`SELECT %v FROM %v s INNER JOIN %v u ON s.user_id = u.id WHERE s.share_id = %v AND u.username = %v`,
  119. selectShareFields, sqlTableShares, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1])
  120. }
  121. return fmt.Sprintf(`SELECT %v FROM %v s INNER JOIN %v u ON s.user_id = u.id WHERE s.share_id = %v`,
  122. selectShareFields, sqlTableShares, sqlTableUsers, sqlPlaceholders[0])
  123. }
  124. func getSharesQuery(order string) string {
  125. return fmt.Sprintf(`SELECT %v FROM %v s INNER JOIN %v u ON s.user_id = u.id WHERE u.username = %v ORDER BY s.share_id %v LIMIT %v OFFSET %v`,
  126. selectShareFields, sqlTableShares, sqlTableUsers, sqlPlaceholders[0], order, sqlPlaceholders[1], sqlPlaceholders[2])
  127. }
  128. func getDumpSharesQuery() string {
  129. return fmt.Sprintf(`SELECT %v FROM %v s INNER JOIN %v u ON s.user_id = u.id`,
  130. selectShareFields, sqlTableShares, sqlTableUsers)
  131. }
  132. func getAddShareQuery() string {
  133. return fmt.Sprintf(`INSERT INTO %v (share_id,name,description,scope,paths,created_at,updated_at,last_use_at,
  134. expires_at,password,max_tokens,used_tokens,allow_from,user_id) VALUES (%v,%v,%v,%v,%v,%v,%v,%v,%v,%v,%v,%v,%v,%v)`,
  135. sqlTableShares, sqlPlaceholders[0], sqlPlaceholders[1],
  136. sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6],
  137. sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9], sqlPlaceholders[10], sqlPlaceholders[11],
  138. sqlPlaceholders[12], sqlPlaceholders[13])
  139. }
  140. func getUpdateShareRestoreQuery() string {
  141. return fmt.Sprintf(`UPDATE %v SET name=%v,description=%v,scope=%v,paths=%v,created_at=%v,updated_at=%v,
  142. last_use_at=%v,expires_at=%v,password=%v,max_tokens=%v,used_tokens=%v,allow_from=%v,user_id=%v WHERE share_id = %v`, sqlTableShares,
  143. sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  144. sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9],
  145. sqlPlaceholders[10], sqlPlaceholders[11], sqlPlaceholders[12], sqlPlaceholders[13])
  146. }
  147. func getUpdateShareQuery() string {
  148. return fmt.Sprintf(`UPDATE %v SET name=%v,description=%v,scope=%v,paths=%v,updated_at=%v,expires_at=%v,
  149. password=%v,max_tokens=%v,allow_from=%v,user_id=%v WHERE share_id = %v`, sqlTableShares,
  150. sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  151. sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9],
  152. sqlPlaceholders[10])
  153. }
  154. func getDeleteShareQuery() string {
  155. return fmt.Sprintf(`DELETE FROM %v WHERE share_id = %v`, sqlTableShares, sqlPlaceholders[0])
  156. }
  157. func getAPIKeyByIDQuery() string {
  158. return fmt.Sprintf(`SELECT %v FROM %v WHERE key_id = %v`, selectAPIKeyFields, sqlTableAPIKeys, sqlPlaceholders[0])
  159. }
  160. func getAPIKeysQuery(order string) string {
  161. return fmt.Sprintf(`SELECT %v FROM %v ORDER BY key_id %v LIMIT %v OFFSET %v`, selectAPIKeyFields, sqlTableAPIKeys,
  162. order, sqlPlaceholders[0], sqlPlaceholders[1])
  163. }
  164. func getDumpAPIKeysQuery() string {
  165. return fmt.Sprintf(`SELECT %v FROM %v`, selectAPIKeyFields, sqlTableAPIKeys)
  166. }
  167. func getAddAPIKeyQuery() string {
  168. return fmt.Sprintf(`INSERT INTO %v (key_id,name,api_key,scope,created_at,updated_at,last_use_at,expires_at,description,user_id,admin_id)
  169. VALUES (%v,%v,%v,%v,%v,%v,%v,%v,%v,%v,%v)`, sqlTableAPIKeys, sqlPlaceholders[0], sqlPlaceholders[1],
  170. sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6],
  171. sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9], sqlPlaceholders[10])
  172. }
  173. func getUpdateAPIKeyQuery() string {
  174. return fmt.Sprintf(`UPDATE %v SET name=%v,scope=%v,expires_at=%v,user_id=%v,admin_id=%v,description=%v,updated_at=%v
  175. WHERE key_id = %v`, sqlTableAPIKeys, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2],
  176. sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7])
  177. }
  178. func getDeleteAPIKeyQuery() string {
  179. return fmt.Sprintf(`DELETE FROM %v WHERE key_id = %v`, sqlTableAPIKeys, sqlPlaceholders[0])
  180. }
  181. func getRelatedUsersForAPIKeysQuery(apiKeys []APIKey) string {
  182. var sb strings.Builder
  183. for _, k := range apiKeys {
  184. if k.userID == 0 {
  185. continue
  186. }
  187. if sb.Len() == 0 {
  188. sb.WriteString("(")
  189. } else {
  190. sb.WriteString(",")
  191. }
  192. sb.WriteString(strconv.FormatInt(k.userID, 10))
  193. }
  194. if sb.Len() > 0 {
  195. sb.WriteString(")")
  196. } else {
  197. sb.WriteString("(0)")
  198. }
  199. return fmt.Sprintf(`SELECT id,username FROM %v WHERE id IN %v`, sqlTableUsers, sb.String())
  200. }
  201. func getRelatedAdminsForAPIKeysQuery(apiKeys []APIKey) string {
  202. var sb strings.Builder
  203. for _, k := range apiKeys {
  204. if k.adminID == 0 {
  205. continue
  206. }
  207. if sb.Len() == 0 {
  208. sb.WriteString("(")
  209. } else {
  210. sb.WriteString(",")
  211. }
  212. sb.WriteString(strconv.FormatInt(k.adminID, 10))
  213. }
  214. if sb.Len() > 0 {
  215. sb.WriteString(")")
  216. } else {
  217. sb.WriteString("(0)")
  218. }
  219. return fmt.Sprintf(`SELECT id,username FROM %v WHERE id IN %v`, sqlTableAdmins, sb.String())
  220. }
  221. func getUserByUsernameQuery() string {
  222. return fmt.Sprintf(`SELECT %v FROM %v WHERE username = %v`, selectUserFields, sqlTableUsers, sqlPlaceholders[0])
  223. }
  224. func getUsersQuery(order string) string {
  225. return fmt.Sprintf(`SELECT %v FROM %v ORDER BY username %v LIMIT %v OFFSET %v`, selectUserFields, sqlTableUsers,
  226. order, sqlPlaceholders[0], sqlPlaceholders[1])
  227. }
  228. func getUsersForQuotaCheckQuery(numArgs int) string {
  229. var sb strings.Builder
  230. for idx := 0; idx < numArgs; idx++ {
  231. if sb.Len() == 0 {
  232. sb.WriteString("(")
  233. } else {
  234. sb.WriteString(",")
  235. }
  236. sb.WriteString(sqlPlaceholders[idx])
  237. }
  238. if sb.Len() > 0 {
  239. sb.WriteString(")")
  240. }
  241. return fmt.Sprintf(`SELECT id,username,quota_size,used_quota_size,total_data_transfer,upload_data_transfer,
  242. download_data_transfer,used_upload_data_transfer,used_download_data_transfer,filters FROM %v WHERE username IN %v`,
  243. sqlTableUsers, sb.String())
  244. }
  245. func getRecentlyUpdatedUsersQuery() string {
  246. return fmt.Sprintf(`SELECT %v FROM %v WHERE updated_at >= %v`, selectUserFields, sqlTableUsers, sqlPlaceholders[0])
  247. }
  248. func getDumpUsersQuery() string {
  249. return fmt.Sprintf(`SELECT %v FROM %v`, selectUserFields, sqlTableUsers)
  250. }
  251. func getDumpFoldersQuery() string {
  252. return fmt.Sprintf(`SELECT %v FROM %v`, selectFolderFields, sqlTableFolders)
  253. }
  254. func getUpdateTransferQuotaQuery(reset bool) string {
  255. if reset {
  256. return fmt.Sprintf(`UPDATE %v SET used_upload_data_transfer = %v,used_download_data_transfer = %v,last_quota_update = %v
  257. WHERE username = %v`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  258. }
  259. return fmt.Sprintf(`UPDATE %v SET used_upload_data_transfer = used_upload_data_transfer + %v,
  260. used_download_data_transfer = used_download_data_transfer + %v,last_quota_update = %v
  261. WHERE username = %v`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  262. }
  263. func getUpdateQuotaQuery(reset bool) string {
  264. if reset {
  265. return fmt.Sprintf(`UPDATE %v SET used_quota_size = %v,used_quota_files = %v,last_quota_update = %v
  266. WHERE username = %v`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  267. }
  268. return fmt.Sprintf(`UPDATE %v SET used_quota_size = used_quota_size + %v,used_quota_files = used_quota_files + %v,last_quota_update = %v
  269. WHERE username = %v`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  270. }
  271. func getSetUpdateAtQuery() string {
  272. return fmt.Sprintf(`UPDATE %v SET updated_at = %v WHERE username = %v`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1])
  273. }
  274. func getUpdateLastLoginQuery() string {
  275. return fmt.Sprintf(`UPDATE %v SET last_login = %v WHERE username = %v`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1])
  276. }
  277. func getUpdateAdminLastLoginQuery() string {
  278. return fmt.Sprintf(`UPDATE %v SET last_login = %v WHERE username = %v`, sqlTableAdmins, sqlPlaceholders[0], sqlPlaceholders[1])
  279. }
  280. func getUpdateAPIKeyLastUseQuery() string {
  281. return fmt.Sprintf(`UPDATE %v SET last_use_at = %v WHERE key_id = %v`, sqlTableAPIKeys, sqlPlaceholders[0], sqlPlaceholders[1])
  282. }
  283. func getUpdateShareLastUseQuery() string {
  284. return fmt.Sprintf(`UPDATE %v SET last_use_at = %v, used_tokens = used_tokens +%v WHERE share_id = %v`,
  285. sqlTableShares, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2])
  286. }
  287. func getQuotaQuery() string {
  288. return fmt.Sprintf(`SELECT used_quota_size,used_quota_files,used_upload_data_transfer,
  289. used_download_data_transfer FROM %v WHERE username = %v`,
  290. sqlTableUsers, sqlPlaceholders[0])
  291. }
  292. func getAddUserQuery() string {
  293. return fmt.Sprintf(`INSERT INTO %v (username,password,public_keys,home_dir,uid,gid,max_sessions,quota_size,quota_files,permissions,
  294. used_quota_size,used_quota_files,last_quota_update,upload_bandwidth,download_bandwidth,status,last_login,expiration_date,filters,
  295. filesystem,additional_info,description,email,created_at,updated_at,upload_data_transfer,download_data_transfer,total_data_transfer,
  296. used_upload_data_transfer,used_download_data_transfer)
  297. VALUES (%v,%v,%v,%v,%v,%v,%v,%v,%v,%v,0,0,0,%v,%v,%v,0,%v,%v,%v,%v,%v,%v,%v,%v,%v,%v,%v,0,0)`,
  298. sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  299. sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9],
  300. sqlPlaceholders[10], sqlPlaceholders[11], sqlPlaceholders[12], sqlPlaceholders[13], sqlPlaceholders[14],
  301. sqlPlaceholders[15], sqlPlaceholders[16], sqlPlaceholders[17], sqlPlaceholders[18], sqlPlaceholders[19],
  302. sqlPlaceholders[20], sqlPlaceholders[21], sqlPlaceholders[22], sqlPlaceholders[23])
  303. }
  304. func getUpdateUserQuery() string {
  305. return fmt.Sprintf(`UPDATE %v SET password=%v,public_keys=%v,home_dir=%v,uid=%v,gid=%v,max_sessions=%v,quota_size=%v,
  306. quota_files=%v,permissions=%v,upload_bandwidth=%v,download_bandwidth=%v,status=%v,expiration_date=%v,filters=%v,filesystem=%v,
  307. additional_info=%v,description=%v,email=%v,updated_at=%v,upload_data_transfer=%v,download_data_transfer=%v,
  308. total_data_transfer=%v WHERE id = %v`,
  309. sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  310. sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9],
  311. sqlPlaceholders[10], sqlPlaceholders[11], sqlPlaceholders[12], sqlPlaceholders[13], sqlPlaceholders[14],
  312. sqlPlaceholders[15], sqlPlaceholders[16], sqlPlaceholders[17], sqlPlaceholders[18], sqlPlaceholders[19],
  313. sqlPlaceholders[20], sqlPlaceholders[21], sqlPlaceholders[22])
  314. }
  315. func getDeleteUserQuery() string {
  316. return fmt.Sprintf(`DELETE FROM %v WHERE id = %v`, sqlTableUsers, sqlPlaceholders[0])
  317. }
  318. func getFolderByNameQuery() string {
  319. return fmt.Sprintf(`SELECT %v FROM %v WHERE name = %v`, selectFolderFields, sqlTableFolders, sqlPlaceholders[0])
  320. }
  321. func checkFolderNameQuery() string {
  322. return fmt.Sprintf(`SELECT name FROM %v WHERE name = %v`, sqlTableFolders, sqlPlaceholders[0])
  323. }
  324. func getAddFolderQuery() string {
  325. return fmt.Sprintf(`INSERT INTO %v (path,used_quota_size,used_quota_files,last_quota_update,name,description,filesystem)
  326. VALUES (%v,%v,%v,%v,%v,%v,%v)`, sqlTableFolders, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2],
  327. sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6])
  328. }
  329. func getUpdateFolderQuery() string {
  330. return fmt.Sprintf(`UPDATE %v SET path=%v,description=%v,filesystem=%v WHERE name = %v`, sqlTableFolders, sqlPlaceholders[0],
  331. sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  332. }
  333. func getDeleteFolderQuery() string {
  334. return fmt.Sprintf(`DELETE FROM %v WHERE id = %v`, sqlTableFolders, sqlPlaceholders[0])
  335. }
  336. func getClearFolderMappingQuery() string {
  337. return fmt.Sprintf(`DELETE FROM %v WHERE user_id = (SELECT id FROM %v WHERE username = %v)`, sqlTableFoldersMapping,
  338. sqlTableUsers, sqlPlaceholders[0])
  339. }
  340. func getAddFolderMappingQuery() string {
  341. return fmt.Sprintf(`INSERT INTO %v (virtual_path,quota_size,quota_files,folder_id,user_id)
  342. VALUES (%v,%v,%v,%v,(SELECT id FROM %v WHERE username = %v))`, sqlTableFoldersMapping, sqlPlaceholders[0],
  343. sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlTableUsers, sqlPlaceholders[4])
  344. }
  345. func getFoldersQuery(order string) string {
  346. return fmt.Sprintf(`SELECT %v FROM %v ORDER BY name %v LIMIT %v OFFSET %v`, selectFolderFields, sqlTableFolders,
  347. order, sqlPlaceholders[0], sqlPlaceholders[1])
  348. }
  349. func getUpdateFolderQuotaQuery(reset bool) string {
  350. if reset {
  351. return fmt.Sprintf(`UPDATE %v SET used_quota_size = %v,used_quota_files = %v,last_quota_update = %v
  352. WHERE name = %v`, sqlTableFolders, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  353. }
  354. return fmt.Sprintf(`UPDATE %v SET used_quota_size = used_quota_size + %v,used_quota_files = used_quota_files + %v,last_quota_update = %v
  355. WHERE name = %v`, sqlTableFolders, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  356. }
  357. func getQuotaFolderQuery() string {
  358. return fmt.Sprintf(`SELECT used_quota_size,used_quota_files FROM %v WHERE name = %v`, sqlTableFolders,
  359. sqlPlaceholders[0])
  360. }
  361. func getRelatedFoldersForUsersQuery(users []User) string {
  362. var sb strings.Builder
  363. for _, u := range users {
  364. if sb.Len() == 0 {
  365. sb.WriteString("(")
  366. } else {
  367. sb.WriteString(",")
  368. }
  369. sb.WriteString(strconv.FormatInt(u.ID, 10))
  370. }
  371. if sb.Len() > 0 {
  372. sb.WriteString(")")
  373. }
  374. 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,
  375. fm.quota_size,fm.quota_files,fm.user_id,f.filesystem,f.description FROM %v f INNER JOIN %v fm ON f.id = fm.folder_id WHERE
  376. fm.user_id IN %v ORDER BY fm.user_id`, sqlTableFolders, sqlTableFoldersMapping, sb.String())
  377. }
  378. func getRelatedUsersForFoldersQuery(folders []vfs.BaseVirtualFolder) string {
  379. var sb strings.Builder
  380. for _, f := range folders {
  381. if sb.Len() == 0 {
  382. sb.WriteString("(")
  383. } else {
  384. sb.WriteString(",")
  385. }
  386. sb.WriteString(strconv.FormatInt(f.ID, 10))
  387. }
  388. if sb.Len() > 0 {
  389. sb.WriteString(")")
  390. }
  391. return fmt.Sprintf(`SELECT fm.folder_id,u.username FROM %v fm INNER JOIN %v u ON fm.user_id = u.id
  392. WHERE fm.folder_id IN %v ORDER BY fm.folder_id`, sqlTableFoldersMapping, sqlTableUsers, sb.String())
  393. }
  394. func getActiveTransfersQuery() string {
  395. return fmt.Sprintf(`SELECT transfer_id,connection_id,transfer_type,username,folder_name,ip,truncated_size,
  396. current_ul_size,current_dl_size,created_at,updated_at FROM %v WHERE updated_at > %v`,
  397. sqlTableActiveTransfers, sqlPlaceholders[0])
  398. }
  399. func getAddActiveTransferQuery() string {
  400. return fmt.Sprintf(`INSERT INTO %v (transfer_id,connection_id,transfer_type,username,folder_name,ip,truncated_size,
  401. current_ul_size,current_dl_size,created_at,updated_at) VALUES (%v,%v,%v,%v,%v,%v,%v,%v,%v,%v,%v)`,
  402. sqlTableActiveTransfers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3],
  403. sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8],
  404. sqlPlaceholders[9], sqlPlaceholders[10])
  405. }
  406. func getUpdateActiveTransferSizesQuery() string {
  407. return fmt.Sprintf(`UPDATE %v SET current_ul_size=%v,current_dl_size=%v,updated_at=%v WHERE connection_id = %v AND transfer_id = %v`,
  408. sqlTableActiveTransfers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4])
  409. }
  410. func getRemoveActiveTransferQuery() string {
  411. return fmt.Sprintf(`DELETE FROM %v WHERE connection_id = %v AND transfer_id = %v`,
  412. sqlTableActiveTransfers, sqlPlaceholders[0], sqlPlaceholders[1])
  413. }
  414. func getCleanupActiveTransfersQuery() string {
  415. return fmt.Sprintf(`DELETE FROM %v WHERE updated_at < %v`, sqlTableActiveTransfers, sqlPlaceholders[0])
  416. }
  417. func getDatabaseVersionQuery() string {
  418. return fmt.Sprintf("SELECT version from %v LIMIT 1", sqlTableSchemaVersion)
  419. }
  420. func getUpdateDBVersionQuery() string {
  421. return fmt.Sprintf(`UPDATE %v SET version=%v`, sqlTableSchemaVersion, sqlPlaceholders[0])
  422. }