sql generator - generates SQL inserts

This commit is contained in:
Jan Prochazka
2021-03-27 20:39:27 +01:00
parent 9d84c0f213
commit bb41236a5f
4 changed files with 37 additions and 24 deletions

View File

@@ -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;
},
};

View File

@@ -26,7 +26,6 @@ const uploads = require('./controllers/uploads');
const plugins = require('./controllers/plugins'); const plugins = require('./controllers/plugins');
const files = require('./controllers/files'); const files = require('./controllers/files');
const scheduler = require('./controllers/scheduler'); const scheduler = require('./controllers/scheduler');
const sqlgen = require('./controllers/sqlgen');
const { rundir } = require('./utility/directories'); const { rundir } = require('./utility/directories');
@@ -73,7 +72,6 @@ function start(argument = null) {
useController(app, '/plugins', plugins); useController(app, '/plugins', plugins);
useController(app, '/files', files); useController(app, '/files', files);
useController(app, '/scheduler', scheduler); useController(app, '/scheduler', scheduler);
useController(app, '/sqlgen', sqlgen);
// if (process.env.PAGES_DIRECTORY) { // if (process.env.PAGES_DIRECTORY) {
// app.use('/pages', express.static(process.env.PAGES_DIRECTORY)); // app.use('/pages', express.static(process.env.PAGES_DIRECTORY));

View File

@@ -100,7 +100,7 @@ async function handleSqlPreview({ msgid, objects, options }) {
const driver = requireEngineDriver(storedConnection); const driver = requireEngineDriver(storedConnection);
const dmp = driver.createDumper(); 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(); await generator.dump();
process.send({ msgtype: 'response', msgid, sql: dmp.s }); process.send({ msgtype: 'response', msgid, sql: dmp.s });
} }

View File

@@ -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'; import { SqlDumper } from './SqlDumper';
interface SqlGeneratorOptions { interface SqlGeneratorOptions {
@@ -31,7 +31,9 @@ export class SqlGenerator {
public dbinfo: DatabaseInfo, public dbinfo: DatabaseInfo,
public options: SqlGeneratorOptions, public options: SqlGeneratorOptions,
public objects: SqlGeneratorObject[], public objects: SqlGeneratorObject[],
public dmp: SqlDumper public dmp: SqlDumper,
public driver: EngineDriver,
public pool
) { ) {
this.tables = this.extract('tables'); this.tables = this.extract('tables');
this.views = this.extract('views'); this.views = this.extract('views');
@@ -50,6 +52,38 @@ export class SqlGenerator {
if (this.checkDumper()) return; 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) { extract(objectTypeField) {