diff --git a/packages/api/src/shell/importDatabase.js b/packages/api/src/shell/importDatabase.js index b59f9d4b9..84d7b6e8c 100644 --- a/packages/api/src/shell/importDatabase.js +++ b/packages/api/src/shell/importDatabase.js @@ -16,7 +16,7 @@ class ImportStream extends stream.Transform { } async _transform(chunk, encoding, cb) { try { - await this.driver.script(this.pool, chunk); + await this.driver.script(this.pool, chunk, { queryOptions: { importSqlDump: true } }); } catch (err) { this.emit('error', err.message); } @@ -47,7 +47,9 @@ async function importDatabase({ connection = undefined, systemConnection = undef const pool = systemConnection || (await connectUtility(driver, connection, 'write')); logger.info(`Connected.`); + logger.info(`Input file: ${inputFile}`); const downloadedFile = await download(inputFile); + logger.info(`Downloaded file: ${downloadedFile}`); const fileStream = fs.createReadStream(downloadedFile, 'utf-8'); const splittedStream = splitQueryStream(fileStream, driver.getQuerySplitterOptions('script')); diff --git a/packages/api/src/shell/runScript.js b/packages/api/src/shell/runScript.js index 5ce4c1a80..0b90f12d8 100644 --- a/packages/api/src/shell/runScript.js +++ b/packages/api/src/shell/runScript.js @@ -11,7 +11,7 @@ async function runScript(func) { await func(); process.exit(0); } catch (err) { - logger.error({ err }, `Error running script: ${err.message}`); + logger.error({ err }, `Error running script: ${err.message || err}`); process.exit(1); } } diff --git a/packages/tools/src/driverBase.ts b/packages/tools/src/driverBase.ts index f3d892c73..f7c0bac18 100644 --- a/packages/tools/src/driverBase.ts +++ b/packages/tools/src/driverBase.ts @@ -71,7 +71,7 @@ export const driverBase = { } for (const sqlItem of splitQuery(sql, this.getQuerySplitterOptions('script'))) { try { - await this.query(pool, sqlItem, { discardResult: true }); + await this.query(pool, sqlItem, { discardResult: true, ...options?.queryOptions }); } catch (err) { if (options?.useTransaction && this.supportsTransactions) { runCommandOnDriver(pool, this, dmp => dmp.rollbackTransaction()); diff --git a/packages/types/engines.d.ts b/packages/types/engines.d.ts index f100858b7..93ed005a9 100644 --- a/packages/types/engines.d.ts +++ b/packages/types/engines.d.ts @@ -25,10 +25,12 @@ export interface StreamOptions { export interface RunScriptOptions { useTransaction: boolean; + queryOptions?: QueryOptions; } export interface QueryOptions { discardResult?: boolean; + importSqlDump?: boolean; } export interface WriteTableOptions { diff --git a/plugins/dbgate-plugin-mysql/src/backend/drivers.js b/plugins/dbgate-plugin-mysql/src/backend/drivers.js index 7aee2984d..6dfcd846d 100644 --- a/plugins/dbgate-plugin-mysql/src/backend/drivers.js +++ b/plugins/dbgate-plugin-mysql/src/backend/drivers.js @@ -60,7 +60,7 @@ const drivers = driverBases.map(driverBase => ({ async close(dbhan) { return dbhan.client.close(); }, - query(dbhan, sql) { + query(dbhan, sql, options) { if (sql == null) { return { rows: [], @@ -68,6 +68,14 @@ const drivers = driverBases.map(driverBase => ({ }; } + if (options?.importSqlDump && sql.trim().startsWith('/*!') && sql.includes('character_set_client')) { + // skip this in SQL dumps + return { + rows: [], + columns: [], + }; + } + return new Promise((resolve, reject) => { dbhan.client.query(sql, function (error, results, fields) { if (error) reject(error);