dbgate-api 5.2.1 → 5.2.2-alpha.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +7 -6
- package/src/controllers/archive.js +4 -1
- package/src/controllers/auth.js +6 -3
- package/src/controllers/config.js +3 -1
- package/src/controllers/connections.js +23 -13
- package/src/controllers/databaseConnections.js +35 -12
- package/src/controllers/runners.js +21 -13
- package/src/controllers/scheduler.js +4 -1
- package/src/controllers/serverConnections.js +37 -10
- package/src/controllers/sessions.js +27 -10
- package/src/controllers/uploads.js +3 -1
- package/src/currentVersion.js +2 -2
- package/src/index.js +96 -2
- package/src/main.js +12 -9
- package/src/proc/databaseConnectionProcess.js +8 -6
- package/src/proc/serverConnectionProcess.js +4 -3
- package/src/proc/sessionProcess.js +26 -1
- package/src/proc/sshForwardProcess.js +5 -2
- package/src/shell/archiveWriter.js +4 -1
- package/src/shell/dumpDatabase.js +5 -2
- package/src/shell/executeQuery.js +5 -2
- package/src/shell/generateModelSql.js +30 -0
- package/src/shell/importDatabase.js +5 -2
- package/src/shell/index.js +4 -0
- package/src/shell/jsonArrayWriter.js +4 -1
- package/src/shell/jsonLinesReader.js +3 -1
- package/src/shell/jsonLinesWriter.js +3 -1
- package/src/shell/loadDatabase.js +21 -0
- package/src/shell/queryReader.js +4 -2
- package/src/shell/requirePlugin.js +3 -1
- package/src/shell/runScript.js +3 -1
- package/src/shell/sqlDataWriter.js +3 -2
- package/src/shell/tableReader.js +6 -5
- package/src/shell/tableWriter.js +4 -3
- package/src/utility/DatastoreProxy.js +29 -9
- package/src/utility/childProcessChecker.js +6 -2
- package/src/utility/cleanDirectory.js +2 -2
- package/src/utility/directories.js +22 -6
- package/src/utility/pipeForkLogs.js +19 -0
- package/src/utility/processArgs.js +2 -0
- package/src/utility/sshTunnel.js +23 -14
- package/src/utility/sshTunnelProxy.js +7 -1
- package/src/utility/useController.js +9 -7
package/src/index.js
CHANGED
|
@@ -1,5 +1,96 @@
|
|
|
1
|
-
const
|
|
1
|
+
const { setLogger, getLogger, setLoggerName } = require('dbgate-tools');
|
|
2
2
|
const processArgs = require('./utility/processArgs');
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const moment = require('moment');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const { logsdir, setLogsFilePath, getLogsFilePath } = require('./utility/directories');
|
|
7
|
+
const { createLogger } = require('pinomin');
|
|
8
|
+
|
|
9
|
+
if (processArgs.startProcess) {
|
|
10
|
+
setLoggerName(processArgs.startProcess.replace(/Process$/, ''));
|
|
11
|
+
}
|
|
12
|
+
if (processArgs.processDisplayName) {
|
|
13
|
+
setLoggerName(processArgs.processDisplayName);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// function loadLogsContent(maxLines) {
|
|
17
|
+
// const text = fs.readFileSync(getLogsFilePath(), { encoding: 'utf8' });
|
|
18
|
+
// if (maxLines) {
|
|
19
|
+
// const lines = text
|
|
20
|
+
// .split('\n')
|
|
21
|
+
// .map(x => x.trim())
|
|
22
|
+
// .filter(x => x);
|
|
23
|
+
// return lines.slice(-maxLines).join('\n');
|
|
24
|
+
// }
|
|
25
|
+
// return text;
|
|
26
|
+
// }
|
|
27
|
+
|
|
28
|
+
function configureLogger() {
|
|
29
|
+
const logsFilePath = path.join(logsdir(), `${moment().format('YYYY-MM-DD-HH-mm')}-${process.pid}.ndjson`);
|
|
30
|
+
setLogsFilePath(logsFilePath);
|
|
31
|
+
setLoggerName('main');
|
|
32
|
+
|
|
33
|
+
const logger = createLogger({
|
|
34
|
+
base: { pid: process.pid },
|
|
35
|
+
targets: [
|
|
36
|
+
{
|
|
37
|
+
type: 'console',
|
|
38
|
+
// @ts-ignore
|
|
39
|
+
level: process.env.CONSOLE_LOG_LEVEL || process.env.LOG_LEVEL || 'info',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
type: 'stream',
|
|
43
|
+
// @ts-ignore
|
|
44
|
+
level: process.env.FILE_LOG_LEVEL || process.env.LOG_LEVEL || 'info',
|
|
45
|
+
stream: fs.createWriteStream(logsFilePath, { flags: 'a' }),
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// const streams = [];
|
|
51
|
+
// if (!platformInfo.isElectron) {
|
|
52
|
+
// streams.push({
|
|
53
|
+
// stream: process.stdout,
|
|
54
|
+
// level: process.env.CONSOLE_LOG_LEVEL || process.env.LOG_LEVEL || 'info',
|
|
55
|
+
// });
|
|
56
|
+
// }
|
|
57
|
+
|
|
58
|
+
// streams.push({
|
|
59
|
+
// stream: fs.createWriteStream(logsFilePath),
|
|
60
|
+
// level: process.env.FILE_LOG_LEVEL || process.env.LOG_LEVEL || 'info',
|
|
61
|
+
// });
|
|
62
|
+
|
|
63
|
+
// let logger = pinoms({
|
|
64
|
+
// redact: { paths: ['hostname'], remove: true },
|
|
65
|
+
// streams,
|
|
66
|
+
// });
|
|
67
|
+
|
|
68
|
+
// // @ts-ignore
|
|
69
|
+
// let logger = pino({
|
|
70
|
+
// redact: { paths: ['hostname'], remove: true },
|
|
71
|
+
// transport: {
|
|
72
|
+
// targets: [
|
|
73
|
+
// {
|
|
74
|
+
// level: process.env.CONSOLE_LOG_LEVEL || process.env.LOG_LEVEL || 'info',
|
|
75
|
+
// target: 'pino/file',
|
|
76
|
+
// },
|
|
77
|
+
// {
|
|
78
|
+
// level: process.env.FILE_LOG_LEVEL || process.env.LOG_LEVEL || 'info',
|
|
79
|
+
// target: 'pino/file',
|
|
80
|
+
// options: { destination: logsFilePath },
|
|
81
|
+
// },
|
|
82
|
+
// ],
|
|
83
|
+
// },
|
|
84
|
+
// });
|
|
85
|
+
|
|
86
|
+
setLogger(logger);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (processArgs.listenApi) {
|
|
90
|
+
configureLogger();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const shell = require('./shell');
|
|
3
94
|
const dbgateTools = require('dbgate-tools');
|
|
4
95
|
|
|
5
96
|
global['DBGATE_TOOLS'] = dbgateTools;
|
|
@@ -8,7 +99,7 @@ if (processArgs.startProcess) {
|
|
|
8
99
|
const proc = require('./proc');
|
|
9
100
|
const module = proc[processArgs.startProcess];
|
|
10
101
|
module.start();
|
|
11
|
-
}
|
|
102
|
+
}
|
|
12
103
|
|
|
13
104
|
if (processArgs.listenApi) {
|
|
14
105
|
const main = require('./main');
|
|
@@ -17,5 +108,8 @@ if (processArgs.listenApi) {
|
|
|
17
108
|
|
|
18
109
|
module.exports = {
|
|
19
110
|
...shell,
|
|
111
|
+
getLogger,
|
|
112
|
+
configureLogger,
|
|
113
|
+
// loadLogsContent,
|
|
20
114
|
getMainModule: () => require('./main'),
|
|
21
115
|
};
|
package/src/main.js
CHANGED
|
@@ -33,6 +33,9 @@ const platformInfo = require('./utility/platformInfo');
|
|
|
33
33
|
const getExpressPath = require('./utility/getExpressPath');
|
|
34
34
|
const { getLogins } = require('./utility/hasPermission');
|
|
35
35
|
const _ = require('lodash');
|
|
36
|
+
const { getLogger } = require('dbgate-tools');
|
|
37
|
+
|
|
38
|
+
const logger = getLogger('main');
|
|
36
39
|
|
|
37
40
|
function start() {
|
|
38
41
|
// console.log('process.argv', process.argv);
|
|
@@ -60,8 +63,8 @@ function start() {
|
|
|
60
63
|
} else if (platformInfo.isNpmDist) {
|
|
61
64
|
app.use(getExpressPath('/'), express.static(path.join(__dirname, '../../dbgate-web/public')));
|
|
62
65
|
} else if (process.env.DEVWEB) {
|
|
63
|
-
console.log('__dirname', __dirname);
|
|
64
|
-
console.log(path.join(__dirname, '../../web/public/build'));
|
|
66
|
+
// console.log('__dirname', __dirname);
|
|
67
|
+
// console.log(path.join(__dirname, '../../web/public/build'));
|
|
65
68
|
app.use(getExpressPath('/'), express.static(path.join(__dirname, '../../web/public')));
|
|
66
69
|
} else {
|
|
67
70
|
app.get(getExpressPath('/'), (req, res) => {
|
|
@@ -109,7 +112,7 @@ function start() {
|
|
|
109
112
|
|
|
110
113
|
if (platformInfo.isDocker) {
|
|
111
114
|
const port = process.env.PORT || 3000;
|
|
112
|
-
|
|
115
|
+
logger.info(`DbGate API listening on port ${port} (docker build)`);
|
|
113
116
|
server.listen(port);
|
|
114
117
|
} else if (platformInfo.isNpmDist) {
|
|
115
118
|
getPort({
|
|
@@ -119,27 +122,27 @@ function start() {
|
|
|
119
122
|
),
|
|
120
123
|
}).then(port => {
|
|
121
124
|
server.listen(port, () => {
|
|
122
|
-
|
|
125
|
+
logger.info(`DbGate API listening on port ${port} (NPM build)`);
|
|
123
126
|
});
|
|
124
127
|
});
|
|
125
128
|
} else if (process.env.DEVWEB) {
|
|
126
129
|
const port = process.env.PORT || 3000;
|
|
127
|
-
|
|
130
|
+
logger.info(`DbGate API & web listening on port ${port} (dev web build)`);
|
|
128
131
|
server.listen(port);
|
|
129
132
|
} else {
|
|
130
133
|
const port = process.env.PORT || 3000;
|
|
131
|
-
|
|
134
|
+
logger.info(`DbGate API listening on port ${port} (dev API build)`);
|
|
132
135
|
server.listen(port);
|
|
133
136
|
}
|
|
134
137
|
|
|
135
138
|
function shutdown() {
|
|
136
|
-
|
|
139
|
+
logger.info('\nShutting down DbGate API server');
|
|
137
140
|
server.close(() => {
|
|
138
|
-
|
|
141
|
+
logger.info('Server shut down, terminating');
|
|
139
142
|
process.exit(0);
|
|
140
143
|
});
|
|
141
144
|
setTimeout(() => {
|
|
142
|
-
|
|
145
|
+
logger.info('Server close timeout, terminating');
|
|
143
146
|
process.exit(0);
|
|
144
147
|
}, 1000);
|
|
145
148
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const stableStringify = require('json-stable-stringify');
|
|
2
2
|
const { splitQuery } = require('dbgate-query-splitter');
|
|
3
3
|
const childProcessChecker = require('../utility/childProcessChecker');
|
|
4
|
-
const { extractBoolSettingsValue, extractIntSettingsValue } = require('dbgate-tools');
|
|
4
|
+
const { extractBoolSettingsValue, extractIntSettingsValue, getLogger } = require('dbgate-tools');
|
|
5
5
|
const requireEngineDriver = require('../utility/requireEngineDriver');
|
|
6
6
|
const connectUtility = require('../utility/connectUtility');
|
|
7
7
|
const { handleProcessCommunication } = require('../utility/processComm');
|
|
@@ -9,6 +9,8 @@ const { SqlGenerator } = require('dbgate-tools');
|
|
|
9
9
|
const generateDeploySql = require('../shell/generateDeploySql');
|
|
10
10
|
const { dumpSqlSelect } = require('dbgate-sqltree');
|
|
11
11
|
|
|
12
|
+
const logger = getLogger('dbconnProcess');
|
|
13
|
+
|
|
12
14
|
let systemConnection;
|
|
13
15
|
let storedConnection;
|
|
14
16
|
let afterConnectCallbacks = [];
|
|
@@ -269,7 +271,7 @@ async function handleSqlPreview({ msgid, objects, options }) {
|
|
|
269
271
|
process.send({ msgtype: 'response', msgid, sql: dmp.s, isTruncated: generator.isTruncated });
|
|
270
272
|
if (generator.isUnhandledException) {
|
|
271
273
|
setTimeout(() => {
|
|
272
|
-
|
|
274
|
+
getLogger.info('Exiting because of unhandled exception');
|
|
273
275
|
process.exit(0);
|
|
274
276
|
}, 500);
|
|
275
277
|
}
|
|
@@ -336,7 +338,7 @@ function start() {
|
|
|
336
338
|
setInterval(() => {
|
|
337
339
|
const time = new Date().getTime();
|
|
338
340
|
if (time - lastPing > 40 * 1000) {
|
|
339
|
-
|
|
341
|
+
logger.info('Database connection not alive, exiting');
|
|
340
342
|
process.exit(0);
|
|
341
343
|
}
|
|
342
344
|
}, 10 * 1000);
|
|
@@ -345,9 +347,9 @@ function start() {
|
|
|
345
347
|
if (handleProcessCommunication(message)) return;
|
|
346
348
|
try {
|
|
347
349
|
await handleMessage(message);
|
|
348
|
-
} catch (
|
|
349
|
-
|
|
350
|
-
process.send({ msgtype: 'error', error:
|
|
350
|
+
} catch (err) {
|
|
351
|
+
logger.error({ err }, 'Error in DB connection');
|
|
352
|
+
process.send({ msgtype: 'error', error: err.message });
|
|
351
353
|
}
|
|
352
354
|
});
|
|
353
355
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
const stableStringify = require('json-stable-stringify');
|
|
2
|
-
const { extractBoolSettingsValue, extractIntSettingsValue } = require('dbgate-tools');
|
|
2
|
+
const { extractBoolSettingsValue, extractIntSettingsValue, getLogger } = require('dbgate-tools');
|
|
3
3
|
const childProcessChecker = require('../utility/childProcessChecker');
|
|
4
4
|
const requireEngineDriver = require('../utility/requireEngineDriver');
|
|
5
5
|
const connectUtility = require('../utility/connectUtility');
|
|
6
6
|
const { handleProcessCommunication } = require('../utility/processComm');
|
|
7
|
+
const logger = getLogger('srvconnProcess');
|
|
7
8
|
|
|
8
9
|
let systemConnection;
|
|
9
10
|
let storedConnection;
|
|
@@ -101,7 +102,7 @@ async function handleDatabaseOp(op, { name }) {
|
|
|
101
102
|
} else {
|
|
102
103
|
const dmp = driver.createDumper();
|
|
103
104
|
dmp[op](name);
|
|
104
|
-
|
|
105
|
+
logger.info({ sql: dmp.s }, 'Running script');
|
|
105
106
|
await driver.query(systemConnection, dmp.s);
|
|
106
107
|
}
|
|
107
108
|
await handleRefresh();
|
|
@@ -146,7 +147,7 @@ function start() {
|
|
|
146
147
|
setInterval(() => {
|
|
147
148
|
const time = new Date().getTime();
|
|
148
149
|
if (time - lastPing > 40 * 1000) {
|
|
149
|
-
|
|
150
|
+
logger.info('Server connection not alive, exiting');
|
|
150
151
|
process.exit(0);
|
|
151
152
|
}
|
|
152
153
|
}, 10 * 1000);
|
|
@@ -10,12 +10,16 @@ const requireEngineDriver = require('../utility/requireEngineDriver');
|
|
|
10
10
|
const { decryptConnection } = require('../utility/crypting');
|
|
11
11
|
const connectUtility = require('../utility/connectUtility');
|
|
12
12
|
const { handleProcessCommunication } = require('../utility/processComm');
|
|
13
|
+
const { getLogger, extractIntSettingsValue, extractBoolSettingsValue } = require('dbgate-tools');
|
|
14
|
+
|
|
15
|
+
const logger = getLogger('sessionProcess');
|
|
13
16
|
|
|
14
17
|
let systemConnection;
|
|
15
18
|
let storedConnection;
|
|
16
19
|
let afterConnectCallbacks = [];
|
|
17
20
|
// let currentHandlers = [];
|
|
18
21
|
let lastPing = null;
|
|
22
|
+
let lastActivity = null;
|
|
19
23
|
let currentProfiler = null;
|
|
20
24
|
|
|
21
25
|
class TableWriter {
|
|
@@ -212,6 +216,8 @@ function waitConnected() {
|
|
|
212
216
|
}
|
|
213
217
|
|
|
214
218
|
async function handleStartProfiler({ jslid }) {
|
|
219
|
+
lastActivity = new Date().getTime();
|
|
220
|
+
|
|
215
221
|
await waitConnected();
|
|
216
222
|
const driver = requireEngineDriver(storedConnection);
|
|
217
223
|
|
|
@@ -230,6 +236,8 @@ async function handleStartProfiler({ jslid }) {
|
|
|
230
236
|
}
|
|
231
237
|
|
|
232
238
|
async function handleStopProfiler({ jslid }) {
|
|
239
|
+
lastActivity = new Date().getTime();
|
|
240
|
+
|
|
233
241
|
const driver = requireEngineDriver(storedConnection);
|
|
234
242
|
currentProfiler.writer.close();
|
|
235
243
|
driver.stopProfiler(systemConnection, currentProfiler);
|
|
@@ -237,6 +245,8 @@ async function handleStopProfiler({ jslid }) {
|
|
|
237
245
|
}
|
|
238
246
|
|
|
239
247
|
async function handleExecuteQuery({ sql }) {
|
|
248
|
+
lastActivity = new Date().getTime();
|
|
249
|
+
|
|
240
250
|
await waitConnected();
|
|
241
251
|
const driver = requireEngineDriver(storedConnection);
|
|
242
252
|
|
|
@@ -270,6 +280,8 @@ async function handleExecuteQuery({ sql }) {
|
|
|
270
280
|
}
|
|
271
281
|
|
|
272
282
|
async function handleExecuteReader({ jslid, sql, fileName }) {
|
|
283
|
+
lastActivity = new Date().getTime();
|
|
284
|
+
|
|
273
285
|
await waitConnected();
|
|
274
286
|
|
|
275
287
|
const driver = requireEngineDriver(storedConnection);
|
|
@@ -325,7 +337,20 @@ function start() {
|
|
|
325
337
|
setInterval(() => {
|
|
326
338
|
const time = new Date().getTime();
|
|
327
339
|
if (time - lastPing > 25 * 1000) {
|
|
328
|
-
|
|
340
|
+
logger.info('Session not alive, exiting');
|
|
341
|
+
process.exit(0);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
const useSessionTimeout =
|
|
345
|
+
storedConnection && storedConnection.globalSettings
|
|
346
|
+
? extractBoolSettingsValue(storedConnection.globalSettings, 'session.autoClose', true)
|
|
347
|
+
: false;
|
|
348
|
+
const sessionTimeout =
|
|
349
|
+
storedConnection && storedConnection.globalSettings
|
|
350
|
+
? extractIntSettingsValue(storedConnection.globalSettings, 'session.autoCloseTimeout', 15, 1, 120)
|
|
351
|
+
: 15;
|
|
352
|
+
if (useSessionTimeout && time - lastActivity > sessionTimeout * 60 * 1000 && !currentProfiler) {
|
|
353
|
+
logger.info('Session not active, exiting');
|
|
329
354
|
process.exit(0);
|
|
330
355
|
}
|
|
331
356
|
}, 10 * 1000);
|
|
@@ -3,6 +3,9 @@ const platformInfo = require('../utility/platformInfo');
|
|
|
3
3
|
const childProcessChecker = require('../utility/childProcessChecker');
|
|
4
4
|
const { handleProcessCommunication } = require('../utility/processComm');
|
|
5
5
|
const { SSHConnection } = require('../utility/SSHConnection');
|
|
6
|
+
const { getLogger } = require('dbgate-tools');
|
|
7
|
+
|
|
8
|
+
const logger = getLogger('sshProcess');
|
|
6
9
|
|
|
7
10
|
async function getSshConnection(connection) {
|
|
8
11
|
const sshConfig = {
|
|
@@ -35,8 +38,8 @@ async function handleStart({ connection, tunnelConfig }) {
|
|
|
35
38
|
tunnelConfig,
|
|
36
39
|
});
|
|
37
40
|
} catch (err) {
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
logger.error({ err }, 'Error creating SSH tunnel connection:');
|
|
42
|
+
|
|
40
43
|
process.send({
|
|
41
44
|
msgtype: 'error',
|
|
42
45
|
connection,
|
|
@@ -3,11 +3,14 @@ const fs = require('fs');
|
|
|
3
3
|
const { archivedir, resolveArchiveFolder } = require('../utility/directories');
|
|
4
4
|
// const socket = require('../utility/socket');
|
|
5
5
|
const jsonLinesWriter = require('./jsonLinesWriter');
|
|
6
|
+
const { getLogger } = require('dbgate-tools');
|
|
7
|
+
|
|
8
|
+
const logger = getLogger();
|
|
6
9
|
|
|
7
10
|
function archiveWriter({ folderName, fileName }) {
|
|
8
11
|
const dir = resolveArchiveFolder(folderName);
|
|
9
12
|
if (!fs.existsSync(dir)) {
|
|
10
|
-
|
|
13
|
+
logger.info(`Creating directory ${dir}`);
|
|
11
14
|
fs.mkdirSync(dir);
|
|
12
15
|
}
|
|
13
16
|
const jsonlFile = path.join(dir, `${fileName}.jsonl`);
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
const requireEngineDriver = require('../utility/requireEngineDriver');
|
|
2
2
|
const connectUtility = require('../utility/connectUtility');
|
|
3
|
+
const { getLogger } = require('dbgate-tools');
|
|
4
|
+
|
|
5
|
+
const logger = getLogger('dumpDb');
|
|
3
6
|
|
|
4
7
|
function doDump(dumper) {
|
|
5
8
|
return new Promise((resolve, reject) => {
|
|
@@ -21,11 +24,11 @@ async function dumpDatabase({
|
|
|
21
24
|
databaseName,
|
|
22
25
|
schemaName,
|
|
23
26
|
}) {
|
|
24
|
-
|
|
27
|
+
logger.info(`Dumping database`);
|
|
25
28
|
|
|
26
29
|
if (!driver) driver = requireEngineDriver(connection);
|
|
27
30
|
const pool = systemConnection || (await connectUtility(driver, connection, 'read', { forceRowsAsObjects: true }));
|
|
28
|
-
|
|
31
|
+
logger.info(`Connected.`);
|
|
29
32
|
|
|
30
33
|
const dumper = await driver.createBackupDumper(pool, {
|
|
31
34
|
outputFile,
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
const requireEngineDriver = require('../utility/requireEngineDriver');
|
|
2
2
|
const connectUtility = require('../utility/connectUtility');
|
|
3
|
+
const { getLogger } = require('dbgate-tools');
|
|
4
|
+
|
|
5
|
+
const logger = getLogger('execQuery');
|
|
3
6
|
|
|
4
7
|
async function executeQuery({ connection = undefined, systemConnection = undefined, driver = undefined, sql }) {
|
|
5
|
-
|
|
8
|
+
logger.info({ sql }, `Execute query`);
|
|
6
9
|
|
|
7
10
|
if (!driver) driver = requireEngineDriver(connection);
|
|
8
11
|
const pool = systemConnection || (await connectUtility(driver, connection, 'script'));
|
|
9
|
-
|
|
12
|
+
logger.info(`Connected.`);
|
|
10
13
|
|
|
11
14
|
await driver.script(pool, sql);
|
|
12
15
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const requireEngineDriver = require('../utility/requireEngineDriver');
|
|
2
|
+
const {
|
|
3
|
+
extendDatabaseInfo,
|
|
4
|
+
databaseInfoFromYamlModel,
|
|
5
|
+
getAlterDatabaseScript,
|
|
6
|
+
DatabaseAnalyser,
|
|
7
|
+
} = require('dbgate-tools');
|
|
8
|
+
const importDbModel = require('../utility/importDbModel');
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
|
|
11
|
+
async function generateModelSql({ engine, driver, modelFolder, loadedDbModel, outputFile }) {
|
|
12
|
+
if (!driver) driver = requireEngineDriver(engine);
|
|
13
|
+
|
|
14
|
+
const dbInfo = extendDatabaseInfo(
|
|
15
|
+
loadedDbModel ? databaseInfoFromYamlModel(loadedDbModel) : await importDbModel(modelFolder)
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
const { sql } = getAlterDatabaseScript(
|
|
19
|
+
DatabaseAnalyser.createEmptyStructure(),
|
|
20
|
+
dbInfo,
|
|
21
|
+
{},
|
|
22
|
+
DatabaseAnalyser.createEmptyStructure(),
|
|
23
|
+
dbInfo,
|
|
24
|
+
driver
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
fs.writeFileSync(outputFile, sql);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
module.exports = generateModelSql;
|
|
@@ -4,6 +4,9 @@ const connectUtility = require('../utility/connectUtility');
|
|
|
4
4
|
const { splitQueryStream } = require('dbgate-query-splitter/lib/splitQueryStream');
|
|
5
5
|
const download = require('./download');
|
|
6
6
|
const stream = require('stream');
|
|
7
|
+
const { getLogger } = require('dbgate-tools');
|
|
8
|
+
|
|
9
|
+
const logger = getLogger('importDb');
|
|
7
10
|
|
|
8
11
|
class ImportStream extends stream.Transform {
|
|
9
12
|
constructor(pool, driver) {
|
|
@@ -38,11 +41,11 @@ function awaitStreamEnd(stream) {
|
|
|
38
41
|
}
|
|
39
42
|
|
|
40
43
|
async function importDatabase({ connection = undefined, systemConnection = undefined, driver = undefined, inputFile }) {
|
|
41
|
-
|
|
44
|
+
logger.info(`Importing database`);
|
|
42
45
|
|
|
43
46
|
if (!driver) driver = requireEngineDriver(connection);
|
|
44
47
|
const pool = systemConnection || (await connectUtility(driver, connection, 'write'));
|
|
45
|
-
|
|
48
|
+
logger.info(`Connected.`);
|
|
46
49
|
|
|
47
50
|
const downloadedFile = await download(inputFile);
|
|
48
51
|
|
package/src/shell/index.js
CHANGED
|
@@ -23,6 +23,8 @@ const deployDb = require('./deployDb');
|
|
|
23
23
|
const initializeApiEnvironment = require('./initializeApiEnvironment');
|
|
24
24
|
const dumpDatabase = require('./dumpDatabase');
|
|
25
25
|
const importDatabase = require('./importDatabase');
|
|
26
|
+
const loadDatabase = require('./loadDatabase');
|
|
27
|
+
const generateModelSql = require('./generateModelSql');
|
|
26
28
|
|
|
27
29
|
const dbgateApi = {
|
|
28
30
|
queryReader,
|
|
@@ -49,6 +51,8 @@ const dbgateApi = {
|
|
|
49
51
|
initializeApiEnvironment,
|
|
50
52
|
dumpDatabase,
|
|
51
53
|
importDatabase,
|
|
54
|
+
loadDatabase,
|
|
55
|
+
generateModelSql,
|
|
52
56
|
};
|
|
53
57
|
|
|
54
58
|
requirePlugin.initializeDbgateApi(dbgateApi);
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
const { getLogger } = require('dbgate-tools');
|
|
1
2
|
const fs = require('fs');
|
|
2
3
|
const stream = require('stream');
|
|
3
4
|
|
|
5
|
+
const logger = getLogger('jsonArrayWriter');
|
|
6
|
+
|
|
4
7
|
class StringifyStream extends stream.Transform {
|
|
5
8
|
constructor() {
|
|
6
9
|
super({ objectMode: true });
|
|
@@ -38,7 +41,7 @@ class StringifyStream extends stream.Transform {
|
|
|
38
41
|
}
|
|
39
42
|
|
|
40
43
|
async function jsonArrayWriter({ fileName, encoding = 'utf-8' }) {
|
|
41
|
-
|
|
44
|
+
logger.info(`Writing file ${fileName}`);
|
|
42
45
|
const stringify = new StringifyStream();
|
|
43
46
|
const fileStream = fs.createWriteStream(fileName, encoding);
|
|
44
47
|
stringify.pipe(fileStream);
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
const fs = require('fs');
|
|
2
2
|
const stream = require('stream');
|
|
3
3
|
const byline = require('byline');
|
|
4
|
+
const { getLogger } = require('dbgate-tools');
|
|
5
|
+
const logger = getLogger('jsonLinesReader');
|
|
4
6
|
|
|
5
7
|
class ParseStream extends stream.Transform {
|
|
6
8
|
constructor({ limitRows }) {
|
|
@@ -31,7 +33,7 @@ class ParseStream extends stream.Transform {
|
|
|
31
33
|
}
|
|
32
34
|
|
|
33
35
|
async function jsonLinesReader({ fileName, encoding = 'utf-8', limitRows = undefined }) {
|
|
34
|
-
|
|
36
|
+
logger.info(`Reading file ${fileName}`);
|
|
35
37
|
|
|
36
38
|
const fileStream = fs.createReadStream(fileName, encoding);
|
|
37
39
|
const liner = byline(fileStream);
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
const { getLogger } = require('dbgate-tools');
|
|
1
2
|
const fs = require('fs');
|
|
2
3
|
const stream = require('stream');
|
|
4
|
+
const logger = getLogger('jsonLinesWriter');
|
|
3
5
|
|
|
4
6
|
class StringifyStream extends stream.Transform {
|
|
5
7
|
constructor({ header }) {
|
|
@@ -21,7 +23,7 @@ class StringifyStream extends stream.Transform {
|
|
|
21
23
|
}
|
|
22
24
|
|
|
23
25
|
async function jsonLinesWriter({ fileName, encoding = 'utf-8', header = true }) {
|
|
24
|
-
|
|
26
|
+
logger.info(`Writing file ${fileName}`);
|
|
25
27
|
const stringify = new StringifyStream({ header });
|
|
26
28
|
const fileStream = fs.createWriteStream(fileName, encoding);
|
|
27
29
|
stringify.pipe(fileStream);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const requireEngineDriver = require('../utility/requireEngineDriver');
|
|
2
|
+
const connectUtility = require('../utility/connectUtility');
|
|
3
|
+
const { getLogger } = require('dbgate-tools');
|
|
4
|
+
const exportDbModel = require('../utility/exportDbModel');
|
|
5
|
+
|
|
6
|
+
const logger = getLogger('analyseDb');
|
|
7
|
+
|
|
8
|
+
async function loadDatabase({ connection = undefined, systemConnection = undefined, driver = undefined, outputDir }) {
|
|
9
|
+
logger.info(`Analysing database`);
|
|
10
|
+
|
|
11
|
+
if (!driver) driver = requireEngineDriver(connection);
|
|
12
|
+
const pool = systemConnection || (await connectUtility(driver, connection, 'read', { forceRowsAsObjects: true }));
|
|
13
|
+
logger.info(`Connected.`);
|
|
14
|
+
|
|
15
|
+
const dbInfo = await driver.analyseFull(pool);
|
|
16
|
+
logger.info(`Analyse finished`);
|
|
17
|
+
|
|
18
|
+
await exportDbModel(dbInfo, outputDir);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
module.exports = loadDatabase;
|
package/src/shell/queryReader.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
const requireEngineDriver = require('../utility/requireEngineDriver');
|
|
2
2
|
const connectUtility = require('../utility/connectUtility');
|
|
3
|
+
const { getLogger } = require('dbgate-tools');
|
|
4
|
+
const logger = getLogger('queryReader');
|
|
3
5
|
|
|
4
6
|
async function queryReader({
|
|
5
7
|
connection,
|
|
@@ -14,12 +16,12 @@ async function queryReader({
|
|
|
14
16
|
// if (!sql && !json) {
|
|
15
17
|
// throw new Error('One of sql or json must be set');
|
|
16
18
|
// }
|
|
17
|
-
|
|
19
|
+
logger.info({ sql: query || sql }, `Reading query`);
|
|
18
20
|
// else console.log(`Reading query ${JSON.stringify(json)}`);
|
|
19
21
|
|
|
20
22
|
const driver = requireEngineDriver(connection);
|
|
21
23
|
const pool = await connectUtility(driver, connection, queryType == 'json' ? 'read' : 'script');
|
|
22
|
-
|
|
24
|
+
logger.info(`Connected.`);
|
|
23
25
|
const reader =
|
|
24
26
|
queryType == 'json' ? await driver.readJsonQuery(pool, query) : await driver.readQuery(pool, query || sql);
|
|
25
27
|
return reader;
|
|
@@ -3,6 +3,8 @@ const fs = require('fs');
|
|
|
3
3
|
const { pluginsdir, packagedPluginsDir, getPluginBackendPath } = require('../utility/directories');
|
|
4
4
|
const nativeModules = require('../nativeModules');
|
|
5
5
|
const platformInfo = require('../utility/platformInfo');
|
|
6
|
+
const { getLogger } = require('dbgate-tools');
|
|
7
|
+
const logger = getLogger('requirePlugin');
|
|
6
8
|
|
|
7
9
|
const loadedPlugins = {};
|
|
8
10
|
|
|
@@ -17,7 +19,7 @@ function requirePlugin(packageName, requiredPlugin = null) {
|
|
|
17
19
|
if (requiredPlugin == null) {
|
|
18
20
|
let module;
|
|
19
21
|
const modulePath = getPluginBackendPath(packageName);
|
|
20
|
-
|
|
22
|
+
logger.info(`Loading module ${packageName} from ${modulePath}`);
|
|
21
23
|
try {
|
|
22
24
|
// @ts-ignore
|
|
23
25
|
module = __non_webpack_require__(modulePath);
|
package/src/shell/runScript.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
const { getLogger } = require('dbgate-tools');
|
|
1
2
|
const childProcessChecker = require('../utility/childProcessChecker');
|
|
2
3
|
const processArgs = require('../utility/processArgs');
|
|
4
|
+
const logger = getLogger();
|
|
3
5
|
|
|
4
6
|
async function runScript(func) {
|
|
5
7
|
if (processArgs.checkParent) {
|
|
@@ -9,7 +11,7 @@ async function runScript(func) {
|
|
|
9
11
|
await func();
|
|
10
12
|
process.exit(0);
|
|
11
13
|
} catch (err) {
|
|
12
|
-
|
|
14
|
+
logger.error('Error running script', err);
|
|
13
15
|
process.exit(1);
|
|
14
16
|
}
|
|
15
17
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
const fs = require('fs');
|
|
2
2
|
const stream = require('stream');
|
|
3
3
|
const path = require('path');
|
|
4
|
-
const { driverBase } = require('dbgate-tools');
|
|
4
|
+
const { driverBase, getLogger } = require('dbgate-tools');
|
|
5
5
|
const requireEngineDriver = require('../utility/requireEngineDriver');
|
|
6
|
+
const logger = getLogger('sqlDataWriter');
|
|
6
7
|
|
|
7
8
|
class SqlizeStream extends stream.Transform {
|
|
8
9
|
constructor({ fileName, dataName }) {
|
|
@@ -40,7 +41,7 @@ class SqlizeStream extends stream.Transform {
|
|
|
40
41
|
}
|
|
41
42
|
|
|
42
43
|
async function sqlDataWriter({ fileName, dataName, driver, encoding = 'utf-8' }) {
|
|
43
|
-
|
|
44
|
+
logger.info(`Writing file ${fileName}`);
|
|
44
45
|
const stringify = new SqlizeStream({ fileName, dataName });
|
|
45
46
|
const fileStream = fs.createWriteStream(fileName, encoding);
|
|
46
47
|
stringify.pipe(fileStream);
|