sqlqueries.go 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  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. selectGroupFields = "id,name,description,created_at,updated_at,user_settings"
  19. )
  20. func getSQLPlaceholders() []string {
  21. var placeholders []string
  22. for i := 1; i <= 50; i++ {
  23. if config.Driver == PGSQLDataProviderName || config.Driver == CockroachDataProviderName {
  24. placeholders = append(placeholders, fmt.Sprintf("$%v", i))
  25. } else {
  26. placeholders = append(placeholders, "?")
  27. }
  28. }
  29. return placeholders
  30. }
  31. func getAddDefenderHostQuery() string {
  32. if config.Driver == MySQLDataProviderName {
  33. return fmt.Sprintf("INSERT INTO %v (`ip`,`updated_at`,`ban_time`) VALUES (%v,%v,0) ON DUPLICATE KEY UPDATE `updated_at`=VALUES(`updated_at`)",
  34. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  35. }
  36. 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`,
  37. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  38. }
  39. func getAddDefenderEventQuery() string {
  40. return fmt.Sprintf(`INSERT INTO %v (date_time,score,host_id) VALUES (%v,%v,(SELECT id from %v WHERE ip = %v))`,
  41. sqlTableDefenderEvents, sqlPlaceholders[0], sqlPlaceholders[1], sqlTableDefenderHosts, sqlPlaceholders[2])
  42. }
  43. func getDefenderHostsQuery() string {
  44. 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`,
  45. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  46. }
  47. func getDefenderHostQuery() string {
  48. return fmt.Sprintf(`SELECT id,ip,ban_time FROM %v WHERE ip = %v AND (updated_at >= %v OR ban_time > 0)`,
  49. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  50. }
  51. func getDefenderEventsQuery(hostIDS []int64) string {
  52. var sb strings.Builder
  53. for _, hID := range hostIDS {
  54. if sb.Len() == 0 {
  55. sb.WriteString("(")
  56. } else {
  57. sb.WriteString(",")
  58. }
  59. sb.WriteString(strconv.FormatInt(hID, 10))
  60. }
  61. if sb.Len() > 0 {
  62. sb.WriteString(")")
  63. } else {
  64. sb.WriteString("(0)")
  65. }
  66. return fmt.Sprintf(`SELECT host_id,SUM(score) FROM %v WHERE date_time >= %v AND host_id IN %v GROUP BY host_id`,
  67. sqlTableDefenderEvents, sqlPlaceholders[0], sb.String())
  68. }
  69. func getDefenderIsHostBannedQuery() string {
  70. return fmt.Sprintf(`SELECT id FROM %v WHERE ip = %v AND ban_time >= %v`,
  71. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  72. }
  73. func getDefenderIncrementBanTimeQuery() string {
  74. return fmt.Sprintf(`UPDATE %v SET ban_time = ban_time + %v WHERE ip = %v`,
  75. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  76. }
  77. func getDefenderSetBanTimeQuery() string {
  78. return fmt.Sprintf(`UPDATE %v SET ban_time = %v WHERE ip = %v`,
  79. sqlTableDefenderHosts, sqlPlaceholders[0], sqlPlaceholders[1])
  80. }
  81. func getDeleteDefenderHostQuery() string {
  82. return fmt.Sprintf(`DELETE FROM %v WHERE ip = %v`, sqlTableDefenderHosts, sqlPlaceholders[0])
  83. }
  84. func getDefenderHostsCleanupQuery() string {
  85. return fmt.Sprintf(`DELETE FROM %v WHERE ban_time < %v AND NOT EXISTS (
  86. SELECT id FROM %v WHERE %v.host_id = %v.id AND %v.date_time > %v)`,
  87. sqlTableDefenderHosts, sqlPlaceholders[0], sqlTableDefenderEvents, sqlTableDefenderEvents, sqlTableDefenderHosts,
  88. sqlTableDefenderEvents, sqlPlaceholders[1])
  89. }
  90. func getDefenderEventsCleanupQuery() string {
  91. return fmt.Sprintf(`DELETE FROM %v WHERE date_time < %v`, sqlTableDefenderEvents, sqlPlaceholders[0])
  92. }
  93. func getGroupByNameQuery() string {
  94. return fmt.Sprintf(`SELECT %s FROM %s WHERE name = %s`, selectGroupFields, sqlTableGroups, sqlPlaceholders[0])
  95. }
  96. func getGroupsQuery(order string, minimal bool) string {
  97. var fieldSelection string
  98. if minimal {
  99. fieldSelection = "id,name"
  100. } else {
  101. fieldSelection = selectGroupFields
  102. }
  103. return fmt.Sprintf(`SELECT %s FROM %s ORDER BY name %s LIMIT %v OFFSET %v`, fieldSelection, sqlTableGroups,
  104. order, sqlPlaceholders[0], sqlPlaceholders[1])
  105. }
  106. func getGroupsWithNamesQuery(numArgs int) string {
  107. var sb strings.Builder
  108. for idx := 0; idx < numArgs; idx++ {
  109. if sb.Len() == 0 {
  110. sb.WriteString("(")
  111. } else {
  112. sb.WriteString(",")
  113. }
  114. sb.WriteString(sqlPlaceholders[idx])
  115. }
  116. if sb.Len() > 0 {
  117. sb.WriteString(")")
  118. } else {
  119. sb.WriteString("('')")
  120. }
  121. return fmt.Sprintf(`SELECT %s FROM %s WHERE name in %s`, selectGroupFields, sqlTableGroups, sb.String())
  122. }
  123. func getUsersInGroupsQuery(numArgs int) string {
  124. var sb strings.Builder
  125. for idx := 0; idx < numArgs; idx++ {
  126. if sb.Len() == 0 {
  127. sb.WriteString("(")
  128. } else {
  129. sb.WriteString(",")
  130. }
  131. sb.WriteString(sqlPlaceholders[idx])
  132. }
  133. if sb.Len() > 0 {
  134. sb.WriteString(")")
  135. } else {
  136. sb.WriteString("('')")
  137. }
  138. 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)))`,
  139. sqlTableUsers, sqlTableUsersGroupsMapping, sqlTableGroups, sb.String())
  140. }
  141. func getDumpGroupsQuery() string {
  142. return fmt.Sprintf(`SELECT %s FROM %s`, selectGroupFields, sqlTableGroups)
  143. }
  144. func getAddGroupQuery() string {
  145. return fmt.Sprintf(`INSERT INTO %s (name,description,created_at,updated_at,user_settings)
  146. VALUES (%v,%v,%v,%v,%v)`, sqlTableGroups, sqlPlaceholders[0], sqlPlaceholders[1],
  147. sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4])
  148. }
  149. func getUpdateGroupQuery() string {
  150. return fmt.Sprintf(`UPDATE %s SET description=%v,user_settings=%v,updated_at=%v
  151. WHERE name = %s`, sqlTableGroups, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2],
  152. sqlPlaceholders[3])
  153. }
  154. func getDeleteGroupQuery() string {
  155. return fmt.Sprintf(`DELETE FROM %s WHERE name = %s`, sqlTableGroups, sqlPlaceholders[0])
  156. }
  157. func getAdminByUsernameQuery() string {
  158. return fmt.Sprintf(`SELECT %v FROM %v WHERE username = %v`, selectAdminFields, sqlTableAdmins, sqlPlaceholders[0])
  159. }
  160. func getAdminsQuery(order string) string {
  161. return fmt.Sprintf(`SELECT %v FROM %v ORDER BY username %v LIMIT %v OFFSET %v`, selectAdminFields, sqlTableAdmins,
  162. order, sqlPlaceholders[0], sqlPlaceholders[1])
  163. }
  164. func getDumpAdminsQuery() string {
  165. return fmt.Sprintf(`SELECT %v FROM %v`, selectAdminFields, sqlTableAdmins)
  166. }
  167. func getAddAdminQuery() string {
  168. return fmt.Sprintf(`INSERT INTO %v (username,password,status,email,permissions,filters,additional_info,description,created_at,updated_at,last_login)
  169. VALUES (%v,%v,%v,%v,%v,%v,%v,%v,%v,%v,0)`, sqlTableAdmins, sqlPlaceholders[0], sqlPlaceholders[1],
  170. sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7],
  171. sqlPlaceholders[8], sqlPlaceholders[9])
  172. }
  173. func getUpdateAdminQuery() string {
  174. return fmt.Sprintf(`UPDATE %v SET password=%v,status=%v,email=%v,permissions=%v,filters=%v,additional_info=%v,description=%v,updated_at=%v
  175. WHERE username = %v`, sqlTableAdmins, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2],
  176. sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8])
  177. }
  178. func getDeleteAdminQuery() string {
  179. return fmt.Sprintf(`DELETE FROM %v WHERE username = %v`, sqlTableAdmins, sqlPlaceholders[0])
  180. }
  181. func getShareByIDQuery(filterUser bool) string {
  182. if filterUser {
  183. 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`,
  184. selectShareFields, sqlTableShares, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1])
  185. }
  186. return fmt.Sprintf(`SELECT %v FROM %v s INNER JOIN %v u ON s.user_id = u.id WHERE s.share_id = %v`,
  187. selectShareFields, sqlTableShares, sqlTableUsers, sqlPlaceholders[0])
  188. }
  189. func getSharesQuery(order string) string {
  190. 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`,
  191. selectShareFields, sqlTableShares, sqlTableUsers, sqlPlaceholders[0], order, sqlPlaceholders[1], sqlPlaceholders[2])
  192. }
  193. func getDumpSharesQuery() string {
  194. return fmt.Sprintf(`SELECT %v FROM %v s INNER JOIN %v u ON s.user_id = u.id`,
  195. selectShareFields, sqlTableShares, sqlTableUsers)
  196. }
  197. func getAddShareQuery() string {
  198. return fmt.Sprintf(`INSERT INTO %v (share_id,name,description,scope,paths,created_at,updated_at,last_use_at,
  199. 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)`,
  200. sqlTableShares, sqlPlaceholders[0], sqlPlaceholders[1],
  201. sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6],
  202. sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9], sqlPlaceholders[10], sqlPlaceholders[11],
  203. sqlPlaceholders[12], sqlPlaceholders[13])
  204. }
  205. func getUpdateShareRestoreQuery() string {
  206. return fmt.Sprintf(`UPDATE %v SET name=%v,description=%v,scope=%v,paths=%v,created_at=%v,updated_at=%v,
  207. 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,
  208. sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  209. sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9],
  210. sqlPlaceholders[10], sqlPlaceholders[11], sqlPlaceholders[12], sqlPlaceholders[13])
  211. }
  212. func getUpdateShareQuery() string {
  213. return fmt.Sprintf(`UPDATE %v SET name=%v,description=%v,scope=%v,paths=%v,updated_at=%v,expires_at=%v,
  214. password=%v,max_tokens=%v,allow_from=%v,user_id=%v WHERE share_id = %v`, sqlTableShares,
  215. sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  216. sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9],
  217. sqlPlaceholders[10])
  218. }
  219. func getDeleteShareQuery() string {
  220. return fmt.Sprintf(`DELETE FROM %v WHERE share_id = %v`, sqlTableShares, sqlPlaceholders[0])
  221. }
  222. func getAPIKeyByIDQuery() string {
  223. return fmt.Sprintf(`SELECT %v FROM %v WHERE key_id = %v`, selectAPIKeyFields, sqlTableAPIKeys, sqlPlaceholders[0])
  224. }
  225. func getAPIKeysQuery(order string) string {
  226. return fmt.Sprintf(`SELECT %v FROM %v ORDER BY key_id %v LIMIT %v OFFSET %v`, selectAPIKeyFields, sqlTableAPIKeys,
  227. order, sqlPlaceholders[0], sqlPlaceholders[1])
  228. }
  229. func getDumpAPIKeysQuery() string {
  230. return fmt.Sprintf(`SELECT %v FROM %v`, selectAPIKeyFields, sqlTableAPIKeys)
  231. }
  232. func getAddAPIKeyQuery() string {
  233. 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)
  234. VALUES (%v,%v,%v,%v,%v,%v,%v,%v,%v,%v,%v)`, sqlTableAPIKeys, sqlPlaceholders[0], sqlPlaceholders[1],
  235. sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6],
  236. sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9], sqlPlaceholders[10])
  237. }
  238. func getUpdateAPIKeyQuery() string {
  239. return fmt.Sprintf(`UPDATE %v SET name=%v,scope=%v,expires_at=%v,user_id=%v,admin_id=%v,description=%v,updated_at=%v
  240. WHERE key_id = %v`, sqlTableAPIKeys, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2],
  241. sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7])
  242. }
  243. func getDeleteAPIKeyQuery() string {
  244. return fmt.Sprintf(`DELETE FROM %v WHERE key_id = %v`, sqlTableAPIKeys, sqlPlaceholders[0])
  245. }
  246. func getRelatedUsersForAPIKeysQuery(apiKeys []APIKey) string {
  247. var sb strings.Builder
  248. for _, k := range apiKeys {
  249. if k.userID == 0 {
  250. continue
  251. }
  252. if sb.Len() == 0 {
  253. sb.WriteString("(")
  254. } else {
  255. sb.WriteString(",")
  256. }
  257. sb.WriteString(strconv.FormatInt(k.userID, 10))
  258. }
  259. if sb.Len() > 0 {
  260. sb.WriteString(")")
  261. } else {
  262. sb.WriteString("(0)")
  263. }
  264. return fmt.Sprintf(`SELECT id,username FROM %v WHERE id IN %v`, sqlTableUsers, sb.String())
  265. }
  266. func getRelatedAdminsForAPIKeysQuery(apiKeys []APIKey) string {
  267. var sb strings.Builder
  268. for _, k := range apiKeys {
  269. if k.adminID == 0 {
  270. continue
  271. }
  272. if sb.Len() == 0 {
  273. sb.WriteString("(")
  274. } else {
  275. sb.WriteString(",")
  276. }
  277. sb.WriteString(strconv.FormatInt(k.adminID, 10))
  278. }
  279. if sb.Len() > 0 {
  280. sb.WriteString(")")
  281. } else {
  282. sb.WriteString("(0)")
  283. }
  284. return fmt.Sprintf(`SELECT id,username FROM %v WHERE id IN %v`, sqlTableAdmins, sb.String())
  285. }
  286. func getUserByUsernameQuery() string {
  287. return fmt.Sprintf(`SELECT %v FROM %v WHERE username = %v`, selectUserFields, sqlTableUsers, sqlPlaceholders[0])
  288. }
  289. func getUsersQuery(order string) string {
  290. return fmt.Sprintf(`SELECT %v FROM %v ORDER BY username %v LIMIT %v OFFSET %v`, selectUserFields, sqlTableUsers,
  291. order, sqlPlaceholders[0], sqlPlaceholders[1])
  292. }
  293. func getUsersForQuotaCheckQuery(numArgs int) string {
  294. var sb strings.Builder
  295. for idx := 0; idx < numArgs; idx++ {
  296. if sb.Len() == 0 {
  297. sb.WriteString("(")
  298. } else {
  299. sb.WriteString(",")
  300. }
  301. sb.WriteString(sqlPlaceholders[idx])
  302. }
  303. if sb.Len() > 0 {
  304. sb.WriteString(")")
  305. }
  306. return fmt.Sprintf(`SELECT id,username,quota_size,used_quota_size,total_data_transfer,upload_data_transfer,
  307. download_data_transfer,used_upload_data_transfer,used_download_data_transfer,filters FROM %v WHERE username IN %v`,
  308. sqlTableUsers, sb.String())
  309. }
  310. func getRecentlyUpdatedUsersQuery() string {
  311. return fmt.Sprintf(`SELECT %v FROM %v WHERE updated_at >= %v`, selectUserFields, sqlTableUsers, sqlPlaceholders[0])
  312. }
  313. func getDumpUsersQuery() string {
  314. return fmt.Sprintf(`SELECT %v FROM %v`, selectUserFields, sqlTableUsers)
  315. }
  316. func getDumpFoldersQuery() string {
  317. return fmt.Sprintf(`SELECT %v FROM %v`, selectFolderFields, sqlTableFolders)
  318. }
  319. func getUpdateTransferQuotaQuery(reset bool) string {
  320. if reset {
  321. return fmt.Sprintf(`UPDATE %v SET used_upload_data_transfer = %v,used_download_data_transfer = %v,last_quota_update = %v
  322. WHERE username = %v`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  323. }
  324. return fmt.Sprintf(`UPDATE %v SET used_upload_data_transfer = used_upload_data_transfer + %v,
  325. used_download_data_transfer = used_download_data_transfer + %v,last_quota_update = %v
  326. WHERE username = %v`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  327. }
  328. func getUpdateQuotaQuery(reset bool) string {
  329. if reset {
  330. return fmt.Sprintf(`UPDATE %v SET used_quota_size = %v,used_quota_files = %v,last_quota_update = %v
  331. WHERE username = %v`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  332. }
  333. return fmt.Sprintf(`UPDATE %v SET used_quota_size = used_quota_size + %v,used_quota_files = used_quota_files + %v,last_quota_update = %v
  334. WHERE username = %v`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  335. }
  336. func getSetUpdateAtQuery() string {
  337. return fmt.Sprintf(`UPDATE %v SET updated_at = %v WHERE username = %v`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1])
  338. }
  339. func getUpdateLastLoginQuery() string {
  340. return fmt.Sprintf(`UPDATE %v SET last_login = %v WHERE username = %v`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1])
  341. }
  342. func getUpdateAdminLastLoginQuery() string {
  343. return fmt.Sprintf(`UPDATE %v SET last_login = %v WHERE username = %v`, sqlTableAdmins, sqlPlaceholders[0], sqlPlaceholders[1])
  344. }
  345. func getUpdateAPIKeyLastUseQuery() string {
  346. return fmt.Sprintf(`UPDATE %v SET last_use_at = %v WHERE key_id = %v`, sqlTableAPIKeys, sqlPlaceholders[0], sqlPlaceholders[1])
  347. }
  348. func getUpdateShareLastUseQuery() string {
  349. return fmt.Sprintf(`UPDATE %v SET last_use_at = %v, used_tokens = used_tokens +%v WHERE share_id = %v`,
  350. sqlTableShares, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2])
  351. }
  352. func getQuotaQuery() string {
  353. return fmt.Sprintf(`SELECT used_quota_size,used_quota_files,used_upload_data_transfer,
  354. used_download_data_transfer FROM %v WHERE username = %v`,
  355. sqlTableUsers, sqlPlaceholders[0])
  356. }
  357. func getAddUserQuery() string {
  358. return fmt.Sprintf(`INSERT INTO %v (username,password,public_keys,home_dir,uid,gid,max_sessions,quota_size,quota_files,permissions,
  359. used_quota_size,used_quota_files,last_quota_update,upload_bandwidth,download_bandwidth,status,last_login,expiration_date,filters,
  360. filesystem,additional_info,description,email,created_at,updated_at,upload_data_transfer,download_data_transfer,total_data_transfer,
  361. used_upload_data_transfer,used_download_data_transfer)
  362. 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)`,
  363. sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  364. sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9],
  365. sqlPlaceholders[10], sqlPlaceholders[11], sqlPlaceholders[12], sqlPlaceholders[13], sqlPlaceholders[14],
  366. sqlPlaceholders[15], sqlPlaceholders[16], sqlPlaceholders[17], sqlPlaceholders[18], sqlPlaceholders[19],
  367. sqlPlaceholders[20], sqlPlaceholders[21], sqlPlaceholders[22], sqlPlaceholders[23])
  368. }
  369. func getUpdateUserQuery() string {
  370. return fmt.Sprintf(`UPDATE %v SET password=%v,public_keys=%v,home_dir=%v,uid=%v,gid=%v,max_sessions=%v,quota_size=%v,
  371. quota_files=%v,permissions=%v,upload_bandwidth=%v,download_bandwidth=%v,status=%v,expiration_date=%v,filters=%v,filesystem=%v,
  372. additional_info=%v,description=%v,email=%v,updated_at=%v,upload_data_transfer=%v,download_data_transfer=%v,
  373. total_data_transfer=%v WHERE id = %v`,
  374. sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4],
  375. sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8], sqlPlaceholders[9],
  376. sqlPlaceholders[10], sqlPlaceholders[11], sqlPlaceholders[12], sqlPlaceholders[13], sqlPlaceholders[14],
  377. sqlPlaceholders[15], sqlPlaceholders[16], sqlPlaceholders[17], sqlPlaceholders[18], sqlPlaceholders[19],
  378. sqlPlaceholders[20], sqlPlaceholders[21], sqlPlaceholders[22])
  379. }
  380. func getUpdateUserPasswordQuery() string {
  381. return fmt.Sprintf(`UPDATE %v SET password=%v WHERE username = %v`, sqlTableUsers, sqlPlaceholders[0], sqlPlaceholders[1])
  382. }
  383. func getDeleteUserQuery() string {
  384. return fmt.Sprintf(`DELETE FROM %v WHERE id = %v`, sqlTableUsers, sqlPlaceholders[0])
  385. }
  386. func getFolderByNameQuery() string {
  387. return fmt.Sprintf(`SELECT %v FROM %v WHERE name = %v`, selectFolderFields, sqlTableFolders, sqlPlaceholders[0])
  388. }
  389. func checkFolderNameQuery() string {
  390. return fmt.Sprintf(`SELECT name FROM %v WHERE name = %v`, sqlTableFolders, sqlPlaceholders[0])
  391. }
  392. func getAddFolderQuery() string {
  393. return fmt.Sprintf(`INSERT INTO %v (path,used_quota_size,used_quota_files,last_quota_update,name,description,filesystem)
  394. VALUES (%v,%v,%v,%v,%v,%v,%v)`, sqlTableFolders, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2],
  395. sqlPlaceholders[3], sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6])
  396. }
  397. func getUpdateFolderQuery() string {
  398. return fmt.Sprintf(`UPDATE %v SET path=%v,description=%v,filesystem=%v WHERE name = %v`, sqlTableFolders, sqlPlaceholders[0],
  399. sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  400. }
  401. func getDeleteFolderQuery() string {
  402. return fmt.Sprintf(`DELETE FROM %v WHERE id = %v`, sqlTableFolders, sqlPlaceholders[0])
  403. }
  404. func getClearUserGroupMappingQuery() string {
  405. return fmt.Sprintf(`DELETE FROM %v WHERE user_id = (SELECT id FROM %v WHERE username = %v)`, sqlTableUsersGroupsMapping,
  406. sqlTableUsers, sqlPlaceholders[0])
  407. }
  408. func getAddUserGroupMappingQuery() string {
  409. return fmt.Sprintf(`INSERT INTO %v (user_id,group_id,group_type) VALUES ((SELECT id FROM %v WHERE username = %v),
  410. (SELECT id FROM %v WHERE name = %v),%v)`,
  411. sqlTableUsersGroupsMapping, sqlTableUsers, sqlPlaceholders[0], sqlTableGroups, sqlPlaceholders[1], sqlPlaceholders[2])
  412. }
  413. func getClearGroupFolderMappingQuery() string {
  414. return fmt.Sprintf(`DELETE FROM %v WHERE group_id = (SELECT id FROM %v WHERE name = %v)`, sqlTableGroupsFoldersMapping,
  415. sqlTableGroups, sqlPlaceholders[0])
  416. }
  417. func getAddGroupFolderMappingQuery() string {
  418. return fmt.Sprintf(`INSERT INTO %v (virtual_path,quota_size,quota_files,folder_id,group_id)
  419. VALUES (%v,%v,%v,(SELECT id FROM %v WHERE name = %v),(SELECT id FROM %v WHERE name = %v))`,
  420. sqlTableGroupsFoldersMapping, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlTableFolders,
  421. sqlPlaceholders[3], sqlTableGroups, sqlPlaceholders[4])
  422. }
  423. func getClearUserFolderMappingQuery() string {
  424. return fmt.Sprintf(`DELETE FROM %v WHERE user_id = (SELECT id FROM %v WHERE username = %v)`, sqlTableUsersFoldersMapping,
  425. sqlTableUsers, sqlPlaceholders[0])
  426. }
  427. func getAddUserFolderMappingQuery() string {
  428. return fmt.Sprintf(`INSERT INTO %v (virtual_path,quota_size,quota_files,folder_id,user_id)
  429. VALUES (%v,%v,%v,%v,(SELECT id FROM %v WHERE username = %v))`, sqlTableUsersFoldersMapping, sqlPlaceholders[0],
  430. sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlTableUsers, sqlPlaceholders[4])
  431. }
  432. func getFoldersQuery(order string, minimal bool) string {
  433. var fieldSelection string
  434. if minimal {
  435. fieldSelection = "id,name"
  436. } else {
  437. fieldSelection = selectFolderFields
  438. }
  439. return fmt.Sprintf(`SELECT %v FROM %v ORDER BY name %v LIMIT %v OFFSET %v`, fieldSelection, sqlTableFolders,
  440. order, sqlPlaceholders[0], sqlPlaceholders[1])
  441. }
  442. func getUpdateFolderQuotaQuery(reset bool) string {
  443. if reset {
  444. return fmt.Sprintf(`UPDATE %v SET used_quota_size = %v,used_quota_files = %v,last_quota_update = %v
  445. WHERE name = %v`, sqlTableFolders, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  446. }
  447. return fmt.Sprintf(`UPDATE %v SET used_quota_size = used_quota_size + %v,used_quota_files = used_quota_files + %v,last_quota_update = %v
  448. WHERE name = %v`, sqlTableFolders, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3])
  449. }
  450. func getQuotaFolderQuery() string {
  451. return fmt.Sprintf(`SELECT used_quota_size,used_quota_files FROM %v WHERE name = %v`, sqlTableFolders,
  452. sqlPlaceholders[0])
  453. }
  454. func getRelatedGroupsForUsersQuery(users []User) string {
  455. var sb strings.Builder
  456. for _, u := range users {
  457. if sb.Len() == 0 {
  458. sb.WriteString("(")
  459. } else {
  460. sb.WriteString(",")
  461. }
  462. sb.WriteString(strconv.FormatInt(u.ID, 10))
  463. }
  464. if sb.Len() > 0 {
  465. sb.WriteString(")")
  466. }
  467. return fmt.Sprintf(`SELECT g.name,ug.group_type,ug.user_id FROM %v g INNER JOIN %v ug ON g.id = ug.group_id WHERE
  468. ug.user_id IN %v ORDER BY ug.user_id`, sqlTableGroups, sqlTableUsersGroupsMapping, sb.String())
  469. }
  470. func getRelatedFoldersForUsersQuery(users []User) string {
  471. var sb strings.Builder
  472. for _, u := range users {
  473. if sb.Len() == 0 {
  474. sb.WriteString("(")
  475. } else {
  476. sb.WriteString(",")
  477. }
  478. sb.WriteString(strconv.FormatInt(u.ID, 10))
  479. }
  480. if sb.Len() > 0 {
  481. sb.WriteString(")")
  482. }
  483. 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,
  484. 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
  485. fm.user_id IN %v ORDER BY fm.user_id`, sqlTableFolders, sqlTableUsersFoldersMapping, sb.String())
  486. }
  487. func getRelatedUsersForFoldersQuery(folders []vfs.BaseVirtualFolder) string {
  488. var sb strings.Builder
  489. for _, f := range folders {
  490. if sb.Len() == 0 {
  491. sb.WriteString("(")
  492. } else {
  493. sb.WriteString(",")
  494. }
  495. sb.WriteString(strconv.FormatInt(f.ID, 10))
  496. }
  497. if sb.Len() > 0 {
  498. sb.WriteString(")")
  499. }
  500. return fmt.Sprintf(`SELECT fm.folder_id,u.username FROM %v fm INNER JOIN %v u ON fm.user_id = u.id
  501. WHERE fm.folder_id IN %v ORDER BY fm.folder_id`, sqlTableUsersFoldersMapping, sqlTableUsers, sb.String())
  502. }
  503. func getRelatedGroupsForFoldersQuery(folders []vfs.BaseVirtualFolder) string {
  504. var sb strings.Builder
  505. for _, f := range folders {
  506. if sb.Len() == 0 {
  507. sb.WriteString("(")
  508. } else {
  509. sb.WriteString(",")
  510. }
  511. sb.WriteString(strconv.FormatInt(f.ID, 10))
  512. }
  513. if sb.Len() > 0 {
  514. sb.WriteString(")")
  515. }
  516. return fmt.Sprintf(`SELECT fm.folder_id,g.name FROM %v fm INNER JOIN %v g ON fm.group_id = g.id
  517. WHERE fm.folder_id IN %v ORDER BY fm.folder_id`, sqlTableGroupsFoldersMapping, sqlTableGroups, sb.String())
  518. }
  519. func getRelatedUsersForGroupsQuery(groups []Group) string {
  520. var sb strings.Builder
  521. for _, g := range groups {
  522. if sb.Len() == 0 {
  523. sb.WriteString("(")
  524. } else {
  525. sb.WriteString(",")
  526. }
  527. sb.WriteString(strconv.FormatInt(g.ID, 10))
  528. }
  529. if sb.Len() > 0 {
  530. sb.WriteString(")")
  531. }
  532. return fmt.Sprintf(`SELECT um.group_id,u.username FROM %v um INNER JOIN %v u ON um.user_id = u.id
  533. WHERE um.group_id IN %v ORDER BY um.group_id`, sqlTableUsersGroupsMapping, sqlTableUsers, sb.String())
  534. }
  535. func getRelatedFoldersForGroupsQuery(groups []Group) string {
  536. var sb strings.Builder
  537. for _, g := range groups {
  538. if sb.Len() == 0 {
  539. sb.WriteString("(")
  540. } else {
  541. sb.WriteString(",")
  542. }
  543. sb.WriteString(strconv.FormatInt(g.ID, 10))
  544. }
  545. if sb.Len() > 0 {
  546. sb.WriteString(")")
  547. }
  548. 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,
  549. 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
  550. fm.group_id IN %v ORDER BY fm.group_id`, sqlTableFolders, sqlTableGroupsFoldersMapping, sb.String())
  551. }
  552. func getActiveTransfersQuery() string {
  553. return fmt.Sprintf(`SELECT transfer_id,connection_id,transfer_type,username,folder_name,ip,truncated_size,
  554. current_ul_size,current_dl_size,created_at,updated_at FROM %v WHERE updated_at > %v`,
  555. sqlTableActiveTransfers, sqlPlaceholders[0])
  556. }
  557. func getAddActiveTransferQuery() string {
  558. return fmt.Sprintf(`INSERT INTO %v (transfer_id,connection_id,transfer_type,username,folder_name,ip,truncated_size,
  559. current_ul_size,current_dl_size,created_at,updated_at) VALUES (%v,%v,%v,%v,%v,%v,%v,%v,%v,%v,%v)`,
  560. sqlTableActiveTransfers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3],
  561. sqlPlaceholders[4], sqlPlaceholders[5], sqlPlaceholders[6], sqlPlaceholders[7], sqlPlaceholders[8],
  562. sqlPlaceholders[9], sqlPlaceholders[10])
  563. }
  564. func getUpdateActiveTransferSizesQuery() string {
  565. 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`,
  566. sqlTableActiveTransfers, sqlPlaceholders[0], sqlPlaceholders[1], sqlPlaceholders[2], sqlPlaceholders[3], sqlPlaceholders[4])
  567. }
  568. func getRemoveActiveTransferQuery() string {
  569. return fmt.Sprintf(`DELETE FROM %v WHERE connection_id = %v AND transfer_id = %v`,
  570. sqlTableActiveTransfers, sqlPlaceholders[0], sqlPlaceholders[1])
  571. }
  572. func getCleanupActiveTransfersQuery() string {
  573. return fmt.Sprintf(`DELETE FROM %v WHERE updated_at < %v`, sqlTableActiveTransfers, sqlPlaceholders[0])
  574. }
  575. func getDatabaseVersionQuery() string {
  576. return fmt.Sprintf("SELECT version from %v LIMIT 1", sqlTableSchemaVersion)
  577. }
  578. func getUpdateDBVersionQuery() string {
  579. return fmt.Sprintf(`UPDATE %v SET version=%v`, sqlTableSchemaVersion, sqlPlaceholders[0])
  580. }