dbgate-api-premium 6.6.0 → 6.6.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/package.json +6 -6
- package/src/auth/authProvider.js +14 -2
- package/src/auth/storageAuthProvider.js +89 -22
- package/src/controllers/archive.js +1 -1
- package/src/controllers/auth.js +3 -2
- package/src/controllers/cloud.js +1 -1
- package/src/controllers/config.js +8 -5
- package/src/controllers/connections.js +12 -11
- package/src/controllers/databaseConnections.js +148 -83
- package/src/controllers/files.js +49 -19
- package/src/controllers/plugins.js +7 -4
- package/src/controllers/runners.js +10 -6
- package/src/controllers/scheduler.js +4 -3
- package/src/controllers/serverConnections.js +69 -14
- package/src/controllers/sessions.js +8 -5
- package/src/controllers/storage.js +81 -51
- package/src/controllers/storageDb.js +118 -4
- package/src/controllers/uploads.js +2 -2
- package/src/currentVersion.js +2 -2
- package/src/index.js +36 -5
- package/src/main.js +59 -20
- package/src/proc/databaseConnectionProcess.js +45 -13
- package/src/proc/serverConnectionProcess.js +32 -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 +726 -105
- 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 +4 -4
- 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/directories.js +2 -2
- package/src/utility/extractSingleFileFromZip.js +3 -3
- package/src/utility/hasPermission.js +286 -71
- 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/src/main.js
CHANGED
|
@@ -6,6 +6,7 @@ const http = require('http');
|
|
|
6
6
|
const cors = require('cors');
|
|
7
7
|
const getPort = require('get-port');
|
|
8
8
|
const path = require('path');
|
|
9
|
+
const fs = require('fs/promises');
|
|
9
10
|
|
|
10
11
|
const useController = require('./utility/useController');
|
|
11
12
|
const socket = require('./utility/socket');
|
|
@@ -44,6 +45,48 @@ const { startCloudFiles } = require('./utility/cloudIntf');
|
|
|
44
45
|
|
|
45
46
|
const logger = getLogger('main');
|
|
46
47
|
|
|
48
|
+
function registerExpressStatic(app, publicDir) {
|
|
49
|
+
app.get([getExpressPath('/'), getExpressPath('/*.html')], async (req, res, next) => {
|
|
50
|
+
try {
|
|
51
|
+
const relPath = req.path === getExpressPath('/') ? '/index.html' : req.path;
|
|
52
|
+
const filePath = path.join(publicDir, relPath);
|
|
53
|
+
|
|
54
|
+
let html = await fs.readFile(filePath, 'utf8');
|
|
55
|
+
|
|
56
|
+
if (process.env.DBGATE_GTM_ID) {
|
|
57
|
+
html = html.replace(
|
|
58
|
+
/<!--HEAD_SCRIPT-->/g,
|
|
59
|
+
`<!-- Google Tag Manager -->
|
|
60
|
+
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
|
|
61
|
+
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
|
|
62
|
+
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
|
|
63
|
+
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
|
|
64
|
+
})(window,document,'script','dataLayer','${process.env.DBGATE_GTM_ID}');</script>
|
|
65
|
+
<!-- End Google Tag Manager -->`
|
|
66
|
+
);
|
|
67
|
+
html = html.replace(
|
|
68
|
+
/<!--BODY_SCRIPT-->/g,
|
|
69
|
+
process.env.PAGE_BODY_SCRIPT ??
|
|
70
|
+
`<!-- Google Tag Manager (noscript) -->
|
|
71
|
+
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=${process.env.DBGATE_GTM_ID}" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
|
|
72
|
+
<!-- End Google Tag Manager (noscript) -->`
|
|
73
|
+
);
|
|
74
|
+
} else {
|
|
75
|
+
html = html.replace(/<!--HEAD_SCRIPT-->/g, process.env.PAGE_HEAD_SCRIPT ?? '');
|
|
76
|
+
html = html.replace(/<!--BODY_SCRIPT-->/g, process.env.PAGE_BODY_SCRIPT ?? '');
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
res.type('html').send(html);
|
|
80
|
+
} catch (err) {
|
|
81
|
+
if (err.code === 'ENOENT') return next();
|
|
82
|
+
next(err);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// 2) Static assets for everything else (css/js/images/etc.)
|
|
87
|
+
app.use(getExpressPath('/'), express.static(publicDir));
|
|
88
|
+
}
|
|
89
|
+
|
|
47
90
|
function start() {
|
|
48
91
|
// console.log('process.argv', process.argv);
|
|
49
92
|
|
|
@@ -78,22 +121,18 @@ function start() {
|
|
|
78
121
|
|
|
79
122
|
if (platformInfo.isDocker) {
|
|
80
123
|
// server static files inside docker container
|
|
81
|
-
app
|
|
124
|
+
registerExpressStatic(app, '/home/dbgate-docker/public');
|
|
82
125
|
} else if (platformInfo.isAwsUbuntuLayout) {
|
|
83
|
-
app
|
|
126
|
+
registerExpressStatic(app, '/home/dbgate-docker/public');
|
|
127
|
+
registerExpressStatic(app, '/home/ubuntu/build/public');
|
|
84
128
|
} else if (platformInfo.isAzureUbuntuLayout) {
|
|
85
|
-
app
|
|
129
|
+
registerExpressStatic(app, '/home/azureuser/build/public');
|
|
86
130
|
} else if (processArgs.runE2eTests) {
|
|
87
|
-
app
|
|
131
|
+
registerExpressStatic(app, path.resolve('packer/build/public'));
|
|
88
132
|
} else if (platformInfo.isNpmDist) {
|
|
89
|
-
app.
|
|
90
|
-
getExpressPath('/'),
|
|
91
|
-
express.static(path.join(__dirname, isProApp() ? '../../dbgate-web-premium/public' : '../../dbgate-web/public'))
|
|
92
|
-
);
|
|
133
|
+
registerExpressStatic(app, path.join(__dirname, isProApp() ? '../../dbgate-web-premium/public' : '../../dbgate-web/public'));
|
|
93
134
|
} else if (process.env.DEVWEB) {
|
|
94
|
-
|
|
95
|
-
// console.log(path.join(__dirname, '../../web/public/build'));
|
|
96
|
-
app.use(getExpressPath('/'), express.static(path.join(__dirname, '../../web/public')));
|
|
135
|
+
registerExpressStatic(app, path.join(__dirname, '../../web/public'));
|
|
97
136
|
} else {
|
|
98
137
|
app.get(getExpressPath('/'), (req, res) => {
|
|
99
138
|
res.send('DbGate API');
|
|
@@ -152,15 +191,15 @@ function start() {
|
|
|
152
191
|
|
|
153
192
|
if (platformInfo.isDocker) {
|
|
154
193
|
const port = process.env.PORT || 3000;
|
|
155
|
-
logger.info(`DbGate API listening on port ${port} (docker build)`);
|
|
194
|
+
logger.info(`DBGM-00028 DbGate API listening on port ${port} (docker build)`);
|
|
156
195
|
server.listen(port);
|
|
157
196
|
} else if (platformInfo.isAwsUbuntuLayout) {
|
|
158
197
|
const port = process.env.PORT || 3000;
|
|
159
|
-
logger.info(`DbGate API listening on port ${port} (AWS AMI build)`);
|
|
198
|
+
logger.info(`DBGM-00029 DbGate API listening on port ${port} (AWS AMI build)`);
|
|
160
199
|
server.listen(port);
|
|
161
200
|
} else if (platformInfo.isAzureUbuntuLayout) {
|
|
162
201
|
const port = process.env.PORT || 3000;
|
|
163
|
-
logger.info(`DbGate API listening on port ${port} (Azure VM build)`);
|
|
202
|
+
logger.info(`DBGM-00030 DbGate API listening on port ${port} (Azure VM build)`);
|
|
164
203
|
server.listen(port);
|
|
165
204
|
} else if (platformInfo.isNpmDist) {
|
|
166
205
|
getPort({
|
|
@@ -170,27 +209,27 @@ function start() {
|
|
|
170
209
|
),
|
|
171
210
|
}).then(port => {
|
|
172
211
|
server.listen(port, () => {
|
|
173
|
-
logger.info(`DbGate API listening on port ${port} (NPM build)`);
|
|
212
|
+
logger.info(`DBGM-00031 DbGate API listening on port ${port} (NPM build)`);
|
|
174
213
|
});
|
|
175
214
|
});
|
|
176
215
|
} else if (process.env.DEVWEB) {
|
|
177
216
|
const port = process.env.PORT || 3000;
|
|
178
|
-
logger.info(`DbGate API & web listening on port ${port} (dev web build)`);
|
|
217
|
+
logger.info(`DBGM-00032 DbGate API & web listening on port ${port} (dev web build)`);
|
|
179
218
|
server.listen(port);
|
|
180
219
|
} else {
|
|
181
220
|
const port = process.env.PORT || 3000;
|
|
182
|
-
logger.info(`DbGate API listening on port ${port} (dev API build)`);
|
|
221
|
+
logger.info(`DBGM-00033 DbGate API listening on port ${port} (dev API build)`);
|
|
183
222
|
server.listen(port);
|
|
184
223
|
}
|
|
185
224
|
|
|
186
225
|
function shutdown() {
|
|
187
|
-
logger.info('
|
|
226
|
+
logger.info('DBGM-00034 Shutting down DbGate API server');
|
|
188
227
|
server.close(() => {
|
|
189
|
-
logger.info('Server shut down, terminating');
|
|
228
|
+
logger.info('DBGM-00035 Server shut down, terminating');
|
|
190
229
|
process.exit(0);
|
|
191
230
|
});
|
|
192
231
|
setTimeout(() => {
|
|
193
|
-
logger.info('Server close timeout, terminating');
|
|
232
|
+
logger.info('DBGM-00036 Server close timeout, terminating');
|
|
194
233
|
process.exit(0);
|
|
195
234
|
}, 1000);
|
|
196
235
|
}
|
|
@@ -6,7 +6,6 @@ const {
|
|
|
6
6
|
extractIntSettingsValue,
|
|
7
7
|
getLogger,
|
|
8
8
|
isCompositeDbName,
|
|
9
|
-
dbNameLogCategory,
|
|
10
9
|
extractErrorMessage,
|
|
11
10
|
extractErrorLogData,
|
|
12
11
|
ScriptWriterEval,
|
|
@@ -18,13 +17,14 @@ const requireEngineDriver = require('../utility/requireEngineDriver');
|
|
|
18
17
|
const { connectUtility } = require('../utility/connectUtility');
|
|
19
18
|
const { handleProcessCommunication } = require('../utility/processComm');
|
|
20
19
|
const generateDeploySql = require('../shell/generateDeploySql');
|
|
21
|
-
const { dumpSqlSelect } = require('dbgate-sqltree');
|
|
20
|
+
const { dumpSqlSelect, scriptToSql } = require('dbgate-sqltree');
|
|
22
21
|
const { allowExecuteCustomScript, handleQueryStream } = require('../utility/handleQueryStream');
|
|
23
22
|
const dbgateApi = require('../shell');
|
|
24
23
|
const requirePlugin = require('../shell/requirePlugin');
|
|
25
24
|
const path = require('path');
|
|
26
25
|
const { rundir } = require('../utility/directories');
|
|
27
26
|
const fs = require('fs-extra');
|
|
27
|
+
const { changeSetToSql } = require('dbgate-datalib');
|
|
28
28
|
|
|
29
29
|
const logger = getLogger('dbconnProcess');
|
|
30
30
|
|
|
@@ -45,6 +45,14 @@ function getStatusCounter() {
|
|
|
45
45
|
return statusCounter;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
+
function getLogInfo() {
|
|
49
|
+
return {
|
|
50
|
+
database: dbhan ? dbhan.database : undefined,
|
|
51
|
+
conid: dbhan ? dbhan.conid : undefined,
|
|
52
|
+
engine: storedConnection ? storedConnection.engine : undefined,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
48
56
|
async function checkedAsyncCall(promise) {
|
|
49
57
|
try {
|
|
50
58
|
const res = await promise;
|
|
@@ -131,10 +139,10 @@ async function readVersion() {
|
|
|
131
139
|
const driver = requireEngineDriver(storedConnection);
|
|
132
140
|
try {
|
|
133
141
|
const version = await driver.getVersion(dbhan);
|
|
134
|
-
logger.debug(`Got server version: ${version.version}`);
|
|
142
|
+
logger.debug(getLogInfo(), `DBGM-00037 Got server version: ${version.version}`);
|
|
135
143
|
serverVersion = version;
|
|
136
144
|
} catch (err) {
|
|
137
|
-
logger.error(extractErrorLogData(err), 'Error getting DB server version');
|
|
145
|
+
logger.error(extractErrorLogData(err, getLogInfo()), 'DBGM-00149 Error getting DB server version');
|
|
138
146
|
serverVersion = { version: 'Unknown' };
|
|
139
147
|
}
|
|
140
148
|
process.send({ msgtype: 'version', version: serverVersion });
|
|
@@ -148,9 +156,8 @@ async function handleConnect({ connection, structure, globalSettings }) {
|
|
|
148
156
|
const driver = requireEngineDriver(storedConnection);
|
|
149
157
|
dbhan = await checkedAsyncCall(connectUtility(driver, storedConnection, 'app'));
|
|
150
158
|
logger.debug(
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}, 'DB: ${dbNameLogCategory(dbhan.database)} }`
|
|
159
|
+
getLogInfo(),
|
|
160
|
+
`DBGM-00038 Connected to database, separate schemas: ${storedConnection.useSeparateSchemas ? 'YES' : 'NO'}`
|
|
154
161
|
);
|
|
155
162
|
dbhan.feedback = feedback => setStatus({ feedback });
|
|
156
163
|
await checkedAsyncCall(readVersion());
|
|
@@ -257,13 +264,16 @@ async function handleDriverDataCore(msgid, callMethod, { logName }) {
|
|
|
257
264
|
const result = await callMethod(driver);
|
|
258
265
|
process.send({ msgtype: 'response', msgid, result: serializeJsTypesForJsonStringify(result) });
|
|
259
266
|
} catch (err) {
|
|
260
|
-
logger.error(
|
|
267
|
+
logger.error(
|
|
268
|
+
extractErrorLogData(err, { logName, ...getLogInfo() }),
|
|
269
|
+
`DBGM-00150 Error when handling message ${logName}`
|
|
270
|
+
);
|
|
261
271
|
process.send({ msgtype: 'response', msgid, errorMessage: extractErrorMessage(err, 'Error executing DB data') });
|
|
262
272
|
}
|
|
263
273
|
}
|
|
264
274
|
|
|
265
275
|
async function handleSchemaList({ msgid }) {
|
|
266
|
-
logger.debug('Loading schema list');
|
|
276
|
+
logger.debug(getLogInfo(), 'DBGM-00039 Loading schema list');
|
|
267
277
|
return handleDriverDataCore(msgid, driver => driver.listSchemas(dbhan), { logName: 'listSchemas' });
|
|
268
278
|
}
|
|
269
279
|
|
|
@@ -339,6 +349,27 @@ async function handleUpdateCollection({ msgid, changeSet }) {
|
|
|
339
349
|
}
|
|
340
350
|
}
|
|
341
351
|
|
|
352
|
+
async function handleSaveTableData({ msgid, changeSet }) {
|
|
353
|
+
await waitStructure();
|
|
354
|
+
try {
|
|
355
|
+
const driver = requireEngineDriver(storedConnection);
|
|
356
|
+
const script = driver.createSaveChangeSetScript(changeSet, analysedStructure, () =>
|
|
357
|
+
changeSetToSql(changeSet, analysedStructure, driver.dialect)
|
|
358
|
+
);
|
|
359
|
+
const sql = scriptToSql(driver, script);
|
|
360
|
+
await driver.script(dbhan, sql, { useTransaction: true });
|
|
361
|
+
process.send({ msgtype: 'response', msgid });
|
|
362
|
+
} catch (err) {
|
|
363
|
+
process.send({
|
|
364
|
+
msgtype: 'response',
|
|
365
|
+
msgid,
|
|
366
|
+
errorMessage: extractErrorMessage(err, 'Error executing SQL script'),
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
}
|
|
372
|
+
|
|
342
373
|
async function handleSqlPreview({ msgid, objects, options }) {
|
|
343
374
|
await waitStructure();
|
|
344
375
|
const driver = requireEngineDriver(storedConnection);
|
|
@@ -351,7 +382,7 @@ async function handleSqlPreview({ msgid, objects, options }) {
|
|
|
351
382
|
process.send({ msgtype: 'response', msgid, sql: dmp.s, isTruncated: generator.isTruncated });
|
|
352
383
|
if (generator.isUnhandledException) {
|
|
353
384
|
setTimeout(async () => {
|
|
354
|
-
logger.error('Exiting because of unhandled exception');
|
|
385
|
+
logger.error(getLogInfo(), 'DBGM-00151 Exiting because of unhandled exception');
|
|
355
386
|
await driver.close(dbhan);
|
|
356
387
|
process.exit(0);
|
|
357
388
|
}, 500);
|
|
@@ -455,6 +486,7 @@ const messageHandlers = {
|
|
|
455
486
|
runScript: handleRunScript,
|
|
456
487
|
runOperation: handleRunOperation,
|
|
457
488
|
updateCollection: handleUpdateCollection,
|
|
489
|
+
saveTableData: handleSaveTableData,
|
|
458
490
|
collectionData: handleCollectionData,
|
|
459
491
|
loadKeys: handleLoadKeys,
|
|
460
492
|
scanKeys: handleScanKeys,
|
|
@@ -485,7 +517,7 @@ function start() {
|
|
|
485
517
|
setInterval(async () => {
|
|
486
518
|
const time = new Date().getTime();
|
|
487
519
|
if (time - lastPing > 40 * 1000) {
|
|
488
|
-
logger.info('Database connection not alive, exiting');
|
|
520
|
+
logger.info(getLogInfo(), 'DBGM-00040 Database connection not alive, exiting');
|
|
489
521
|
const driver = requireEngineDriver(storedConnection);
|
|
490
522
|
await driver.close(dbhan);
|
|
491
523
|
process.exit(0);
|
|
@@ -497,10 +529,10 @@ function start() {
|
|
|
497
529
|
try {
|
|
498
530
|
await handleMessage(message);
|
|
499
531
|
} catch (err) {
|
|
500
|
-
logger.error(extractErrorLogData(err), 'Error in DB connection');
|
|
532
|
+
logger.error(extractErrorLogData(err, getLogInfo()), 'DBGM-00041 Error in DB connection');
|
|
501
533
|
process.send({
|
|
502
534
|
msgtype: 'error',
|
|
503
|
-
error: extractErrorMessage(err, 'Error processing message'),
|
|
535
|
+
error: extractErrorMessage(err, 'DBGM-00042 Error processing message'),
|
|
504
536
|
msgid: message?.msgid,
|
|
505
537
|
});
|
|
506
538
|
}
|
|
@@ -39,7 +39,7 @@ async function handleRefresh() {
|
|
|
39
39
|
name: 'error',
|
|
40
40
|
message: err.message,
|
|
41
41
|
});
|
|
42
|
-
logger.error(extractErrorLogData(err), 'Error refreshing server databases');
|
|
42
|
+
logger.error(extractErrorLogData(err), 'DBGM-00152 Error refreshing server databases');
|
|
43
43
|
setTimeout(() => process.exit(1), 1000);
|
|
44
44
|
}
|
|
45
45
|
}
|
|
@@ -50,7 +50,7 @@ async function readVersion() {
|
|
|
50
50
|
try {
|
|
51
51
|
version = await driver.getVersion(dbhan);
|
|
52
52
|
} catch (err) {
|
|
53
|
-
logger.error(extractErrorLogData(err), 'Error getting DB server version');
|
|
53
|
+
logger.error(extractErrorLogData(err), 'DBGM-00153 Error getting DB server version');
|
|
54
54
|
version = { version: 'Unknown' };
|
|
55
55
|
}
|
|
56
56
|
process.send({ msgtype: 'version', version });
|
|
@@ -90,7 +90,7 @@ async function handleConnect(connection) {
|
|
|
90
90
|
name: 'error',
|
|
91
91
|
message: err.message,
|
|
92
92
|
});
|
|
93
|
-
logger.error(extractErrorLogData(err), 'Error connecting to server');
|
|
93
|
+
logger.error(extractErrorLogData(err), 'DBGM-00154 Error connecting to server');
|
|
94
94
|
setTimeout(() => process.exit(1), 1000);
|
|
95
95
|
}
|
|
96
96
|
|
|
@@ -120,7 +120,7 @@ async function handleDatabaseOp(op, { msgid, name }) {
|
|
|
120
120
|
} else {
|
|
121
121
|
const dmp = driver.createDumper();
|
|
122
122
|
dmp[op](name);
|
|
123
|
-
logger.info({ sql: dmp.s }, 'Running script');
|
|
123
|
+
logger.info({ sql: dmp.s }, 'DBGM-00043 Running script');
|
|
124
124
|
await driver.query(dbhan, dmp.s, { discardResult: true });
|
|
125
125
|
}
|
|
126
126
|
await handleRefresh();
|
|
@@ -146,6 +146,30 @@ async function handleServerSummary({ msgid }) {
|
|
|
146
146
|
return handleDriverDataCore(msgid, driver => driver.serverSummary(dbhan));
|
|
147
147
|
}
|
|
148
148
|
|
|
149
|
+
async function handleKillDatabaseProcess({ msgid, pid }) {
|
|
150
|
+
await waitConnected();
|
|
151
|
+
const driver = requireEngineDriver(storedConnection);
|
|
152
|
+
|
|
153
|
+
try {
|
|
154
|
+
const result = await driver.killProcess(dbhan, Number(pid));
|
|
155
|
+
process.send({ msgtype: 'response', msgid, result });
|
|
156
|
+
} catch (err) {
|
|
157
|
+
process.send({ msgtype: 'response', msgid, errorMessage: err.message });
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
async function handleListDatabaseProcesses({ msgid }) {
|
|
162
|
+
await waitConnected();
|
|
163
|
+
const driver = requireEngineDriver(storedConnection);
|
|
164
|
+
|
|
165
|
+
try {
|
|
166
|
+
const result = await driver.listProcesses(dbhan);
|
|
167
|
+
process.send({ msgtype: 'response', msgid, result });
|
|
168
|
+
} catch (err) {
|
|
169
|
+
process.send({ msgtype: 'response', msgid, errorMessage: err.message });
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
149
173
|
async function handleSummaryCommand({ msgid, command, row }) {
|
|
150
174
|
return handleDriverDataCore(msgid, driver => driver.summaryCommand(dbhan, command, row));
|
|
151
175
|
}
|
|
@@ -154,6 +178,8 @@ const messageHandlers = {
|
|
|
154
178
|
connect: handleConnect,
|
|
155
179
|
ping: handlePing,
|
|
156
180
|
serverSummary: handleServerSummary,
|
|
181
|
+
killDatabaseProcess: handleKillDatabaseProcess,
|
|
182
|
+
listDatabaseProcesses: handleListDatabaseProcesses,
|
|
157
183
|
summaryCommand: handleSummaryCommand,
|
|
158
184
|
createDatabase: props => handleDatabaseOp('createDatabase', props),
|
|
159
185
|
dropDatabase: props => handleDatabaseOp('dropDatabase', props),
|
|
@@ -170,7 +196,7 @@ function start() {
|
|
|
170
196
|
setInterval(async () => {
|
|
171
197
|
const time = new Date().getTime();
|
|
172
198
|
if (time - lastPing > 40 * 1000) {
|
|
173
|
-
logger.info('Server connection not alive, exiting');
|
|
199
|
+
logger.info('DBGM-00044 Server connection not alive, exiting');
|
|
174
200
|
const driver = requireEngineDriver(storedConnection);
|
|
175
201
|
if (dbhan) {
|
|
176
202
|
await driver.close(dbhan);
|
|
@@ -188,7 +214,7 @@ function start() {
|
|
|
188
214
|
name: 'error',
|
|
189
215
|
message: err.message,
|
|
190
216
|
});
|
|
191
|
-
logger.error(extractErrorLogData(err), `Error processing message ${message?.['msgtype']}`);
|
|
217
|
+
logger.error(extractErrorLogData(err), `DBGM-00155 Error processing message ${message?.['msgtype']}`);
|
|
192
218
|
}
|
|
193
219
|
});
|
|
194
220
|
}
|
|
@@ -230,7 +230,7 @@ function start() {
|
|
|
230
230
|
setInterval(async () => {
|
|
231
231
|
const time = new Date().getTime();
|
|
232
232
|
if (time - lastPing > 25 * 1000) {
|
|
233
|
-
logger.info('Session not alive, exiting');
|
|
233
|
+
logger.info('DBGM-00045 Session not alive, exiting');
|
|
234
234
|
const driver = requireEngineDriver(storedConnection);
|
|
235
235
|
await driver.close(dbhan);
|
|
236
236
|
process.exit(0);
|
|
@@ -250,7 +250,7 @@ function start() {
|
|
|
250
250
|
!currentProfiler &&
|
|
251
251
|
executingScripts == 0
|
|
252
252
|
) {
|
|
253
|
-
logger.info('Session not active, exiting');
|
|
253
|
+
logger.info('DBGM-00046 Session not active, exiting');
|
|
254
254
|
const driver = requireEngineDriver(storedConnection);
|
|
255
255
|
await driver.close(dbhan);
|
|
256
256
|
process.exit(0);
|
|
@@ -41,7 +41,7 @@ async function handleStart({ connection, tunnelConfig }) {
|
|
|
41
41
|
tunnelConfig,
|
|
42
42
|
});
|
|
43
43
|
} catch (err) {
|
|
44
|
-
logger.error(extractErrorLogData(err), 'Error creating SSH tunnel connection:');
|
|
44
|
+
logger.error(extractErrorLogData(err), 'DBGM-00156 Error creating SSH tunnel connection:');
|
|
45
45
|
|
|
46
46
|
process.send({
|
|
47
47
|
msgtype: 'error',
|
|
@@ -10,7 +10,7 @@ const logger = getLogger();
|
|
|
10
10
|
function archiveWriter({ folderName, fileName }) {
|
|
11
11
|
const dir = resolveArchiveFolder(folderName);
|
|
12
12
|
if (!fs.existsSync(dir)) {
|
|
13
|
-
logger.info(`Creating directory ${dir}`);
|
|
13
|
+
logger.info(`DBGM-00047 Creating directory ${dir}`);
|
|
14
14
|
fs.mkdirSync(dir);
|
|
15
15
|
}
|
|
16
16
|
const jsonlFile = path.join(dir, `${fileName}.jsonl`);
|
package/src/shell/copyStream.js
CHANGED
|
@@ -83,7 +83,7 @@ async function copyStream(input, output, options) {
|
|
|
83
83
|
});
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
-
logger.error(extractErrorLogData(err, { progressName }), 'Import/export job failed');
|
|
86
|
+
logger.error(extractErrorLogData(err, { progressName }), 'DBGM-00157 Import/export job failed');
|
|
87
87
|
// throw err;
|
|
88
88
|
}
|
|
89
89
|
}
|
|
@@ -28,20 +28,20 @@ async function executeQuery({
|
|
|
28
28
|
useTransaction,
|
|
29
29
|
}) {
|
|
30
30
|
if (!logScriptItems && !skipLogging) {
|
|
31
|
-
logger.info({ sql: getLimitedQuery(sql) }, `Execute query`);
|
|
31
|
+
logger.info({ sql: getLimitedQuery(sql) }, `DBGM-00048 Execute query`);
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
if (!driver) driver = requireEngineDriver(connection);
|
|
35
35
|
const dbhan = systemConnection || (await connectUtility(driver, connection, 'script'));
|
|
36
36
|
|
|
37
37
|
if (sqlFile) {
|
|
38
|
-
logger.debug(`Loading SQL file ${sqlFile}`);
|
|
38
|
+
logger.debug(`DBGM-00049 Loading SQL file ${sqlFile}`);
|
|
39
39
|
sql = await fs.readFile(sqlFile, { encoding: 'utf-8' });
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
try {
|
|
43
43
|
if (!skipLogging) {
|
|
44
|
-
logger.debug(`Running SQL query, length: ${sql.length}`);
|
|
44
|
+
logger.debug(`DBGM-00050 Running SQL query, length: ${sql.length}`);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
await driver.script(dbhan, sql, { logScriptItems, useTransaction });
|
|
@@ -45,14 +45,14 @@ class ImportStream extends stream.Transform {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
async function importDatabase({ connection = undefined, systemConnection = undefined, driver = undefined, inputFile }) {
|
|
48
|
-
logger.info(`Importing database`);
|
|
48
|
+
logger.info(`DBGM-00051 Importing database`);
|
|
49
49
|
|
|
50
50
|
if (!driver) driver = requireEngineDriver(connection);
|
|
51
51
|
const dbhan = systemConnection || (await connectUtility(driver, connection, 'write'));
|
|
52
52
|
try {
|
|
53
|
-
logger.info(`Input file: ${inputFile}`);
|
|
53
|
+
logger.info(`DBGM-00052 Input file: ${inputFile}`);
|
|
54
54
|
const downloadedFile = await download(inputFile);
|
|
55
|
-
logger.info(`Downloaded file: ${downloadedFile}`);
|
|
55
|
+
logger.info(`DBGM-00053 Downloaded file: ${downloadedFile}`);
|
|
56
56
|
|
|
57
57
|
const fileStream = fs.createReadStream(downloadedFile, 'utf-8');
|
|
58
58
|
const splittedStream = splitQueryStream(fileStream, {
|
|
@@ -42,7 +42,7 @@ class ParseStream extends stream.Transform {
|
|
|
42
42
|
* @returns {Promise<readerType>} - reader object
|
|
43
43
|
*/
|
|
44
44
|
async function jsonLinesReader({ fileName, encoding = 'utf-8', limitRows = undefined }) {
|
|
45
|
-
logger.info(`Reading file ${fileName}`);
|
|
45
|
+
logger.info(`DBGM-00054 Reading file ${fileName}`);
|
|
46
46
|
|
|
47
47
|
const downloadedFile = await download(fileName);
|
|
48
48
|
|
|
@@ -33,7 +33,7 @@ class StringifyStream extends stream.Transform {
|
|
|
33
33
|
* @returns {Promise<writerType>} - writer object
|
|
34
34
|
*/
|
|
35
35
|
async function jsonLinesWriter({ fileName, encoding = 'utf-8', header = true }) {
|
|
36
|
-
logger.info(`Writing file ${fileName}`);
|
|
36
|
+
logger.info(`DBGM-00055 Writing file ${fileName}`);
|
|
37
37
|
const stringify = new StringifyStream({ header });
|
|
38
38
|
const fileStream = fs.createWriteStream(fileName, encoding);
|
|
39
39
|
return [stringify, fileStream];
|
package/src/shell/jsonReader.js
CHANGED
|
@@ -63,7 +63,7 @@ async function jsonReader({
|
|
|
63
63
|
encoding = 'utf-8',
|
|
64
64
|
limitRows = undefined,
|
|
65
65
|
}) {
|
|
66
|
-
logger.info(`Reading file ${fileName}`);
|
|
66
|
+
logger.info(`DBGM-00056 Reading file ${fileName}`);
|
|
67
67
|
|
|
68
68
|
const downloadedFile = await download(fileName);
|
|
69
69
|
const fileStream = fs.createReadStream(
|
package/src/shell/jsonWriter.js
CHANGED
|
@@ -96,7 +96,7 @@ class StringifyStream extends stream.Transform {
|
|
|
96
96
|
* @returns {Promise<writerType>} - writer object
|
|
97
97
|
*/
|
|
98
98
|
async function jsonWriter({ fileName, jsonStyle, keyField = '_key', rootField, encoding = 'utf-8' }) {
|
|
99
|
-
logger.info(`Writing file ${fileName}`);
|
|
99
|
+
logger.info(`DBGM-00057 Writing file ${fileName}`);
|
|
100
100
|
const stringify = new StringifyStream({ jsonStyle, keyField, rootField });
|
|
101
101
|
const fileStream = fs.createWriteStream(fileName, encoding);
|
|
102
102
|
return [stringify, fileStream];
|
|
@@ -6,13 +6,13 @@ const exportDbModel = require('../utility/exportDbModel');
|
|
|
6
6
|
const logger = getLogger('analyseDb');
|
|
7
7
|
|
|
8
8
|
async function loadDatabase({ connection = undefined, systemConnection = undefined, driver = undefined, outputDir }) {
|
|
9
|
-
logger.debug(`Analysing database`);
|
|
9
|
+
logger.debug(`DBGM-00058 Analysing database`);
|
|
10
10
|
|
|
11
11
|
if (!driver) driver = requireEngineDriver(connection);
|
|
12
12
|
const dbhan = systemConnection || (await connectUtility(driver, connection, 'read', { forceRowsAsObjects: true }));
|
|
13
13
|
try {
|
|
14
14
|
const dbInfo = await driver.analyseFull(dbhan);
|
|
15
|
-
logger.debug(`Analyse finished`);
|
|
15
|
+
logger.debug(`DBGM-00059 Analyse finished`);
|
|
16
16
|
|
|
17
17
|
await exportDbModel(dbInfo, outputDir);
|
|
18
18
|
} finally {
|
|
@@ -132,7 +132,7 @@ async function modifyJsonLinesReader({
|
|
|
132
132
|
mergeKey = null,
|
|
133
133
|
mergeMode = 'merge',
|
|
134
134
|
}) {
|
|
135
|
-
logger.info(`Reading file ${fileName} with change set`);
|
|
135
|
+
logger.info(`DBGM-00060 Reading file ${fileName} with change set`);
|
|
136
136
|
|
|
137
137
|
const fileStream = fs.createReadStream(
|
|
138
138
|
fileName,
|
package/src/shell/queryReader.js
CHANGED
|
@@ -29,7 +29,7 @@ async function queryReader({
|
|
|
29
29
|
// if (!sql && !json) {
|
|
30
30
|
// throw new Error('One of sql or json must be set');
|
|
31
31
|
// }
|
|
32
|
-
logger.info({ sql: query || sql }, `Reading query`);
|
|
32
|
+
logger.info({ sql: query || sql }, `DBGM-00061 Reading query`);
|
|
33
33
|
// else console.log(`Reading query ${JSON.stringify(json)}`);
|
|
34
34
|
|
|
35
35
|
if (!driver) {
|
|
@@ -4,6 +4,7 @@ const { pluginsdir, packagedPluginsDir, getPluginBackendPath } = require('../uti
|
|
|
4
4
|
const platformInfo = require('../utility/platformInfo');
|
|
5
5
|
const authProxy = require('../utility/authProxy');
|
|
6
6
|
const { getLogger } = require('dbgate-tools');
|
|
7
|
+
//
|
|
7
8
|
const logger = getLogger('requirePlugin');
|
|
8
9
|
|
|
9
10
|
const loadedPlugins = {};
|
|
@@ -12,6 +13,10 @@ const dbgateEnv = {
|
|
|
12
13
|
dbgateApi: null,
|
|
13
14
|
platformInfo,
|
|
14
15
|
authProxy,
|
|
16
|
+
isProApp: () =>{
|
|
17
|
+
const { isProApp } = require('../utility/checkLicense');
|
|
18
|
+
return isProApp();
|
|
19
|
+
}
|
|
15
20
|
};
|
|
16
21
|
function requirePlugin(packageName, requiredPlugin = null) {
|
|
17
22
|
if (!packageName) throw new Error('Missing packageName in plugin');
|
|
@@ -20,7 +25,7 @@ function requirePlugin(packageName, requiredPlugin = null) {
|
|
|
20
25
|
if (requiredPlugin == null) {
|
|
21
26
|
let module;
|
|
22
27
|
const modulePath = getPluginBackendPath(packageName);
|
|
23
|
-
logger.info(`Loading module ${packageName} from ${modulePath}`);
|
|
28
|
+
logger.info(`DBGM-00062 Loading module ${packageName} from ${modulePath}`);
|
|
24
29
|
try {
|
|
25
30
|
// @ts-ignore
|
|
26
31
|
module = __non_webpack_require__(modulePath);
|
package/src/shell/runScript.js
CHANGED
|
@@ -11,7 +11,7 @@ async function runScript(func) {
|
|
|
11
11
|
await func();
|
|
12
12
|
process.exit(0);
|
|
13
13
|
} catch (err) {
|
|
14
|
-
logger.error(extractErrorLogData(err), `Error running script`);
|
|
14
|
+
logger.error(extractErrorLogData(err), `DBGM-00158 Error running script`);
|
|
15
15
|
process.exit(1);
|
|
16
16
|
}
|
|
17
17
|
}
|
|
@@ -41,7 +41,7 @@ class SqlizeStream extends stream.Transform {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
async function sqlDataWriter({ fileName, dataName, driver, encoding = 'utf-8' }) {
|
|
44
|
-
logger.info(`Writing file ${fileName}`);
|
|
44
|
+
logger.info(`DBGM-00063 Writing file ${fileName}`);
|
|
45
45
|
const stringify = new SqlizeStream({ fileName, dataName });
|
|
46
46
|
const fileStream = fs.createWriteStream(fileName, encoding);
|
|
47
47
|
return [stringify, fileStream];
|
package/src/shell/tableReader.js
CHANGED
|
@@ -23,7 +23,7 @@ async function tableReader({ connection, systemConnection, pureName, schemaName,
|
|
|
23
23
|
|
|
24
24
|
if (driver.databaseEngineTypes.includes('document')) {
|
|
25
25
|
// @ts-ignore
|
|
26
|
-
logger.info(`Reading collection ${fullNameToString(fullName)}`);
|
|
26
|
+
logger.info(`DBGM-00064 Reading collection ${fullNameToString(fullName)}`);
|
|
27
27
|
// @ts-ignore
|
|
28
28
|
return await driver.readQuery(dbhan, JSON.stringify(fullName));
|
|
29
29
|
}
|
|
@@ -32,14 +32,14 @@ async function tableReader({ connection, systemConnection, pureName, schemaName,
|
|
|
32
32
|
const query = `select * from ${quoteFullName(driver.dialect, fullName)}`;
|
|
33
33
|
if (table) {
|
|
34
34
|
// @ts-ignore
|
|
35
|
-
logger.info(`Reading table ${fullNameToString(table)}`);
|
|
35
|
+
logger.info(`DBGM-00065 Reading table ${fullNameToString(table)}`);
|
|
36
36
|
// @ts-ignore
|
|
37
37
|
return await driver.readQuery(dbhan, query, table);
|
|
38
38
|
}
|
|
39
39
|
const view = await driver.analyseSingleObject(dbhan, fullName, 'views');
|
|
40
40
|
if (view) {
|
|
41
41
|
// @ts-ignore
|
|
42
|
-
logger.info(`Reading view ${fullNameToString(view)}`);
|
|
42
|
+
logger.info(`DBGM-00066 Reading view ${fullNameToString(view)}`);
|
|
43
43
|
// @ts-ignore
|
|
44
44
|
return await driver.readQuery(dbhan, query, view);
|
|
45
45
|
}
|
package/src/shell/tableWriter.js
CHANGED
|
@@ -20,7 +20,7 @@ const logger = getLogger('tableWriter');
|
|
|
20
20
|
* @returns {Promise<writerType>} - writer object
|
|
21
21
|
*/
|
|
22
22
|
async function tableWriter({ connection, schemaName, pureName, driver, systemConnection, ...options }) {
|
|
23
|
-
logger.info(`Writing table ${fullNameToString({ schemaName, pureName })}`);
|
|
23
|
+
logger.info(`DBGM-00067 Writing table ${fullNameToString({ schemaName, pureName })}`);
|
|
24
24
|
|
|
25
25
|
if (!driver) {
|
|
26
26
|
driver = requireEngineDriver(connection);
|