sqlqueries.go 30 KB

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