dbgate-api-premium 5.5.7-alpha.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/.env +19 -0
  2. package/.yarnrc +2 -0
  3. package/README.md +1 -0
  4. package/env/dblogin/.env +14 -0
  5. package/env/portal/.env +70 -0
  6. package/env/singledb/.env +17 -0
  7. package/env/storage/.env +43 -0
  8. package/package.json +89 -0
  9. package/src/auth/authCommon.js +16 -0
  10. package/src/auth/authProvider.js +343 -0
  11. package/src/auth/storageAuthProvider.js +393 -0
  12. package/src/controllers/apps.js +280 -0
  13. package/src/controllers/archive.js +217 -0
  14. package/src/controllers/auth.js +136 -0
  15. package/src/controllers/config.js +271 -0
  16. package/src/controllers/connections.js +486 -0
  17. package/src/controllers/databaseConnections.js +561 -0
  18. package/src/controllers/files.js +222 -0
  19. package/src/controllers/jsldata.js +296 -0
  20. package/src/controllers/metadata.js +47 -0
  21. package/src/controllers/plugins.js +216 -0
  22. package/src/controllers/queryHistory.js +54 -0
  23. package/src/controllers/runners.js +234 -0
  24. package/src/controllers/scheduler.js +46 -0
  25. package/src/controllers/serverConnections.js +271 -0
  26. package/src/controllers/sessions.js +243 -0
  27. package/src/controllers/storage.js +380 -0
  28. package/src/controllers/storageDb.js +215 -0
  29. package/src/controllers/uploads.js +133 -0
  30. package/src/currentVersion.js +5 -0
  31. package/src/gistSecret.js +2 -0
  32. package/src/index.js +139 -0
  33. package/src/main.js +202 -0
  34. package/src/packagedPluginsContent.js +1 -0
  35. package/src/proc/connectProcess.js +38 -0
  36. package/src/proc/databaseConnectionProcess.js +431 -0
  37. package/src/proc/index.js +15 -0
  38. package/src/proc/jslDatastoreProcess.js +60 -0
  39. package/src/proc/serverConnectionProcess.js +188 -0
  40. package/src/proc/sessionProcess.js +390 -0
  41. package/src/proc/sshForwardProcess.js +75 -0
  42. package/src/shell/archiveReader.js +11 -0
  43. package/src/shell/archiveWriter.js +22 -0
  44. package/src/shell/autoIndexForeignKeysTransform.js +19 -0
  45. package/src/shell/collectorWriter.js +33 -0
  46. package/src/shell/consoleObjectWriter.js +16 -0
  47. package/src/shell/copyStream.js +48 -0
  48. package/src/shell/dataDuplicator.js +63 -0
  49. package/src/shell/dataTypeMapperTransform.js +21 -0
  50. package/src/shell/dbModelToJson.js +16 -0
  51. package/src/shell/deployDb.js +56 -0
  52. package/src/shell/download.js +15 -0
  53. package/src/shell/dropAllDbObjects.js +42 -0
  54. package/src/shell/dumpDatabase.js +49 -0
  55. package/src/shell/executeQuery.js +39 -0
  56. package/src/shell/fakeObjectReader.js +35 -0
  57. package/src/shell/finalizer.js +12 -0
  58. package/src/shell/generateDeploySql.js +95 -0
  59. package/src/shell/generateModelSql.js +30 -0
  60. package/src/shell/importDatabase.js +85 -0
  61. package/src/shell/index.js +80 -0
  62. package/src/shell/initializeApiEnvironment.js +9 -0
  63. package/src/shell/jslDataReader.js +9 -0
  64. package/src/shell/jsonLinesReader.js +52 -0
  65. package/src/shell/jsonLinesWriter.js +36 -0
  66. package/src/shell/jsonReader.js +84 -0
  67. package/src/shell/jsonToDbModel.js +9 -0
  68. package/src/shell/jsonWriter.js +97 -0
  69. package/src/shell/loadDatabase.js +27 -0
  70. package/src/shell/loadFile.js +10 -0
  71. package/src/shell/modifyJsonLinesReader.js +148 -0
  72. package/src/shell/queryReader.js +30 -0
  73. package/src/shell/registerPlugins.js +9 -0
  74. package/src/shell/requirePlugin.js +43 -0
  75. package/src/shell/runScript.js +19 -0
  76. package/src/shell/sqlDataWriter.js +52 -0
  77. package/src/shell/sqlTextReplacementTransform.js +32 -0
  78. package/src/shell/tableReader.js +39 -0
  79. package/src/shell/tableWriter.js +18 -0
  80. package/src/storageModel.js +819 -0
  81. package/src/utility/ColumnMapTransformStream.js +21 -0
  82. package/src/utility/DatastoreProxy.js +106 -0
  83. package/src/utility/EnsureStreamHeaderStream.js +31 -0
  84. package/src/utility/JsonLinesDatabase.js +148 -0
  85. package/src/utility/JsonLinesDatastore.js +232 -0
  86. package/src/utility/LineReader.js +88 -0
  87. package/src/utility/SSHConnection.js +251 -0
  88. package/src/utility/authProxy.js +133 -0
  89. package/src/utility/checkLicense.js +186 -0
  90. package/src/utility/childProcessChecker.js +21 -0
  91. package/src/utility/cleanDirectory.js +24 -0
  92. package/src/utility/cloudUpgrade.js +61 -0
  93. package/src/utility/connectUtility.js +111 -0
  94. package/src/utility/crypting.js +105 -0
  95. package/src/utility/diff2htmlPage.js +8 -0
  96. package/src/utility/directories.js +179 -0
  97. package/src/utility/downloadPackage.js +51 -0
  98. package/src/utility/downloader.js +25 -0
  99. package/src/utility/exceptions.js +9 -0
  100. package/src/utility/exportDbModel.js +31 -0
  101. package/src/utility/exportDbModelSql.js +80 -0
  102. package/src/utility/getChartExport.js +55 -0
  103. package/src/utility/getDiagramExport.js +25 -0
  104. package/src/utility/getExpressPath.js +10 -0
  105. package/src/utility/getJslFileName.js +16 -0
  106. package/src/utility/getMapExport.js +77 -0
  107. package/src/utility/hardwareFingerprint.js +89 -0
  108. package/src/utility/hasPermission.js +101 -0
  109. package/src/utility/importDbModel.js +9 -0
  110. package/src/utility/loadFilesRecursive.js +20 -0
  111. package/src/utility/loadModelFolder.js +29 -0
  112. package/src/utility/loadModelTransform.js +36 -0
  113. package/src/utility/pipeForkLogs.js +19 -0
  114. package/src/utility/platformInfo.js +62 -0
  115. package/src/utility/processArgs.js +39 -0
  116. package/src/utility/processComm.js +18 -0
  117. package/src/utility/requireEngineDriver.js +26 -0
  118. package/src/utility/requirePluginFunction.js +16 -0
  119. package/src/utility/socket.js +68 -0
  120. package/src/utility/sshTunnel.js +106 -0
  121. package/src/utility/sshTunnelProxy.js +36 -0
  122. package/src/utility/timingSafeCheckToken.js +9 -0
  123. package/src/utility/useController.js +99 -0
  124. package/tsconfig.json +13 -0
  125. package/webpack.config.js +55 -0
