dbgate-api-premium 6.5.6 → 6.6.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/package.json +7 -6
- package/src/auth/authProvider.js +1 -1
- package/src/auth/storageAuthProvider.js +2 -2
- package/src/controllers/archive.js +1 -1
- package/src/controllers/auth.js +1 -1
- package/src/controllers/cloud.js +15 -1
- package/src/controllers/connections.js +4 -4
- package/src/controllers/databaseConnections.js +11 -11
- package/src/controllers/files.js +24 -4
- package/src/controllers/runners.js +7 -6
- package/src/controllers/scheduler.js +1 -1
- package/src/controllers/serverConnections.js +4 -4
- package/src/controllers/sessions.js +4 -4
- package/src/controllers/storage.js +6 -40
- package/src/controllers/storageDb.js +5 -4
- package/src/controllers/uploads.js +2 -2
- package/src/currentVersion.js +2 -2
- package/src/index.js +35 -5
- package/src/main.js +59 -20
- package/src/proc/databaseConnectionProcess.js +21 -12
- package/src/proc/serverConnectionProcess.js +6 -6
- package/src/proc/sessionProcess.js +2 -2
- package/src/proc/sshForwardProcess.js +1 -1
- package/src/shell/archiveWriter.js +1 -1
- package/src/shell/copyStream.js +1 -1
- package/src/shell/executeQuery.js +3 -3
- package/src/shell/importDatabase.js +3 -3
- package/src/shell/jsonLinesReader.js +1 -1
- package/src/shell/jsonLinesWriter.js +1 -1
- package/src/shell/jsonReader.js +1 -1
- package/src/shell/jsonWriter.js +1 -1
- package/src/shell/loadDatabase.js +2 -2
- package/src/shell/modifyJsonLinesReader.js +1 -1
- package/src/shell/queryReader.js +1 -1
- package/src/shell/requirePlugin.js +6 -1
- package/src/shell/runScript.js +1 -1
- package/src/shell/sqlDataWriter.js +1 -1
- package/src/shell/tableReader.js +3 -3
- package/src/shell/tableWriter.js +1 -1
- package/src/shell/unzipDirectory.js +4 -4
- package/src/shell/zipDirectory.js +3 -3
- package/src/shell/zipJsonLinesData.js +3 -3
- package/src/storageModel.js +6 -0
- package/src/utility/DatastoreProxy.js +3 -3
- package/src/utility/JsonLinesDatastore.js +4 -2
- package/src/utility/appLogStore.js +119 -0
- package/src/utility/auditlog.js +1 -1
- package/src/utility/authProxy.js +31 -3
- package/src/utility/checkLicense.js +10 -4
- package/src/utility/childProcessChecker.js +1 -1
- package/src/utility/cloudIntf.js +5 -5
- package/src/utility/cloudUpgrade.js +4 -4
- package/src/utility/connectUtility.js +1 -1
- package/src/utility/crypting.js +13 -11
- package/src/utility/directories.js +2 -2
- package/src/utility/extractSingleFileFromZip.js +3 -3
- package/src/utility/loadModelTransform.js +1 -1
- package/src/utility/sshTunnel.js +7 -7
- package/src/utility/sshTunnelProxy.js +1 -1
- package/src/utility/useController.js +3 -3
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dbgate-api-premium",
|
|
3
3
|
"main": "src/index.js",
|
|
4
|
-
"version": "6.
|
|
4
|
+
"version": "6.6.1",
|
|
5
5
|
"homepage": "https://dbgate.org/",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -30,10 +30,10 @@
|
|
|
30
30
|
"compare-versions": "^3.6.0",
|
|
31
31
|
"cors": "^2.8.5",
|
|
32
32
|
"cross-env": "^6.0.3",
|
|
33
|
-
"dbgate-datalib": "^6.
|
|
33
|
+
"dbgate-datalib": "^6.6.1",
|
|
34
34
|
"dbgate-query-splitter": "^4.11.5",
|
|
35
|
-
"dbgate-sqltree": "^6.
|
|
36
|
-
"dbgate-tools": "^6.
|
|
35
|
+
"dbgate-sqltree": "^6.6.1",
|
|
36
|
+
"dbgate-tools": "^6.6.1",
|
|
37
37
|
"debug": "^4.3.4",
|
|
38
38
|
"diff": "^5.0.0",
|
|
39
39
|
"diff2html": "^3.4.13",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"ncp": "^2.0.0",
|
|
57
57
|
"node-cron": "^2.0.3",
|
|
58
58
|
"on-finished": "^2.4.1",
|
|
59
|
-
"pinomin": "^1.0.
|
|
59
|
+
"pinomin": "^1.0.5",
|
|
60
60
|
"portfinder": "^1.0.28",
|
|
61
61
|
"rimraf": "^3.0.0",
|
|
62
62
|
"semver": "^7.6.3",
|
|
@@ -68,6 +68,7 @@
|
|
|
68
68
|
},
|
|
69
69
|
"scripts": {
|
|
70
70
|
"start": "env-cmd -f .env node src/index.js --listen-api",
|
|
71
|
+
"start:debug": "env-cmd -f .env node --inspect src/index.js --listen-api",
|
|
71
72
|
"start:portal": "env-cmd -f env/portal/.env node src/index.js --listen-api",
|
|
72
73
|
"start:singledb": "env-cmd -f env/singledb/.env node src/index.js --listen-api",
|
|
73
74
|
"start:auth": "env-cmd -f env/auth/.env node src/index.js --listen-api",
|
|
@@ -85,7 +86,7 @@
|
|
|
85
86
|
"devDependencies": {
|
|
86
87
|
"@types/fs-extra": "^9.0.11",
|
|
87
88
|
"@types/lodash": "^4.14.149",
|
|
88
|
-
"dbgate-types": "^6.
|
|
89
|
+
"dbgate-types": "^6.6.1",
|
|
89
90
|
"env-cmd": "^10.1.0",
|
|
90
91
|
"jsdoc-to-markdown": "^9.0.5",
|
|
91
92
|
"node-loader": "^1.0.2",
|
package/src/auth/authProvider.js
CHANGED
|
@@ -94,7 +94,7 @@ class OAuthProvider extends AuthProviderBase {
|
|
|
94
94
|
payload = jwt.decode(id_token);
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
logger.info({ payload }, 'User payload returned from OAUTH');
|
|
97
|
+
logger.info({ payload }, 'DBGM-00002 User payload returned from OAUTH');
|
|
98
98
|
|
|
99
99
|
const login =
|
|
100
100
|
process.env.OAUTH_LOGIN_FIELD && payload && payload[process.env.OAUTH_LOGIN_FIELD]
|
|
@@ -190,7 +190,7 @@ class OauthProvider extends StorageProviderBase {
|
|
|
190
190
|
|
|
191
191
|
const payload = jwt.decode(id_token ?? access_token);
|
|
192
192
|
|
|
193
|
-
logger.info({ payload }, 'User payload returned from OAUTH');
|
|
193
|
+
logger.info({ payload }, 'DBGM-00003 User payload returned from OAUTH');
|
|
194
194
|
|
|
195
195
|
const login =
|
|
196
196
|
this.config.oauthLoginField && payload && payload[this.config.oauthLoginField]
|
|
@@ -485,7 +485,7 @@ class MsEntraProvider extends StorageProviderBase {
|
|
|
485
485
|
|
|
486
486
|
const payload = jwt.decode(token);
|
|
487
487
|
|
|
488
|
-
logger.info({ payload }, 'User payload returned from MS Entra');
|
|
488
|
+
logger.info({ payload }, 'DBGM-00004 User payload returned from MS Entra');
|
|
489
489
|
|
|
490
490
|
const { email } = payload;
|
|
491
491
|
|
|
@@ -102,7 +102,7 @@ module.exports = {
|
|
|
102
102
|
...fileType('.matview.sql', 'matview.sql'),
|
|
103
103
|
];
|
|
104
104
|
} catch (err) {
|
|
105
|
-
logger.error(extractErrorLogData(err), 'Error reading archive files');
|
|
105
|
+
logger.error(extractErrorLogData(err), 'DBGM-00001 Error reading archive files');
|
|
106
106
|
return [];
|
|
107
107
|
}
|
|
108
108
|
},
|
package/src/controllers/auth.js
CHANGED
|
@@ -99,7 +99,7 @@ function authMiddleware(req, res, next) {
|
|
|
99
99
|
return next();
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
logger.error(extractErrorLogData(err), 'Sending invalid token error');
|
|
102
|
+
logger.error(extractErrorLogData(err), 'DBGM-00098 Sending invalid token error');
|
|
103
103
|
|
|
104
104
|
return unauthorizedResponse(req, res, 'invalid token');
|
|
105
105
|
}
|
package/src/controllers/cloud.js
CHANGED
|
@@ -16,6 +16,7 @@ const { getConnectionLabel, getLogger, extractErrorLogData } = require('dbgate-t
|
|
|
16
16
|
const logger = getLogger('cloud');
|
|
17
17
|
const _ = require('lodash');
|
|
18
18
|
const fs = require('fs-extra');
|
|
19
|
+
const { getAiGatewayServer } = require('../utility/authProxy');
|
|
19
20
|
|
|
20
21
|
module.exports = {
|
|
21
22
|
publicFiles_meta: true,
|
|
@@ -44,7 +45,7 @@ module.exports = {
|
|
|
44
45
|
const resp = await callCloudApiGet('content-list');
|
|
45
46
|
return resp;
|
|
46
47
|
} catch (err) {
|
|
47
|
-
logger.error(extractErrorLogData(err), 'Error getting cloud content list');
|
|
48
|
+
logger.error(extractErrorLogData(err), 'DBGM-00099 Error getting cloud content list');
|
|
48
49
|
|
|
49
50
|
return [];
|
|
50
51
|
}
|
|
@@ -276,4 +277,17 @@ module.exports = {
|
|
|
276
277
|
const resp = await callCloudApiPost(`content-folders/remove-user/${folid}`, { email });
|
|
277
278
|
return resp;
|
|
278
279
|
},
|
|
280
|
+
|
|
281
|
+
getAiGateway_meta: true,
|
|
282
|
+
async getAiGateway() {
|
|
283
|
+
return getAiGatewayServer();
|
|
284
|
+
},
|
|
285
|
+
|
|
286
|
+
// chatStream_meta: {
|
|
287
|
+
// raw: true,
|
|
288
|
+
// method: 'post',
|
|
289
|
+
// },
|
|
290
|
+
// chatStream(req, res) {
|
|
291
|
+
// callChatStream(req.body, res);
|
|
292
|
+
// },
|
|
279
293
|
};
|
|
@@ -116,12 +116,12 @@ function getPortalCollections() {
|
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
logger.info({ connections: connections.map(pickSafeConnectionInfo) }, 'Using connections from ENV variables');
|
|
119
|
+
logger.info({ connections: connections.map(pickSafeConnectionInfo) }, 'DBGM-00005 Using connections from ENV variables');
|
|
120
120
|
const noengine = connections.filter(x => !x.engine);
|
|
121
121
|
if (noengine.length > 0) {
|
|
122
122
|
logger.warn(
|
|
123
123
|
{ connections: noengine.map(x => x._id) },
|
|
124
|
-
'Invalid CONNECTIONS configuration, missing ENGINE for connection ID'
|
|
124
|
+
'DBGM-00006 Invalid CONNECTIONS configuration, missing ENGINE for connection ID'
|
|
125
125
|
);
|
|
126
126
|
}
|
|
127
127
|
return connections;
|
|
@@ -530,7 +530,7 @@ module.exports = {
|
|
|
530
530
|
socket.emit('got-volatile-token', { strmid, savedConId: conid, volatileConId: volatile._id });
|
|
531
531
|
return { success: true };
|
|
532
532
|
} catch (err) {
|
|
533
|
-
logger.error(extractErrorLogData(err), 'Error getting DB token');
|
|
533
|
+
logger.error(extractErrorLogData(err), 'DBGM-00100 Error getting DB token');
|
|
534
534
|
return { error: err.message };
|
|
535
535
|
}
|
|
536
536
|
},
|
|
@@ -546,7 +546,7 @@ module.exports = {
|
|
|
546
546
|
const resp = await authProvider.login(null, null, { conid: volatile._id }, req);
|
|
547
547
|
return resp;
|
|
548
548
|
} catch (err) {
|
|
549
|
-
logger.error(extractErrorLogData(err), 'Error getting DB token');
|
|
549
|
+
logger.error(extractErrorLogData(err), 'DBGM-00101 Error getting DB token');
|
|
550
550
|
return { error: err.message };
|
|
551
551
|
}
|
|
552
552
|
},
|
|
@@ -76,7 +76,7 @@ module.exports = {
|
|
|
76
76
|
|
|
77
77
|
handle_error(conid, database, props) {
|
|
78
78
|
const { error } = props;
|
|
79
|
-
logger.error(`Error in database connection ${conid}, database ${database}: ${error}`);
|
|
79
|
+
logger.error(`DBGM-00102 Error in database connection ${conid}, database ${database}: ${error}`);
|
|
80
80
|
if (props?.msgid) {
|
|
81
81
|
const [resolve, reject] = this.requests[props?.msgid];
|
|
82
82
|
reject(error);
|
|
@@ -144,7 +144,7 @@ module.exports = {
|
|
|
144
144
|
handle_copyStreamError(conid, database, { copyStreamError }) {
|
|
145
145
|
const { progressName } = copyStreamError;
|
|
146
146
|
const { runid } = progressName;
|
|
147
|
-
logger.error(`Error in database connection ${conid}, database ${database}: ${copyStreamError}`);
|
|
147
|
+
logger.error(`DBGM-00103 Error in database connection ${conid}, database ${database}: ${copyStreamError}`);
|
|
148
148
|
socket.emit(`runner-done-${runid}`);
|
|
149
149
|
},
|
|
150
150
|
|
|
@@ -193,7 +193,7 @@ module.exports = {
|
|
|
193
193
|
if (newOpened.disconnected) return;
|
|
194
194
|
const funcName = `handle_${msgtype}`;
|
|
195
195
|
if (!this[funcName]) {
|
|
196
|
-
logger.error(`Unknown message type ${msgtype} from subprocess databaseConnectionProcess`);
|
|
196
|
+
logger.error(`DBGM-00104 Unknown message type ${msgtype} from subprocess databaseConnectionProcess`);
|
|
197
197
|
return;
|
|
198
198
|
}
|
|
199
199
|
|
|
@@ -204,7 +204,7 @@ module.exports = {
|
|
|
204
204
|
this.close(conid, database, false);
|
|
205
205
|
});
|
|
206
206
|
subprocess.on('error', err => {
|
|
207
|
-
logger.error(extractErrorLogData(err), 'Error in database connection subprocess');
|
|
207
|
+
logger.error(extractErrorLogData(err), 'DBGM-00114 Error in database connection subprocess');
|
|
208
208
|
if (newOpened.disconnected) return;
|
|
209
209
|
this.close(conid, database, false);
|
|
210
210
|
});
|
|
@@ -226,7 +226,7 @@ module.exports = {
|
|
|
226
226
|
try {
|
|
227
227
|
conn.subprocess.send({ msgid, ...message });
|
|
228
228
|
} catch (err) {
|
|
229
|
-
logger.error(extractErrorLogData(err), 'Error sending request do process');
|
|
229
|
+
logger.error(extractErrorLogData(err), 'DBGM-00115 Error sending request do process');
|
|
230
230
|
this.close(conn.conid, conn.database);
|
|
231
231
|
}
|
|
232
232
|
});
|
|
@@ -236,7 +236,7 @@ module.exports = {
|
|
|
236
236
|
queryData_meta: true,
|
|
237
237
|
async queryData({ conid, database, sql }, req) {
|
|
238
238
|
testConnectionPermission(conid, req);
|
|
239
|
-
logger.info({ conid, database, sql }, 'Processing query');
|
|
239
|
+
logger.info({ conid, database, sql }, 'DBGM-00007 Processing query');
|
|
240
240
|
const opened = await this.ensureOpened(conid, database);
|
|
241
241
|
// if (opened && opened.status && opened.status.name == 'error') {
|
|
242
242
|
// return opened.status;
|
|
@@ -283,7 +283,7 @@ module.exports = {
|
|
|
283
283
|
runScript_meta: true,
|
|
284
284
|
async runScript({ conid, database, sql, useTransaction, logMessage }, req) {
|
|
285
285
|
testConnectionPermission(conid, req);
|
|
286
|
-
logger.info({ conid, database, sql }, 'Processing script');
|
|
286
|
+
logger.info({ conid, database, sql }, 'DBGM-00008 Processing script');
|
|
287
287
|
const opened = await this.ensureOpened(conid, database);
|
|
288
288
|
sendToAuditLog(req, {
|
|
289
289
|
category: 'dbop',
|
|
@@ -304,7 +304,7 @@ module.exports = {
|
|
|
304
304
|
runOperation_meta: true,
|
|
305
305
|
async runOperation({ conid, database, operation, useTransaction }, req) {
|
|
306
306
|
testConnectionPermission(conid, req);
|
|
307
|
-
logger.info({ conid, database, operation }, 'Processing operation');
|
|
307
|
+
logger.info({ conid, database, operation }, 'DBGM-00009 Processing operation');
|
|
308
308
|
|
|
309
309
|
sendToAuditLog(req, {
|
|
310
310
|
category: 'dbop',
|
|
@@ -481,7 +481,7 @@ module.exports = {
|
|
|
481
481
|
try {
|
|
482
482
|
existing.subprocess.send({ msgtype: 'ping' });
|
|
483
483
|
} catch (err) {
|
|
484
|
-
logger.error(extractErrorLogData(err), 'Error pinging DB connection');
|
|
484
|
+
logger.error(extractErrorLogData(err), 'DBGM-00116 Error pinging DB connection');
|
|
485
485
|
this.close(conid, database);
|
|
486
486
|
|
|
487
487
|
return {
|
|
@@ -530,7 +530,7 @@ module.exports = {
|
|
|
530
530
|
try {
|
|
531
531
|
existing.subprocess.kill();
|
|
532
532
|
} catch (err) {
|
|
533
|
-
logger.error(extractErrorLogData(err), 'Error killing subprocess');
|
|
533
|
+
logger.error(extractErrorLogData(err), 'DBGM-00117 Error killing subprocess');
|
|
534
534
|
}
|
|
535
535
|
}
|
|
536
536
|
this.opened = this.opened.filter(x => x.conid != conid || x.database != database);
|
|
@@ -924,7 +924,7 @@ module.exports = {
|
|
|
924
924
|
executeSessionQuery_meta: true,
|
|
925
925
|
async executeSessionQuery({ sesid, conid, database, sql }, req) {
|
|
926
926
|
testConnectionPermission(conid, req);
|
|
927
|
-
logger.info({ sesid, sql }, 'Processing query');
|
|
927
|
+
logger.info({ sesid, sql }, 'DBGM-00010 Processing query');
|
|
928
928
|
sessions.dispatchMessage(sesid, 'Query execution started');
|
|
929
929
|
|
|
930
930
|
const opened = await this.ensureOpened(conid, database);
|
package/src/controllers/files.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const fs = require('fs-extra');
|
|
2
2
|
const path = require('path');
|
|
3
3
|
const crypto = require('crypto');
|
|
4
|
-
const { filesdir, archivedir, resolveArchiveFolder, uploadsdir, appdir } = require('../utility/directories');
|
|
4
|
+
const { filesdir, archivedir, resolveArchiveFolder, uploadsdir, appdir, jsldir } = require('../utility/directories');
|
|
5
5
|
const getChartExport = require('../utility/getChartExport');
|
|
6
6
|
const { hasPermission } = require('../utility/hasPermission');
|
|
7
7
|
const socket = require('../utility/socket');
|
|
@@ -13,6 +13,7 @@ const dbgateApi = require('../shell');
|
|
|
13
13
|
const { getLogger } = require('dbgate-tools');
|
|
14
14
|
const platformInfo = require('../utility/platformInfo');
|
|
15
15
|
const { checkSecureFilePathsWithoutDirectory, checkSecureDirectories } = require('../utility/security');
|
|
16
|
+
const { copyAppLogsIntoFile, getRecentAppLogRecords } = require('../utility/appLogStore');
|
|
16
17
|
const logger = getLogger('files');
|
|
17
18
|
|
|
18
19
|
function serialize(format, data) {
|
|
@@ -253,7 +254,7 @@ module.exports = {
|
|
|
253
254
|
|
|
254
255
|
createZipFromJsons_meta: true,
|
|
255
256
|
async createZipFromJsons({ db, filePath }) {
|
|
256
|
-
logger.info(`Creating zip file from JSONS ${filePath}`);
|
|
257
|
+
logger.info(`DBGM-00011 Creating zip file from JSONS ${filePath}`);
|
|
257
258
|
await dbgateApi.zipJsonLinesData(db, filePath);
|
|
258
259
|
return true;
|
|
259
260
|
},
|
|
@@ -279,7 +280,7 @@ module.exports = {
|
|
|
279
280
|
const FOLDERS = ['sql', 'sqlite'];
|
|
280
281
|
for (const folder of FOLDERS) {
|
|
281
282
|
if (fileName.toLowerCase().endsWith('.' + folder)) {
|
|
282
|
-
logger.info(`Saving ${folder} file ${fileName}`);
|
|
283
|
+
logger.info(`DBGM-00012 Saving ${folder} file ${fileName}`);
|
|
283
284
|
await fs.copyFile(filePath, path.join(filesdir(), folder, fileName));
|
|
284
285
|
|
|
285
286
|
socket.emitChanged(`files-changed`, { folder: folder });
|
|
@@ -291,7 +292,7 @@ module.exports = {
|
|
|
291
292
|
}
|
|
292
293
|
}
|
|
293
294
|
|
|
294
|
-
throw new Error(
|
|
295
|
+
throw new Error(`DBGM-00013 ${fileName} doesn't have one of supported extensions: ${FOLDERS.join(', ')}`);
|
|
295
296
|
},
|
|
296
297
|
|
|
297
298
|
exportFile_meta: true,
|
|
@@ -311,4 +312,23 @@ module.exports = {
|
|
|
311
312
|
await fs.copyFile(sourceFilePath, targetFilePath);
|
|
312
313
|
return true;
|
|
313
314
|
},
|
|
315
|
+
|
|
316
|
+
fillAppLogs_meta: true,
|
|
317
|
+
async fillAppLogs({ dateFrom = 0, dateTo = new Date().getTime(), prepareForExport = false }) {
|
|
318
|
+
const jslid = crypto.randomUUID();
|
|
319
|
+
const outputFile = path.join(jsldir(), `${jslid}.jsonl`);
|
|
320
|
+
await copyAppLogsIntoFile(dateFrom, dateTo, outputFile, prepareForExport);
|
|
321
|
+
return {
|
|
322
|
+
jslid,
|
|
323
|
+
};
|
|
324
|
+
},
|
|
325
|
+
|
|
326
|
+
getRecentAppLog_meta: true,
|
|
327
|
+
getRecentAppLog({ limit }) {
|
|
328
|
+
const res = getRecentAppLogRecords();
|
|
329
|
+
if (limit) {
|
|
330
|
+
return res.slice(-limit);
|
|
331
|
+
}
|
|
332
|
+
return res;
|
|
333
|
+
},
|
|
314
334
|
};
|
|
@@ -48,7 +48,7 @@ require=null;
|
|
|
48
48
|
async function run() {
|
|
49
49
|
${script}
|
|
50
50
|
await dbgateApi.finalizer.run();
|
|
51
|
-
logger.info('Finished job script');
|
|
51
|
+
logger.info('DBGM-00014 Finished job script');
|
|
52
52
|
}
|
|
53
53
|
dbgateApi.runScript(run);
|
|
54
54
|
`;
|
|
@@ -74,7 +74,8 @@ module.exports = {
|
|
|
74
74
|
|
|
75
75
|
dispatchMessage(runid, message) {
|
|
76
76
|
if (message) {
|
|
77
|
-
if (_.isPlainObject(message))
|
|
77
|
+
if (_.isPlainObject(message))
|
|
78
|
+
logger.log({ ...message, msg: message.msg || message.message || '', message: undefined });
|
|
78
79
|
else logger.info(message);
|
|
79
80
|
|
|
80
81
|
const toEmit = _.isPlainObject(message)
|
|
@@ -132,7 +133,7 @@ module.exports = {
|
|
|
132
133
|
const pluginNames = extractPlugins(scriptText);
|
|
133
134
|
// console.log('********************** SCRIPT TEXT **********************');
|
|
134
135
|
// console.log(scriptText);
|
|
135
|
-
logger.info({ scriptFile }, 'Running script');
|
|
136
|
+
logger.info({ scriptFile }, 'DBGM-00015 Running script');
|
|
136
137
|
// const subprocess = fork(scriptFile, ['--checkParent', '--max-old-space-size=8192'], {
|
|
137
138
|
const subprocess = fork(
|
|
138
139
|
scriptFile,
|
|
@@ -171,7 +172,7 @@ module.exports = {
|
|
|
171
172
|
subprocess.on('exit', code => {
|
|
172
173
|
// console.log('... EXITED', code);
|
|
173
174
|
this.rejectRequest(runid, { message: 'No data returned, maybe input data source is too big' });
|
|
174
|
-
logger.info({ code, pid: subprocess.pid }, 'Exited process');
|
|
175
|
+
logger.info({ code, pid: subprocess.pid }, 'DBGM-00016 Exited process');
|
|
175
176
|
socket.emit(`runner-done-${runid}`, code);
|
|
176
177
|
this.opened = this.opened.filter(x => x.runid != runid);
|
|
177
178
|
});
|
|
@@ -222,7 +223,7 @@ module.exports = {
|
|
|
222
223
|
|
|
223
224
|
subprocess.on('exit', code => {
|
|
224
225
|
console.log('... EXITED', code);
|
|
225
|
-
logger.info({ code, pid: subprocess.pid }, 'Exited process');
|
|
226
|
+
logger.info({ code, pid: subprocess.pid }, 'DBGM-00017 Exited process');
|
|
226
227
|
this.dispatchMessage(runid, `Finished external process with code ${code}`);
|
|
227
228
|
socket.emit(`runner-done-${runid}`, code);
|
|
228
229
|
if (onFinished) {
|
|
@@ -258,7 +259,7 @@ module.exports = {
|
|
|
258
259
|
severity: 'error',
|
|
259
260
|
message: extractErrorMessage(err),
|
|
260
261
|
});
|
|
261
|
-
logger.error(extractErrorLogData(err), 'Caught error on stdin');
|
|
262
|
+
logger.error(extractErrorLogData(err), 'DBGM-00118 Caught error on stdin');
|
|
262
263
|
});
|
|
263
264
|
}
|
|
264
265
|
|
|
@@ -24,7 +24,7 @@ module.exports = {
|
|
|
24
24
|
if (!match) return;
|
|
25
25
|
const pattern = match[1];
|
|
26
26
|
if (!cron.validate(pattern)) return;
|
|
27
|
-
logger.info(`Schedule script ${file} with pattern ${pattern}`);
|
|
27
|
+
logger.info(`DBGM-00018 Schedule script ${file} with pattern ${pattern}`);
|
|
28
28
|
const task = cron.schedule(pattern, () => runners.start({ script: text }));
|
|
29
29
|
this.tasks.push(task);
|
|
30
30
|
},
|
|
@@ -103,7 +103,7 @@ module.exports = {
|
|
|
103
103
|
this.close(conid, false);
|
|
104
104
|
});
|
|
105
105
|
subprocess.on('error', err => {
|
|
106
|
-
logger.error(extractErrorLogData(err), 'Error in server connection subprocess');
|
|
106
|
+
logger.error(extractErrorLogData(err), 'DBGM-00119 Error in server connection subprocess');
|
|
107
107
|
if (newOpened.disconnected) return;
|
|
108
108
|
this.close(conid, false);
|
|
109
109
|
});
|
|
@@ -121,7 +121,7 @@ module.exports = {
|
|
|
121
121
|
try {
|
|
122
122
|
existing.subprocess.kill();
|
|
123
123
|
} catch (err) {
|
|
124
|
-
logger.error(extractErrorLogData(err), 'Error killing subprocess');
|
|
124
|
+
logger.error(extractErrorLogData(err), 'DBGM-00120 Error killing subprocess');
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
127
|
this.opened = this.opened.filter(x => x.conid != conid);
|
|
@@ -191,7 +191,7 @@ module.exports = {
|
|
|
191
191
|
try {
|
|
192
192
|
opened.subprocess.send({ msgtype: 'ping' });
|
|
193
193
|
} catch (err) {
|
|
194
|
-
logger.error(extractErrorLogData(err), 'Error pinging server connection');
|
|
194
|
+
logger.error(extractErrorLogData(err), 'DBGM-00121 Error pinging server connection');
|
|
195
195
|
this.close(conid);
|
|
196
196
|
}
|
|
197
197
|
})
|
|
@@ -244,7 +244,7 @@ module.exports = {
|
|
|
244
244
|
try {
|
|
245
245
|
conn.subprocess.send({ msgid, ...message });
|
|
246
246
|
} catch (err) {
|
|
247
|
-
logger.error(extractErrorLogData(err), 'Error sending request');
|
|
247
|
+
logger.error(extractErrorLogData(err), 'DBGM-00122 Error sending request');
|
|
248
248
|
this.close(conn.conid);
|
|
249
249
|
}
|
|
250
250
|
});
|
|
@@ -165,7 +165,7 @@ module.exports = {
|
|
|
165
165
|
message: 'Executing query',
|
|
166
166
|
});
|
|
167
167
|
|
|
168
|
-
logger.info({ sesid, sql }, 'Processing query');
|
|
168
|
+
logger.info({ sesid, sql }, 'DBGM-00019 Processing query');
|
|
169
169
|
this.dispatchMessage(sesid, 'Query execution started');
|
|
170
170
|
session.subprocess.send({
|
|
171
171
|
msgtype: 'executeQuery',
|
|
@@ -186,7 +186,7 @@ module.exports = {
|
|
|
186
186
|
throw new Error('Invalid session');
|
|
187
187
|
}
|
|
188
188
|
|
|
189
|
-
logger.info({ sesid, command }, 'Processing control command');
|
|
189
|
+
logger.info({ sesid, command }, 'DBGM-00020 Processing control command');
|
|
190
190
|
this.dispatchMessage(sesid, `${_.startCase(command)} started`);
|
|
191
191
|
session.subprocess.send({ msgtype: 'executeControlCommand', command });
|
|
192
192
|
|
|
@@ -224,7 +224,7 @@ module.exports = {
|
|
|
224
224
|
throw new Error('Invalid session');
|
|
225
225
|
}
|
|
226
226
|
|
|
227
|
-
logger.info({ sesid }, 'Starting profiler');
|
|
227
|
+
logger.info({ sesid }, 'DBGM-00021 Starting profiler');
|
|
228
228
|
session.loadingReader_jslid = jslid;
|
|
229
229
|
session.subprocess.send({ msgtype: 'startProfiler', jslid });
|
|
230
230
|
|
|
@@ -271,7 +271,7 @@ module.exports = {
|
|
|
271
271
|
try {
|
|
272
272
|
session.subprocess.send({ msgtype: 'ping' });
|
|
273
273
|
} catch (err) {
|
|
274
|
-
logger.error(extractErrorLogData(err), 'Error pinging session');
|
|
274
|
+
logger.error(extractErrorLogData(err), 'DBGM-00145 Error pinging session');
|
|
275
275
|
|
|
276
276
|
return {
|
|
277
277
|
status: 'error',
|
|
@@ -18,7 +18,7 @@ const {
|
|
|
18
18
|
const { hasPermission } = require('../utility/hasPermission');
|
|
19
19
|
const { changeSetToSql, removeSchemaFromChangeSet } = require('dbgate-datalib');
|
|
20
20
|
const storageModel = require('../storageModel');
|
|
21
|
-
const { dumpSqlCommand, dumpSqlSelect } = require('dbgate-sqltree');
|
|
21
|
+
const { dumpSqlCommand, dumpSqlSelect, createLogCompoudCondition } = require('dbgate-sqltree');
|
|
22
22
|
const {
|
|
23
23
|
runCommandOnDriver,
|
|
24
24
|
getLogger,
|
|
@@ -94,14 +94,14 @@ module.exports = {
|
|
|
94
94
|
return;
|
|
95
95
|
}
|
|
96
96
|
if (resp.status == 'error') {
|
|
97
|
-
logger.error(`Error refreshing license: ${resp.message}`);
|
|
97
|
+
logger.error(`DBGM-00146 Error refreshing license: ${resp.message}`);
|
|
98
98
|
return;
|
|
99
99
|
}
|
|
100
100
|
if (resp.status != 'ok') {
|
|
101
101
|
return;
|
|
102
102
|
}
|
|
103
103
|
const { token } = resp;
|
|
104
|
-
logger.info('License succesfully refreshed');
|
|
104
|
+
logger.info('DBGM-00022 License succesfully refreshed');
|
|
105
105
|
if (process.env.STORAGE_DATABASE) {
|
|
106
106
|
await this.writeConfig({ group: 'license', config: { licenseKey: token } });
|
|
107
107
|
} else {
|
|
@@ -142,9 +142,8 @@ module.exports = {
|
|
|
142
142
|
);
|
|
143
143
|
} else {
|
|
144
144
|
resp = await storageSelectFmt(
|
|
145
|
-
`select
|
|
146
|
-
|
|
147
|
-
where ~role_connections.~role_id = %v`,
|
|
145
|
+
`select ~connections.* from ~connections
|
|
146
|
+
where exists (select * from ~role_connections where ~role_connections.~connection_id = ~connections.~id and ~role_connections.~role_id = %v)`,
|
|
148
147
|
roleId ?? -1
|
|
149
148
|
);
|
|
150
149
|
}
|
|
@@ -728,36 +727,6 @@ module.exports = {
|
|
|
728
727
|
getAuditLog_meta: true,
|
|
729
728
|
async getAuditLog({ offset = 0, limit = 100, dateFrom = 0, dateTo = new Date().getTime(), filters = {} }) {
|
|
730
729
|
const [conn, driver] = await getStorageConnection();
|
|
731
|
-
const conditions = [
|
|
732
|
-
{
|
|
733
|
-
conditionType: 'binary',
|
|
734
|
-
operator: '>=',
|
|
735
|
-
left: { exprType: 'column', columnName: 'created' },
|
|
736
|
-
right: { exprType: 'value', value: dateFrom },
|
|
737
|
-
},
|
|
738
|
-
{
|
|
739
|
-
conditionType: 'binary',
|
|
740
|
-
operator: '<=',
|
|
741
|
-
left: { exprType: 'column', columnName: 'created' },
|
|
742
|
-
right: { exprType: 'value', value: dateTo },
|
|
743
|
-
},
|
|
744
|
-
];
|
|
745
|
-
for (const [key, values] of Object.entries(filters)) {
|
|
746
|
-
if (values.length == 1 && values[0] == null) {
|
|
747
|
-
// @ts-ignore
|
|
748
|
-
conditions.push({
|
|
749
|
-
conditionType: 'isNull',
|
|
750
|
-
expr: { exprType: 'column', columnName: key },
|
|
751
|
-
});
|
|
752
|
-
continue;
|
|
753
|
-
}
|
|
754
|
-
// @ts-ignore
|
|
755
|
-
conditions.push({
|
|
756
|
-
conditionType: 'in',
|
|
757
|
-
expr: { exprType: 'column', columnName: key },
|
|
758
|
-
values,
|
|
759
|
-
});
|
|
760
|
-
}
|
|
761
730
|
const COLUMNS = [
|
|
762
731
|
'id',
|
|
763
732
|
'created',
|
|
@@ -780,10 +749,7 @@ module.exports = {
|
|
|
780
749
|
exprType: 'column',
|
|
781
750
|
columnName,
|
|
782
751
|
})),
|
|
783
|
-
where:
|
|
784
|
-
conditionType: 'and',
|
|
785
|
-
conditions,
|
|
786
|
-
},
|
|
752
|
+
where: createLogCompoudCondition(filters, 'created', dateFrom, dateTo),
|
|
787
753
|
range: {
|
|
788
754
|
limit: limit,
|
|
789
755
|
offset: offset,
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
const requireEngineDriver = require('../utility/requireEngineDriver');
|
|
2
1
|
const storageModel = require('../storageModel');
|
|
3
2
|
const dbgateApi = require('../shell');
|
|
4
3
|
const {
|
|
@@ -86,6 +85,8 @@ let storageDriver = null;
|
|
|
86
85
|
let storageConnectionError = null;
|
|
87
86
|
|
|
88
87
|
async function getStorageConnectionCore() {
|
|
88
|
+
const requireEngineDriver = require('../utility/requireEngineDriver');
|
|
89
|
+
|
|
89
90
|
if (storageConnection) {
|
|
90
91
|
return [storageConnection, storageDriver];
|
|
91
92
|
}
|
|
@@ -103,7 +104,7 @@ async function getStorageConnectionCore() {
|
|
|
103
104
|
try {
|
|
104
105
|
newConnection = await storageDriver.connect(dbConnectionParams);
|
|
105
106
|
const version = await storageDriver.getVersion(newConnection);
|
|
106
|
-
logger.info(`Connected to storage database ${dbConnectionParams.engine}, version ${version?.versionText}`);
|
|
107
|
+
logger.info(`DBGM-00023 Connected to storage database ${dbConnectionParams.engine}, version ${version?.versionText}`);
|
|
107
108
|
storageConnectionError = null;
|
|
108
109
|
} catch (err) {
|
|
109
110
|
storageConnectionError = err;
|
|
@@ -113,7 +114,7 @@ async function getStorageConnectionCore() {
|
|
|
113
114
|
} catch (err) {}
|
|
114
115
|
newConnection = null;
|
|
115
116
|
}
|
|
116
|
-
logger.error(extractErrorLogData(err), 'Error connecting to storage database, retrying in 5 seconds');
|
|
117
|
+
logger.error(extractErrorLogData(err), 'DBGM-00024 Error connecting to storage database, retrying in 5 seconds');
|
|
117
118
|
// sleep 5 seconds
|
|
118
119
|
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
119
120
|
}
|
|
@@ -149,7 +150,7 @@ function getStorageConnection() {
|
|
|
149
150
|
gettingStorageConnectionPromise = null;
|
|
150
151
|
})
|
|
151
152
|
.catch(err => {
|
|
152
|
-
logger.error(extractErrorLogData(err), 'Error connecting to storage database');
|
|
153
|
+
logger.error(extractErrorLogData(err), 'DBGM-00147 Error connecting to storage database');
|
|
153
154
|
gettingStorageConnectionPromise = null;
|
|
154
155
|
});
|
|
155
156
|
|
|
@@ -28,7 +28,7 @@ module.exports = {
|
|
|
28
28
|
}
|
|
29
29
|
const uploadName = crypto.randomUUID();
|
|
30
30
|
const filePath = path.join(uploadsdir(), uploadName);
|
|
31
|
-
logger.info(`Uploading file ${data.name}, size=${data.size}`);
|
|
31
|
+
logger.info(`DBGM-00025 Uploading file ${data.name}, size=${data.size}`);
|
|
32
32
|
|
|
33
33
|
data.mv(filePath, () => {
|
|
34
34
|
res.json({
|
|
@@ -115,7 +115,7 @@ module.exports = {
|
|
|
115
115
|
|
|
116
116
|
return response.data;
|
|
117
117
|
} catch (err) {
|
|
118
|
-
logger.error(extractErrorLogData(err), 'Error uploading gist');
|
|
118
|
+
logger.error(extractErrorLogData(err), 'DBGM-00148 Error uploading gist');
|
|
119
119
|
|
|
120
120
|
return {
|
|
121
121
|
apiErrorMessage: err.message,
|
package/src/currentVersion.js
CHANGED