backend - using engine driver from plugin

This commit is contained in:
Jan Prochazka
2020-11-24 20:42:02 +01:00
parent 424aff5d93
commit c96cb08cfd
9 changed files with 58 additions and 42 deletions

View File

@@ -1,13 +1,12 @@
const engines = require('dbgate-engines');
const driverConnect = require('../utility/driverConnect');
const childProcessChecker = require('../utility/childProcessChecker'); const childProcessChecker = require('../utility/childProcessChecker');
const requireEngineDriver = require('../utility/requireEngineDriver');
function start() { function start() {
childProcessChecker(); childProcessChecker();
process.on('message', async (connection) => { process.on('message', async (connection) => {
try { try {
const driver = engines(connection); const driver = requireEngineDriver(connection);
const conn = await driverConnect(driver, connection); const conn = await driver.connect(connection);
const res = await driver.getVersion(conn); const res = await driver.getVersion(conn);
process.send({ msgtype: 'connected', ...res }); process.send({ msgtype: 'connected', ...res });
} catch (e) { } catch (e) {

View File

@@ -1,7 +1,6 @@
const engines = require('dbgate-engines');
const stableStringify = require('json-stable-stringify'); const stableStringify = require('json-stable-stringify');
const driverConnect = require('../utility/driverConnect');
const childProcessChecker = require('../utility/childProcessChecker'); const childProcessChecker = require('../utility/childProcessChecker');
const requireEngineDriver = require('../utility/requireEngineDriver');
let systemConnection; let systemConnection;
let storedConnection; let storedConnection;
@@ -26,14 +25,14 @@ async function checkedAsyncCall(promise) {
} }
async function handleFullRefresh() { async function handleFullRefresh() {
const driver = engines(storedConnection); const driver = requireEngineDriver(storedConnection);
analysedStructure = await checkedAsyncCall(driver.analyseFull(systemConnection)); analysedStructure = await checkedAsyncCall(driver.analyseFull(systemConnection));
process.send({ msgtype: 'structure', structure: analysedStructure }); process.send({ msgtype: 'structure', structure: analysedStructure });
setStatusName('ok'); setStatusName('ok');
} }
async function handleIncrementalRefresh() { async function handleIncrementalRefresh() {
const driver = engines(storedConnection); const driver = requireEngineDriver(storedConnection);
const newStructure = await checkedAsyncCall(driver.analyseIncremental(systemConnection, analysedStructure)); const newStructure = await checkedAsyncCall(driver.analyseIncremental(systemConnection, analysedStructure));
if (newStructure != null) { if (newStructure != null) {
analysedStructure = newStructure; analysedStructure = newStructure;
@@ -58,8 +57,8 @@ async function handleConnect({ connection, structure }) {
lastPing = new Date().getTime(); lastPing = new Date().getTime();
if (!structure) setStatusName('pending'); if (!structure) setStatusName('pending');
const driver = engines(storedConnection); const driver = requireEngineDriver(storedConnection);
systemConnection = await checkedAsyncCall(driverConnect(driver, storedConnection)); systemConnection = await checkedAsyncCall(driver.connect(storedConnection));
if (structure) { if (structure) {
analysedStructure = structure; analysedStructure = structure;
handleIncrementalRefresh(); handleIncrementalRefresh();
@@ -82,7 +81,7 @@ function waitConnected() {
async function handleQueryData({ msgid, sql }) { async function handleQueryData({ msgid, sql }) {
await waitConnected(); await waitConnected();
const driver = engines(storedConnection); const driver = requireEngineDriver(storedConnection);
try { try {
const res = await driver.query(systemConnection, sql); const res = await driver.query(systemConnection, sql);
process.send({ msgtype: 'response', msgid, ...res }); process.send({ msgtype: 'response', msgid, ...res });

View File

@@ -1,7 +1,6 @@
const engines = require('dbgate-engines');
const stableStringify = require('json-stable-stringify'); const stableStringify = require('json-stable-stringify');
const driverConnect = require('../utility/driverConnect');
const childProcessChecker = require('../utility/childProcessChecker'); const childProcessChecker = require('../utility/childProcessChecker');
const requireEngineDriver = require('../utility/requireEngineDriver');
let systemConnection; let systemConnection;
let storedConnection; let storedConnection;
@@ -10,7 +9,7 @@ let lastStatus = null;
let lastPing = null; let lastPing = null;
async function handleRefresh() { async function handleRefresh() {
const driver = engines(storedConnection); const driver = requireEngineDriver(storedConnection);
try { try {
const databases = await driver.listDatabases(systemConnection); const databases = await driver.listDatabases(systemConnection);
setStatusName('ok'); setStatusName('ok');
@@ -46,9 +45,9 @@ async function handleConnect(connection) {
setStatusName('pending'); setStatusName('pending');
lastPing = new Date().getTime(); lastPing = new Date().getTime();
const driver = engines(storedConnection); const driver = requireEngineDriver(storedConnection);
try { try {
systemConnection = await driverConnect(driver, storedConnection); systemConnection = await driver.connect(storedConnection);
handleRefresh(); handleRefresh();
setInterval(handleRefresh, 30 * 1000); setInterval(handleRefresh, 30 * 1000);
} catch (err) { } catch (err) {
@@ -66,8 +65,8 @@ function handlePing() {
} }
async function handleCreateDatabase({ name }) { async function handleCreateDatabase({ name }) {
const driver = engines(storedConnection); const driver = requireEngineDriver(storedConnection);
systemConnection = await driverConnect(driver, storedConnection); systemConnection = await driver.connect(storedConnection);
console.log(`RUNNING SCRIPT: CREATE DATABASE ${driver.dialect.quoteIdentifier(name)}`); console.log(`RUNNING SCRIPT: CREATE DATABASE ${driver.dialect.quoteIdentifier(name)}`);
await driver.query(systemConnection, `CREATE DATABASE ${driver.dialect.quoteIdentifier(name)}`); await driver.query(systemConnection, `CREATE DATABASE ${driver.dialect.quoteIdentifier(name)}`);
await handleRefresh(); await handleRefresh();

View File

@@ -1,4 +1,3 @@
const engines = require('dbgate-engines');
const uuidv1 = require('uuid/v1'); const uuidv1 = require('uuid/v1');
const path = require('path'); const path = require('path');
const fs = require('fs'); const fs = require('fs');
@@ -6,8 +5,8 @@ const _ = require('lodash');
const childProcessChecker = require('../utility/childProcessChecker'); const childProcessChecker = require('../utility/childProcessChecker');
const goSplit = require('../utility/goSplit'); const goSplit = require('../utility/goSplit');
const driverConnect = require('../utility/driverConnect');
const { jsldir } = require('../utility/directories'); const { jsldir } = require('../utility/directories');
const requireEngineDriver = require('../utility/requireEngineDriver');
let systemConnection; let systemConnection;
let storedConnection; let storedConnection;
@@ -119,8 +118,8 @@ class StreamHandler {
async function handleConnect(connection) { async function handleConnect(connection) {
storedConnection = connection; storedConnection = connection;
const driver = engines(storedConnection); const driver = requireEngineDriver(storedConnection);
systemConnection = await driverConnect(driver, storedConnection); systemConnection = await driver.connect(storedConnection);
for (const [resolve] of afterConnectCallbacks) { for (const [resolve] of afterConnectCallbacks) {
resolve(); resolve();
} }
@@ -142,7 +141,7 @@ function waitConnected() {
async function handleExecuteQuery({ sql }) { async function handleExecuteQuery({ sql }) {
await waitConnected(); await waitConnected();
const driver = engines(storedConnection); const driver = requireEngineDriver(storedConnection);
let resultIndex = 0; let resultIndex = 0;
for (const sqlItem of goSplit(sql)) { for (const sqlItem of goSplit(sql)) {

View File

@@ -1,12 +1,10 @@
const driverConnect = require('../utility/driverConnect'); const requireEngineDriver = require("../utility/requireEngineDriver");
const engines = require('dbgate-engines');
async function queryReader({ connection, sql }) { async function queryReader({ connection, sql }) {
console.log(`Reading query ${sql}`); console.log(`Reading query ${sql}`);
const driver = engines(connection); const driver = requireEngineDriver(connection);
const pool = await driverConnect(driver, connection); const pool = await driver.connect(connection);
console.log(`Connected.`); console.log(`Connected.`);
return await driver.readQuery(pool, sql); return await driver.readQuery(pool, sql);
} }

View File

@@ -1,11 +1,9 @@
const { quoteFullName } = require('dbgate-tools'); const { quoteFullName } = require('dbgate-tools');
const driverConnect = require('../utility/driverConnect'); const requireEngineDriver = require('../utility/requireEngineDriver');
const engines = require('dbgate-engines');
async function tableReader({ connection, pureName, schemaName }) { async function tableReader({ connection, pureName, schemaName }) {
const driver = engines(connection); const driver = requireEngineDriver(connection);
const pool = await driverConnect(driver, connection); const pool = await driver.connect(connection);
console.log(`Connected.`); console.log(`Connected.`);
const fullName = { pureName, schemaName }; const fullName = { pureName, schemaName };
@@ -14,11 +12,13 @@ async function tableReader({ connection, pureName, schemaName }) {
const query = `select * from ${quoteFullName(driver.dialect, fullName)}`; const query = `select * from ${quoteFullName(driver.dialect, fullName)}`;
if (table) { if (table) {
console.log(`Reading table ${table.pureName}`); console.log(`Reading table ${table.pureName}`);
// @ts-ignore
return await driver.readQuery(pool, query, table); return await driver.readQuery(pool, query, table);
} }
const view = await driver.analyseSingleObject(pool, fullName, 'views'); const view = await driver.analyseSingleObject(pool, fullName, 'views');
if (view) { if (view) {
console.log(`Reading view ${view.pureName}`); console.log(`Reading view ${view.pureName}`);
// @ts-ignore
return await driver.readQuery(pool, query, view); return await driver.readQuery(pool, query, view);
} }

View File

@@ -1,12 +1,10 @@
const driverConnect = require('../utility/driverConnect'); const requireEngineDriver = require("../utility/requireEngineDriver");
const engines = require('dbgate-engines');
async function tableWriter({ connection, schemaName, pureName, ...options }) { async function tableWriter({ connection, schemaName, pureName, ...options }) {
console.log(`Write table ${schemaName}.${pureName}`); console.log(`Write table ${schemaName}.${pureName}`);
const driver = engines(connection); const driver = requireEngineDriver(connection);
const pool = await driverConnect(driver, connection); const pool = await driver.connect(connection);
console.log(`Connected.`); console.log(`Connected.`);
return await driver.writeTable(pool, { schemaName, pureName }, options); return await driver.writeTable(pool, { schemaName, pureName }, options);
} }

View File

@@ -0,0 +1,24 @@
const _ = require('lodash');
const requirePlugin = require('../shell/requirePlugin');
/** @returns {import('dbgate-types').EngineDriver} */
function requireEngineDriver(connection) {
let engine = null;
if (_.isString(connection)) {
engine = connection;
} else if (_.isPlainObject(connection)) {
engine = connection.engine;
}
if (!engine) {
throw new Error('Could not get driver from connection');
}
if (engine.includes('@')) {
const [shortName, packageName] = engine.split('@');
const plugin = requirePlugin(packageName);
return plugin.driver;
}
throw new Error(`Could not found engine driver ${engine}`);
}
module.exports = requireEngineDriver;

View File

@@ -7,9 +7,9 @@ import { DatabaseInfo, NamedObjectInfo, TableInfo, ViewInfo, ProcedureInfo, Func
export interface StreamOptions { export interface StreamOptions {
recordset: (columns) => void; recordset: (columns) => void;
row: (row) => void; row: (row) => void;
error: (error) => void; error?: (error) => void;
done: (result) => void; done?: (result) => void;
info: (info) => void; info?: (info) => void;
} }
export interface WriteTableOptions { export interface WriteTableOptions {
@@ -21,7 +21,7 @@ export interface WriteTableOptions {
export interface EngineDriver { export interface EngineDriver {
engine: string; engine: string;
title: string; title: string;
connect(nativeModules, { server, port, user, password, database }): any; connect({ server, port, user, password, database }): any;
query(pool: any, sql: string): Promise<QueryResult>; query(pool: any, sql: string): Promise<QueryResult>;
stream(pool: any, sql: string, options: StreamOptions); stream(pool: any, sql: string, options: StreamOptions);
readQuery(pool: any, sql: string, structure?: TableInfo): Promise<stream.Readable>; readQuery(pool: any, sql: string, structure?: TableInfo): Promise<stream.Readable>;