@budibase/server 1.3.15-alpha.0 → 1.3.16

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 (252) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/builder/assets/index.43e7aaa8.js +876 -0
  3. package/builder/assets/{index.f5c54dd2.css → index.a70e216a.css} +2 -2
  4. package/builder/assets/vendor.5e1fe644.css +1 -0
  5. package/builder/assets/vendor.67dbd8fa.js +248 -0
  6. package/builder/index.html +4 -2
  7. package/coverage/clover.xml +254 -296
  8. package/coverage/coverage-final.json +17 -17
  9. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/component.js.html +13 -82
  15. package/coverage/lcov-report/api/controllers/datasource.js.html +20 -20
  16. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/index.html +30 -30
  18. package/coverage/lcov-report/api/controllers/integration.js.html +6 -6
  19. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  24. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/screen.js.html +12 -204
  34. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  45. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  46. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  47. package/coverage/lcov-report/api/index.html +1 -1
  48. package/coverage/lcov-report/api/index.js.html +12 -12
  49. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/index.html +1 -1
  60. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  74. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  77. package/coverage/lcov-report/automations/actions.js.html +1 -1
  78. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  79. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  80. package/coverage/lcov-report/automations/index.html +1 -1
  81. package/coverage/lcov-report/automations/index.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/index.html +1 -1
  89. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  108. package/coverage/lcov-report/constants/index.html +1 -1
  109. package/coverage/lcov-report/constants/index.js.html +1 -1
  110. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  111. package/coverage/lcov-report/constants/screens.js.html +1 -1
  112. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  113. package/coverage/lcov-report/db/index.html +18 -18
  114. package/coverage/lcov-report/db/index.js.html +1 -1
  115. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  116. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  117. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  118. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  119. package/coverage/lcov-report/db/newid.js.html +2 -2
  120. package/coverage/lcov-report/db/utils.js.html +20 -56
  121. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  122. package/coverage/lcov-report/events/index.html +1 -1
  123. package/coverage/lcov-report/events/index.js.html +1 -1
  124. package/coverage/lcov-report/events/utils.js.html +1 -1
  125. package/coverage/lcov-report/index.html +28 -28
  126. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  127. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  128. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  129. package/coverage/lcov-report/middleware/builder.js.html +12 -12
  130. package/coverage/lcov-report/middleware/currentapp.js.html +33 -33
  131. package/coverage/lcov-report/middleware/index.html +1 -1
  132. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  133. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  134. package/coverage/lcov-report/middleware/resourceId.js.html +7 -7
  135. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  136. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  137. package/coverage/lcov-report/utilities/budibaseDir.js.html +3 -3
  138. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  139. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  140. package/coverage/lcov-report/utilities/global.js.html +16 -16
  141. package/coverage/lcov-report/utilities/index.html +1 -1
  142. package/coverage/lcov-report/utilities/index.js.html +24 -24
  143. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  144. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  145. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  146. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  147. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  148. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  149. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  150. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  151. package/coverage/lcov-report/utilities/security.js.html +2 -2
  152. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  153. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  154. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  155. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  156. package/coverage/lcov-report/utilities/users.js.html +1 -1
  157. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  158. package/coverage/lcov.info +445 -533
  159. package/dist/api/controllers/application.js +4 -5
  160. package/dist/api/controllers/component.js +1 -18
  161. package/dist/api/controllers/datasource.js +4 -4
  162. package/dist/api/controllers/integration.js +4 -4
  163. package/dist/api/controllers/row/ExternalRequest.js +3 -1
  164. package/dist/api/controllers/screen.js +2 -51
  165. package/dist/api/controllers/static/index.js +0 -1
  166. package/dist/api/controllers/static/templates/BudibaseApp.svelte +0 -10
  167. package/dist/api/controllers/static/templates/preview.hbs +1 -3
  168. package/dist/api/routes/index.js +0 -2
  169. package/dist/app.js +0 -9
  170. package/dist/db/utils.js +1 -10
  171. package/dist/environment.js +2 -3
  172. package/dist/integrations/airtable.js +129 -126
  173. package/dist/integrations/arangodb.js +89 -86
  174. package/dist/integrations/base/query.js +2 -2
  175. package/dist/integrations/couchdb.js +83 -80
  176. package/dist/integrations/dynamodb.js +164 -161
  177. package/dist/integrations/elasticsearch.js +138 -135
  178. package/dist/integrations/firebase.js +157 -154
  179. package/dist/integrations/googlesheets.js +327 -323
  180. package/dist/integrations/index.js +51 -93
  181. package/dist/integrations/microsoftSqlServer.js +243 -240
  182. package/dist/integrations/mongodb.js +242 -239
  183. package/dist/integrations/mysql.js +219 -215
  184. package/dist/integrations/oracle.js +322 -318
  185. package/dist/integrations/postgres.js +265 -262
  186. package/dist/integrations/redis.js +139 -134
  187. package/dist/integrations/rest.js +292 -289
  188. package/dist/integrations/s3.js +64 -61
  189. package/dist/integrations/snowflake.js +86 -83
  190. package/dist/package.json +6 -8
  191. package/dist/threads/query.js +2 -2
  192. package/dist/tsconfig.build.tsbuildinfo +1 -1
  193. package/dist/utilities/fileSystem/index.js +10 -66
  194. package/package.json +7 -9
  195. package/scripts/dev/manage.js +0 -1
  196. package/src/api/controllers/application.ts +1 -1
  197. package/src/api/controllers/component.js +2 -25
  198. package/src/api/controllers/datasource.js +4 -4
  199. package/src/api/controllers/integration.js +4 -4
  200. package/src/api/controllers/row/ExternalRequest.ts +4 -1
  201. package/src/api/controllers/screen.js +1 -65
  202. package/src/api/controllers/static/index.ts +0 -1
  203. package/src/api/controllers/static/templates/BudibaseApp.svelte +0 -10
  204. package/src/api/controllers/static/templates/preview.hbs +1 -3
  205. package/src/api/routes/index.ts +0 -2
  206. package/src/api/routes/tests/query.spec.js +25 -8
  207. package/src/app.ts +0 -12
  208. package/src/db/utils.js +0 -12
  209. package/src/environment.js +2 -3
  210. package/src/integrations/airtable.ts +118 -116
  211. package/src/integrations/arangodb.ts +89 -87
  212. package/src/integrations/base/query.ts +2 -2
  213. package/src/integrations/couchdb.ts +89 -83
  214. package/src/integrations/dynamodb.ts +175 -173
  215. package/src/integrations/elasticsearch.ts +122 -120
  216. package/src/integrations/firebase.ts +159 -157
  217. package/src/integrations/googlesheets.ts +338 -328
  218. package/src/integrations/index.ts +21 -59
  219. package/src/integrations/microsoftSqlServer.ts +251 -249
  220. package/src/integrations/mongodb.ts +258 -261
  221. package/src/integrations/mysql.ts +234 -229
  222. package/src/integrations/oracle.ts +380 -373
  223. package/src/integrations/postgres.ts +268 -264
  224. package/src/integrations/redis.ts +132 -128
  225. package/src/integrations/rest.ts +329 -324
  226. package/src/integrations/s3.ts +71 -68
  227. package/src/integrations/snowflake.ts +82 -80
  228. package/src/integrations/tests/{airtable.spec.ts → airtable.spec.js} +18 -21
  229. package/src/integrations/tests/{arangodb.spec.ts → arangodb.spec.js} +9 -12
  230. package/src/integrations/tests/{couchdb.spec.ts → couchdb.spec.js} +27 -33
  231. package/src/integrations/tests/{dynamodb.spec.ts → dynamodb.spec.js} +41 -45
  232. package/src/integrations/tests/{elasticsearch.spec.ts → elasticsearch.spec.js} +21 -22
  233. package/src/integrations/tests/{firebase.spec.ts → firebase.spec.js} +28 -33
  234. package/src/integrations/tests/{microsoftSqlServer.spec.ts → microsoftSqlServer.spec.js} +11 -12
  235. package/src/integrations/tests/{mongo.spec.ts → mongo.spec.js} +35 -46
  236. package/src/integrations/tests/{mysql.spec.ts → mysql.spec.js} +15 -17
  237. package/src/integrations/tests/{oracle.spec.ts → oracle.spec.js} +17 -19
  238. package/src/integrations/tests/{postgres.spec.ts → postgres.spec.js} +17 -19
  239. package/src/integrations/tests/{redis.spec.ts → redis.spec.js} +18 -27
  240. package/src/integrations/tests/{rest.spec.ts → rest.spec.js} +14 -22
  241. package/src/integrations/tests/{s3.spec.ts → s3.spec.js} +8 -10
  242. package/src/integrations/tests/{sql.spec.ts → sql.spec.js} +177 -228
  243. package/src/module.d.ts +0 -1
  244. package/src/threads/query.ts +2 -2
  245. package/src/utilities/fileSystem/index.js +9 -70
  246. package/builder/assets/index.b266d29f.js +0 -995
  247. package/dist/api/controllers/plugin.js +0 -119
  248. package/dist/api/routes/plugin.js +0 -38
  249. package/dist/watch.js +0 -77
  250. package/src/api/controllers/plugin.ts +0 -110
  251. package/src/api/routes/plugin.ts +0 -13
  252. package/src/watch.ts +0 -38
