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