sqlqueries.go 18 KB

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