driver plugins supports more drivers. Added derived drivers for MariaDB, CockroachDB, Amazon Redshift

This commit is contained in:
Jan Prochazka
2021-05-15 08:49:58 +02:00
parent f9545eaf7f
commit c5605d63ca
17 changed files with 62 additions and 31 deletions

View File

@@ -135,8 +135,9 @@ module.exports = {
async authTypes({ engine }) { async authTypes({ engine }) {
const packageName = extractPackageName(engine); const packageName = extractPackageName(engine);
const content = requirePlugin(packageName); const content = requirePlugin(packageName);
if (!content.driver || content.driver.engine != engine || !content.driver.getAuthTypes) return null; const driver = content.drivers.find(x => x.engine == engine);
return content.driver.getAuthTypes() || null; if (!driver || !driver.getAuthTypes) return null;
return driver.getAuthTypes() || null;
}, },
// async _init() { // async _init() {

View File

@@ -15,7 +15,7 @@ function requireEngineDriver(connection) {
if (engine.includes('@')) { if (engine.includes('@')) {
const [shortName, packageName] = engine.split('@'); const [shortName, packageName] = engine.split('@');
const plugin = requirePlugin(packageName); const plugin = requirePlugin(packageName);
return plugin.driver; return plugin.drivers.find(x => x.engine == engine);
} }
throw new Error(`Could not found engine driver ${engine}`); throw new Error(`Could not found engine driver ${engine}`);
} }

View File

@@ -28,7 +28,7 @@
function buildDrivers(plugins) { function buildDrivers(plugins) {
const res = []; const res = [];
for (const { content } of plugins) { for (const { content } of plugins) {
if (content.driver) res.push(content.driver); // if (content.driver) res.push(content.driver);
if (content.drivers) res.push(...content.drivers); if (content.drivers) res.push(...content.drivers);
} }
return res; return res;

View File

@@ -2,5 +2,5 @@ const driver = require('./driver');
module.exports = { module.exports = {
packageName: 'dbgate-plugin-mongo', packageName: 'dbgate-plugin-mongo',
driver, drivers: [driver],
}; };

View File

@@ -2,5 +2,5 @@ import driver from './driver';
export default { export default {
packageName: 'dbgate-plugin-mongo', packageName: 'dbgate-plugin-mongo',
driver, drivers: [driver],
}; };

View File

@@ -2,7 +2,7 @@ const driver = require('./driver');
module.exports = { module.exports = {
packageName: 'dbgate-plugin-mssql', packageName: 'dbgate-plugin-mssql',
driver, drivers: [driver],
initialize(dbgateEnv) { initialize(dbgateEnv) {
driver.initialize(dbgateEnv); driver.initialize(dbgateEnv);
}, },

View File

@@ -1,5 +1,5 @@
import driver from './driver'; import driver from './driver';
export default { export default {
driver, drivers: [driver],
}; };

View File

@@ -1,6 +1,6 @@
const _ = require('lodash'); const _ = require('lodash');
const stream = require('stream'); const stream = require('stream');
const driverBase = require('../frontend/driver'); const driverBases = require('../frontend/drivers');
const Analyser = require('./Analyser'); const Analyser = require('./Analyser');
const mysql2 = require('mysql2'); const mysql2 = require('mysql2');
const { createBulkInsertStreamBase, makeUniqueColumnNames } = require('dbgate-tools'); const { createBulkInsertStreamBase, makeUniqueColumnNames } = require('dbgate-tools');
@@ -90,7 +90,7 @@ async function runStreamItem(connection, sql, options) {
} }
/** @type {import('dbgate-types').EngineDriver} */ /** @type {import('dbgate-types').EngineDriver} */
const driver = { const drivers = driverBases.map(driverBase => ({
...driverBase, ...driverBase,
analyserClass: Analyser, analyserClass: Analyser,
@@ -184,6 +184,6 @@ const driver = {
// @ts-ignore // @ts-ignore
return createBulkInsertStreamBase(this, stream, pool, name, options); return createBulkInsertStreamBase(this, stream, pool, name, options);
}, },
}; }));
module.exports = driver; module.exports = drivers;

View File

@@ -1,6 +1,6 @@
const driver = require('./driver'); const drivers = require('./drivers');
module.exports = { module.exports = {
packageName: 'dbgate-plugin-mysql', packageName: 'dbgate-plugin-mysql',
driver, drivers,
}; };

View File

@@ -15,13 +15,23 @@ const dialect = {
}; };
/** @type {import('dbgate-types').EngineDriver} */ /** @type {import('dbgate-types').EngineDriver} */
const driver = { const mysqlDriver = {
...driverBase, ...driverBase,
dumperClass: Dumper, dumperClass: Dumper,
dialect, dialect,
engine: 'mysql@dbgate-plugin-mysql', engine: 'mysql@dbgate-plugin-mysql',
title: 'MySQL / MariaDB', title: 'MySQL',
defaultPort: 3306, defaultPort: 3306,
}; };
module.exports = driver; /** @type {import('dbgate-types').EngineDriver} */
const mariaDriver = {
...driverBase,
dumperClass: Dumper,
dialect,
engine: 'mariadb@dbgate-plugin-mysql',
title: 'MariaDB',
defaultPort: 3306,
};
module.exports = [mysqlDriver, mariaDriver];

View File

@@ -1,6 +1,6 @@
import driver from './driver'; import drivers from './drivers';
export default { export default {
packageName: 'dbgate-plugin-mysql', packageName: 'dbgate-plugin-mysql',
driver, drivers,
}; };

View File

@@ -2,7 +2,7 @@ const _ = require('lodash');
const stream = require('stream'); const stream = require('stream');
const { identify } = require('sql-query-identifier'); const { identify } = require('sql-query-identifier');
const driverBase = require('../frontend/driver'); const driverBases = require('../frontend/drivers');
const Analyser = require('./Analyser'); const Analyser = require('./Analyser');
const pg = require('pg'); const pg = require('pg');
const pgQueryStream = require('pg-query-stream'); const pgQueryStream = require('pg-query-stream');
@@ -93,7 +93,7 @@ async function runStreamItem(client, sql, options) {
} }
/** @type {import('dbgate-types').EngineDriver} */ /** @type {import('dbgate-types').EngineDriver} */
const driver = { const drivers = driverBases.map(driverBase => ({
...driverBase, ...driverBase,
analyserClass: Analyser, analyserClass: Analyser,
@@ -220,6 +220,6 @@ const driver = {
const { rows } = await this.query(client, 'SELECT datname AS name FROM pg_database WHERE datistemplate = false'); const { rows } = await this.query(client, 'SELECT datname AS name FROM pg_database WHERE datistemplate = false');
return rows; return rows;
}, },
}; }));
module.exports = driver; module.exports = drivers;

