@budibase/server 1.0.80-alpha.3 → 1.0.80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/__mocks__/node-fetch.ts +0 -1
  2. package/builder/assets/index.22a39cc9.js +1352 -0
  3. package/builder/assets/{index.c57242d4.css → index.c8d1e8f0.css} +2 -2
  4. package/builder/assets/{vendor.a7c6ad0a.js → vendor.20f80cec.js} +216 -190
  5. package/builder/index.html +3 -3
  6. package/coverage/clover.xml +2327 -2390
  7. package/coverage/coverage-final.json +137 -138
  8. package/coverage/lcov-report/api/controllers/analytics.js.html +6 -6
  9. package/coverage/lcov-report/api/controllers/apikeys.js.html +6 -6
  10. package/coverage/lcov-report/api/controllers/application.js.html +149 -152
  11. package/coverage/lcov-report/api/controllers/auth.js.html +7 -7
  12. package/coverage/lcov-report/api/controllers/automation.js.html +21 -21
  13. package/coverage/lcov-report/api/controllers/backup.js.html +3 -3
  14. package/coverage/lcov-report/api/controllers/cloud.js.html +11 -11
  15. package/coverage/lcov-report/api/controllers/component.js.html +5 -5
  16. package/coverage/lcov-report/api/controllers/datasource.js.html +16 -16
  17. package/coverage/lcov-report/api/controllers/dev.js.html +19 -19
  18. package/coverage/lcov-report/api/controllers/index.html +16 -16
  19. package/coverage/lcov-report/api/controllers/integration.js.html +4 -4
  20. package/coverage/lcov-report/api/controllers/layout.js.html +6 -6
  21. package/coverage/lcov-report/api/controllers/metadata.js.html +9 -9
  22. package/coverage/lcov-report/api/controllers/migrations.js.html +4 -4
  23. package/coverage/lcov-report/api/controllers/permission.js.html +15 -15
  24. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  25. package/coverage/lcov-report/api/controllers/query/index.js.html +26 -26
  26. package/coverage/lcov-report/api/controllers/query/validation.js.html +10 -10
  27. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  28. package/coverage/lcov-report/api/controllers/routing.js.html +9 -9
  29. package/coverage/lcov-report/api/controllers/row/external.js.html +16 -16
  30. package/coverage/lcov-report/api/controllers/row/index.html +27 -27
  31. package/coverage/lcov-report/api/controllers/row/index.js.html +46 -46
  32. package/coverage/lcov-report/api/controllers/row/internal.js.html +82 -94
  33. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +204 -204
  34. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +24 -24
  35. package/coverage/lcov-report/api/controllers/row/utils.js.html +29 -29
  36. package/coverage/lcov-report/api/controllers/screen.js.html +7 -7
  37. package/coverage/lcov-report/api/controllers/script.js.html +4 -4
  38. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +49 -49
  39. package/coverage/lcov-report/api/controllers/table/external.js.html +12 -12
  40. package/coverage/lcov-report/api/controllers/table/index.html +11 -11
  41. package/coverage/lcov-report/api/controllers/table/index.js.html +44 -47
  42. package/coverage/lcov-report/api/controllers/table/internal.js.html +50 -50
  43. package/coverage/lcov-report/api/controllers/table/utils.js.html +80 -80
  44. package/coverage/lcov-report/api/controllers/templates.js.html +5 -5
  45. package/coverage/lcov-report/api/controllers/user.js.html +19 -19
  46. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  47. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  48. package/coverage/lcov-report/api/controllers/view/index.js.html +14 -14
  49. package/coverage/lcov-report/api/controllers/view/utils.js.html +12 -12
  50. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
  51. package/coverage/lcov-report/api/controllers/webhook.js.html +27 -18
  52. package/coverage/lcov-report/api/index.html +10 -10
  53. package/coverage/lcov-report/api/index.js.html +28 -37
  54. package/coverage/lcov-report/api/routes/analytics.js.html +6 -6
  55. package/coverage/lcov-report/api/routes/apikeys.js.html +8 -8
  56. package/coverage/lcov-report/api/routes/application.js.html +9 -9
  57. package/coverage/lcov-report/api/routes/auth.js.html +6 -6
  58. package/coverage/lcov-report/api/routes/automation.js.html +109 -19
  59. package/coverage/lcov-report/api/routes/backup.js.html +8 -8
  60. package/coverage/lcov-report/api/routes/cloud.js.html +8 -8
  61. package/coverage/lcov-report/api/routes/component.js.html +8 -8
  62. package/coverage/lcov-report/api/routes/datasource.js.html +156 -18
  63. package/coverage/lcov-report/api/routes/deploy.js.html +8 -8
  64. package/coverage/lcov-report/api/routes/dev.js.html +13 -13
  65. package/coverage/lcov-report/api/routes/index.html +35 -35
  66. package/coverage/lcov-report/api/routes/index.js.html +32 -38
  67. package/coverage/lcov-report/api/routes/integration.js.html +8 -8
  68. package/coverage/lcov-report/api/routes/layout.js.html +8 -8
  69. package/coverage/lcov-report/api/routes/metadata.js.html +9 -9
  70. package/coverage/lcov-report/api/routes/migrations.js.html +7 -7
  71. package/coverage/lcov-report/api/routes/permission.js.html +58 -16
  72. package/coverage/lcov-report/api/routes/query.js.html +10 -10
  73. package/coverage/lcov-report/api/routes/role.js.html +78 -15
  74. package/coverage/lcov-report/api/routes/routing.js.html +8 -8
  75. package/coverage/lcov-report/api/routes/row.js.html +14 -17
  76. package/coverage/lcov-report/api/routes/screen.js.html +95 -14
  77. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/static.js.html +13 -13
  79. package/coverage/lcov-report/api/routes/table.js.html +62 -17
  80. package/coverage/lcov-report/api/routes/templates.js.html +8 -8
  81. package/coverage/lcov-report/api/routes/user.js.html +8 -8
  82. package/coverage/lcov-report/api/routes/view.js.html +10 -10
  83. package/coverage/lcov-report/api/routes/webhook.js.html +62 -14
  84. package/coverage/lcov-report/automations/actions.js.html +24 -24
  85. package/coverage/lcov-report/automations/automationUtils.js.html +5 -5
  86. package/coverage/lcov-report/automations/bullboard.js.html +16 -16
  87. package/coverage/lcov-report/automations/index.html +1 -1
  88. package/coverage/lcov-report/automations/index.js.html +7 -7
  89. package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
  90. package/coverage/lcov-report/automations/steps/createRow.js.html +7 -7
  91. package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
  92. package/coverage/lcov-report/automations/steps/deleteRow.js.html +7 -7
  93. package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
  94. package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
  95. package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
  96. package/coverage/lcov-report/automations/steps/filter.js.html +9 -12
  97. package/coverage/lcov-report/automations/steps/index.html +1 -1
  98. package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
  99. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
  100. package/coverage/lcov-report/automations/steps/queryRows.js.html +11 -11
  101. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
  102. package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
  103. package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
  104. package/coverage/lcov-report/automations/steps/updateRow.js.html +6 -6
  105. package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
  106. package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
  107. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  108. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  109. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  111. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  112. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  113. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  114. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  115. package/coverage/lcov-report/automations/triggers.js.html +26 -26
  116. package/coverage/lcov-report/automations/utils.js.html +35 -35
  117. package/coverage/lcov-report/constants/index.html +5 -5
  118. package/coverage/lcov-report/constants/index.js.html +28 -40
  119. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  120. package/coverage/lcov-report/constants/screens.js.html +4 -4
  121. package/coverage/lcov-report/db/client.js.html +18 -18
  122. package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
  123. package/coverage/lcov-report/db/index.html +15 -15
  124. package/coverage/lcov-report/db/index.js.html +3 -3
  125. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +21 -21
  126. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  127. package/coverage/lcov-report/db/linkedRows/index.js.html +36 -36
  128. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +30 -30
  129. package/coverage/lcov-report/db/newid.js.html +4 -4
  130. package/coverage/lcov-report/db/utils.js.html +87 -123
  131. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  132. package/coverage/lcov-report/events/index.html +1 -1
  133. package/coverage/lcov-report/events/index.js.html +8 -8
  134. package/coverage/lcov-report/events/utils.js.html +18 -18
  135. package/coverage/lcov-report/index.html +74 -89
  136. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  137. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  138. package/coverage/lcov-report/middleware/appInfo.js.html +5 -5
  139. package/coverage/lcov-report/middleware/authorized.js.html +29 -29
  140. package/coverage/lcov-report/middleware/builder.js.html +16 -16
  141. package/coverage/lcov-report/middleware/currentapp.js.html +44 -44
  142. package/coverage/lcov-report/middleware/index.html +1 -1
  143. package/coverage/lcov-report/middleware/joi-validator.js.html +14 -14
  144. package/coverage/lcov-report/middleware/resourceId.js.html +29 -29
  145. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  146. package/coverage/lcov-report/middleware/usageQuota.js.html +17 -17
  147. package/coverage/lcov-report/middleware/utils.js.html +4 -4
  148. package/coverage/lcov-report/threads/automation.js.html +1 -1
  149. package/coverage/lcov-report/threads/index.html +19 -19
  150. package/coverage/lcov-report/threads/index.js.html +10 -10
  151. package/coverage/lcov-report/threads/query.js.html +39 -123
  152. package/coverage/lcov-report/threads/utils.js.html +14 -14
  153. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  154. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  155. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  156. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  157. package/coverage/lcov-report/utilities/global.js.html +28 -28
  158. package/coverage/lcov-report/utilities/index.html +18 -18
  159. package/coverage/lcov-report/utilities/index.js.html +24 -24
  160. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +9 -9
  161. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  162. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  163. package/coverage/lcov-report/utilities/routing/index.js.html +6 -6
  164. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  165. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +60 -60
  166. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +13 -13
  167. package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
  168. package/coverage/lcov-report/utilities/security.js.html +8 -8
  169. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  170. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  171. package/coverage/lcov-report/utilities/usageQuota/index.js.html +12 -12
  172. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +8 -8
  173. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  174. package/coverage/lcov-report/utilities/users.js.html +5 -5
  175. package/coverage/lcov-report/utilities/workerRequests.js.html +53 -200
  176. package/coverage/lcov.info +3233 -3332
  177. package/dist/api/controllers/application.js +0 -1
  178. package/dist/api/controllers/row/internal.js +1 -4
  179. package/dist/api/controllers/table/index.js +1 -2
  180. package/dist/api/controllers/webhook.js +5 -3
  181. package/dist/api/index.js +1 -3
  182. package/dist/api/routes/automation.js +31 -3
  183. package/dist/api/routes/datasource.js +50 -3
  184. package/dist/api/routes/index.js +0 -2
  185. package/dist/api/routes/permission.js +14 -4
  186. package/dist/api/routes/role.js +19 -3
  187. package/dist/api/routes/row.js +4 -3
  188. package/dist/api/routes/screen.js +23 -2
  189. package/dist/api/routes/table.js +17 -3
  190. package/dist/api/routes/tests/utilities/index.js +0 -23
  191. package/dist/api/routes/webhook.js +17 -2
  192. package/dist/automations/steps/filter.js +2 -2
  193. package/dist/automations/steps/queryRows.js +1 -1
  194. package/dist/automations/utils.js +2 -2
  195. package/dist/constants/index.js +0 -3
  196. package/dist/db/utils.js +0 -11
  197. package/dist/environment.js +0 -1
  198. package/dist/integrations/base/sql.js +1 -16
  199. package/dist/integrations/base/sqlTable.js +4 -8
  200. package/dist/integrations/googlesheets.js +0 -3
  201. package/dist/integrations/microsoftSqlServer.js +43 -60
  202. package/dist/integrations/mysql.js +0 -3
  203. package/dist/integrations/oracle.js +19 -14
  204. package/dist/integrations/postgres.js +28 -34
  205. package/dist/integrations/utils.js +15 -32
  206. package/dist/package.json +7 -11
  207. package/dist/tests/utilities/TestConfiguration.js +8 -25
  208. package/dist/threads/query.js +8 -33
  209. package/dist/tsconfig.tsbuildinfo +1 -1
  210. package/dist/utilities/workerRequests.js +15 -50
  211. package/package.json +8 -12
  212. package/scripts/integrations/mssql/data/setup.sql +1 -18
  213. package/scripts/integrations/oracle/oracle.md +2 -2
  214. package/scripts/integrations/postgres/init.sql +3 -11
  215. package/scripts/likeCypress.ts +6 -9
  216. package/scripts/proxy/generateProxyConfig.js +70 -0
  217. package/src/api/controllers/application.js +0 -1
  218. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  219. package/src/api/controllers/row/internal.js +0 -4
  220. package/src/api/controllers/table/index.js +1 -2
  221. package/src/api/controllers/webhook.js +6 -3
  222. package/src/api/index.js +1 -4
  223. package/src/api/routes/automation.js +33 -3
  224. package/src/api/routes/datasource.js +52 -6
  225. package/src/api/routes/index.js +0 -2
  226. package/src/api/routes/permission.js +18 -4
  227. package/src/api/routes/role.js +24 -3
  228. package/src/api/routes/row.js +2 -3
  229. package/src/api/routes/screen.js +29 -2
  230. package/src/api/routes/table.js +19 -4
  231. package/src/api/routes/tests/utilities/index.js +0 -24
  232. package/src/api/routes/webhook.js +18 -2
  233. package/src/automations/steps/filter.js +2 -3
  234. package/src/automations/steps/queryRows.js +1 -1
  235. package/src/automations/utils.js +2 -2
  236. package/src/constants/index.js +0 -4
  237. package/src/db/utils.js +0 -12
  238. package/src/definitions/common.ts +0 -4
  239. package/src/definitions/datasource.ts +0 -1
  240. package/src/environment.js +0 -1
  241. package/src/integrations/base/datasourcePlus.ts +0 -3
  242. package/src/integrations/base/sql.ts +1 -16
  243. package/src/integrations/base/sqlTable.ts +7 -11
  244. package/src/integrations/googlesheets.ts +2 -5
  245. package/src/integrations/microsoftSqlServer.ts +61 -86
  246. package/src/integrations/mysql.ts +0 -4
  247. package/src/integrations/oracle.ts +35 -27
  248. package/src/integrations/postgres.ts +26 -33
  249. package/src/integrations/utils.ts +15 -43
  250. package/src/tests/utilities/TestConfiguration.js +2 -23
  251. package/src/threads/query.js +9 -37
  252. package/src/utilities/workerRequests.js +16 -65
  253. package/builder/assets/index.f8c92447.js +0 -1288
  254. package/coverage/lcov-report/api/routes/utils/index.html +0 -111
  255. package/coverage/lcov-report/api/routes/utils/validators.js.html +0 -737
  256. package/dist/api/controllers/public/applications.js +0 -94
  257. package/dist/api/controllers/public/mapping/applications.js +0 -29
  258. package/dist/api/controllers/public/mapping/index.js +0 -11
  259. package/dist/api/controllers/public/mapping/queries.js +0 -36
  260. package/dist/api/controllers/public/mapping/rows.js +0 -24
  261. package/dist/api/controllers/public/mapping/tables.js +0 -23
  262. package/dist/api/controllers/public/mapping/types.js +0 -2
  263. package/dist/api/controllers/public/mapping/users.js +0 -29
  264. package/dist/api/controllers/public/queries.js +0 -38
  265. package/dist/api/controllers/public/rows.js +0 -97
  266. package/dist/api/controllers/public/tables.js +0 -75
  267. package/dist/api/controllers/public/users.js +0 -95
  268. package/dist/api/controllers/public/utils.js +0 -49
  269. package/dist/api/routes/public/applications.js +0 -141
  270. package/dist/api/routes/public/index.js +0 -101
  271. package/dist/api/routes/public/middleware/mapper.js +0 -94
  272. package/dist/api/routes/public/queries.js +0 -77
  273. package/dist/api/routes/public/rows.js +0 -229
  274. package/dist/api/routes/public/tables.js +0 -154
  275. package/dist/api/routes/public/users.js +0 -137
  276. package/dist/api/routes/public/utils/Endpoint.js +0 -36
  277. package/dist/api/routes/utils/validators.js +0 -200
  278. package/dist/definitions/openapi.js +0 -6
  279. package/specs/generate.js +0 -94
  280. package/specs/openapi.json +0 -2232
  281. package/specs/openapi.yaml +0 -1538
  282. package/specs/parameters.js +0 -59
  283. package/specs/resources/application.js +0 -101
  284. package/specs/resources/index.js +0 -24
  285. package/specs/resources/misc.js +0 -12
  286. package/specs/resources/query.js +0 -189
  287. package/specs/resources/row.js +0 -125
  288. package/specs/resources/table.js +0 -191
  289. package/specs/resources/user.js +0 -126
  290. package/specs/resources/utils/Resource.js +0 -26
  291. package/specs/resources/utils/index.js +0 -11
  292. package/specs/security.js +0 -7
  293. package/src/api/controllers/public/applications.ts +0 -74
  294. package/src/api/controllers/public/mapping/applications.ts +0 -32
  295. package/src/api/controllers/public/mapping/index.ts +0 -13
  296. package/src/api/controllers/public/mapping/queries.ts +0 -39
  297. package/src/api/controllers/public/mapping/rows.ts +0 -31
  298. package/src/api/controllers/public/mapping/tables.ts +0 -26
  299. package/src/api/controllers/public/mapping/types.ts +0 -13
  300. package/src/api/controllers/public/mapping/users.ts +0 -32
  301. package/src/api/controllers/public/queries.ts +0 -20
  302. package/src/api/controllers/public/rows.ts +0 -77
  303. package/src/api/controllers/public/tables.ts +0 -56
  304. package/src/api/controllers/public/users.ts +0 -82
  305. package/src/api/controllers/public/utils.ts +0 -38
  306. package/src/api/routes/public/applications.ts +0 -156
  307. package/src/api/routes/public/index.ts +0 -118
  308. package/src/api/routes/public/middleware/mapper.ts +0 -81
  309. package/src/api/routes/public/queries.ts +0 -81
  310. package/src/api/routes/public/rows.ts +0 -242
  311. package/src/api/routes/public/tables.ts +0 -169
  312. package/src/api/routes/public/tests/compare.spec.js +0 -184
  313. package/src/api/routes/public/users.ts +0 -144
  314. package/src/api/routes/public/utils/Endpoint.ts +0 -51
  315. package/src/api/routes/utils/validators.js +0 -219
  316. package/src/definitions/openapi.ts +0 -943
