@budibase/server 1.0.80-alpha.1 → 1.0.80-alpha.2
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/builder/assets/{index.c0b657be.js → index.f3e82852.js} +1 -1
- package/builder/index.html +1 -1
- 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/integrations/base/sql.js +16 -1
- package/dist/integrations/base/sqlTable.js +8 -4
- package/dist/integrations/microsoftSqlServer.js +28 -17
- package/dist/integrations/utils.js +32 -15
- package/dist/package.json +4 -4
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/scripts/integrations/mssql/data/setup.sql +18 -1
- package/scripts/integrations/postgres/init.sql +6 -0
- package/src/definitions/datasource.ts +1 -0
- package/src/integrations/base/sql.ts +16 -1
- package/src/integrations/base/sqlTable.ts +11 -7
- package/src/integrations/microsoftSqlServer.ts +52 -32
- package/src/integrations/utils.ts +43 -15
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.80-alpha.
|
|
4
|
+
"version": "1.0.80-alpha.2",
|
|
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.80-alpha.
|
|
75
|
-
"@budibase/client": "^1.0.80-alpha.
|
|
76
|
-
"@budibase/string-templates": "^1.0.80-alpha.
|
|
74
|
+
"@budibase/backend-core": "^1.0.80-alpha.2",
|
|
75
|
+
"@budibase/client": "^1.0.80-alpha.2",
|
|
76
|
+
"@budibase/string-templates": "^1.0.80-alpha.2",
|
|
77
77
|
"@bull-board/api": "^3.7.0",
|
|
78
78
|
"@bull-board/koa": "^3.7.0",
|
|
79
79
|
"@elastic/elasticsearch": "7.10.0",
|
|
@@ -175,5 +175,5 @@
|
|
|
175
175
|
"optionalDependencies": {
|
|
176
176
|
"oracledb": "^5.3.0"
|
|
177
177
|
},
|
|
178
|
-
"gitHead": "
|
|
178
|
+
"gitHead": "e159e4a15eeb454b72602911b6654d7dd5f49f6f"
|
|
179
179
|
}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
USE master;
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
IF NOT EXISTS(SELECT 1 FROM sys.schemas WHERE name = 'Chains')
|
|
4
|
+
BEGIN
|
|
5
|
+
EXEC sys.sp_executesql N'CREATE SCHEMA Chains;'
|
|
6
|
+
END
|
|
7
|
+
|
|
3
8
|
IF OBJECT_ID ('dbo.products', 'U') IS NOT NULL
|
|
4
9
|
DROP TABLE products;
|
|
5
10
|
GO
|
|
@@ -61,3 +66,15 @@ VALUES ('Bob', '30'),
|
|
|
61
66
|
('Bobert', '99'),
|
|
62
67
|
('Jan', '22'),
|
|
63
68
|
('Megan', '11');
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
IF OBJECT_ID ('Chains.sizes', 'U') IS NOT NULL
|
|
72
|
+
DROP TABLE Chains.sizes;
|
|
73
|
+
GO
|
|
74
|
+
CREATE TABLE Chains.sizes
|
|
75
|
+
(
|
|
76
|
+
sizeid int IDENTITY(1, 1),
|
|
77
|
+
name varchar(30),
|
|
78
|
+
CONSTRAINT pk_size PRIMARY KEY NONCLUSTERED (sizeid)
|
|
79
|
+
);
|
|
80
|
+
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
SELECT 'CREATE DATABASE main'
|
|
2
2
|
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'main')\gexec
|
|
3
|
+
CREATE SCHEMA test;
|
|
3
4
|
CREATE TYPE person_job AS ENUM ('qa', 'programmer', 'designer');
|
|
4
5
|
CREATE TABLE Persons (
|
|
5
6
|
PersonID SERIAL PRIMARY KEY,
|
|
@@ -37,6 +38,10 @@ CREATE TABLE Products_Tasks (
|
|
|
37
38
|
REFERENCES Tasks(TaskID),
|
|
38
39
|
PRIMARY KEY (ProductID, TaskID)
|
|
39
40
|
);
|
|
41
|
+
CREATE TABLE test.table1 (
|
|
42
|
+
id SERIAL PRIMARY KEY,
|
|
43
|
+
Name varchar(255)
|
|
44
|
+
);
|
|
40
45
|
INSERT INTO Persons (FirstName, LastName, Address, City, Type) VALUES ('Mike', 'Hughes', '123 Fake Street', 'Belfast', 'qa');
|
|
41
46
|
INSERT INTO Persons (FirstName, LastName, Address, City, Type) VALUES ('John', 'Smith', '64 Updown Road', 'Dublin', 'programmer');
|
|
42
47
|
INSERT INTO Tasks (ExecutorID, QaID, TaskName, Completed) VALUES (1, 2, 'assembling', TRUE);
|
|
@@ -48,3 +53,4 @@ INSERT INTO Products_Tasks (ProductID, TaskID) VALUES (1, 1);
|
|
|
48
53
|
INSERT INTO Products_Tasks (ProductID, TaskID) VALUES (2, 1);
|
|
49
54
|
INSERT INTO Products_Tasks (ProductID, TaskID) VALUES (3, 1);
|
|
50
55
|
INSERT INTO Products_Tasks (ProductID, TaskID) VALUES (1, 2);
|
|
56
|
+
INSERT INTO test.table1 (Name) VALUES ('Test');
|
|
@@ -249,6 +249,9 @@ class InternalBuilder {
|
|
|
249
249
|
create(knex: Knex, json: QueryJson, opts: QueryOptions): KnexQuery {
|
|
250
250
|
const { endpoint, body } = json
|
|
251
251
|
let query: KnexQuery = knex(endpoint.entityId)
|
|
252
|
+
if (endpoint.schema) {
|
|
253
|
+
query = query.withSchema(endpoint.schema)
|
|
254
|
+
}
|
|
252
255
|
const parsedBody = parseBody(body)
|
|
253
256
|
// make sure no null values in body for creation
|
|
254
257
|
for (let [key, value] of Object.entries(parsedBody)) {
|
|
@@ -267,6 +270,9 @@ class InternalBuilder {
|
|
|
267
270
|
bulkCreate(knex: Knex, json: QueryJson): KnexQuery {
|
|
268
271
|
const { endpoint, body } = json
|
|
269
272
|
let query: KnexQuery = knex(endpoint.entityId)
|
|
273
|
+
if (endpoint.schema) {
|
|
274
|
+
query = query.withSchema(endpoint.schema)
|
|
275
|
+
}
|
|
270
276
|
if (!Array.isArray(body)) {
|
|
271
277
|
return query
|
|
272
278
|
}
|
|
@@ -275,7 +281,7 @@ class InternalBuilder {
|
|
|
275
281
|
}
|
|
276
282
|
|
|
277
283
|
read(knex: Knex, json: QueryJson, limit: number): KnexQuery {
|
|
278
|
-
let { endpoint, resource, filters,
|
|
284
|
+
let { endpoint, resource, filters, paginate, relationships } = json
|
|
279
285
|
const tableName = endpoint.entityId
|
|
280
286
|
// select all if not specified
|
|
281
287
|
if (!resource) {
|
|
@@ -302,6 +308,9 @@ class InternalBuilder {
|
|
|
302
308
|
}
|
|
303
309
|
// start building the query
|
|
304
310
|
let query: KnexQuery = knex(tableName).limit(foundLimit)
|
|
311
|
+
if (endpoint.schema) {
|
|
312
|
+
query = query.withSchema(endpoint.schema)
|
|
313
|
+
}
|
|
305
314
|
if (foundOffset) {
|
|
306
315
|
query = query.offset(foundOffset)
|
|
307
316
|
}
|
|
@@ -331,6 +340,9 @@ class InternalBuilder {
|
|
|
331
340
|
update(knex: Knex, json: QueryJson, opts: QueryOptions): KnexQuery {
|
|
332
341
|
const { endpoint, body, filters } = json
|
|
333
342
|
let query: KnexQuery = knex(endpoint.entityId)
|
|
343
|
+
if (endpoint.schema) {
|
|
344
|
+
query = query.withSchema(endpoint.schema)
|
|
345
|
+
}
|
|
334
346
|
const parsedBody = parseBody(body)
|
|
335
347
|
query = this.addFilters(query, filters, { tableName: endpoint.entityId })
|
|
336
348
|
// mysql can't use returning
|
|
@@ -344,6 +356,9 @@ class InternalBuilder {
|
|
|
344
356
|
delete(knex: Knex, json: QueryJson, opts: QueryOptions): KnexQuery {
|
|
345
357
|
const { endpoint, filters } = json
|
|
346
358
|
let query: KnexQuery = knex(endpoint.entityId)
|
|
359
|
+
if (endpoint.schema) {
|
|
360
|
+
query = query.withSchema(endpoint.schema)
|
|
361
|
+
}
|
|
347
362
|
query = this.addFilters(query, filters, { tableName: endpoint.entityId })
|
|
348
363
|
// mysql can't use returning
|
|
349
364
|
if (opts.disableReturning) {
|
|
@@ -101,28 +101,28 @@ function generateSchema(
|
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
function buildCreateTable(
|
|
104
|
-
knex:
|
|
104
|
+
knex: SchemaBuilder,
|
|
105
105
|
table: Table,
|
|
106
106
|
tables: Record<string, Table>
|
|
107
107
|
): SchemaBuilder {
|
|
108
|
-
return knex.
|
|
108
|
+
return knex.createTable(table.name, schema => {
|
|
109
109
|
generateSchema(schema, table, tables)
|
|
110
110
|
})
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
function buildUpdateTable(
|
|
114
|
-
knex:
|
|
114
|
+
knex: SchemaBuilder,
|
|
115
115
|
table: Table,
|
|
116
116
|
tables: Record<string, Table>,
|
|
117
117
|
oldTable: Table
|
|
118
118
|
): SchemaBuilder {
|
|
119
|
-
return knex.
|
|
119
|
+
return knex.alterTable(table.name, schema => {
|
|
120
120
|
generateSchema(schema, table, tables, oldTable)
|
|
121
121
|
})
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
-
function buildDeleteTable(knex:
|
|
125
|
-
return knex.
|
|
124
|
+
function buildDeleteTable(knex: SchemaBuilder, table: Table): SchemaBuilder {
|
|
125
|
+
return knex.dropTable(table.name)
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
class SqlTableQueryBuilder {
|
|
@@ -146,7 +146,11 @@ class SqlTableQueryBuilder {
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
_tableQuery(json: QueryJson): any {
|
|
149
|
-
|
|
149
|
+
let client = knex({ client: this.sqlClient }).schema
|
|
150
|
+
if (json?.endpoint?.schema) {
|
|
151
|
+
client = client.withSchema(json.endpoint.schema)
|
|
152
|
+
}
|
|
153
|
+
|
|
150
154
|
let query
|
|
151
155
|
if (!json.table || !json.meta || !json.meta.tables) {
|
|
152
156
|
throw "Cannot execute without table being specified"
|
|
@@ -19,6 +19,7 @@ import { Table, TableSchema } from "../definitions/common"
|
|
|
19
19
|
module MSSQLModule {
|
|
20
20
|
const sqlServer = require("mssql")
|
|
21
21
|
const Sql = require("./base/sql")
|
|
22
|
+
const DEFAULT_SCHEMA = "dbo"
|
|
22
23
|
|
|
23
24
|
interface MSSQLConfig {
|
|
24
25
|
user: string
|
|
@@ -26,9 +27,17 @@ module MSSQLModule {
|
|
|
26
27
|
server: string
|
|
27
28
|
port: number
|
|
28
29
|
database: string
|
|
30
|
+
schema: string
|
|
29
31
|
encrypt?: boolean
|
|
30
32
|
}
|
|
31
33
|
|
|
34
|
+
interface TablesResponse {
|
|
35
|
+
TABLE_CATALOG: string
|
|
36
|
+
TABLE_SCHEMA: string
|
|
37
|
+
TABLE_NAME: string
|
|
38
|
+
TABLE_TYPE: string
|
|
39
|
+
}
|
|
40
|
+
|
|
32
41
|
const SCHEMA: Integration = {
|
|
33
42
|
docs: "https://github.com/tediousjs/node-mssql",
|
|
34
43
|
plus: true,
|
|
@@ -58,6 +67,10 @@ module MSSQLModule {
|
|
|
58
67
|
type: DatasourceFieldTypes.STRING,
|
|
59
68
|
default: "root",
|
|
60
69
|
},
|
|
70
|
+
schema: {
|
|
71
|
+
type: DatasourceFieldTypes.STRING,
|
|
72
|
+
default: DEFAULT_SCHEMA,
|
|
73
|
+
},
|
|
61
74
|
encrypt: {
|
|
62
75
|
type: DatasourceFieldTypes.BOOLEAN,
|
|
63
76
|
default: true,
|
|
@@ -96,6 +109,35 @@ module MSSQLModule {
|
|
|
96
109
|
TABLES_SQL =
|
|
97
110
|
"SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'"
|
|
98
111
|
|
|
112
|
+
constructor(config: MSSQLConfig) {
|
|
113
|
+
super(SqlClients.MS_SQL)
|
|
114
|
+
this.config = config
|
|
115
|
+
const clientCfg = {
|
|
116
|
+
...this.config,
|
|
117
|
+
options: {
|
|
118
|
+
encrypt: this.config.encrypt,
|
|
119
|
+
enableArithAbort: true,
|
|
120
|
+
},
|
|
121
|
+
}
|
|
122
|
+
delete clientCfg.encrypt
|
|
123
|
+
if (!this.pool) {
|
|
124
|
+
this.pool = new sqlServer.ConnectionPool(clientCfg)
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
getBindingIdentifier(): string {
|
|
129
|
+
return `(@p${this.index++})`
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
async connect() {
|
|
133
|
+
try {
|
|
134
|
+
this.client = await this.pool.connect()
|
|
135
|
+
} catch (err) {
|
|
136
|
+
// @ts-ignore
|
|
137
|
+
throw new Error(err)
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
99
141
|
async internalQuery(
|
|
100
142
|
query: SqlQuery,
|
|
101
143
|
operation: string | undefined = undefined
|
|
@@ -151,35 +193,6 @@ module MSSQLModule {
|
|
|
151
193
|
WHERE TABLE_NAME='${tableName}'`
|
|
152
194
|
}
|
|
153
195
|
|
|
154
|
-
constructor(config: MSSQLConfig) {
|
|
155
|
-
super(SqlClients.MS_SQL)
|
|
156
|
-
this.config = config
|
|
157
|
-
const clientCfg = {
|
|
158
|
-
...this.config,
|
|
159
|
-
options: {
|
|
160
|
-
encrypt: this.config.encrypt,
|
|
161
|
-
enableArithAbort: true,
|
|
162
|
-
},
|
|
163
|
-
}
|
|
164
|
-
delete clientCfg.encrypt
|
|
165
|
-
if (!this.pool) {
|
|
166
|
-
this.pool = new sqlServer.ConnectionPool(clientCfg)
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
getBindingIdentifier(): string {
|
|
171
|
-
return `(@p${this.index++})`
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
async connect() {
|
|
175
|
-
try {
|
|
176
|
-
this.client = await this.pool.connect()
|
|
177
|
-
} catch (err) {
|
|
178
|
-
// @ts-ignore
|
|
179
|
-
throw new Error(err)
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
196
|
async runSQL(sql: string) {
|
|
184
197
|
return (await this.internalQuery(getSqlQuery(sql))).recordset
|
|
185
198
|
}
|
|
@@ -191,11 +204,14 @@ module MSSQLModule {
|
|
|
191
204
|
*/
|
|
192
205
|
async buildSchema(datasourceId: string, entities: Record<string, Table>) {
|
|
193
206
|
await this.connect()
|
|
194
|
-
let
|
|
195
|
-
if (
|
|
207
|
+
let tableInfo: TablesResponse[] = await this.runSQL(this.TABLES_SQL)
|
|
208
|
+
if (tableInfo == null || !Array.isArray(tableInfo)) {
|
|
196
209
|
throw "Unable to get list of tables in database"
|
|
197
210
|
}
|
|
198
|
-
|
|
211
|
+
|
|
212
|
+
const schema = this.config.schema || DEFAULT_SCHEMA
|
|
213
|
+
const tableNames = tableInfo
|
|
214
|
+
.filter((record: any) => record.TABLE_SCHEMA === schema)
|
|
199
215
|
.map((record: any) => record.TABLE_NAME)
|
|
200
216
|
.filter((name: string) => this.MASTER_TABLES.indexOf(name) === -1)
|
|
201
217
|
|
|
@@ -267,7 +283,11 @@ module MSSQLModule {
|
|
|
267
283
|
}
|
|
268
284
|
|
|
269
285
|
async query(json: QueryJson) {
|
|
286
|
+
const schema = this.config.schema
|
|
270
287
|
await this.connect()
|
|
288
|
+
if (schema && schema !== DEFAULT_SCHEMA && json?.endpoint) {
|
|
289
|
+
json.endpoint.schema = schema
|
|
290
|
+
}
|
|
271
291
|
const operation = this._operation(json)
|
|
272
292
|
const queryFn = (query: any, op: string) => this.internalQuery(query, op)
|
|
273
293
|
const processFn = (result: any) =>
|
|
@@ -6,35 +6,63 @@ import { FieldTypes, BuildSchemaErrors, InvalidColumns } from "../constants"
|
|
|
6
6
|
const DOUBLE_SEPARATOR = `${SEPARATOR}${SEPARATOR}`
|
|
7
7
|
const ROW_ID_REGEX = /^\[.*]$/g
|
|
8
8
|
|
|
9
|
-
const
|
|
10
|
-
text: FieldTypes.LONGFORM,
|
|
11
|
-
varchar: FieldTypes.STRING,
|
|
9
|
+
const SQL_NUMBER_TYPE_MAP = {
|
|
12
10
|
integer: FieldTypes.NUMBER,
|
|
11
|
+
int: FieldTypes.NUMBER,
|
|
13
12
|
bigint: FieldTypes.NUMBER,
|
|
14
13
|
decimal: FieldTypes.NUMBER,
|
|
15
14
|
smallint: FieldTypes.NUMBER,
|
|
16
15
|
real: FieldTypes.NUMBER,
|
|
17
|
-
"double precision": FieldTypes.NUMBER,
|
|
18
|
-
timestamp: FieldTypes.DATETIME,
|
|
19
|
-
time: FieldTypes.DATETIME,
|
|
20
|
-
boolean: FieldTypes.BOOLEAN,
|
|
21
|
-
json: FieldTypes.JSON,
|
|
22
|
-
date: FieldTypes.DATETIME,
|
|
23
|
-
blob: FieldTypes.LONGFORM,
|
|
24
|
-
enum: FieldTypes.STRING,
|
|
25
16
|
float: FieldTypes.NUMBER,
|
|
26
|
-
int: FieldTypes.NUMBER,
|
|
27
17
|
numeric: FieldTypes.NUMBER,
|
|
28
18
|
mediumint: FieldTypes.NUMBER,
|
|
29
19
|
dec: FieldTypes.NUMBER,
|
|
30
20
|
double: FieldTypes.NUMBER,
|
|
31
21
|
fixed: FieldTypes.NUMBER,
|
|
32
|
-
|
|
33
|
-
tinyint: FieldTypes.BOOLEAN,
|
|
34
|
-
long: FieldTypes.LONGFORM,
|
|
22
|
+
"double precision": FieldTypes.NUMBER,
|
|
35
23
|
number: FieldTypes.NUMBER,
|
|
36
24
|
binary_float: FieldTypes.NUMBER,
|
|
37
25
|
binary_double: FieldTypes.NUMBER,
|
|
26
|
+
money: FieldTypes.NUMBER,
|
|
27
|
+
smallmoney: FieldTypes.NUMBER,
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const SQL_DATE_TYPE_MAP = {
|
|
31
|
+
timestamp: FieldTypes.DATETIME,
|
|
32
|
+
time: FieldTypes.DATETIME,
|
|
33
|
+
datetime: FieldTypes.DATETIME,
|
|
34
|
+
smalldatetime: FieldTypes.DATETIME,
|
|
35
|
+
date: FieldTypes.DATETIME,
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const SQL_STRING_TYPE_MAP = {
|
|
39
|
+
varchar: FieldTypes.STRING,
|
|
40
|
+
char: FieldTypes.STRING,
|
|
41
|
+
nchar: FieldTypes.STRING,
|
|
42
|
+
nvarchar: FieldTypes.STRING,
|
|
43
|
+
ntext: FieldTypes.STRING,
|
|
44
|
+
enum: FieldTypes.STRING,
|
|
45
|
+
blob: FieldTypes.LONGFORM,
|
|
46
|
+
long: FieldTypes.LONGFORM,
|
|
47
|
+
text: FieldTypes.LONGFORM,
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const SQL_BOOLEAN_TYPE_MAP = {
|
|
51
|
+
boolean: FieldTypes.BOOLEAN,
|
|
52
|
+
bit: FieldTypes.BOOLEAN,
|
|
53
|
+
tinyint: FieldTypes.BOOLEAN,
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const SQL_MISC_TYPE_MAP = {
|
|
57
|
+
json: FieldTypes.JSON,
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const SQL_TYPE_MAP = {
|
|
61
|
+
...SQL_NUMBER_TYPE_MAP,
|
|
62
|
+
...SQL_DATE_TYPE_MAP,
|
|
63
|
+
...SQL_STRING_TYPE_MAP,
|
|
64
|
+
...SQL_BOOLEAN_TYPE_MAP,
|
|
65
|
+
...SQL_MISC_TYPE_MAP,
|
|
38
66
|
}
|
|
39
67
|
|
|
40
68
|
export enum SqlClients {
|