dbgate-api-premium 6.6.0 → 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 +6 -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 +1 -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/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 +3 -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/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/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,
|
|
@@ -45,6 +44,14 @@ function getStatusCounter() {
|
|
|
45
44
|
return statusCounter;
|
|
46
45
|
}
|
|
47
46
|
|
|
47
|
+
function getLogInfo() {
|
|
48
|
+
return {
|
|
49
|
+
database: dbhan ? dbhan.database : undefined,
|
|
50
|
+
conid: dbhan ? dbhan.conid : undefined,
|
|
51
|
+
engine: storedConnection ? storedConnection.engine : undefined,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
48
55
|
async function checkedAsyncCall(promise) {
|
|
49
56
|
try {
|
|
50
57
|
const res = await promise;
|
|
@@ -131,10 +138,10 @@ async function readVersion() {
|
|
|
131
138
|
const driver = requireEngineDriver(storedConnection);
|
|
132
139
|
try {
|
|
133
140
|
const version = await driver.getVersion(dbhan);
|
|
134
|
-
logger.debug(`Got server version: ${version.version}`);
|
|
141
|
+
logger.debug(getLogInfo(), `DBGM-00037 Got server version: ${version.version}`);
|
|
135
142
|
serverVersion = version;
|
|
136
143
|
} catch (err) {
|
|
137
|
-
logger.error(extractErrorLogData(err), 'Error getting DB server version');
|
|
144
|
+
logger.error(extractErrorLogData(err, getLogInfo()), 'DBGM-00149 Error getting DB server version');
|
|
138
145
|
serverVersion = { version: 'Unknown' };
|
|
139
146
|
}
|
|
140
147
|
process.send({ msgtype: 'version', version: serverVersion });
|
|
@@ -148,9 +155,8 @@ async function handleConnect({ connection, structure, globalSettings }) {
|
|
|
148
155
|
const driver = requireEngineDriver(storedConnection);
|
|
149
156
|
dbhan = await checkedAsyncCall(connectUtility(driver, storedConnection, 'app'));
|
|
150
157
|
logger.debug(
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}, 'DB: ${dbNameLogCategory(dbhan.database)} }`
|
|
158
|
+
getLogInfo(),
|
|
159
|
+
`DBGM-00038 Connected to database, separate schemas: ${storedConnection.useSeparateSchemas ? 'YES' : 'NO'}`
|
|
154
160
|
);
|
|
155
161
|
dbhan.feedback = feedback => setStatus({ feedback });
|
|
156
162
|
await checkedAsyncCall(readVersion());
|
|
@@ -257,13 +263,16 @@ async function handleDriverDataCore(msgid, callMethod, { logName }) {
|
|
|
257
263
|
const result = await callMethod(driver);
|
|
258
264
|
process.send({ msgtype: 'response', msgid, result: serializeJsTypesForJsonStringify(result) });
|
|
259
265
|
} catch (err) {
|
|
260
|
-
logger.error(
|
|
266
|
+
logger.error(
|
|
267
|
+
extractErrorLogData(err, { logName, ...getLogInfo() }),
|
|
268
|
+
`DBGM-00150 Error when handling message ${logName}`
|
|
269
|
+
);
|
|
261
270
|
process.send({ msgtype: 'response', msgid, errorMessage: extractErrorMessage(err, 'Error executing DB data') });
|
|
262
271
|
}
|
|
263
272
|
}
|
|
264
273
|
|
|
265
274
|
async function handleSchemaList({ msgid }) {
|
|
266
|
-
logger.debug('Loading schema list');
|
|
275
|
+
logger.debug(getLogInfo(), 'DBGM-00039 Loading schema list');
|
|
267
276
|
return handleDriverDataCore(msgid, driver => driver.listSchemas(dbhan), { logName: 'listSchemas' });
|
|
268
277
|
}
|
|
269
278
|
|
|
@@ -351,7 +360,7 @@ async function handleSqlPreview({ msgid, objects, options }) {
|
|
|
351
360
|
process.send({ msgtype: 'response', msgid, sql: dmp.s, isTruncated: generator.isTruncated });
|
|
352
361
|
if (generator.isUnhandledException) {
|
|
353
362
|
setTimeout(async () => {
|
|
354
|
-
logger.error('Exiting because of unhandled exception');
|
|
363
|
+
logger.error(getLogInfo(), 'DBGM-00151 Exiting because of unhandled exception');
|
|
355
364
|
await driver.close(dbhan);
|
|
356
365
|
process.exit(0);
|
|
357
366
|
}, 500);
|
|
@@ -485,7 +494,7 @@ function start() {
|
|
|
485
494
|
setInterval(async () => {
|
|
486
495
|
const time = new Date().getTime();
|
|
487
496
|
if (time - lastPing > 40 * 1000) {
|
|
488
|
-
logger.info('Database connection not alive, exiting');
|
|
497
|
+
logger.info(getLogInfo(), 'DBGM-00040 Database connection not alive, exiting');
|
|
489
498
|
const driver = requireEngineDriver(storedConnection);
|
|
490
499
|
await driver.close(dbhan);
|
|
491
500
|
process.exit(0);
|
|
@@ -497,10 +506,10 @@ function start() {
|
|
|
497
506
|
try {
|
|
498
507
|
await handleMessage(message);
|
|
499
508
|
} catch (err) {
|
|
500
|
-
logger.error(extractErrorLogData(err), 'Error in DB connection');
|
|
509
|
+
logger.error(extractErrorLogData(err, getLogInfo()), 'DBGM-00041 Error in DB connection');
|
|
501
510
|
process.send({
|
|
502
511
|
msgtype: 'error',
|
|
503
|
-
error: extractErrorMessage(err, 'Error processing message'),
|
|
512
|
+
error: extractErrorMessage(err, 'DBGM-00042 Error processing message'),
|
|
504
513
|
msgid: message?.msgid,
|
|
505
514
|
});
|
|
506
515
|
}
|
|
@@ -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();
|
|
@@ -170,7 +170,7 @@ function start() {
|
|
|
170
170
|
setInterval(async () => {
|
|
171
171
|
const time = new Date().getTime();
|
|
172
172
|
if (time - lastPing > 40 * 1000) {
|
|
173
|
-
logger.info('Server connection not alive, exiting');
|
|
173
|
+
logger.info('DBGM-00044 Server connection not alive, exiting');
|
|
174
174
|
const driver = requireEngineDriver(storedConnection);
|
|
175
175
|
if (dbhan) {
|
|
176
176
|
await driver.close(dbhan);
|
|
@@ -188,7 +188,7 @@ function start() {
|
|
|
188
188
|
name: 'error',
|
|
189
189
|
message: err.message,
|
|
190
190
|
});
|
|
191
|
-
logger.error(extractErrorLogData(err), `Error processing message ${message?.['msgtype']}`);
|
|
191
|
+
logger.error(extractErrorLogData(err), `DBGM-00155 Error processing message ${message?.['msgtype']}`);
|
|
192
192
|
}
|
|
193
193
|
});
|
|
194
194
|
}
|
|
@@ -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);
|
|
@@ -52,14 +52,14 @@ function unzipDirectory(zipPath, outputDirectory) {
|
|
|
52
52
|
readStream.on('end', () => zipFile.readEntry());
|
|
53
53
|
|
|
54
54
|
writeStream.on('finish', () => {
|
|
55
|
-
logger.info(`Extracted "${entry.fileName}" → "${destPath}".`);
|
|
55
|
+
logger.info(`DBGM-00068 Extracted "${entry.fileName}" → "${destPath}".`);
|
|
56
56
|
res();
|
|
57
57
|
});
|
|
58
58
|
|
|
59
59
|
writeStream.on('error', writeErr => {
|
|
60
60
|
logger.error(
|
|
61
61
|
extractErrorLogData(writeErr),
|
|
62
|
-
`Error extracting "${entry.fileName}" from "${zipPath}".`
|
|
62
|
+
`DBGM-00069 Error extracting "${entry.fileName}" from "${zipPath}".`
|
|
63
63
|
);
|
|
64
64
|
rej(writeErr);
|
|
65
65
|
});
|
|
@@ -74,14 +74,14 @@ function unzipDirectory(zipPath, outputDirectory) {
|
|
|
74
74
|
zipFile.on('end', () => {
|
|
75
75
|
Promise.all(pending)
|
|
76
76
|
.then(() => {
|
|
77
|
-
logger.info(`Archive "${zipPath}" fully extracted to "${outputDirectory}".`);
|
|
77
|
+
logger.info(`DBGM-00070 Archive "${zipPath}" fully extracted to "${outputDirectory}".`);
|
|
78
78
|
resolve(true);
|
|
79
79
|
})
|
|
80
80
|
.catch(reject);
|
|
81
81
|
});
|
|
82
82
|
|
|
83
83
|
zipFile.on('error', err => {
|
|
84
|
-
logger.error(extractErrorLogData(err), `ZIP file error in ${zipPath}.`);
|
|
84
|
+
logger.error(extractErrorLogData(err), `DBGM-00071 ZIP file error in ${zipPath}.`);
|
|
85
85
|
reject(err);
|
|
86
86
|
});
|
|
87
87
|
});
|
|
@@ -16,16 +16,16 @@ function zipDirectory(inputDirectory, outputFile) {
|
|
|
16
16
|
|
|
17
17
|
// Listen for all archive data to be written
|
|
18
18
|
output.on('close', () => {
|
|
19
|
-
logger.info(`ZIP file created (${archive.pointer()} total bytes)`);
|
|
19
|
+
logger.info(`DBGM-00072 ZIP file created (${archive.pointer()} total bytes)`);
|
|
20
20
|
resolve();
|
|
21
21
|
});
|
|
22
22
|
|
|
23
23
|
archive.on('warning', err => {
|
|
24
|
-
logger.warn(extractErrorLogData(err), `Warning while creating ZIP: ${err.message}`);
|
|
24
|
+
logger.warn(extractErrorLogData(err), `DBGM-00073 Warning while creating ZIP: ${err.message}`);
|
|
25
25
|
});
|
|
26
26
|
|
|
27
27
|
archive.on('error', err => {
|
|
28
|
-
logger.error(extractErrorLogData(err), `Error while creating ZIP: ${err.message}`);
|
|
28
|
+
logger.error(extractErrorLogData(err), `DBGM-00074 Error while creating ZIP: ${err.message}`);
|
|
29
29
|
reject(err);
|
|
30
30
|
});
|
|
31
31
|
|
|
@@ -17,16 +17,16 @@ function zipDirectory(jsonDb, outputFile) {
|
|
|
17
17
|
|
|
18
18
|
// Listen for all archive data to be written
|
|
19
19
|
output.on('close', () => {
|
|
20
|
-
logger.info(`ZIP file created (${archive.pointer()} total bytes)`);
|
|
20
|
+
logger.info(`DBGM-00075 ZIP file created (${archive.pointer()} total bytes)`);
|
|
21
21
|
resolve();
|
|
22
22
|
});
|
|
23
23
|
|
|
24
24
|
archive.on('warning', err => {
|
|
25
|
-
logger.warn(extractErrorLogData(err), `Warning while creating ZIP: ${err.message}`);
|
|
25
|
+
logger.warn(extractErrorLogData(err), `DBGM-00076 Warning while creating ZIP: ${err.message}`);
|
|
26
26
|
});
|
|
27
27
|
|
|
28
28
|
archive.on('error', err => {
|
|
29
|
-
logger.error(extractErrorLogData(err), `Error while creating ZIP: ${err.message}`);
|
|
29
|
+
logger.error(extractErrorLogData(err), `DBGM-00077 Error while creating ZIP: ${err.message}`);
|
|
30
30
|
reject(err);
|
|
31
31
|
});
|
|
32
32
|
|
|
@@ -61,7 +61,7 @@ class DatastoreProxy {
|
|
|
61
61
|
this.subprocess = null;
|
|
62
62
|
});
|
|
63
63
|
this.subprocess.on('error', err => {
|
|
64
|
-
logger.error(extractErrorLogData(err), 'Error in data store subprocess');
|
|
64
|
+
logger.error(extractErrorLogData(err), 'DBGM-00167 Error in data store subprocess');
|
|
65
65
|
this.subprocess = null;
|
|
66
66
|
});
|
|
67
67
|
this.subprocess.send({ msgtype: 'open', file: this.file });
|
|
@@ -77,7 +77,7 @@ class DatastoreProxy {
|
|
|
77
77
|
try {
|
|
78
78
|
this.subprocess.send({ msgtype: 'read', msgid, offset, limit });
|
|
79
79
|
} catch (err) {
|
|
80
|
-
logger.error(extractErrorLogData(err), 'Error getting rows');
|
|
80
|
+
logger.error(extractErrorLogData(err), 'DBGM-00168 Error getting rows');
|
|
81
81
|
this.subprocess = null;
|
|
82
82
|
}
|
|
83
83
|
});
|
|
@@ -91,7 +91,7 @@ class DatastoreProxy {
|
|
|
91
91
|
try {
|
|
92
92
|
this.subprocess.send({ msgtype: 'notify', msgid });
|
|
93
93
|
} catch (err) {
|
|
94
|
-
logger.error(extractErrorLogData(err), 'Error notifying subprocess');
|
|
94
|
+
logger.error(extractErrorLogData(err), 'DBGM-00169 Error notifying subprocess');
|
|
95
95
|
this.subprocess = null;
|
|
96
96
|
}
|
|
97
97
|
});
|