@@ -17,342 +17,346 @@ const utils_1 = require("./utils");
17
17
  const oracledb_1 = __importDefault(require("oracledb"));
18
18
  const sql_1 = __importDefault(require("./base/sql"));
19
19
  const constants_1 = require("../constants");
20
- oracledb_1.default.outFormat = oracledb_1.default.OUT_FORMAT_OBJECT;
21
- const SCHEMA = {
22
- docs: "https://github.com/oracle/node-oracledb",
23
- plus: true,
24
- friendlyName: "Oracle",
25
- type: "Relational",
26
- description: "Oracle Database is an object-relational database management system developed by Oracle Corporation",
27
- datasource: {
28
- host: {
29
- type: types_1.DatasourceFieldType.STRING,
30
- default: "localhost",
31
- required: true,
20
+ var OracleModule;
21
+ (function (OracleModule) {
22
+ oracledb_1.default.outFormat = oracledb_1.default.OUT_FORMAT_OBJECT;
23
+ const SCHEMA = {
24
+ docs: "https://github.com/oracle/node-oracledb",
25
+ plus: true,
26
+ friendlyName: "Oracle",
27
+ type: "Relational",
28
+ description: "Oracle Database is an object-relational database management system developed by Oracle Corporation",
29
+ datasource: {
30
+ host: {
31
+ type: types_1.DatasourceFieldType.STRING,
32
+ default: "localhost",
33
+ required: true,
34
+ },
35
+ port: {
36
+ type: types_1.DatasourceFieldType.NUMBER,
37
+ required: true,
38
+ default: 1521,
39
+ },
40
+ database: {
41
+ type: types_1.DatasourceFieldType.STRING,
42
+ required: true,
43
+ },
44
+ user: {
45
+ type: types_1.DatasourceFieldType.STRING,
46
+ required: true,
47
+ },
48
+ password: {
49
+ type: types_1.DatasourceFieldType.PASSWORD,
50
+ required: true,
51
+ },
32
52
  },
33
- port: {
34
- type: types_1.DatasourceFieldType.NUMBER,
35
- required: true,
36
- default: 1521,
53
+ query: {
54
+ create: {
55
+ type: types_1.QueryType.SQL,
56
+ },
57
+ read: {
58
+ type: types_1.QueryType.SQL,
59
+ },
60
+ update: {
61
+ type: types_1.QueryType.SQL,
62
+ },
63
+ delete: {
64
+ type: types_1.QueryType.SQL,
65
+ },
37
66
  },
38
- database: {
39
- type: types_1.DatasourceFieldType.STRING,
40
- required: true,
41
- },
42
- user: {
43
- type: types_1.DatasourceFieldType.STRING,
44
- required: true,
45
- },
46
- password: {
47
- type: types_1.DatasourceFieldType.PASSWORD,
48
- required: true,
49
- },
50
- },
51
- query: {
52
- create: {
53
- type: types_1.QueryType.SQL,
54
- },
55
- read: {
56
- type: types_1.QueryType.SQL,
57
- },
58
- update: {
59
- type: types_1.QueryType.SQL,
60
- },
61
- delete: {
62
- type: types_1.QueryType.SQL,
63
- },
64
- },
65
- };
66
- const UNSUPPORTED_TYPES = ["BLOB", "CLOB", "NCLOB"];
67
- const OracleContraintTypes = {
68
- PRIMARY: "P",
69
- NOT_NULL_OR_CHECK: "C",
70
- FOREIGN_KEY: "R",
71
- UNIQUE: "U",
72
- };
73
- class OracleIntegration extends sql_1.default {
74
- constructor(config) {
75
- super(utils_1.SqlClient.ORACLE);
76
- this.index = 1;
77
- this.tables = {};
78
- this.schemaErrors = {};
79
- this.COLUMNS_SQL = `
80
- SELECT
81
- tabs.table_name,
82
- cols.column_name,
83
- cols.data_type,
84
- cols.data_default,
85
- cols.column_id,
86
- cons.constraint_name,
87
- cons.constraint_type,
88
- cons.r_constraint_name,
89
- cons.search_condition
90
- FROM
91
- user_tables tabs
92
- JOIN
93
- user_tab_columns cols
94
- ON tabs.table_name = cols.table_name
95
- LEFT JOIN
96
- user_cons_columns col_cons
97
- ON cols.column_name = col_cons.column_name
98
- AND cols.table_name = col_cons.table_name
99
- LEFT JOIN
100
- user_constraints cons
101
- ON col_cons.constraint_name = cons.constraint_name
102
- AND cons.table_name = cols.table_name
103
- WHERE
104
- (cons.status = 'ENABLED'
105
- OR cons.status IS NULL)
106
- `;
107
- this.getConnection = () => __awaiter(this, void 0, void 0, function* () {
108
- //connectString : "(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))(CONNECT_DATA =(SID= ORCL)))"
109
- const connectString = `${this.config.host}:${this.config.port || 1521}/${this.config.database}`;
110
- const attributes = {
111
- user: this.config.user,
112
- password: this.config.password,
113
- connectString,
114
- };
115
- return oracledb_1.default.getConnection(attributes);
116
- });
117
- this.config = config;
118
- }
119
- getBindingIdentifier() {
120
- return `:${this.index++}`;
121
- }
122
- getStringConcat(parts) {
123
- return parts.join(" || ");
124
- }
125
- /**
126
- * Map the flat tabular columns and constraints data into a nested object
127
- */
128
- mapColumns(result) {
129
- const oracleTables = {};
130
- if (result.rows) {
131
- result.rows.forEach(row => {
132
- const tableName = row.TABLE_NAME;
133
- const columnName = row.COLUMN_NAME;
134
- const dataType = row.DATA_TYPE;
135
- const dataDefault = row.DATA_DEFAULT;
136
- const columnId = row.COLUMN_ID;
137
- const constraintName = row.CONSTRAINT_NAME;
138
- const constraintType = row.CONSTRAINT_TYPE;
139
- const relatedConstraintName = row.R_CONSTRAINT_NAME;
140
- const searchCondition = row.SEARCH_CONDITION;
141
- let table = oracleTables[tableName];
142
- if (!table) {
143
- table = {
144
- name: tableName,
145
- columns: {},
146
- };
147
- oracleTables[tableName] = table;
148
- }
149
- let column = table.columns[columnName];
150
- if (!column) {
151
- column = {
152
- name: columnName,
153
- type: dataType,
154
- default: dataDefault,
155
- id: columnId,
156
- constraints: {},
157
- };
158
- table.columns[columnName] = column;
159
- }
160
- if (constraintName && constraintType) {
161
- let constraint = column.constraints[constraintName];
162
- if (!constraint) {
163
- constraint = {
164
- name: constraintName,
165
- type: constraintType,
166
- relatedConstraintName: relatedConstraintName,
167
- searchCondition: searchCondition,
67
+ };
68
+ const UNSUPPORTED_TYPES = ["BLOB", "CLOB", "NCLOB"];
69
+ const OracleContraintTypes = {
70
+ PRIMARY: "P",
71
+ NOT_NULL_OR_CHECK: "C",
72
+ FOREIGN_KEY: "R",
73
+ UNIQUE: "U",
74
+ };
75
+ class OracleIntegration extends sql_1.default {
76
+ constructor(config) {
77
+ super(utils_1.SqlClient.ORACLE);
78
+ this.index = 1;
79
+ this.tables = {};
80
+ this.schemaErrors = {};
81
+ this.COLUMNS_SQL = `
82
+ SELECT
83
+ tabs.table_name,
84
+ cols.column_name,
85
+ cols.data_type,
86
+ cols.data_default,
87
+ cols.column_id,
88
+ cons.constraint_name,
89
+ cons.constraint_type,
90
+ cons.r_constraint_name,
91
+ cons.search_condition
92
+ FROM
93
+ user_tables tabs
94
+ JOIN
95
+ user_tab_columns cols
96
+ ON tabs.table_name = cols.table_name
97
+ LEFT JOIN
98
+ user_cons_columns col_cons
99
+ ON cols.column_name = col_cons.column_name
100
+ AND cols.table_name = col_cons.table_name
101
+ LEFT JOIN
102
+ user_constraints cons
103
+ ON col_cons.constraint_name = cons.constraint_name
104
+ AND cons.table_name = cols.table_name
105
+ WHERE
106
+ (cons.status = 'ENABLED'
107
+ OR cons.status IS NULL)
108
+ `;
109
+ this.getConnection = () => __awaiter(this, void 0, void 0, function* () {
110
+ //connectString : "(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))(CONNECT_DATA =(SID= ORCL)))"
111
+ const connectString = `${this.config.host}:${this.config.port || 1521}/${this.config.database}`;
112
+ const attributes = {
113
+ user: this.config.user,
114
+ password: this.config.password,
115
+ connectString,
116
+ };
117
+ return oracledb_1.default.getConnection(attributes);
118
+ });
119
+ this.config = config;
120
+ }
121
+ getBindingIdentifier() {
122
+ return `:${this.index++}`;
123
+ }
124
+ getStringConcat(parts) {
125
+ return parts.join(" || ");
126
+ }
127
+ /**
128
+ * Map the flat tabular columns and constraints data into a nested object
129
+ */
130
+ mapColumns(result) {
131
+ const oracleTables = {};
132
+ if (result.rows) {
133
+ result.rows.forEach(row => {
134
+ const tableName = row.TABLE_NAME;
135
+ const columnName = row.COLUMN_NAME;
136
+ const dataType = row.DATA_TYPE;
137
+ const dataDefault = row.DATA_DEFAULT;
138
+ const columnId = row.COLUMN_ID;
139
+ const constraintName = row.CONSTRAINT_NAME;
140
+ const constraintType = row.CONSTRAINT_TYPE;
141
+ const relatedConstraintName = row.R_CONSTRAINT_NAME;
142
+ const searchCondition = row.SEARCH_CONDITION;
143
+ let table = oracleTables[tableName];
144
+ if (!table) {
145
+ table = {
146
+ name: tableName,
147
+ columns: {},
168
148
  };
149
+ oracleTables[tableName] = table;
169
150
  }
170
- column.constraints[constraintName] = constraint;
171
- }
172
- });
151
+ let column = table.columns[columnName];
152
+ if (!column) {
153
+ column = {
154
+ name: columnName,
155
+ type: dataType,
156
+ default: dataDefault,
157
+ id: columnId,
158
+ constraints: {},
159
+ };
160
+ table.columns[columnName] = column;
161
+ }
162
+ if (constraintName && constraintType) {
163
+ let constraint = column.constraints[constraintName];
164
+ if (!constraint) {
165
+ constraint = {
166
+ name: constraintName,
167
+ type: constraintType,
168
+ relatedConstraintName: relatedConstraintName,
169
+ searchCondition: searchCondition,
170
+ };
171
+ }
172
+ column.constraints[constraintName] = constraint;
173
+ }
174
+ });
175
+ }
176
+ return oracleTables;
173
177
  }
174
- return oracleTables;
175
- }
176
- static isSupportedColumn(column) {
177
- return !UNSUPPORTED_TYPES.includes(column.type);
178
- }
179
- static isAutoColumn(column) {
180
- return !!(column.default && column.default.toLowerCase().includes("nextval"));
181
- }
182
- /**
183
- * No native boolean in oracle. Best we can do is to check if a manual 1 or 0 number constraint has been set up
184
- * This matches the default behaviour for generating DDL used in knex.
185
- */
186
- isBooleanType(column) {
187
- return (column.type.toLowerCase() === "number" &&
188
- Object.values(column.constraints).filter(c => {
189
- if (c.type === OracleContraintTypes.NOT_NULL_OR_CHECK &&
190
- c.searchCondition) {
191
- const condition = c.searchCondition
192
- .replace(/\s/g, "") // remove spaces
193
- .replace(/[']+/g, ""); // remove quotes
194
- if (condition.includes("in(0,1)") || condition.includes("in(1,0)")) {
195
- return true;
178
+ static isSupportedColumn(column) {
179
+ return !UNSUPPORTED_TYPES.includes(column.type);
180
+ }
181
+ static isAutoColumn(column) {
182
+ return !!(column.default && column.default.toLowerCase().includes("nextval"));
183
+ }
184
+ /**
185
+ * No native boolean in oracle. Best we can do is to check if a manual 1 or 0 number constraint has been set up
186
+ * This matches the default behaviour for generating DDL used in knex.
187
+ */
188
+ isBooleanType(column) {
189
+ return (column.type.toLowerCase() === "number" &&
190
+ Object.values(column.constraints).filter(c => {
191
+ if (c.type === OracleContraintTypes.NOT_NULL_OR_CHECK &&
192
+ c.searchCondition) {
193
+ const condition = c.searchCondition
194
+ .replace(/\s/g, "") // remove spaces
195
+ .replace(/[']+/g, ""); // remove quotes
196
+ if (condition.includes("in(0,1)") ||
197
+ condition.includes("in(1,0)")) {
198
+ return true;
199
+ }
196
200
  }
197
- }
198
- return false;
199
- }).length > 0);
200
- }
201
- internalConvertType(column) {
202
- if (this.isBooleanType(column)) {
203
- return { type: constants_1.FieldTypes.BOOLEAN };
201
+ return false;
202
+ }).length > 0);
204
203
  }
205
- return (0, utils_1.convertSqlType)(column.type);
206
- }
207
- /**
208
- * Fetches the tables from the oracle table and assigns them to the datasource.
209
- * @param {*} datasourceId - datasourceId to fetch
210
- * @param entities - the tables that are to be built
211
- */
212
- buildSchema(datasourceId, entities) {
213
- return __awaiter(this, void 0, void 0, function* () {
214
- const columnsResponse = yield this.internalQuery({
215
- sql: this.COLUMNS_SQL,
216
- });
217
- const oracleTables = this.mapColumns(columnsResponse);
218
- const tables = {};
219
- // iterate each table
220
- Object.values(oracleTables).forEach(oracleTable => {
221
- let table = tables[oracleTable.name];
222
- if (!table) {
223
- table = {
224
- _id: (0, utils_1.buildExternalTableId)(datasourceId, oracleTable.name),
225
- primary: [],
226
- name: oracleTable.name,
227
- schema: {},
228
- };
229
- tables[oracleTable.name] = table;
230
- }
231
- // iterate each column on the table
232
- Object.values(oracleTable.columns)
233
- // remove columns that we can't read / save
234
- .filter(oracleColumn => OracleIntegration.isSupportedColumn(oracleColumn))
235
- // match the order of the columns in the db
236
- .sort((c1, c2) => c1.id - c2.id)
237
- .forEach(oracleColumn => {
238
- const columnName = oracleColumn.name;
239
- let fieldSchema = table.schema[columnName];
240
- if (!fieldSchema) {
241
- fieldSchema = Object.assign({ autocolumn: OracleIntegration.isAutoColumn(oracleColumn), name: columnName }, this.internalConvertType(oracleColumn));
242
- table.schema[columnName] = fieldSchema;
204
+ internalConvertType(column) {
205
+ if (this.isBooleanType(column)) {
206
+ return { type: constants_1.FieldTypes.BOOLEAN };
207
+ }
208
+ return (0, utils_1.convertSqlType)(column.type);
209
+ }
210
+ /**
211
+ * Fetches the tables from the oracle table and assigns them to the datasource.
212
+ * @param {*} datasourceId - datasourceId to fetch
213
+ * @param entities - the tables that are to be built
214
+ */
215
+ buildSchema(datasourceId, entities) {
216
+ return __awaiter(this, void 0, void 0, function* () {
217
+ const columnsResponse = yield this.internalQuery({
218
+ sql: this.COLUMNS_SQL,
219
+ });
220
+ const oracleTables = this.mapColumns(columnsResponse);
221
+ const tables = {};
222
+ // iterate each table
223
+ Object.values(oracleTables).forEach(oracleTable => {
224
+ let table = tables[oracleTable.name];
225
+ if (!table) {
226
+ table = {
227
+ _id: (0, utils_1.buildExternalTableId)(datasourceId, oracleTable.name),
228
+ primary: [],
229
+ name: oracleTable.name,
230
+ schema: {},
231
+ };
232
+ tables[oracleTable.name] = table;
243
233
  }
244
- // iterate each constraint on the column
245
- Object.values(oracleColumn.constraints).forEach(oracleConstraint => {
246
- if (oracleConstraint.type === OracleContraintTypes.PRIMARY) {
247
- table.primary.push(columnName);
234
+ // iterate each column on the table
235
+ Object.values(oracleTable.columns)
236
+ // remove columns that we can't read / save
237
+ .filter(oracleColumn => OracleIntegration.isSupportedColumn(oracleColumn))
238
+ // match the order of the columns in the db
239
+ .sort((c1, c2) => c1.id - c2.id)
240
+ .forEach(oracleColumn => {
241
+ const columnName = oracleColumn.name;
242
+ let fieldSchema = table.schema[columnName];
243
+ if (!fieldSchema) {
244
+ fieldSchema = Object.assign({ autocolumn: OracleIntegration.isAutoColumn(oracleColumn), name: columnName }, this.internalConvertType(oracleColumn));
245
+ table.schema[columnName] = fieldSchema;
248
246
  }
247
+ // iterate each constraint on the column
248
+ Object.values(oracleColumn.constraints).forEach(oracleConstraint => {
249
+ if (oracleConstraint.type === OracleContraintTypes.PRIMARY) {
250
+ table.primary.push(columnName);
251
+ }
252
+ });
249
253
  });
250
254
  });
255
+ const final = (0, utils_1.finaliseExternalTables)(tables, entities);
256
+ this.tables = final.tables;
257
+ this.schemaErrors = final.errors;
251
258
  });
252
- const final = (0, utils_1.finaliseExternalTables)(tables, entities);
253
- this.tables = final.tables;
254
- this.schemaErrors = final.errors;
255
- });
256
- }
257
- internalQuery(query) {
258
- return __awaiter(this, void 0, void 0, function* () {
259
- let connection;
260
- try {
261
- this.index = 1;
262
- connection = yield this.getConnection();
263
- const options = { autoCommit: true };
264
- const bindings = query.bindings || [];
265
- return yield connection.execute(query.sql, bindings, options);
266
- }
267
- finally {
268
- if (connection) {
269
- try {
270
- yield connection.close();
271
- }
272
- catch (err) {
273
- console.error(err);
274
- }
275
- }
276
- }
277
- });
278
- }
279
- create(query) {
280
- return __awaiter(this, void 0, void 0, function* () {
281
- const response = yield this.internalQuery((0, utils_1.getSqlQuery)(query));
282
- return response.rows && response.rows.length
283
- ? response.rows
284
- : [{ created: true }];
285
- });
286
- }
287
- read(query) {
288
- return __awaiter(this, void 0, void 0, function* () {
289
- const response = yield this.internalQuery((0, utils_1.getSqlQuery)(query));
290
- return response.rows ? response.rows : [];
291
- });
292
- }
293
- update(query) {
294
- return __awaiter(this, void 0, void 0, function* () {
295
- const response = yield this.internalQuery((0, utils_1.getSqlQuery)(query));
296
- return response.rows && response.rows.length
297
- ? response.rows
298
- : [{ updated: true }];
299
- });
300
- }
301
- delete(query) {
302
- return __awaiter(this, void 0, void 0, function* () {
303
- const response = yield this.internalQuery((0, utils_1.getSqlQuery)(query));
304
- return response.rows && response.rows.length
305
- ? response.rows
306
- : [{ deleted: true }];
307
- });
308
- }
309
- query(json) {
310
- var _a, _b, _c;
311
- return __awaiter(this, void 0, void 0, function* () {
312
- const operation = this._operation(json);
313
- const input = this._query(json, { disableReturning: true });
314
- if (Array.isArray(input)) {
315
- const responses = [];
316
- for (let query of input) {
317
- responses.push(yield this.internalQuery(query));
318
- }
319
- return responses;
320
- }
321
- else {
322
- // read the row to be deleted up front for the return
323
- let deletedRows;
324
- if (operation === types_1.Operation.DELETE) {
325
- const queryFn = (query) => this.internalQuery(query);
326
- deletedRows = yield this.getReturningRow(queryFn, json);
259
+ }
260
+ internalQuery(query) {
261
+ return __awaiter(this, void 0, void 0, function* () {
262
+ let connection;
263
+ try {
264
+ this.index = 1;
265
+ connection = yield this.getConnection();
266
+ const options = { autoCommit: true };
267
+ const bindings = query.bindings || [];
268
+ return yield connection.execute(query.sql, bindings, options);
327
269
  }
328
- // run the query
329
- const response = yield this.internalQuery(input);
330
- // get the results or return the created / updated / deleted row
331
- if ((_a = deletedRows === null || deletedRows === void 0 ? void 0 : deletedRows.rows) === null || _a === void 0 ? void 0 : _a.length) {
332
- return deletedRows.rows;
270
+ finally {
271
+ if (connection) {
272
+ try {
273
+ yield connection.close();
274
+ }
275
+ catch (err) {
276
+ console.error(err);
277
+ }
278
+ }
333
279
  }
334
- else if ((_b = response.rows) === null || _b === void 0 ? void 0 : _b.length) {
335
- return response.rows;
280
+ });
281
+ }
282
+ create(query) {
283
+ return __awaiter(this, void 0, void 0, function* () {
284
+ const response = yield this.internalQuery((0, utils_1.getSqlQuery)(query));
285
+ return response.rows && response.rows.length
286
+ ? response.rows
287
+ : [{ created: true }];
288
+ });
289
+ }
290
+ read(query) {
291
+ return __awaiter(this, void 0, void 0, function* () {
292
+ const response = yield this.internalQuery((0, utils_1.getSqlQuery)(query));
293
+ return response.rows ? response.rows : [];
294
+ });
295
+ }
296
+ update(query) {
297
+ return __awaiter(this, void 0, void 0, function* () {
298
+ const response = yield this.internalQuery((0, utils_1.getSqlQuery)(query));
299
+ return response.rows && response.rows.length
300
+ ? response.rows
301
+ : [{ updated: true }];
302
+ });
303
+ }
304
+ delete(query) {
305
+ return __awaiter(this, void 0, void 0, function* () {
306
+ const response = yield this.internalQuery((0, utils_1.getSqlQuery)(query));
307
+ return response.rows && response.rows.length
308
+ ? response.rows
309
+ : [{ deleted: true }];
310
+ });
311
+ }
312
+ query(json) {
313
+ var _a, _b, _c;
314
+ return __awaiter(this, void 0, void 0, function* () {
315
+ const operation = this._operation(json);
316
+ const input = this._query(json, { disableReturning: true });
317
+ if (Array.isArray(input)) {
318
+ const responses = [];
319
+ for (let query of input) {
320
+ responses.push(yield this.internalQuery(query));
321
+ }
322
+ return responses;
336
323
  }
337
324
  else {
338
- // get the last row that was updated
339
- if (response.lastRowid &&
340
- ((_c = json.endpoint) === null || _c === void 0 ? void 0 : _c.entityId) &&
341
- operation !== types_1.Operation.DELETE) {
342
- const lastRow = yield this.internalQuery({
343
- sql: `SELECT * FROM \"${json.endpoint.entityId}\" WHERE ROWID = '${response.lastRowid}'`,
344
- });
345
- return lastRow.rows;
325
+ // read the row to be deleted up front for the return
326
+ let deletedRows;
327
+ if (operation === types_1.Operation.DELETE) {
328
+ const queryFn = (query) => this.internalQuery(query);
329
+ deletedRows = yield this.getReturningRow(queryFn, json);
330
+ }
331
+ // run the query
332
+ const response = yield this.internalQuery(input);
333
+ // get the results or return the created / updated / deleted row
334
+ if ((_a = deletedRows === null || deletedRows === void 0 ? void 0 : deletedRows.rows) === null || _a === void 0 ? void 0 : _a.length) {
335
+ return deletedRows.rows;
336
+ }
337
+ else if ((_b = response.rows) === null || _b === void 0 ? void 0 : _b.length) {
338
+ return response.rows;
346
339
  }
347
340
  else {
348
- return [{ [operation.toLowerCase()]: true }];
341
+ // get the last row that was updated
342
+ if (response.lastRowid &&
343
+ ((_c = json.endpoint) === null || _c === void 0 ? void 0 : _c.entityId) &&
344
+ operation !== types_1.Operation.DELETE) {
345
+ const lastRow = yield this.internalQuery({
346
+ sql: `SELECT * FROM \"${json.endpoint.entityId}\" WHERE ROWID = '${response.lastRowid}'`,
347
+ });
348
+ return lastRow.rows;
349
+ }
350
+ else {
351
+ return [{ [operation.toLowerCase()]: true }];
352
+ }
349
353
  }
350
354
  }
351
- }
352
- });
355
+ });
356
+ }
353
357
  }
354
- }
355
- exports.default = {
356
- schema: SCHEMA,
357
- integration: OracleIntegration,
358
- };
358
+ module.exports = {
359
+ schema: SCHEMA,
360
+ integration: OracleIntegration,
361
+ };
362
+ })(OracleModule || (OracleModule = {}));