From bb41236a5f47ec0b1165a46cbbf4e05b218f2172 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sat, 27 Mar 2021 20:39:27 +0100 Subject: [PATCH] sql generator - generates SQL inserts --- packages/api/src/controllers/sqlgen.js | 19 ---------- packages/api/src/main.js | 2 - .../api/src/proc/databaseConnectionProcess.js | 2 +- packages/tools/src/SqlGenerator.ts | 38 ++++++++++++++++++- 4 files changed, 37 insertions(+), 24 deletions(-) delete mode 100644 packages/api/src/controllers/sqlgen.js diff --git a/packages/api/src/controllers/sqlgen.js b/packages/api/src/controllers/sqlgen.js deleted file mode 100644 index f065a70db..000000000 --- a/packages/api/src/controllers/sqlgen.js +++ /dev/null @@ -1,19 +0,0 @@ -const databaseConnections = require('./databaseConnections'); -const connections = require('./connections'); -const requireEngineDriver = require('../utility/requireEngineDriver'); -const { SqlGenerator } = require('dbgate-tools') - -module.exports = { - preview_meta: { - method: 'post', - }, - async preview({ conid, database, objects, options }) { - const structure = await databaseConnections.structure({ conid, database }) - const connection = await connections.get({ conid }) - const driver = requireEngineDriver(connection); - const dmp = driver.createDumper(); - const generator = new SqlGenerator(structure, options, objects, dmp); - await generator.dump(); - return dmp.s; - }, -}; diff --git a/packages/api/src/main.js b/packages/api/src/main.js index 63080f666..b96dbc809 100644 --- a/packages/api/src/main.js +++ b/packages/api/src/main.js @@ -26,7 +26,6 @@ const uploads = require('./controllers/uploads'); const plugins = require('./controllers/plugins'); const files = require('./controllers/files'); const scheduler = require('./controllers/scheduler'); -const sqlgen = require('./controllers/sqlgen'); const { rundir } = require('./utility/directories'); @@ -73,7 +72,6 @@ function start(argument = null) { useController(app, '/plugins', plugins); useController(app, '/files', files); useController(app, '/scheduler', scheduler); - useController(app, '/sqlgen', sqlgen); // if (process.env.PAGES_DIRECTORY) { // app.use('/pages', express.static(process.env.PAGES_DIRECTORY)); diff --git a/packages/api/src/proc/databaseConnectionProcess.js b/packages/api/src/proc/databaseConnectionProcess.js index e134a78ae..28024029a 100644 --- a/packages/api/src/proc/databaseConnectionProcess.js +++ b/packages/api/src/proc/databaseConnectionProcess.js @@ -100,7 +100,7 @@ async function handleSqlPreview({ msgid, objects, options }) { const driver = requireEngineDriver(storedConnection); const dmp = driver.createDumper(); - const generator = new SqlGenerator(analysedStructure, options, objects, dmp); + const generator = new SqlGenerator(analysedStructure, options, objects, dmp, driver, systemConnection); await generator.dump(); process.send({ msgtype: 'response', msgid, sql: dmp.s }); } diff --git a/packages/tools/src/SqlGenerator.ts b/packages/tools/src/SqlGenerator.ts index b1fc11b63..3fb3f7b22 100644 --- a/packages/tools/src/SqlGenerator.ts +++ b/packages/tools/src/SqlGenerator.ts @@ -1,4 +1,4 @@ -import { DatabaseInfo, FunctionInfo, ProcedureInfo, TableInfo, ViewInfo } from 'dbgate-types'; +import { DatabaseInfo, EngineDriver, FunctionInfo, ProcedureInfo, TableInfo, ViewInfo } from 'dbgate-types'; import { SqlDumper } from './SqlDumper'; interface SqlGeneratorOptions { @@ -31,7 +31,9 @@ export class SqlGenerator { public dbinfo: DatabaseInfo, public options: SqlGeneratorOptions, public objects: SqlGeneratorObject[], - public dmp: SqlDumper + public dmp: SqlDumper, + public driver: EngineDriver, + public pool ) { this.tables = this.extract('tables'); this.views = this.extract('views'); @@ -50,6 +52,38 @@ export class SqlGenerator { if (this.checkDumper()) return; } } + if (this.options.insert) { + for (const table of this.tables) { + await this.insertTableData(table); + if (this.checkDumper()) return; + } + } + } + + async insertTableData(table: TableInfo) { + const dmp = this.driver.createDumper(); + dmp.put('^select * ^from %f', table); + const readable = await this.driver.readQuery(this.pool, dmp.s, table); + await this.processReadable(table, readable); + } + + processReadable(table: TableInfo, readable) { + const columnNames = table.columns.map(x => x.columnName); + return new Promise(resolve => { + readable.on('data', chunk => { + // const chunk = readable.read(); + // if (!chunk) return; + this.dmp.put( + '^insert ^into %f (%,i) ^values (%,v);&n', + table, + columnNames, + columnNames.map(col => chunk[col]) + ); + }); + readable.on('end', () => { + resolve(undefined); + }); + }); } extract(objectTypeField) {