@budibase/server 1.0.79-alpha.9 → 1.0.80-alpha.1
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__/mysql2/promise.ts +17 -0
- package/builder/assets/{index.e6e92f4f.js → index.c0b657be.js} +84 -84
- package/builder/assets/{vendor.6b00a24f.js → vendor.a7c6ad0a.js} +1 -1
- package/builder/index.html +2 -2
- package/coverage/clover.xml +2 -2
- package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
- package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/controllers/application.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 +1 -1
- package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
- package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
- package/coverage/lcov-report/api/controllers/index.html +1 -1
- package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
- 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/index.js.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 +1 -1
- package/coverage/lcov-report/api/controllers/row/index.html +1 -1
- package/coverage/lcov-report/api/controllers/row/index.js.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 +1 -1
- 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/table/internal.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/utils.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 +1 -1
- 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/application.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/index.js.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/row.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/static.js.html +1 -1
- package/coverage/lcov-report/api/routes/table.js.html +1 -1
- 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 +1 -1
- package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
- 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/createRow.js.html +1 -1
- package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
- package/coverage/lcov-report/automations/steps/deleteRow.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/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/automations/utils.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/client.js.html +1 -1
- package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
- package/coverage/lcov-report/db/index.html +1 -1
- 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 +1 -1
- package/coverage/lcov-report/db/utils.js.html +1 -1
- 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 +1 -1
- 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/authorized.js.html +1 -1
- package/coverage/lcov-report/middleware/builder.js.html +1 -1
- package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
- 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/resourceId.js.html +1 -1
- package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
- package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
- package/coverage/lcov-report/middleware/utils.js.html +1 -1
- package/coverage/lcov-report/threads/automation.js.html +1 -1
- package/coverage/lcov-report/threads/index.html +1 -1
- package/coverage/lcov-report/threads/index.js.html +1 -1
- package/coverage/lcov-report/threads/query.js.html +1 -1
- package/coverage/lcov-report/threads/utils.js.html +1 -1
- package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
- package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
- package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
- package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
- package/coverage/lcov-report/utilities/global.js.html +1 -1
- package/coverage/lcov-report/utilities/index.html +1 -1
- package/coverage/lcov-report/utilities/index.js.html +1 -1
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
- 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 +1 -1
- 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/index.js.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/dist/api/routes/public/index.js +33 -0
- package/dist/environment.js +1 -0
- package/dist/integrations/mysql.js +71 -56
- package/dist/integrations/utils.js +1 -1
- package/dist/package.json +7 -4
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -5
- package/src/api/controllers/row/ExternalRequest.ts +1 -1
- package/src/api/routes/public/index.ts +36 -0
- package/src/environment.js +1 -0
- package/src/integrations/mysql.ts +79 -70
- package/src/integrations/tests/mysql.spec.js +4 -4
- package/src/integrations/utils.ts +1 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@budibase/server",
|
|
3
3
|
"email": "hi@budibase.com",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.80-alpha.1",
|
|
5
5
|
"description": "Budibase Web Server",
|
|
6
6
|
"main": "src/index.ts",
|
|
7
7
|
"repository": {
|
|
@@ -71,9 +71,9 @@
|
|
|
71
71
|
"license": "GPL-3.0",
|
|
72
72
|
"dependencies": {
|
|
73
73
|
"@apidevtools/swagger-parser": "^10.0.3",
|
|
74
|
-
"@budibase/backend-core": "^1.0.
|
|
75
|
-
"@budibase/client": "^1.0.
|
|
76
|
-
"@budibase/string-templates": "^1.0.
|
|
74
|
+
"@budibase/backend-core": "^1.0.80-alpha.1",
|
|
75
|
+
"@budibase/client": "^1.0.80-alpha.1",
|
|
76
|
+
"@budibase/string-templates": "^1.0.80-alpha.1",
|
|
77
77
|
"@bull-board/api": "^3.7.0",
|
|
78
78
|
"@bull-board/koa": "^3.7.0",
|
|
79
79
|
"@elastic/elasticsearch": "7.10.0",
|
|
@@ -108,6 +108,7 @@
|
|
|
108
108
|
"koa-send": "5.0.0",
|
|
109
109
|
"koa-session": "5.12.0",
|
|
110
110
|
"koa-static": "5.0.0",
|
|
111
|
+
"koa2-ratelimit": "^1.1.0",
|
|
111
112
|
"lodash": "4.17.21",
|
|
112
113
|
"memorystream": "^0.3.1",
|
|
113
114
|
"mongodb": "3.6.3",
|
|
@@ -123,6 +124,7 @@
|
|
|
123
124
|
"pouchdb-all-dbs": "1.0.2",
|
|
124
125
|
"pouchdb-find": "^7.2.2",
|
|
125
126
|
"pouchdb-replication-stream": "1.2.9",
|
|
127
|
+
"redis": "4",
|
|
126
128
|
"server-destroy": "1.0.1",
|
|
127
129
|
"svelte": "^3.38.2",
|
|
128
130
|
"swagger-parser": "^10.0.3",
|
|
@@ -148,6 +150,7 @@
|
|
|
148
150
|
"@types/koa-router": "^7.4.2",
|
|
149
151
|
"@types/node": "^15.12.4",
|
|
150
152
|
"@types/oracledb": "^5.2.1",
|
|
153
|
+
"@types/redis": "^4.0.11",
|
|
151
154
|
"@typescript-eslint/parser": "4.28.0",
|
|
152
155
|
"apidoc": "^0.50.2",
|
|
153
156
|
"babel-jest": "^27.0.2",
|
|
@@ -172,5 +175,5 @@
|
|
|
172
175
|
"optionalDependencies": {
|
|
173
176
|
"oracledb": "^5.3.0"
|
|
174
177
|
},
|
|
175
|
-
"gitHead": "
|
|
178
|
+
"gitHead": "946d24502027e86e6c9a67685c780e20bcc127de"
|
|
176
179
|
}
|
|
@@ -58,7 +58,7 @@ module External {
|
|
|
58
58
|
) {
|
|
59
59
|
const primary = table.primary
|
|
60
60
|
// if passed in array need to copy for shifting etc
|
|
61
|
-
let idCopy = cloneDeep(id)
|
|
61
|
+
let idCopy: undefined | string | any[] = cloneDeep(id)
|
|
62
62
|
if (filters) {
|
|
63
63
|
// need to map over the filters and make sure the _id field isn't present
|
|
64
64
|
for (let filter of Object.values(filters)) {
|
|
@@ -8,18 +8,54 @@ import authorized from "../../../middleware/authorized"
|
|
|
8
8
|
import { paramResource, paramSubResource } from "../../../middleware/resourceId"
|
|
9
9
|
import { CtxFn } from "./utils/Endpoint"
|
|
10
10
|
import mapperMiddleware from "./middleware/mapper"
|
|
11
|
+
import env from "../../../environment"
|
|
12
|
+
// below imports don't have declaration files
|
|
11
13
|
const Router = require("@koa/router")
|
|
14
|
+
const { RateLimit, Stores } = require("koa2-ratelimit")
|
|
12
15
|
const {
|
|
13
16
|
PermissionLevels,
|
|
14
17
|
PermissionTypes,
|
|
15
18
|
} = require("@budibase/backend-core/permissions")
|
|
19
|
+
const { getRedisOptions } = require("@budibase/backend-core/redis").utils
|
|
16
20
|
|
|
17
21
|
const PREFIX = "/api/public/v1"
|
|
22
|
+
// allow a lot more requests when in test
|
|
23
|
+
const DEFAULT_API_REQ_LIMIT_PER_SEC = env.isTest() ? 100 : 10
|
|
24
|
+
|
|
25
|
+
function getApiLimitPerSecond(): number {
|
|
26
|
+
if (!env.API_REQ_LIMIT_PER_SEC) {
|
|
27
|
+
return DEFAULT_API_REQ_LIMIT_PER_SEC
|
|
28
|
+
}
|
|
29
|
+
return parseInt(env.API_REQ_LIMIT_PER_SEC)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (!env.isTest()) {
|
|
33
|
+
const REDIS_OPTS = getRedisOptions()
|
|
34
|
+
RateLimit.defaultOptions({
|
|
35
|
+
store: new Stores.Redis({
|
|
36
|
+
// @ts-ignore
|
|
37
|
+
socket: {
|
|
38
|
+
host: REDIS_OPTS.host,
|
|
39
|
+
port: REDIS_OPTS.port,
|
|
40
|
+
},
|
|
41
|
+
password: REDIS_OPTS.opts.password,
|
|
42
|
+
database: 1,
|
|
43
|
+
}),
|
|
44
|
+
})
|
|
45
|
+
}
|
|
46
|
+
// rate limiting, allows for 2 requests per second
|
|
47
|
+
const limiter = RateLimit.middleware({
|
|
48
|
+
interval: { sec: 1 },
|
|
49
|
+
// per ip, per interval
|
|
50
|
+
max: getApiLimitPerSecond(),
|
|
51
|
+
})
|
|
18
52
|
|
|
19
53
|
const publicRouter = new Router({
|
|
20
54
|
prefix: PREFIX,
|
|
21
55
|
})
|
|
22
56
|
|
|
57
|
+
publicRouter.use(limiter)
|
|
58
|
+
|
|
23
59
|
function addMiddleware(
|
|
24
60
|
endpoints: any,
|
|
25
61
|
middleware: CtxFn,
|
package/src/environment.js
CHANGED
|
@@ -45,6 +45,7 @@ module.exports = {
|
|
|
45
45
|
INTERNAL_API_KEY: process.env.INTERNAL_API_KEY,
|
|
46
46
|
MULTI_TENANCY: process.env.MULTI_TENANCY,
|
|
47
47
|
HTTP_MIGRATIONS: process.env.HTTP_MIGRATIONS,
|
|
48
|
+
API_REQ_LIMIT_PER_SEC: process.env.API_REQ_LIMIT_PER_SEC,
|
|
48
49
|
// environment
|
|
49
50
|
NODE_ENV: process.env.NODE_ENV,
|
|
50
51
|
JEST_WORKER_ID: process.env.JEST_WORKER_ID,
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
import { DatasourcePlus } from "./base/datasourcePlus"
|
|
17
17
|
|
|
18
18
|
module MySQLModule {
|
|
19
|
-
const mysql = require("mysql2")
|
|
19
|
+
const mysql = require("mysql2/promise")
|
|
20
20
|
const Sql = require("./base/sql")
|
|
21
21
|
|
|
22
22
|
interface MySQLConfig {
|
|
@@ -29,7 +29,7 @@ module MySQLModule {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
const SCHEMA: Integration = {
|
|
32
|
-
docs: "https://github.com/
|
|
32
|
+
docs: "https://github.com/sidorares/node-mysql2",
|
|
33
33
|
plus: true,
|
|
34
34
|
friendlyName: "MySQL",
|
|
35
35
|
description:
|
|
@@ -82,7 +82,7 @@ module MySQLModule {
|
|
|
82
82
|
|
|
83
83
|
class MySQLIntegration extends Sql implements DatasourcePlus {
|
|
84
84
|
private config: MySQLConfig
|
|
85
|
-
private
|
|
85
|
+
private client: any
|
|
86
86
|
public tables: Record<string, Table> = {}
|
|
87
87
|
public schemaErrors: Record<string, string> = {}
|
|
88
88
|
|
|
@@ -92,92 +92,99 @@ module MySQLModule {
|
|
|
92
92
|
if (config.ssl && Object.keys(config.ssl).length === 0) {
|
|
93
93
|
delete config.ssl
|
|
94
94
|
}
|
|
95
|
-
this.
|
|
95
|
+
this.config = config
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
getBindingIdentifier(): string {
|
|
99
99
|
return "?"
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
|
|
102
|
+
async connect() {
|
|
103
|
+
this.client = await mysql.createConnection(this.config)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async disconnect() {
|
|
107
|
+
await this.client.end()
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
async internalQuery(
|
|
103
111
|
query: SqlQuery,
|
|
104
112
|
connect: boolean = true
|
|
105
113
|
): Promise<any[] | any> {
|
|
106
|
-
|
|
107
|
-
// Node MySQL is callback based, so we must wrap our call in a promise
|
|
108
|
-
return new Promise((resolve, reject) => {
|
|
114
|
+
try {
|
|
109
115
|
if (connect) {
|
|
110
|
-
|
|
116
|
+
await this.connect()
|
|
111
117
|
}
|
|
112
|
-
|
|
118
|
+
// Node MySQL is callback based, so we must wrap our call in a promise
|
|
119
|
+
const response = await this.client.query(
|
|
113
120
|
query.sql,
|
|
114
|
-
query.bindings ||
|
|
115
|
-
(error: any, results: object[]) => {
|
|
116
|
-
if (error) {
|
|
117
|
-
reject(error)
|
|
118
|
-
} else {
|
|
119
|
-
resolve(results)
|
|
120
|
-
}
|
|
121
|
-
if (connect) {
|
|
122
|
-
client.end()
|
|
123
|
-
}
|
|
124
|
-
}
|
|
121
|
+
query.bindings || []
|
|
125
122
|
)
|
|
126
|
-
|
|
123
|
+
return response[0]
|
|
124
|
+
} finally {
|
|
125
|
+
if (connect) {
|
|
126
|
+
await this.disconnect()
|
|
127
|
+
}
|
|
128
|
+
}
|
|
127
129
|
}
|
|
128
130
|
|
|
129
131
|
async buildSchema(datasourceId: string, entities: Record<string, Table>) {
|
|
130
132
|
const tables: { [key: string]: Table } = {}
|
|
131
133
|
const database = this.config.database
|
|
132
|
-
this.
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
)
|
|
139
|
-
const tableNames = tablesResp.map(
|
|
140
|
-
(obj: any) =>
|
|
141
|
-
obj[`Tables_in_${database}`] ||
|
|
142
|
-
obj[`Tables_in_${database.toLowerCase()}`]
|
|
143
|
-
)
|
|
144
|
-
for (let tableName of tableNames) {
|
|
145
|
-
const primaryKeys = []
|
|
146
|
-
const schema: TableSchema = {}
|
|
147
|
-
const descResp = await this.internalQuery(
|
|
148
|
-
{ sql: `DESCRIBE \`${tableName}\`;` },
|
|
134
|
+
await this.connect()
|
|
135
|
+
|
|
136
|
+
try {
|
|
137
|
+
// get the tables first
|
|
138
|
+
const tablesResp = await this.internalQuery(
|
|
139
|
+
{ sql: "SHOW TABLES;" },
|
|
149
140
|
false
|
|
150
141
|
)
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
142
|
+
const tableNames = tablesResp.map(
|
|
143
|
+
(obj: any) =>
|
|
144
|
+
obj[`Tables_in_${database}`] ||
|
|
145
|
+
obj[`Tables_in_${database.toLowerCase()}`]
|
|
146
|
+
)
|
|
147
|
+
for (let tableName of tableNames) {
|
|
148
|
+
const primaryKeys = []
|
|
149
|
+
const schema: TableSchema = {}
|
|
150
|
+
const descResp = await this.internalQuery(
|
|
151
|
+
{ sql: `DESCRIBE \`${tableName}\`;` },
|
|
152
|
+
false
|
|
153
|
+
)
|
|
154
|
+
for (let column of descResp) {
|
|
155
|
+
const columnName = column.Field
|
|
156
|
+
if (
|
|
157
|
+
column.Key === "PRI" &&
|
|
158
|
+
primaryKeys.indexOf(column.Key) === -1
|
|
159
|
+
) {
|
|
160
|
+
primaryKeys.push(columnName)
|
|
161
|
+
}
|
|
162
|
+
const constraints = {
|
|
163
|
+
presence: column.Null !== "YES",
|
|
164
|
+
}
|
|
165
|
+
const isAuto: boolean =
|
|
166
|
+
typeof column.Extra === "string" &&
|
|
167
|
+
(column.Extra === "auto_increment" ||
|
|
168
|
+
column.Extra.toLowerCase().includes("generated"))
|
|
169
|
+
schema[columnName] = {
|
|
170
|
+
name: columnName,
|
|
171
|
+
autocolumn: isAuto,
|
|
172
|
+
type: convertSqlType(column.Type),
|
|
173
|
+
constraints,
|
|
174
|
+
}
|
|
168
175
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
+
if (!tables[tableName]) {
|
|
177
|
+
tables[tableName] = {
|
|
178
|
+
_id: buildExternalTableId(datasourceId, tableName),
|
|
179
|
+
primary: primaryKeys,
|
|
180
|
+
name: tableName,
|
|
181
|
+
schema,
|
|
182
|
+
}
|
|
176
183
|
}
|
|
177
184
|
}
|
|
185
|
+
} finally {
|
|
186
|
+
await this.disconnect()
|
|
178
187
|
}
|
|
179
|
-
|
|
180
|
-
this.client.end()
|
|
181
188
|
const final = finaliseExternalTables(tables, entities)
|
|
182
189
|
this.tables = final.tables
|
|
183
190
|
this.schemaErrors = final.errors
|
|
@@ -203,11 +210,13 @@ module MySQLModule {
|
|
|
203
210
|
}
|
|
204
211
|
|
|
205
212
|
async query(json: QueryJson) {
|
|
206
|
-
this.
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
213
|
+
await this.connect()
|
|
214
|
+
try {
|
|
215
|
+
const queryFn = (query: any) => this.internalQuery(query, false)
|
|
216
|
+
return await this.queryWithReturning(json, queryFn)
|
|
217
|
+
} finally {
|
|
218
|
+
await this.disconnect()
|
|
219
|
+
}
|
|
211
220
|
}
|
|
212
221
|
}
|
|
213
222
|
|
|
@@ -19,7 +19,7 @@ describe("MySQL Integration", () => {
|
|
|
19
19
|
await config.integration.create({
|
|
20
20
|
sql
|
|
21
21
|
})
|
|
22
|
-
expect(config.integration.client.query).toHaveBeenCalledWith(sql,
|
|
22
|
+
expect(config.integration.client.query).toHaveBeenCalledWith(sql, [])
|
|
23
23
|
})
|
|
24
24
|
|
|
25
25
|
it("calls the read method with the correct params", async () => {
|
|
@@ -27,7 +27,7 @@ describe("MySQL Integration", () => {
|
|
|
27
27
|
await config.integration.read({
|
|
28
28
|
sql
|
|
29
29
|
})
|
|
30
|
-
expect(config.integration.client.query).toHaveBeenCalledWith(sql,
|
|
30
|
+
expect(config.integration.client.query).toHaveBeenCalledWith(sql, [])
|
|
31
31
|
})
|
|
32
32
|
|
|
33
33
|
it("calls the update method with the correct params", async () => {
|
|
@@ -35,7 +35,7 @@ describe("MySQL Integration", () => {
|
|
|
35
35
|
await config.integration.update({
|
|
36
36
|
sql
|
|
37
37
|
})
|
|
38
|
-
expect(config.integration.client.query).toHaveBeenCalledWith(sql,
|
|
38
|
+
expect(config.integration.client.query).toHaveBeenCalledWith(sql, [])
|
|
39
39
|
})
|
|
40
40
|
|
|
41
41
|
it("calls the delete method with the correct params", async () => {
|
|
@@ -43,7 +43,7 @@ describe("MySQL Integration", () => {
|
|
|
43
43
|
await config.integration.delete({
|
|
44
44
|
sql
|
|
45
45
|
})
|
|
46
|
-
expect(config.integration.client.query).toHaveBeenCalledWith(sql,
|
|
46
|
+
expect(config.integration.client.query).toHaveBeenCalledWith(sql, [])
|
|
47
47
|
})
|
|
48
48
|
|
|
49
49
|
describe("no rows returned", () => {
|