@@ -0,0 +1,16 @@
1
+ const importDbModel = require('../utility/importDbModel');
2
+ const fs = require('fs');
3
+
4
+ async function dbModelToJson({ modelFolder, outputFile, commonjs }) {
5
+ const dbInfo = await importDbModel(modelFolder);
6
+
7
+ const json = JSON.stringify(dbInfo, null, 2);
8
+ if (commonjs) {
9
+ fs.writeFileSync(outputFile, `module.exports = ${json};`);
10
+ return;
11
+ } else {
12
+ fs.writeFileSync(outputFile, json);
13
+ }
14
+ }
15
+
16
+ module.exports = dbModelToJson;
@@ -0,0 +1,56 @@
1
+ const generateDeploySql = require('./generateDeploySql');
2
+ const executeQuery = require('./executeQuery');
3
+ const { ScriptDrivedDeployer } = require('dbgate-datalib');
4
+ const connectUtility = require('../utility/connectUtility');
5
+ const requireEngineDriver = require('../utility/requireEngineDriver');
6
+ const loadModelFolder = require('../utility/loadModelFolder');
7
+ const crypto = require('crypto');
8
+
9
+ async function deployDb({
10
+ connection,
11
+ systemConnection,
12
+ driver,
13
+ analysedStructure,
14
+ modelFolder,
15
+ loadedDbModel,
16
+ modelTransforms,
17
+ dbdiffOptionsExtra,
18
+ ignoreNameRegex = '',
19
+ targetSchema = null,
20
+ }) {
21
+ if (!driver) driver = requireEngineDriver(connection);
22
+ const dbhan = systemConnection || (await connectUtility(driver, connection, 'read'));
23
+
24
+ try {
25
+ const scriptDeployer = new ScriptDrivedDeployer(
26
+ dbhan,
27
+ driver,
28
+ Array.isArray(loadedDbModel) ? loadedDbModel : modelFolder ? await loadModelFolder(modelFolder) : [],
29
+ crypto
30
+ );
31
+ await scriptDeployer.runPre();
32
+
33
+ const { sql } = await generateDeploySql({
34
+ connection,
35
+ systemConnection: dbhan,
36
+ driver,
37
+ analysedStructure,
38
+ modelFolder,
39
+ loadedDbModel,
40
+ modelTransforms,
41
+ dbdiffOptionsExtra,
42
+ ignoreNameRegex,
43
+ targetSchema,
44
+ });
45
+ // console.log('RUNNING DEPLOY SCRIPT:', sql);
46
+ await executeQuery({ connection, systemConnection: dbhan, driver, sql, logScriptItems: true });
47
+
48
+ await scriptDeployer.runPost();
49
+ } finally {
50
+ if (!systemConnection) {
51
+ await driver.close(dbhan);
52
+ }
53
+ }
54
+ }
55
+
56
+ module.exports = deployDb;
@@ -0,0 +1,15 @@
1
+ const crypto = require('crypto');
2
+ const path = require('path');
3
+ const { uploadsdir } = require('../utility/directories');
4
+ const { downloadFile } = require('../utility/downloader');
5
+
6
+ async function download(url) {
7
+ if (url && url.match(/(^http:\/\/)|(^https:\/\/)/)) {
8
+ const tmpFile = path.join(uploadsdir(), crypto.randomUUID());
9
+ await downloadFile(url, tmpFile);
10
+ return tmpFile;
11
+ }
12
+ return url;
13
+ }
14
+
15
+ module.exports = download;
@@ -0,0 +1,42 @@
1
+ const executeQuery = require('./executeQuery');
2
+ const requireEngineDriver = require('../utility/requireEngineDriver');
3
+ const connectUtility = require('../utility/connectUtility');
4
+ const { getLogger, extendDatabaseInfo } = require('dbgate-tools');
5
+
6
+ const logger = getLogger('dropAllDbObjects');
7
+
8
+ async function dropAllDbObjects({ connection, systemConnection, driver, analysedStructure }) {
9
+ if (!driver) driver = requireEngineDriver(connection);
10
+
11
+ const dbhan = systemConnection || (await connectUtility(driver, connection, 'write'));
12
+
13
+ logger.info(`Connected.`);
14
+
15
+ if (!analysedStructure) {
16
+ analysedStructure = await driver.analyseFull(dbhan);
17
+ }
18
+
19
+ analysedStructure = extendDatabaseInfo(analysedStructure);
20
+
21
+ const dmp = driver.createDumper();
22
+
23
+ for (const table of analysedStructure.tables) {
24
+ for (const fk of table.foreignKeys) {
25
+ dmp.dropForeignKey(fk);
26
+ }
27
+ }
28
+ for (const table of analysedStructure.tables) {
29
+ dmp.dropTable(table);
30
+ }
31
+ for (const field of Object.keys(analysedStructure)) {
32
+ if (dmp.getSqlObjectSqlName(field)) {
33
+ for (const obj of analysedStructure[field]) {
34
+ dmp.dropSqlObject(obj);
35
+ }
36
+ }
37
+ }
38
+
39
+ await executeQuery({ connection, systemConnection, driver, sql: dmp.s, logScriptItems: true });
40
+ }
41
+
42
+ module.exports = dropAllDbObjects;
@@ -0,0 +1,49 @@
1
+ const requireEngineDriver = require('../utility/requireEngineDriver');
2
+ const connectUtility = require('../utility/connectUtility');
3
+ const { getLogger } = require('dbgate-tools');
4
+
5
+ const logger = getLogger('dumpDb');
6
+
7
+ function doDump(dumper) {
8
+ return new Promise((resolve, reject) => {
9
+ dumper.once('end', () => {
10
+ resolve(true);
11
+ });
12
+ dumper.once('error', err => {
13
+ reject(err);
14
+ });
15
+ dumper.run();
16
+ });
17
+ }
18
+
19
+ async function dumpDatabase({
20
+ connection = undefined,
21
+ systemConnection = undefined,
22
+ driver = undefined,
23
+ outputFile,
24
+ databaseName,
25
+ schemaName,
26
+ }) {
27
+ logger.info(`Dumping database`);
28
+
29
+ if (!driver) driver = requireEngineDriver(connection);
30
+
31
+ const dbhan = systemConnection || (await connectUtility(driver, connection, 'read', { forceRowsAsObjects: true }));
32
+
33
+ try {
34
+ logger.info(`Connected.`);
35
+
36
+ const dumper = await driver.createBackupDumper(dbhan, {
37
+ outputFile,
38
+ databaseName,
39
+ schemaName,
40
+ });
41
+ await doDump(dumper);
42
+ } finally {
43
+ if (!systemConnection) {
44
+ await driver.close(dbhan);
45
+ }
46
+ }
47
+ }
48
+
49
+ module.exports = dumpDatabase;
@@ -0,0 +1,39 @@
1
+ const fs = require('fs-extra');
2
+ const requireEngineDriver = require('../utility/requireEngineDriver');
3
+ const connectUtility = require('../utility/connectUtility');
4
+ const { getLogger, getLimitedQuery } = require('dbgate-tools');
5
+
6
+ const logger = getLogger('execQuery');
7
+
8
+ async function executeQuery({
9
+ connection = undefined,
10
+ systemConnection = undefined,
11
+ driver = undefined,
12
+ sql,
13
+ sqlFile = undefined,
14
+ logScriptItems = false,
15
+ }) {
16
+ if (!logScriptItems) {
17
+ logger.info({ sql: getLimitedQuery(sql) }, `Execute query`);
18
+ }
19
+
20
+ if (!driver) driver = requireEngineDriver(connection);
21
+ const dbhan = systemConnection || (await connectUtility(driver, connection, 'script'));
22
+
23
+ if (sqlFile) {
24
+ logger.debug(`Loading SQL file ${sqlFile}`);
25
+ sql = await fs.readFile(sqlFile, { encoding: 'utf-8' });
26
+ }
27
+
28
+ try {
29
+ logger.info(`Connected.`);
30
+
31
+ await driver.script(dbhan, sql, { logScriptItems });
32
+ } finally {
33
+ if (!systemConnection) {
34
+ await driver.close(dbhan);
35
+ }
36
+ }
37
+ }
38
+
39
+ module.exports = executeQuery;
@@ -0,0 +1,35 @@
1
+ const stream = require('stream');
2
+
3
+ async function fakeObjectReader({ delay = 0, dynamicData = null } = {}) {
4
+ const pass = new stream.PassThrough({
5
+ objectMode: true,
6
+ });
7
+ function doWrite() {
8
+ if (dynamicData) {
9
+ pass.write({ __isStreamHeader: true, __isDynamicStructure: true });
10
+ for (const item of dynamicData) {
11
+ pass.write(item);
12
+ }
13
+ pass.end();
14
+ } else {
15
+ pass.write({ columns: [{ columnName: 'id' }, { columnName: 'country' }], __isStreamHeader: true });
16
+ pass.write({ id: 1, country: 'Czechia' });
17
+ pass.write({ id: 2, country: 'Austria' });
18
+ pass.write({ country: 'Germany', id: 3 });
19
+ pass.write({ country: 'Romania', id: 4 });
20
+ pass.write({ country: 'Great Britain', id: 5 });
21
+ pass.write({ country: 'Bosna, Hecegovina', id: 6 });
22
+ pass.end();
23
+ }
24
+ }
25
+
26
+ if (delay) {
27
+ setTimeout(doWrite, delay);
28
+ } else {
29
+ doWrite();
30
+ }
31
+
32
+ return pass;
33
+ }
34
+
35
+ module.exports = fakeObjectReader;
@@ -0,0 +1,12 @@
1
+ const finalizers = [];
2
+
3
+ module.exports = {
4
+ async run() {
5
+ for (const func of finalizers) {
6
+ await func();
7
+ }
8
+ },
9
+ register(func) {
10
+ finalizers.push(func);
11
+ },
12
+ };
@@ -0,0 +1,95 @@
1
+ const {
2
+ getAlterDatabaseScript,
3
+ generateDbPairingId,
4
+ matchPairedObjects,
5
+ databaseInfoFromYamlModel,
6
+ extendDatabaseInfo,
7
+ modelCompareDbDiffOptions,
8
+ enrichWithPreloadedRows,
9
+ skipNamesInStructureByRegex,
10
+ replaceSchemaInStructure,
11
+ filterStructureBySchema,
12
+ skipDbGateInternalObjects,
13
+ } = require('dbgate-tools');
14
+ const importDbModel = require('../utility/importDbModel');
15
+ const requireEngineDriver = require('../utility/requireEngineDriver');
16
+ const connectUtility = require('../utility/connectUtility');
17
+
18
+ async function generateDeploySql({
19
+ connection,
20
+ systemConnection = undefined,
21
+ driver = undefined,
22
+ analysedStructure = undefined,
23
+ modelFolder = undefined,
24
+ loadedDbModel = undefined,
25
+ modelTransforms = undefined,
26
+ dbdiffOptionsExtra = {},
27
+ ignoreNameRegex = '',
28
+ targetSchema = null,
29
+ }) {
30
+ if (!driver) driver = requireEngineDriver(connection);
31
+
32
+ const dbhan = systemConnection || (await connectUtility(driver, connection, 'read'));
33
+
34
+ try {
35
+ if (!analysedStructure) {
36
+ analysedStructure = await driver.analyseFull(dbhan);
37
+ }
38
+
39
+ if (ignoreNameRegex) {
40
+ analysedStructure = skipNamesInStructureByRegex(analysedStructure, new RegExp(ignoreNameRegex, 'i'));
41
+ }
42
+ analysedStructure = skipDbGateInternalObjects(analysedStructure);
43
+
44
+ let deployedModelSource = loadedDbModel
45
+ ? databaseInfoFromYamlModel(loadedDbModel)
46
+ : await importDbModel(modelFolder);
47
+
48
+ for (const transform of modelTransforms || []) {
49
+ deployedModelSource = transform(deployedModelSource);
50
+ }
51
+
52
+ if (targetSchema) {
53
+ deployedModelSource = replaceSchemaInStructure(deployedModelSource, targetSchema);
54
+ analysedStructure = filterStructureBySchema(analysedStructure, targetSchema);
55
+ }
56
+
57
+ const deployedModel = generateDbPairingId(extendDatabaseInfo(deployedModelSource));
58
+ const currentModel = generateDbPairingId(extendDatabaseInfo(analysedStructure));
59
+ const opts = {
60
+ ...modelCompareDbDiffOptions,
61
+
62
+ noDropTable: true,
63
+ noDropColumn: true,
64
+ noDropConstraint: true,
65
+ noDropSqlObject: true,
66
+ noRenameTable: true,
67
+ noRenameColumn: true,
68
+
69
+ ...dbdiffOptionsExtra,
70
+ };
71
+ const currentModelPaired = matchPairedObjects(deployedModel, currentModel, opts);
72
+ const currentModelPairedPreloaded = await enrichWithPreloadedRows(deployedModel, currentModelPaired, dbhan, driver);
73
+
74
+ // console.log('currentModelPairedPreloaded', currentModelPairedPreloaded.tables[0]);
75
+ // console.log('deployedModel', deployedModel.tables[0]);
76
+ // console.log('currentModel', currentModel.tables[0]);
77
+ // console.log('currentModelPaired', currentModelPaired.tables[0]);
78
+ const res = getAlterDatabaseScript(
79
+ currentModelPairedPreloaded,
80
+ deployedModel,
81
+ opts,
82
+ currentModelPairedPreloaded,
83
+ deployedModel,
84
+ driver
85
+ );
86
+
87
+ return res;
88
+ } finally {
89
+ if (!systemConnection) {
90
+ await driver.close(dbhan);
91
+ }
92
+ }
93
+ }
94
+
95
+ module.exports = generateDeploySql;
@@ -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;
@@ -0,0 +1,85 @@
1
+ const fs = require('fs');
2
+ const requireEngineDriver = require('../utility/requireEngineDriver');
3
+ const connectUtility = require('../utility/connectUtility');
4
+ const { splitQueryStream } = require('dbgate-query-splitter/lib/splitQueryStream');
5
+ const download = require('./download');
6
+ const stream = require('stream');
7
+ const { getLogger } = require('dbgate-tools');
8
+
9
+ const logger = getLogger('importDb');
10
+
11
+ class ImportStream extends stream.Transform {
12
+ constructor(dbhan, driver) {
13
+ super({ objectMode: true });
14
+ this.dbhan = dbhan;
15
+ this.driver = driver;
16
+ this.writeQueryStream = null;
17
+ }
18
+ async _transform(chunk, encoding, cb) {
19
+ try {
20
+ if (chunk.specialMarker == 'copy_stdin_start') {
21
+ this.writeQueryStream = await this.driver.writeQueryFromStream(this.dbhan, chunk.text);
22
+ } else if (chunk.specialMarker == 'copy_stdin_line') {
23
+ this.writeQueryStream.write(chunk.text);
24
+ } else if (chunk.specialMarker == 'copy_stdin_end') {
25
+ this.writeQueryStream.end();
26
+ await new Promise((resolve, reject) => {
27
+ this.writeQueryStream.on('finish', resolve);
28
+ this.writeQueryStream.on('error', reject);
29
+ });
30
+ this.writeQueryStream = null;
31
+ } else {
32
+ await this.driver.script(this.dbhan, chunk.text, { queryOptions: { importSqlDump: true } });
33
+ }
34
+ } catch (err) {
35
+ this.emit('error', err.message);
36
+ }
37
+ cb();
38
+ }
39
+ _flush(cb) {
40
+ this.push('finish');
41
+ cb();
42
+ this.emit('end');
43
+ }
44
+ }
45
+
46
+ function awaitStreamEnd(stream) {
47
+ return new Promise((resolve, reject) => {
48
+ stream.once('end', () => {
49
+ resolve(true);
50
+ });
51
+ stream.once('error', err => {
52
+ reject(err);
53
+ });
54
+ });
55
+ }
56
+
57
+ async function importDatabase({ connection = undefined, systemConnection = undefined, driver = undefined, inputFile }) {
58
+ logger.info(`Importing database`);
59
+
60
+ if (!driver) driver = requireEngineDriver(connection);
61
+ const dbhan = systemConnection || (await connectUtility(driver, connection, 'write'));
62
+ try {
63
+ logger.info(`Connected.`);
64
+
65
+ logger.info(`Input file: ${inputFile}`);
66
+ const downloadedFile = await download(inputFile);
67
+ logger.info(`Downloaded file: ${downloadedFile}`);
68
+
69
+ const fileStream = fs.createReadStream(downloadedFile, 'utf-8');
70
+ const splittedStream = splitQueryStream(fileStream, {
71
+ ...driver.getQuerySplitterOptions('import'),
72
+ returnRichInfo: true,
73
+ });
74
+ const importStream = new ImportStream(dbhan, driver);
75
+ // @ts-ignore
76
+ splittedStream.pipe(importStream);
77
+ await awaitStreamEnd(importStream);
78
+ } finally {
79
+ if (!systemConnection) {
80
+ await driver.close(dbhan);
81
+ }
82
+ }
83
+ }
84
+
85
+ module.exports = importDatabase;
@@ -0,0 +1,80 @@
1
+ const queryReader = require('./queryReader');
2
+ const runScript = require('./runScript');
3
+ const tableWriter = require('./tableWriter');
4
+ const tableReader = require('./tableReader');
5
+ const copyStream = require('./copyStream');
6
+ const fakeObjectReader = require('./fakeObjectReader');
7
+ const consoleObjectWriter = require('./consoleObjectWriter');
8
+ const jsonLinesWriter = require('./jsonLinesWriter');
9
+ const jsonWriter = require('./jsonWriter');
10
+ const jsonLinesReader = require('./jsonLinesReader');
11
+ const sqlDataWriter = require('./sqlDataWriter');
12
+ const jslDataReader = require('./jslDataReader');
13
+ const archiveWriter = require('./archiveWriter');
14
+ const archiveReader = require('./archiveReader');
15
+ const collectorWriter = require('./collectorWriter');
16
+ const finalizer = require('./finalizer');
17
+ const registerPlugins = require('./registerPlugins');
18
+ const requirePlugin = require('./requirePlugin');
19
+ const download = require('./download');
20
+ const executeQuery = require('./executeQuery');
21
+ const loadFile = require('./loadFile');
22
+ const deployDb = require('./deployDb');
23
+ const initializeApiEnvironment = require('./initializeApiEnvironment');
24
+ const dumpDatabase = require('./dumpDatabase');
25
+ const importDatabase = require('./importDatabase');
26
+ const loadDatabase = require('./loadDatabase');
27
+ const generateModelSql = require('./generateModelSql');
28
+ const modifyJsonLinesReader = require('./modifyJsonLinesReader');
29
+ const dataDuplicator = require('./dataDuplicator');
30
+ const dbModelToJson = require('./dbModelToJson');
31
+ const jsonToDbModel = require('./jsonToDbModel');
32
+ const jsonReader = require('./jsonReader');
33
+ const dataTypeMapperTransform = require('./dataTypeMapperTransform');
34
+ const sqlTextReplacementTransform = require('./sqlTextReplacementTransform');
35
+ const autoIndexForeignKeysTransform = require('./autoIndexForeignKeysTransform');
36
+ const generateDeploySql = require('./generateDeploySql');
37
+ const dropAllDbObjects = require('./dropAllDbObjects');
38
+
39
+ const dbgateApi = {
40
+ queryReader,
41
+ runScript,
42
+ tableWriter,
43
+ tableReader,
44
+ copyStream,
45
+ jsonLinesWriter,
46
+ jsonLinesReader,
47
+ jsonReader,
48
+ jsonWriter,
49
+ sqlDataWriter,
50
+ fakeObjectReader,
51
+ consoleObjectWriter,
52
+ jslDataReader,
53
+ archiveWriter,
54
+ archiveReader,
55
+ collectorWriter,
56
+ finalizer,
57
+ download,
58
+ registerPlugins,
59
+ executeQuery,
60
+ loadFile,
61
+ deployDb,
62
+ initializeApiEnvironment,
63
+ dumpDatabase,
64
+ importDatabase,
65
+ loadDatabase,
66
+ generateModelSql,
67
+ modifyJsonLinesReader,
68
+ dataDuplicator,
69
+ dbModelToJson,
70
+ jsonToDbModel,
71
+ dataTypeMapperTransform,
72
+ sqlTextReplacementTransform,
73
+ autoIndexForeignKeysTransform,
74
+ generateDeploySql,
75
+ dropAllDbObjects,
76
+ };
77
+
78
+ requirePlugin.initializeDbgateApi(dbgateApi);
79
+
80
+ module.exports = dbgateApi;
@@ -0,0 +1,9 @@
1
+ const { handleProcessCommunication } = require('../utility/processComm');
2
+
3
+ async function initializeApiEnvironment() {
4
+ process.on('message', async message => {
5
+ handleProcessCommunication(message);
6
+ });
7
+ }
8
+
9
+ module.exports = initializeApiEnvironment;
@@ -0,0 +1,9 @@
1
+ const getJslFileName = require('../utility/getJslFileName');
2
+ const jsonLinesReader = require('./jsonLinesReader');
3
+
4
+ function jslDataReader({ jslid, ...other }) {
5
+ const fileName = getJslFileName(jslid);
6
+ return jsonLinesReader({ fileName, ...other });
7
+ }
8
+
9
+ module.exports = jslDataReader;
@@ -0,0 +1,52 @@
1
+ const fs = require('fs');
2
+ const stream = require('stream');
3
+ const byline = require('byline');
4
+ const { getLogger } = require('dbgate-tools');
5
+ const download = require('./download');
6
+ const logger = getLogger('jsonLinesReader');
7
+
8
+ class ParseStream extends stream.Transform {
9
+ constructor({ limitRows }) {
10
+ super({ objectMode: true });
11
+ this.wasHeader = false;
12
+ this.limitRows = limitRows;
13
+ this.rowsWritten = 0;
14
+ }
15
+ _transform(chunk, encoding, done) {
16
+ const obj = JSON.parse(chunk);
17
+ if (!this.wasHeader) {
18
+ if (!obj.__isStreamHeader) {
19
+ this.push({
20
+ __isStreamHeader: true,
21
+ __isDynamicStructure: true,
22
+ // columns: Object.keys(obj).map(columnName => ({ columnName })),
23
+ });
24
+ }
25
+
26
+ this.wasHeader = true;
27
+ }
28
+ if (!this.limitRows || this.rowsWritten < this.limitRows) {
29
+ this.push(obj);
30
+ this.rowsWritten += 1;
31
+ }
32
+ done();
33
+ }
34
+ }
35
+
36
+ async function jsonLinesReader({ fileName, encoding = 'utf-8', limitRows = undefined }) {
37
+ logger.info(`Reading file ${fileName}`);
38
+
39
+ const downloadedFile = await download(fileName);
40
+
41
+ const fileStream = fs.createReadStream(
42
+ downloadedFile,
43
+ // @ts-ignore
44
+ encoding
45
+ );
46
+ const liner = byline(fileStream);
47
+ const parser = new ParseStream({ limitRows });
48
+ liner.pipe(parser);
49
+ return parser;
50
+ }
51
+
52
+ module.exports = jsonLinesReader;
@@ -0,0 +1,36 @@
1
+ const { getLogger } = require('dbgate-tools');
2
+ const fs = require('fs');
3
+ const stream = require('stream');
4
+ const logger = getLogger('jsonLinesWriter');
5
+
6
+ class StringifyStream extends stream.Transform {
7
+ constructor({ header }) {
8
+ super({ objectMode: true });
9
+ this.header = header;
10
+ this.wasHeader = false;
11
+ }
12
+ _transform(chunk, encoding, done) {
13
+ let skip = false;
14
+ if (!this.wasHeader) {
15
+ skip =
16
+ (chunk.__isStreamHeader && !this.header) ||
17
+ (chunk.__isStreamHeader && chunk.__isDynamicStructure && !chunk.__keepDynamicStreamHeader);
18
+ this.wasHeader = true;
19
+ }
20
+ if (!skip) {
21
+ this.push(JSON.stringify(chunk) + '\n');
22
+ }
23
+ done();
24
+ }
25
+ }
26
+
27
+ async function jsonLinesWriter({ fileName, encoding = 'utf-8', header = true }) {
28
+ logger.info(`Writing file ${fileName}`);
29
+ const stringify = new StringifyStream({ header });
30
+ const fileStream = fs.createWriteStream(fileName, encoding);
31
+ stringify.pipe(fileStream);
32
+ stringify['finisher'] = fileStream;
33
+ return stringify;
34
+ }
35
+
36
+ module.exports = jsonLinesWriter;