From f4fbb2812430f82ca9cf4033acfd91d44a242cea Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sat, 1 Jun 2024 16:28:46 +0200 Subject: [PATCH] oracle: bulk inserter --- .../backend/createOracleBulkInsertStream.js | 38 +++++++++++++++++++ .../src/backend/drivers.js | 4 +- 2 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 plugins/dbgate-plugin-oracle/src/backend/createOracleBulkInsertStream.js diff --git a/plugins/dbgate-plugin-oracle/src/backend/createOracleBulkInsertStream.js b/plugins/dbgate-plugin-oracle/src/backend/createOracleBulkInsertStream.js new file mode 100644 index 000000000..188761861 --- /dev/null +++ b/plugins/dbgate-plugin-oracle/src/backend/createOracleBulkInsertStream.js @@ -0,0 +1,38 @@ +const { createBulkInsertStreamBase } = require('dbgate-tools'); +const _ = require('lodash'); + +/** + * + * @param {import('dbgate-types').EngineDriver} driver + */ +function createOracleBulkInsertStream(driver, stream, pool, name, options) { + const fullNameQuoted = name.schemaName + ? `${driver.dialect.quoteIdentifier(name.schemaName)}.${driver.dialect.quoteIdentifier(name.pureName)}` + : driver.dialect.quoteIdentifier(name.pureName); + + const writable = createBulkInsertStreamBase(driver, stream, pool, name, { + ...options, + // this is really not used, send method below is used instead + commitAfterInsert: true, + }); + + writable.send = async () => { + const dmp = driver.createDumper(); + dmp.putRaw(`INSERT INTO ${fullNameQuoted} (`); + dmp.putCollection(',', writable.columnNames, col => dmp.putRaw(driver.dialect.quoteIdentifier(col))); + dmp.putRaw(')\n VALUES (\n'); + dmp.put( + '%,s', + writable.columnNames.map((c, i) => `:C${i}`) + ); + dmp.putRaw(')'); + + const rows = writable.buffer.map(row => _.mapKeys(row, (v, k) => `c${writable.columnNames.indexOf(k)}`)); + await pool.executeMany(dmp.s, rows, { autoCommit: true }); + writable.buffer = []; + }; + + return writable; +} + +module.exports = createOracleBulkInsertStream; diff --git a/plugins/dbgate-plugin-oracle/src/backend/drivers.js b/plugins/dbgate-plugin-oracle/src/backend/drivers.js index 02eed9dfd..d9f7b897f 100644 --- a/plugins/dbgate-plugin-oracle/src/backend/drivers.js +++ b/plugins/dbgate-plugin-oracle/src/backend/drivers.js @@ -6,6 +6,7 @@ const Analyser = require('./Analyser'); //--const pg = require('pg'); const oracledb = require('oracledb'); const { createBulkInsertStreamBase, makeUniqueColumnNames } = require('dbgate-tools'); +const createOracleBulkInsertStream = require('./createOracleBulkInsertStream'); /* pg.types.setTypeParser(1082, 'text', val => val); // date @@ -288,8 +289,7 @@ const drivers = driverBases.map(driverBase => ({ return pass; }, async writeTable(pool, name, options) { - // @ts-ignore - return createBulkInsertStreamBase(this, stream, pool, name, { ...options, commitAfterInsert: true }); + return createOracleBulkInsertStream(this, stream, pool, name, options); }, async listDatabases(client) { const { rows } = await this.query(client, 'SELECT username as "name" from all_users order by username');