diff --git a/packages/api/src/shell/copyStream.js b/packages/api/src/shell/copyStream.js index edf9bbe52..6a3a6848b 100644 --- a/packages/api/src/shell/copyStream.js +++ b/packages/api/src/shell/copyStream.js @@ -1,7 +1,7 @@ const EnsureStreamHeaderStream = require('../utility/EnsureStreamHeaderStream'); const ColumnMapTransformStream = require('../utility/ColumnMapTransformStream'); const streamPipeline = require('../utility/streamPipeline'); -const { getLogger, extractErrorLogData, RowProgressReporter } = require('dbgate-tools'); +const { getLogger, extractErrorLogData, RowProgressReporter, extractErrorMessage } = require('dbgate-tools'); const logger = getLogger('copyStream'); const stream = require('stream'); @@ -66,7 +66,7 @@ async function copyStream(input, output, options) { process.send({ msgtype: 'copyStreamError', copyStreamError: { - message: err.message, + message: extractErrorMessage(err), ...err, }, }); @@ -76,7 +76,7 @@ async function copyStream(input, output, options) { msgtype: 'progress', progressName, status: 'error', - errorMessage: err.message, + errorMessage: extractErrorMessage(err), }); } diff --git a/packages/api/src/shell/tableWriter.js b/packages/api/src/shell/tableWriter.js index bb986d5fc..b577b33a4 100644 --- a/packages/api/src/shell/tableWriter.js +++ b/packages/api/src/shell/tableWriter.js @@ -15,6 +15,7 @@ const logger = getLogger('tableWriter'); * @param {boolean} options.truncate - truncate table before insert * @param {boolean} options.createIfNotExists - create table if not exists * @param {boolean} options.commitAfterInsert - commit transaction after insert + * @param {string} options.progressName - name for reporting progress * @param {any} options.targetTableStructure - target table structure (don't analyse if given) * @returns {Promise} - writer object */ @@ -26,7 +27,20 @@ async function tableWriter({ connection, schemaName, pureName, driver, systemCon } const dbhan = systemConnection || (await connectUtility(driver, connection, 'write')); - return await driver.writeTable(dbhan, { schemaName, pureName }, options); + try { + return await driver.writeTable(dbhan, { schemaName, pureName }, options); + } catch (err) { + if (options.progressName) { + process.send({ + msgtype: 'progress', + progressName: options.progressName, + status: 'error', + errorMessage: err.message, + }); + } + + throw err; + } } module.exports = tableWriter; diff --git a/packages/web/src/impexp/ImportExportConfigurator.svelte b/packages/web/src/impexp/ImportExportConfigurator.svelte index 1c9f5619f..142cf875d 100644 --- a/packages/web/src/impexp/ImportExportConfigurator.svelte +++ b/packages/web/src/impexp/ImportExportConfigurator.svelte @@ -82,6 +82,7 @@ // export let openedFile = undefined; export let previewReaderStore; export let isTabActive; + export let isRunning = false; const { values, setFieldValue } = getFormContext(); @@ -305,7 +306,7 @@ - {#if progressHolder[row]?.status == 'running'} + {#if progressHolder[row]?.status == 'running' && isRunning} {#if progressHolder[row]?.writtenRowCount} {progressHolder[row]?.writtenRowCount} rows writtem @@ -334,7 +335,14 @@ Done {/if} {:else} - Queued + + {#if progressHolder[row]?.writtenRowCount} + {progressHolder[row]?.writtenRowCount} rows writtem + {:else if progressHolder[row]?.readRowCount} + {progressHolder[row]?.readRowCount} rows read + {:else} + Queued + {/if} {/if} diff --git a/packages/web/src/tabs/ImportExportTab.svelte b/packages/web/src/tabs/ImportExportTab.svelte index ab027d607..47ef6ac40 100644 --- a/packages/web/src/tabs/ImportExportTab.svelte +++ b/packages/web/src/tabs/ImportExportTab.svelte @@ -264,6 +264,7 @@ {previewReaderStore} {progressHolder} isTabActive={tabid == $activeTabId} + isRunning={busy} /> {#if busy} diff --git a/plugins/dbgate-plugin-mssql/src/backend/createTediousBulkInsertStream.js b/plugins/dbgate-plugin-mssql/src/backend/createTediousBulkInsertStream.js index 878579262..c0d6208ed 100644 --- a/plugins/dbgate-plugin-mssql/src/backend/createTediousBulkInsertStream.js +++ b/plugins/dbgate-plugin-mssql/src/backend/createTediousBulkInsertStream.js @@ -1,14 +1,15 @@ -const { createBulkInsertStreamBase } = global.DBGATE_PACKAGES['dbgate-tools']; +const { createBulkInsertStreamBase, getLogger, extractErrorLogData } = global.DBGATE_PACKAGES['dbgate-tools']; const tedious = require('tedious'); const getConcreteType = require('./getConcreteType'); const _ = require('lodash'); +const logger = getLogger('tediousBulkInsertStream'); function runBulkInsertBatch(dbhan, tableName, writable, rows) { return new Promise((resolve, reject) => { - var options = { keepNulls: true }; + const options = { keepNulls: true }; // instantiate - provide the table where you'll be inserting to, options and a callback - var bulkLoad = dbhan.client.newBulkLoad(tableName, options, (error, rowCount) => { + const bulkLoad = dbhan.client.newBulkLoad(tableName, options, (error, rowCount) => { if (error) reject(error); else resolve(); }); @@ -68,7 +69,13 @@ function createTediousBulkInsertStream(driver, stream, dbhan, name, options) { const rows = writable.buffer; writable.buffer = []; - await runBulkInsertBatch(dbhan, fullName, writable, rows); + try { + await runBulkInsertBatch(dbhan, fullName, writable, rows); + } catch (err) { + logger.error(extractErrorLogData(err), 'Error during bulk insert, insert stopped'); + // writable.emit('error', err); + writable.destroy(err); + } }; return writable;