diff --git a/plugins/dbgate-plugin-firebird/src/backend/driver.js b/plugins/dbgate-plugin-firebird/src/backend/driver.js index ebec5f431..f6c9a4c56 100644 --- a/plugins/dbgate-plugin-firebird/src/backend/driver.js +++ b/plugins/dbgate-plugin-firebird/src/backend/driver.js @@ -4,7 +4,7 @@ const stream = require('stream'); const driverBase = require('../frontend/driver'); const Analyser = require('./Analyser'); const Firebird = require('node-firebird'); -const { normalizeRow } = require('./helpers'); +const { normalizeRow, createFirebirdInsertStream } = require('./helpers'); const { getLogger, extractErrorLogData, createBulkInsertStreamBase } = require('dbgate-tools'); const sql = require('./sql'); @@ -151,7 +151,7 @@ const driver = { }, async writeTable(dbhan, name, options) { - return createBulkInsertStreamBase(this, stream, dbhan, name, options); + return createFirebirdInsertStream(this, stream, dbhan, name, options); }, async getVersion(dbhan) { diff --git a/plugins/dbgate-plugin-firebird/src/backend/helpers.js b/plugins/dbgate-plugin-firebird/src/backend/helpers.js index ff85f5485..2c53e38a3 100644 --- a/plugins/dbgate-plugin-firebird/src/backend/helpers.js +++ b/plugins/dbgate-plugin-firebird/src/backend/helpers.js @@ -1,3 +1,5 @@ +const { createBulkInsertStreamBase } = require('dbgate-tools'); + function getDataTypeString({ dataTypeCode, scale, length, precision }) { switch (dataTypeCode) { case 7: @@ -127,6 +129,34 @@ async function normalizeRow(row) { return Object.fromEntries(entries); } +function transformRow(row) { + return Object.fromEntries( + Object.entries(row).map(([key, value]) => { + if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$/.test(value)) { + return [key, value.replace('T', ' ')]; + } + return [key, value]; + }) + ); +} + +function createFirebirdInsertStream(driver, stream, dbhan, name, options) { + const writable = createBulkInsertStreamBase(driver, stream, dbhan, name, options); + + writable.addRow = async row => { + const transformedRow = transformRow(row); + + if (writable.structure) { + writable.buffer.push(transformedRow); + } else { + writable.structure = transformedRow; + await writable.checkStructure(); + } + }; + + return writable; +} + module.exports = { getDataTypeString, getTriggerEventType, @@ -135,4 +165,5 @@ module.exports = { getTriggerCreateSql, blobStreamToString, normalizeRow, + createFirebirdInsertStream, };