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.
Files changed (60) hide show
  1. package/package.json +7 -6
  2. package/src/auth/authProvider.js +1 -1
  3. package/src/auth/storageAuthProvider.js +2 -2
  4. package/src/controllers/archive.js +1 -1
  5. package/src/controllers/auth.js +1 -1
  6. package/src/controllers/cloud.js +15 -1
  7. package/src/controllers/connections.js +4 -4
  8. package/src/controllers/databaseConnections.js +11 -11
  9. package/src/controllers/files.js +24 -4
  10. package/src/controllers/runners.js +7 -6
  11. package/src/controllers/scheduler.js +1 -1
  12. package/src/controllers/serverConnections.js +4 -4
  13. package/src/controllers/sessions.js +4 -4
  14. package/src/controllers/storage.js +6 -40
  15. package/src/controllers/storageDb.js +5 -4
  16. package/src/controllers/uploads.js +2 -2
  17. package/src/currentVersion.js +2 -2
  18. package/src/index.js +35 -5
  19. package/src/main.js +59 -20
  20. package/src/proc/databaseConnectionProcess.js +21 -12
  21. package/src/proc/serverConnectionProcess.js +6 -6
  22. package/src/proc/sessionProcess.js +2 -2
  23. package/src/proc/sshForwardProcess.js +1 -1
  24. package/src/shell/archiveWriter.js +1 -1
  25. package/src/shell/copyStream.js +1 -1
  26. package/src/shell/executeQuery.js +3 -3
  27. package/src/shell/importDatabase.js +3 -3
  28. package/src/shell/jsonLinesReader.js +1 -1
  29. package/src/shell/jsonLinesWriter.js +1 -1
  30. package/src/shell/jsonReader.js +1 -1
  31. package/src/shell/jsonWriter.js +1 -1
  32. package/src/shell/loadDatabase.js +2 -2
  33. package/src/shell/modifyJsonLinesReader.js +1 -1
  34. package/src/shell/queryReader.js +1 -1
  35. package/src/shell/requirePlugin.js +6 -1
  36. package/src/shell/runScript.js +1 -1
  37. package/src/shell/sqlDataWriter.js +1 -1
  38. package/src/shell/tableReader.js +3 -3
  39. package/src/shell/tableWriter.js +1 -1
  40. package/src/shell/unzipDirectory.js +4 -4
  41. package/src/shell/zipDirectory.js +3 -3
  42. package/src/shell/zipJsonLinesData.js +3 -3
  43. package/src/storageModel.js +6 -0
  44. package/src/utility/DatastoreProxy.js +3 -3
  45. package/src/utility/JsonLinesDatastore.js +4 -2
  46. package/src/utility/appLogStore.js +119 -0
  47. package/src/utility/auditlog.js +1 -1
  48. package/src/utility/authProxy.js +31 -3
  49. package/src/utility/checkLicense.js +10 -4
  50. package/src/utility/childProcessChecker.js +1 -1
  51. package/src/utility/cloudIntf.js +5 -5
  52. package/src/utility/cloudUpgrade.js +4 -4
  53. package/src/utility/connectUtility.js +1 -1
  54. package/src/utility/crypting.js +13 -11
  55. package/src/utility/directories.js +2 -2
  56. package/src/utility/extractSingleFileFromZip.js +3 -3
  57. package/src/utility/loadModelTransform.js +1 -1
  58. package/src/utility/sshTunnel.js +7 -7
  59. package/src/utility/sshTunnelProxy.js +1 -1
  60. 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.5.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.5.6",
33
+ "dbgate-datalib": "^6.6.1",
34
34
  "dbgate-query-splitter": "^4.11.5",
35
- "dbgate-sqltree": "^6.5.6",
36
- "dbgate-tools": "^6.5.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.4",
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.5.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",
@@ -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
  },
@@ -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
  }
@@ -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);
@@ -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(`${fileName} doesn't have one of supported extensions: ${FOLDERS.join(', ')}`);
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)) logger.log(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 distinct ~connections.* from ~connections
146
- inner join ~role_connections on ~connections.~id = ~role_connections.~connection_id
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,
@@ -1,5 +1,5 @@
1
1
 
2
2
  module.exports = {
3
- version: '6.5.6',
4
- buildTime: '2025-07-17T07:05:49.044Z'
3
+ version: '6.6.1',
4
+ buildTime: '2025-08-14T15:32:48.560Z'
5
5
  };