View File

@@ -1,6 +1,6 @@
const driver = require('./driver'); const drivers = require('./drivers');
module.exports = { module.exports = {
packageName: 'dbgate-plugin-postgres', packageName: 'dbgate-plugin-postgres',
driver, drivers,
}; };

View File

@@ -15,7 +15,7 @@ const dialect = {
}; };
/** @type {import('dbgate-types').EngineDriver} */ /** @type {import('dbgate-types').EngineDriver} */
const driver = { const postgresDriver = {
...driverBase, ...driverBase,
dumperClass: Dumper, dumperClass: Dumper,
dialect, dialect,
@@ -24,4 +24,24 @@ const driver = {
defaultPort: 5432, defaultPort: 5432,
}; };
module.exports = driver; /** @type {import('dbgate-types').EngineDriver} */
const cockroachDriver = {
...driverBase,
dumperClass: Dumper,
dialect,
engine: 'cockroach@dbgate-plugin-postgres',
title: 'CockroachDB',
defaultPort: 26257,
};
/** @type {import('dbgate-types').EngineDriver} */
const redshiftDriver = {
...driverBase,
dumperClass: Dumper,
dialect,
engine: 'red@dbgate-plugin-postgres',
title: 'Amazon Redshift',
defaultPort: 5432,
};
module.exports = [postgresDriver, cockroachDriver, redshiftDriver];

View File

@@ -1,6 +1,6 @@
import driver from './driver'; import drivers from './drivers';
export default { export default {
packageName: 'dbgate-plugin-postgres', packageName: 'dbgate-plugin-postgres',
driver, drivers,
}; };

View File

@@ -2,7 +2,7 @@ const driver = require('./driver');
module.exports = { module.exports = {
packageName: 'dbgate-plugin-sqlite', packageName: 'dbgate-plugin-sqlite',
driver, drivers: [driver],
initialize(dbgateEnv) { initialize(dbgateEnv) {
driver.initialize(dbgateEnv); driver.initialize(dbgateEnv);
}, },

View File

@@ -2,5 +2,5 @@ import driver from './driver';
export default { export default {
packageName: 'dbgate-plugin-sqlite', packageName: 'dbgate-plugin-sqlite',
driver, drivers: [driver],
}; };