@@ -19,7 +19,6 @@ import { Table, TableSchema } from "../definitions/common"
19
19
  module MSSQLModule {
20
20
  const sqlServer = require("mssql")
21
21
  const Sql = require("./base/sql")
22
- const DEFAULT_SCHEMA = "dbo"
23
22
 
24
23
  interface MSSQLConfig {
25
24
  user: string
@@ -27,17 +26,9 @@ module MSSQLModule {
27
26
  server: string
28
27
  port: number
29
28
  database: string
30
- schema: string
31
29
  encrypt?: boolean
32
30
  }
33
31
 
34
- interface TablesResponse {
35
- TABLE_CATALOG: string
36
- TABLE_SCHEMA: string
37
- TABLE_NAME: string
38
- TABLE_TYPE: string
39
- }
40
-
41
32
  const SCHEMA: Integration = {
42
33
  docs: "https://github.com/tediousjs/node-mssql",
43
34
  plus: true,
@@ -67,10 +58,6 @@ module MSSQLModule {
67
58
  type: DatasourceFieldTypes.STRING,
68
59
  default: "root",
69
60
  },
70
- schema: {
71
- type: DatasourceFieldTypes.STRING,
72
- default: DEFAULT_SCHEMA,
73
- },
74
61
  encrypt: {
75
62
  type: DatasourceFieldTypes.BOOLEAN,
76
63
  default: true,
@@ -92,9 +79,34 @@ module MSSQLModule {
92
79
  },
93
80
  }
94
81
 
82
+ async function internalQuery(
83
+ client: any,
84
+ query: SqlQuery,
85
+ operation: string | undefined = undefined
86
+ ) {
87
+ const request = client.request()
88
+ try {
89
+ if (Array.isArray(query.bindings)) {
90
+ let count = 0
91
+ for (let binding of query.bindings) {
92
+ request.input(`p${count++}`, binding)
93
+ }
94
+ }
95
+ // this is a hack to get the inserted ID back,
96
+ // no way to do this with Knex nicely
97
+ const sql =
98
+ operation === Operation.CREATE
99
+ ? `${query.sql}; SELECT SCOPE_IDENTITY() AS id;`
100
+ : query.sql
101
+ return await request.query(sql)
102
+ } catch (err) {
103
+ // @ts-ignore
104
+ throw new Error(err)
105
+ }
106
+ }
107
+
95
108
  class SqlServerIntegration extends Sql implements DatasourcePlus {
96
109
  private readonly config: MSSQLConfig
97
- private index: number = 0
98
110
  static pool: any
99
111
  public tables: Record<string, Table> = {}
100
112
  public schemaErrors: Record<string, string> = {}
@@ -109,62 +121,6 @@ module MSSQLModule {
109
121
  TABLES_SQL =
110
122
  "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'"
111
123
 
112
- constructor(config: MSSQLConfig) {
113
- super(SqlClients.MS_SQL)
114
- this.config = config
115
- const clientCfg = {
116
- ...this.config,
117
- options: {
118
- encrypt: this.config.encrypt,
119
- enableArithAbort: true,
120
- },
121
- }
122
- delete clientCfg.encrypt
123
- if (!this.pool) {
124
- this.pool = new sqlServer.ConnectionPool(clientCfg)
125
- }
126
- }
127
-
128
- getBindingIdentifier(): string {
129
- return `(@p${this.index++})`
130
- }
131
-
132
- async connect() {
133
- try {
134
- this.client = await this.pool.connect()
135
- } catch (err) {
136
- // @ts-ignore
137
- throw new Error(err)
138
- }
139
- }
140
-
141
- async internalQuery(
142
- query: SqlQuery,
143
- operation: string | undefined = undefined
144
- ) {
145
- const client = this.client
146
- const request = client.request()
147
- this.index = 0
148
- try {
149
- if (Array.isArray(query.bindings)) {
150
- let count = 0
151
- for (let binding of query.bindings) {
152
- request.input(`p${count++}`, binding)
153
- }
154
- }
155
- // this is a hack to get the inserted ID back,
156
- // no way to do this with Knex nicely
157
- const sql =
158
- operation === Operation.CREATE
159
- ? `${query.sql}; SELECT SCOPE_IDENTITY() AS id;`
160
- : query.sql
161
- return await request.query(sql)
162
- } catch (err) {
163
- // @ts-ignore
164
- throw new Error(err)
165
- }
166
- }
167
-
168
124
  getDefinitionSQL(tableName: string) {
169
125
  return `select *
170
126
  from INFORMATION_SCHEMA.COLUMNS
@@ -193,8 +149,33 @@ module MSSQLModule {
193
149
  WHERE TABLE_NAME='${tableName}'`
194
150
  }
195
151
 
152
+ constructor(config: MSSQLConfig) {
153
+ super(SqlClients.MS_SQL)
154
+ this.config = config
155
+ const clientCfg = {
156
+ ...this.config,
157
+ options: {
158
+ encrypt: this.config.encrypt,
159
+ enableArithAbort: true,
160
+ },
161
+ }
162
+ delete clientCfg.encrypt
163
+ if (!this.pool) {
164
+ this.pool = new sqlServer.ConnectionPool(clientCfg)
165
+ }
166
+ }
167
+
168
+ async connect() {
169
+ try {
170
+ this.client = await this.pool.connect()
171
+ } catch (err) {
172
+ // @ts-ignore
173
+ throw new Error(err)
174
+ }
175
+ }
176
+
196
177
  async runSQL(sql: string) {
197
- return (await this.internalQuery(getSqlQuery(sql))).recordset
178
+ return (await internalQuery(this.client, getSqlQuery(sql))).recordset
198
179
  }
199
180
 
200
181
  /**
@@ -204,14 +185,11 @@ module MSSQLModule {
204
185
  */
205
186
  async buildSchema(datasourceId: string, entities: Record<string, Table>) {
206
187
  await this.connect()
207
- let tableInfo: TablesResponse[] = await this.runSQL(this.TABLES_SQL)
208
- if (tableInfo == null || !Array.isArray(tableInfo)) {
188
+ let tableNames = await this.runSQL(this.TABLES_SQL)
189
+ if (tableNames == null || !Array.isArray(tableNames)) {
209
190
  throw "Unable to get list of tables in database"
210
191
  }
211
-
212
- const schema = this.config.schema || DEFAULT_SCHEMA
213
- const tableNames = tableInfo
214
- .filter((record: any) => record.TABLE_SCHEMA === schema)
192
+ tableNames = tableNames
215
193
  .map((record: any) => record.TABLE_NAME)
216
194
  .filter((name: string) => this.MASTER_TABLES.indexOf(name) === -1)
217
195
 
@@ -260,36 +238,33 @@ module MSSQLModule {
260
238
 
261
239
  async read(query: SqlQuery | string) {
262
240
  await this.connect()
263
- const response = await this.internalQuery(getSqlQuery(query))
241
+ const response = await internalQuery(this.client, getSqlQuery(query))
264
242
  return response.recordset
265
243
  }
266
244
 
267
245
  async create(query: SqlQuery | string) {
268
246
  await this.connect()
269
- const response = await this.internalQuery(getSqlQuery(query))
247
+ const response = await internalQuery(this.client, getSqlQuery(query))
270
248
  return response.recordset || [{ created: true }]
271
249
  }
272
250
 
273
251
  async update(query: SqlQuery | string) {
274
252
  await this.connect()
275
- const response = await this.internalQuery(getSqlQuery(query))
253
+ const response = await internalQuery(this.client, getSqlQuery(query))
276
254
  return response.recordset || [{ updated: true }]
277
255
  }
278
256
 
279
257
  async delete(query: SqlQuery | string) {
280
258
  await this.connect()
281
- const response = await this.internalQuery(getSqlQuery(query))
259
+ const response = await internalQuery(this.client, getSqlQuery(query))
282
260
  return response.recordset || [{ deleted: true }]
283
261
  }
284
262
 
285
263
  async query(json: QueryJson) {
286
- const schema = this.config.schema
287
264
  await this.connect()
288
- if (schema && schema !== DEFAULT_SCHEMA && json?.endpoint) {
289
- json.endpoint.schema = schema
290
- }
291
265
  const operation = this._operation(json)
292
- const queryFn = (query: any, op: string) => this.internalQuery(query, op)
266
+ const queryFn = (query: any, op: string) =>
267
+ internalQuery(this.client, query, op)
293
268
  const processFn = (result: any) =>
294
269
  result.recordset ? result.recordset : [{ [operation]: true }]
295
270
  return this.queryWithReturning(json, queryFn, processFn)
@@ -95,10 +95,6 @@ module MySQLModule {
95
95
  this.config = config
96
96
  }
97
97
 
98
- getBindingIdentifier(): string {
99
- return "?"
100
- }
101
-
102
98
  async connect() {
103
99
  this.client = await mysql.createConnection(this.config)
104
100
  }
@@ -1,24 +1,24 @@
1
1
  import {
2
- DatasourceFieldTypes,
3
2
  Integration,
4
- Operation,
5
- QueryJson,
3
+ DatasourceFieldTypes,
6
4
  QueryTypes,
7
5
  SqlQuery,
6
+ QueryJson,
7
+ Operation,
8
8
  } from "../definitions/datasource"
9
9
  import {
10
- buildExternalTableId,
11
- convertSqlType,
12
10
  finaliseExternalTables,
13
11
  getSqlQuery,
12
+ buildExternalTableId,
13
+ convertSqlType,
14
14
  SqlClients,
15
15
  } from "./utils"
16
16
  import oracledb, {
17
- BindParameters,
18
- Connection,
19
- ConnectionAttributes,
20
17
  ExecuteOptions,
21
18
  Result,
19
+ Connection,
20
+ ConnectionAttributes,
21
+ BindParameters,
22
22
  } from "oracledb"
23
23
  import Sql from "./base/sql"
24
24
  import { Table } from "../definitions/common"
@@ -137,7 +137,6 @@ module OracleModule {
137
137
 
138
138
  class OracleIntegration extends Sql implements DatasourcePlus {
139
139
  private readonly config: OracleConfig
140
- private index: number = 1
141
140
 
142
141
  public tables: Record<string, Table> = {}
143
142
  public schemaErrors: Record<string, string> = {}
@@ -175,10 +174,6 @@ module OracleModule {
175
174
  this.config = config
176
175
  }
177
176
 
178
- getBindingIdentifier(): string {
179
- return `:${this.index++}`
180
- }
181
-
182
177
  /**
183
178
  * Map the flat tabular columns and constraints data into a nested object
184
179
  */
@@ -238,14 +233,20 @@ module OracleModule {
238
233
  return oracleTables
239
234
  }
240
235
 
241
- private static isSupportedColumn(column: OracleColumn) {
242
- return !UNSUPPORTED_TYPES.includes(column.type)
236
+ private isSupportedColumn(column: OracleColumn) {
237
+ if (UNSUPPORTED_TYPES.includes(column.type)) {
238
+ return false
239
+ }
240
+
241
+ return true
243
242
  }
244
243
 
245
- private static isAutoColumn(column: OracleColumn) {
246
- return !!(
247
- column.default && column.default.toLowerCase().includes("nextval")
248
- )
244
+ private isAutoColumn(column: OracleColumn) {
245
+ if (column.default && column.default.toLowerCase().includes("nextval")) {
246
+ return true
247
+ }
248
+
249
+ return false
249
250
  }
250
251
 
251
252
  /**
@@ -253,7 +254,7 @@ module OracleModule {
253
254
  * This matches the default behaviour for generating DDL used in knex.
254
255
  */
255
256
  private isBooleanType(column: OracleColumn): boolean {
256
- return (
257
+ if (
257
258
  column.type.toLowerCase() === "number" &&
258
259
  Object.values(column.constraints).filter(c => {
259
260
  if (
@@ -272,7 +273,11 @@ module OracleModule {
272
273
  }
273
274
  return false
274
275
  }).length > 0
275
- )
276
+ ) {
277
+ return true
278
+ }
279
+
280
+ return false
276
281
  }
277
282
 
278
283
  private internalConvertType(column: OracleColumn): string {
@@ -312,9 +317,7 @@ module OracleModule {
312
317
  // iterate each column on the table
313
318
  Object.values(oracleTable.columns)
314
319
  // remove columns that we can't read / save
315
- .filter(oracleColumn =>
316
- OracleIntegration.isSupportedColumn(oracleColumn)
317
- )
320
+ .filter(oracleColumn => this.isSupportedColumn(oracleColumn))
318
321
  // match the order of the columns in the db
319
322
  .sort((c1, c2) => c1.id - c2.id)
320
323
  .forEach(oracleColumn => {
@@ -322,7 +325,7 @@ module OracleModule {
322
325
  let fieldSchema = table.schema[columnName]
323
326
  if (!fieldSchema) {
324
327
  fieldSchema = {
325
- autocolumn: OracleIntegration.isAutoColumn(oracleColumn),
328
+ autocolumn: this.isAutoColumn(oracleColumn),
326
329
  name: columnName,
327
330
  type: this.internalConvertType(oracleColumn),
328
331
  }
@@ -348,13 +351,18 @@ module OracleModule {
348
351
  private async internalQuery<T>(query: SqlQuery): Promise<Result<T>> {
349
352
  let connection
350
353
  try {
351
- this.index = 1
352
354
  connection = await this.getConnection()
353
355
 
354
356
  const options: ExecuteOptions = { autoCommit: true }
355
357
  const bindings: BindParameters = query.bindings || []
356
358
 
357
- return await connection.execute<T>(query.sql, bindings, options)
359
+ const result: Result<T> = await connection.execute<T>(
360
+ query.sql,
361
+ bindings,
362
+ options
363
+ )
364
+
365
+ return result
358
366
  } finally {
359
367
  if (connection) {
360
368
  try {
@@ -103,11 +103,30 @@ module PostgresModule {
103
103
  },
104
104
  }
105
105
 
106
+ async function internalQuery(client: any, query: SqlQuery) {
107
+ // need to handle a specific issue with json data types in postgres,
108
+ // new lines inside the JSON data will break it
109
+ if (query && query.sql) {
110
+ const matches = query.sql.match(JSON_REGEX)
111
+ if (matches && matches.length > 0) {
112
+ for (let match of matches) {
113
+ const escaped = escapeDangerousCharacters(match)
114
+ query.sql = query.sql.replace(match, escaped)
115
+ }
116
+ }
117
+ }
118
+ try {
119
+ return await client.query(query.sql, query.bindings || [])
120
+ } catch (err) {
121
+ // @ts-ignore
122
+ throw new Error(err)
123
+ }
124
+ }
125
+
106
126
  class PostgresIntegration extends Sql implements DatasourcePlus {
107
127
  static pool: any
108
128
  private readonly client: any
109
129
  private readonly config: PostgresConfig
110
- private index: number = 1
111
130
  public tables: Record<string, Table> = {}
112
131
  public schemaErrors: Record<string, string> = {}
113
132
 
@@ -144,32 +163,6 @@ module PostgresModule {
144
163
  this.setSchema()
145
164
  }
146
165
 
147
- getBindingIdentifier(): string {
148
- return `$${this.index++}`
149
- }
150
-
151
- async internalQuery(query: SqlQuery) {
152
- const client = this.client
153
- this.index = 1
154
- // need to handle a specific issue with json data types in postgres,
155
- // new lines inside the JSON data will break it
156
- if (query && query.sql) {
157
- const matches = query.sql.match(JSON_REGEX)
158
- if (matches && matches.length > 0) {
159
- for (let match of matches) {
160
- const escaped = escapeDangerousCharacters(match)
161
- query.sql = query.sql.replace(match, escaped)
162
- }
163
- }
164
- }
165
- try {
166
- return await client.query(query.sql, query.bindings || [])
167
- } catch (err) {
168
- // @ts-ignore
169
- throw new Error(err)
170
- }
171
- }
172
-
173
166
  setSchema() {
174
167
  if (!this.config.schema) {
175
168
  this.config.schema = "public"
@@ -248,22 +241,22 @@ module PostgresModule {
248
241
  }
249
242
 
250
243
  async create(query: SqlQuery | string) {
251
- const response = await this.internalQuery(getSqlQuery(query))
244
+ const response = await internalQuery(this.client, getSqlQuery(query))
252
245
  return response.rows.length ? response.rows : [{ created: true }]
253
246
  }
254
247
 
255
248
  async read(query: SqlQuery | string) {
256
- const response = await this.internalQuery(getSqlQuery(query))
249
+ const response = await internalQuery(this.client, getSqlQuery(query))
257
250
  return response.rows
258
251
  }
259
252
 
260
253
  async update(query: SqlQuery | string) {
261
- const response = await this.internalQuery(getSqlQuery(query))
254
+ const response = await internalQuery(this.client, getSqlQuery(query))
262
255
  return response.rows.length ? response.rows : [{ updated: true }]
263
256
  }
264
257
 
265
258
  async delete(query: SqlQuery | string) {
266
- const response = await this.internalQuery(getSqlQuery(query))
259
+ const response = await internalQuery(this.client, getSqlQuery(query))
267
260
  return response.rows.length ? response.rows : [{ deleted: true }]
268
261
  }
269
262
 
@@ -273,11 +266,11 @@ module PostgresModule {
273
266
  if (Array.isArray(input)) {
274
267
  const responses = []
275
268
  for (let query of input) {
276
- responses.push(await this.internalQuery(query))
269
+ responses.push(await internalQuery(this.client, query))
277
270
  }
278
271
  return responses
279
272
  } else {
280
- const response = await this.internalQuery(input)
273
+ const response = await internalQuery(this.client, input)
281
274
  return response.rows.length ? response.rows : [{ [operation]: true }]
282
275
  }
283
276
  }
@@ -6,63 +6,35 @@ import { FieldTypes, BuildSchemaErrors, InvalidColumns } from "../constants"
6
6
  const DOUBLE_SEPARATOR = `${SEPARATOR}${SEPARATOR}`
7
7
  const ROW_ID_REGEX = /^\[.*]$/g
8
8
 
9
- const SQL_NUMBER_TYPE_MAP = {
9
+ const SQL_TYPE_MAP = {
10
+ text: FieldTypes.LONGFORM,
11
+ varchar: FieldTypes.STRING,
10
12
  integer: FieldTypes.NUMBER,
11
- int: FieldTypes.NUMBER,
12
13
  bigint: FieldTypes.NUMBER,
13
14
  decimal: FieldTypes.NUMBER,
14
15
  smallint: FieldTypes.NUMBER,
15
16
  real: FieldTypes.NUMBER,
17
+ "double precision": FieldTypes.NUMBER,
18
+ timestamp: FieldTypes.DATETIME,
19
+ time: FieldTypes.DATETIME,
20
+ boolean: FieldTypes.BOOLEAN,
21
+ json: FieldTypes.JSON,
22
+ date: FieldTypes.DATETIME,
23
+ blob: FieldTypes.LONGFORM,
24
+ enum: FieldTypes.STRING,
16
25
  float: FieldTypes.NUMBER,
26
+ int: FieldTypes.NUMBER,
17
27
  numeric: FieldTypes.NUMBER,
18
28
  mediumint: FieldTypes.NUMBER,
19
29
  dec: FieldTypes.NUMBER,
20
30
  double: FieldTypes.NUMBER,
21
31
  fixed: FieldTypes.NUMBER,
22
- "double precision": FieldTypes.NUMBER,
32
+ datetime: FieldTypes.DATETIME,
33
+ tinyint: FieldTypes.BOOLEAN,
34
+ long: FieldTypes.LONGFORM,
23
35
  number: FieldTypes.NUMBER,
24
36
  binary_float: FieldTypes.NUMBER,
25
37
  binary_double: FieldTypes.NUMBER,
26
- money: FieldTypes.NUMBER,
27
- smallmoney: FieldTypes.NUMBER,
28
- }
29
-
30
- const SQL_DATE_TYPE_MAP = {
31
- timestamp: FieldTypes.DATETIME,
32
- time: FieldTypes.DATETIME,
33
- datetime: FieldTypes.DATETIME,
34
- smalldatetime: FieldTypes.DATETIME,
35
- date: FieldTypes.DATETIME,
36
- }
37
-
38
- const SQL_STRING_TYPE_MAP = {
39
- varchar: FieldTypes.STRING,
40
- char: FieldTypes.STRING,
41
- nchar: FieldTypes.STRING,
42
- nvarchar: FieldTypes.STRING,
43
- ntext: FieldTypes.STRING,
44
- enum: FieldTypes.STRING,
45
- blob: FieldTypes.LONGFORM,
46
- long: FieldTypes.LONGFORM,
47
- text: FieldTypes.LONGFORM,
48
- }
49
-
50
- const SQL_BOOLEAN_TYPE_MAP = {
51
- boolean: FieldTypes.BOOLEAN,
52
- bit: FieldTypes.BOOLEAN,
53
- tinyint: FieldTypes.BOOLEAN,
54
- }
55
-
56
- const SQL_MISC_TYPE_MAP = {
57
- json: FieldTypes.JSON,
58
- }
59
-
60
- const SQL_TYPE_MAP = {
61
- ...SQL_NUMBER_TYPE_MAP,
62
- ...SQL_DATE_TYPE_MAP,
63
- ...SQL_STRING_TYPE_MAP,
64
- ...SQL_BOOLEAN_TYPE_MAP,
65
- ...SQL_MISC_TYPE_MAP,
66
38
  }
67
39
 
68
40
  export enum SqlClients {
@@ -25,8 +25,6 @@ const { createASession } = require("@budibase/backend-core/sessions")
25
25
  const { user: userCache } = require("@budibase/backend-core/cache")
26
26
  const newid = require("../../db/newid")
27
27
  const context = require("@budibase/backend-core/context")
28
- const { generateDevInfoID, SEPARATOR } = require("@budibase/backend-core/db")
29
- const { encrypt } = require("@budibase/backend-core/encryption")
30
28
 
31
29
  const GLOBAL_USER_ID = "us_uuid1"
32
30
  const EMAIL = "babs@babs.com"
@@ -49,10 +47,6 @@ class TestConfiguration {
49
47
  return this.request
50
48
  }
51
49
 
52
- getApp() {
53
- return this.app
54
- }
55
-
56
50
  getAppId() {
57
51
  return this.appId
58
52
  }
@@ -89,20 +83,6 @@ class TestConfiguration {
89
83
  }
90
84
  }
91
85
 
92
- async generateApiKey(userId = GLOBAL_USER_ID) {
93
- const db = getGlobalDB(TENANT_ID)
94
- const id = generateDevInfoID(userId)
95
- let devInfo
96
- try {
97
- devInfo = await db.get(id)
98
- } catch (err) {
99
- devInfo = { _id: id, userId }
100
- }
101
- devInfo.apiKey = encrypt(`${TENANT_ID}${SEPARATOR}${newid()}`)
102
- await db.put(devInfo)
103
- return devInfo.apiKey
104
- }
105
-
106
86
  async globalUser({
107
87
  id = GLOBAL_USER_ID,
108
88
  builder = true,
@@ -155,7 +135,7 @@ class TestConfiguration {
155
135
  cleanup(this.allApps.map(app => app.appId))
156
136
  }
157
137
 
158
- defaultHeaders(extras = {}) {
138
+ defaultHeaders() {
159
139
  const auth = {
160
140
  userId: GLOBAL_USER_ID,
161
141
  sessionId: "sessionid",
@@ -174,7 +154,6 @@ class TestConfiguration {
174
154
  `${Cookies.CurrentApp}=${appToken}`,
175
155
  ],
176
156
  [Headers.CSRF_TOKEN]: CSRF_TOKEN,
177
- ...extras,
178
157
  }
179
158
  if (this.appId) {
180
159
  headers[Headers.APP_ID] = this.appId
@@ -247,7 +226,7 @@ class TestConfiguration {
247
226
 
248
227
  async getTable(tableId = null) {
249
228
  tableId = tableId || this.table._id
250
- return this._req(null, { tableId }, controllers.table.find)
229
+ return this._req(null, { id: tableId }, controllers.table.find)
251
230
  }
252
231
 
253
232
  async createLinkedTable(relationshipType = null, links = ["link"]) {