better error reporting

This commit is contained in:
SPRINX0\prochazka
2024-10-01 12:15:22 +02:00
parent 29a66bfcb0
commit ef23b786ac
23 changed files with 99 additions and 69 deletions

View File

@@ -6,7 +6,7 @@ const { archivedir, clearArchiveLinksCache, resolveArchiveFolder } = require('..
const socket = require('../utility/socket'); const socket = require('../utility/socket');
const loadFilesRecursive = require('../utility/loadFilesRecursive'); const loadFilesRecursive = require('../utility/loadFilesRecursive');
const getJslFileName = require('../utility/getJslFileName'); const getJslFileName = require('../utility/getJslFileName');
const { getLogger } = require('dbgate-tools'); const { getLogger, extractErrorLogData } = require('dbgate-tools');
const dbgateApi = require('../shell'); const dbgateApi = require('../shell');
const jsldata = require('./jsldata'); const jsldata = require('./jsldata');
const platformInfo = require('../utility/platformInfo'); const platformInfo = require('../utility/platformInfo');
@@ -74,7 +74,7 @@ module.exports = {
...fileType('.matview.sql', 'matview.sql'), ...fileType('.matview.sql', 'matview.sql'),
]; ];
} catch (err) { } catch (err) {
logger.error({ err }, 'Error reading archive files'); logger.error(extractErrorLogData(err), 'Error reading archive files');
return []; return [];
} }
}, },

View File

@@ -1,7 +1,7 @@
const axios = require('axios'); const axios = require('axios');
const jwt = require('jsonwebtoken'); const jwt = require('jsonwebtoken');
const getExpressPath = require('../utility/getExpressPath'); const getExpressPath = require('../utility/getExpressPath');
const { getLogger } = require('dbgate-tools'); const { getLogger, extractErrorLogData } = require('dbgate-tools');
const AD = require('activedirectory2').promiseWrapper; const AD = require('activedirectory2').promiseWrapper;
const crypto = require('crypto'); const crypto = require('crypto');
const { getTokenSecret, getTokenLifetime } = require('../auth/authCommon'); const { getTokenSecret, getTokenLifetime } = require('../auth/authCommon');
@@ -71,7 +71,7 @@ function authMiddleware(req, res, next) {
return next(); return next();
} }
logger.error({ err }, 'Sending invalid token error'); logger.error(extractErrorLogData(err), 'Sending invalid token error');
return unauthorizedResponse(req, res, 'invalid token'); return unauthorizedResponse(req, res, 'invalid token');
} }

View File

@@ -12,7 +12,7 @@ const { pickSafeConnectionInfo } = require('../utility/crypting');
const JsonLinesDatabase = require('../utility/JsonLinesDatabase'); const JsonLinesDatabase = require('../utility/JsonLinesDatabase');
const processArgs = require('../utility/processArgs'); const processArgs = require('../utility/processArgs');
const { safeJsonParse, getLogger } = require('dbgate-tools'); const { safeJsonParse, getLogger, extractErrorLogData } = require('dbgate-tools');
const platformInfo = require('../utility/platformInfo'); const platformInfo = require('../utility/platformInfo');
const { connectionHasPermission, testConnectionPermission } = require('../utility/hasPermission'); const { connectionHasPermission, testConnectionPermission } = require('../utility/hasPermission');
const pipeForkLogs = require('../utility/pipeForkLogs'); const pipeForkLogs = require('../utility/pipeForkLogs');
@@ -430,7 +430,7 @@ module.exports = {
socket.emit('got-volatile-token', { strmid, savedConId: conid, volatileConId: volatile._id }); socket.emit('got-volatile-token', { strmid, savedConId: conid, volatileConId: volatile._id });
return { success: true }; return { success: true };
} catch (err) { } catch (err) {
logger.error({ err }, 'Error getting DB token'); logger.error(extractErrorLogData(err), 'Error getting DB token');
return { error: err.message }; return { error: err.message };
} }
}, },
@@ -446,7 +446,7 @@ module.exports = {
const resp = await authProvider.login(null, null, { conid: volatile._id }); const resp = await authProvider.login(null, null, { conid: volatile._id });
return resp; return resp;
} catch (err) { } catch (err) {
logger.error({ err }, 'Error getting DB token'); logger.error(extractErrorLogData(err), 'Error getting DB token');
return { error: err.message }; return { error: err.message };
} }
}, },

View File

@@ -12,6 +12,7 @@ const {
extendDatabaseInfo, extendDatabaseInfo,
modelCompareDbDiffOptions, modelCompareDbDiffOptions,
getLogger, getLogger,
extractErrorLogData,
} = require('dbgate-tools'); } = require('dbgate-tools');
const { html, parse } = require('diff2html'); const { html, parse } = require('diff2html');
const { handleProcessCommunication } = require('../utility/processComm'); const { handleProcessCommunication } = require('../utility/processComm');
@@ -146,7 +147,7 @@ module.exports = {
try { try {
conn.subprocess.send({ msgid, ...message }); conn.subprocess.send({ msgid, ...message });
} catch (err) { } catch (err) {
logger.error({ err }, 'Error sending request do process'); logger.error(extractErrorLogData(err), 'Error sending request do process');
this.close(conn.conid, conn.database); this.close(conn.conid, conn.database);
} }
}); });
@@ -318,7 +319,7 @@ module.exports = {
try { try {
existing.subprocess.send({ msgtype: 'ping' }); existing.subprocess.send({ msgtype: 'ping' });
} catch (err) { } catch (err) {
logger.error({ err }, 'Error pinging DB connection'); logger.error(extractErrorLogData(err), 'Error pinging DB connection');
this.close(conid, database); this.close(conid, database);
return { return {
@@ -362,7 +363,7 @@ module.exports = {
try { try {
existing.subprocess.kill(); existing.subprocess.kill();
} catch (err) { } catch (err) {
logger.error({ err }, 'Error killing subprocess'); logger.error(extractErrorLogData(err), 'Error killing subprocess');
} }
} }
this.opened = this.opened.filter(x => x.conid != conid || x.database != database); this.opened = this.opened.filter(x => x.conid != conid || x.database != database);

View File

@@ -11,7 +11,7 @@ const processArgs = require('../utility/processArgs');
const { testConnectionPermission } = require('../utility/hasPermission'); const { testConnectionPermission } = require('../utility/hasPermission');
const { MissingCredentialsError } = require('../utility/exceptions'); const { MissingCredentialsError } = require('../utility/exceptions');
const pipeForkLogs = require('../utility/pipeForkLogs'); const pipeForkLogs = require('../utility/pipeForkLogs');
const { getLogger } = require('dbgate-tools'); const { getLogger, extractErrorLogData } = require('dbgate-tools');
const logger = getLogger('serverConnection'); const logger = getLogger('serverConnection');
@@ -112,7 +112,7 @@ module.exports = {
try { try {
existing.subprocess.kill(); existing.subprocess.kill();
} catch (err) { } catch (err) {
logger.error({ err }, 'Error killing subprocess'); logger.error(extractErrorLogData(err), 'Error killing subprocess');
} }
} }
this.opened = this.opened.filter(x => x.conid != conid); this.opened = this.opened.filter(x => x.conid != conid);
@@ -167,7 +167,7 @@ module.exports = {
try { try {
opened.subprocess.send({ msgtype: 'ping' }); opened.subprocess.send({ msgtype: 'ping' });
} catch (err) { } catch (err) {
logger.error({ err }, 'Error pinging server connection'); logger.error(extractErrorLogData(err), 'Error pinging server connection');
this.close(conid); this.close(conid);
} }
}) })
@@ -217,7 +217,7 @@ module.exports = {
try { try {
conn.subprocess.send({ msgid, ...message }); conn.subprocess.send({ msgid, ...message });
} catch (err) { } catch (err) {
logger.error({ err }, 'Error sending request'); logger.error(extractErrorLogData(err), 'Error sending request');
this.close(conn.conid); this.close(conn.conid);
} }
}); });

View File

@@ -8,7 +8,7 @@ const path = require('path');
const { handleProcessCommunication } = require('../utility/processComm'); const { handleProcessCommunication } = require('../utility/processComm');
const processArgs = require('../utility/processArgs'); const processArgs = require('../utility/processArgs');
const { appdir } = require('../utility/directories'); const { appdir } = require('../utility/directories');
const { getLogger } = require('dbgate-tools'); const { getLogger, extractErrorLogData } = require('dbgate-tools');
const pipeForkLogs = require('../utility/pipeForkLogs'); const pipeForkLogs = require('../utility/pipeForkLogs');
const config = require('./config'); const config = require('./config');
@@ -222,7 +222,7 @@ module.exports = {
try { try {
session.subprocess.send({ msgtype: 'ping' }); session.subprocess.send({ msgtype: 'ping' });
} catch (err) { } catch (err) {
logger.error({ err }, 'Error pinging session'); logger.error(extractErrorLogData(err), 'Error pinging session');
return { return {
status: 'error', status: 'error',

View File

@@ -1,7 +1,7 @@
const crypto = require('crypto'); const crypto = require('crypto');
const path = require('path'); const path = require('path');
const { uploadsdir, getLogsFilePath } = require('../utility/directories'); const { uploadsdir, getLogsFilePath } = require('../utility/directories');
const { getLogger } = require('dbgate-tools'); const { getLogger, extractErrorLogData } = require('dbgate-tools');
const logger = getLogger('uploads'); const logger = getLogger('uploads');
const axios = require('axios'); const axios = require('axios');
const os = require('os'); const os = require('os');
@@ -110,7 +110,7 @@ module.exports = {
return response.data; return response.data;
} catch (err) { } catch (err) {
logger.error({ err }, 'Error uploading gist'); logger.error(extractErrorLogData(err), 'Error uploading gist');
return { return {
apiErrorMessage: err.message, apiErrorMessage: err.message,

View File

@@ -7,6 +7,8 @@ const {
getLogger, getLogger,
isCompositeDbName, isCompositeDbName,
dbNameLogCategory, dbNameLogCategory,
extractErrorMessage,
extractErrorLogData,
} = require('dbgate-tools'); } = require('dbgate-tools');
const requireEngineDriver = require('../utility/requireEngineDriver'); const requireEngineDriver = require('../utility/requireEngineDriver');
const connectUtility = require('../utility/connectUtility'); const connectUtility = require('../utility/connectUtility');
@@ -34,25 +36,6 @@ function getStatusCounter() {
return statusCounter; return statusCounter;
} }
function extractErrorMessage(err, defaultMessage) {
if (!err) {
return defaultMessage;
}
if (err.errors) {
try {
return err.errors.map(x => x.message).join('\n');
} catch (e2) {}
}
if (err.message) {
return err.message;
}
const s = `${err}`;
if (s && (!s.endsWith('Error') || s.includes(' '))) {
return s;
}
return defaultMessage;
}
async function checkedAsyncCall(promise) { async function checkedAsyncCall(promise) {
try { try {
const res = await promise; const res = await promise;
@@ -261,7 +244,7 @@ async function handleDriverDataCore(msgid, callMethod, { logName }) {
const result = await callMethod(driver); const result = await callMethod(driver);
process.send({ msgtype: 'response', msgid, result }); process.send({ msgtype: 'response', msgid, result });
} catch (err) { } catch (err) {
logger.error(err, `Error when handling message ${logName}`); logger.error(extractErrorLogData(err, { logName }), `Error when handling message ${logName}`);
process.send({ msgtype: 'response', msgid, errorMessage: extractErrorMessage(err, 'Error executing DB data') }); process.send({ msgtype: 'response', msgid, errorMessage: extractErrorMessage(err, 'Error executing DB data') });
} }
} }
@@ -436,7 +419,7 @@ function start() {
try { try {
await handleMessage(message); await handleMessage(message);
} catch (err) { } catch (err) {
logger.error({ err }, 'Error in DB connection'); logger.error(extractErrorLogData(err), 'Error in DB connection');
process.send({ msgtype: 'error', error: extractErrorMessage(err, 'Error processing message') }); process.send({ msgtype: 'error', error: extractErrorMessage(err, 'Error processing message') });
} }
}); });

View File

@@ -3,7 +3,7 @@ const platformInfo = require('../utility/platformInfo');
const childProcessChecker = require('../utility/childProcessChecker'); const childProcessChecker = require('../utility/childProcessChecker');
const { handleProcessCommunication } = require('../utility/processComm'); const { handleProcessCommunication } = require('../utility/processComm');
const { SSHConnection } = require('../utility/SSHConnection'); const { SSHConnection } = require('../utility/SSHConnection');
const { getLogger } = require('dbgate-tools'); const { getLogger, extractErrorLogData } = require('dbgate-tools');
const logger = getLogger('sshProcess'); const logger = getLogger('sshProcess');
@@ -40,7 +40,7 @@ async function handleStart({ connection, tunnelConfig }) {
tunnelConfig, tunnelConfig,
}); });
} catch (err) { } catch (err) {
logger.error({ err }, 'Error creating SSH tunnel connection:'); logger.error(extractErrorLogData(err), 'Error creating SSH tunnel connection:');
process.send({ process.send({
msgtype: 'error', msgtype: 'error',

View File

@@ -1,4 +1,4 @@
const { getLogger } = require('dbgate-tools'); const { getLogger, extractErrorLogData } = require('dbgate-tools');
const childProcessChecker = require('../utility/childProcessChecker'); const childProcessChecker = require('../utility/childProcessChecker');
const processArgs = require('../utility/processArgs'); const processArgs = require('../utility/processArgs');
const logger = getLogger(); const logger = getLogger();
@@ -11,7 +11,7 @@ async function runScript(func) {
await func(); await func();
process.exit(0); process.exit(0);
} catch (err) { } catch (err) {
logger.error({ err }, `Error running script: ${err.message || err}`); logger.error(extractErrorLogData(err), `Error running script`);
process.exit(1); process.exit(1);
} }
} }

View File

@@ -3,7 +3,7 @@ const { fork } = require('child_process');
const { handleProcessCommunication } = require('./processComm'); const { handleProcessCommunication } = require('./processComm');
const processArgs = require('../utility/processArgs'); const processArgs = require('../utility/processArgs');
const pipeForkLogs = require('./pipeForkLogs'); const pipeForkLogs = require('./pipeForkLogs');
const { getLogger } = require('dbgate-tools'); const { getLogger, extractErrorLogData } = require('dbgate-tools');
const logger = getLogger('DatastoreProxy'); const logger = getLogger('DatastoreProxy');
class DatastoreProxy { class DatastoreProxy {
@@ -73,7 +73,7 @@ class DatastoreProxy {
try { try {
this.subprocess.send({ msgtype: 'read', msgid, offset, limit }); this.subprocess.send({ msgtype: 'read', msgid, offset, limit });
} catch (err) { } catch (err) {
logger.error({ err }, 'Error getting rows'); logger.error(extractErrorLogData(err), 'Error getting rows');
this.subprocess = null; this.subprocess = null;
} }
}); });
@@ -87,7 +87,7 @@ class DatastoreProxy {
try { try {
this.subprocess.send({ msgtype: 'notify', msgid }); this.subprocess.send({ msgtype: 'notify', msgid });
} catch (err) { } catch (err) {
logger.error({ err }, 'Error notifying subprocess'); logger.error(extractErrorLogData(err), 'Error notifying subprocess');
this.subprocess = null; this.subprocess = null;
} }
}); });

View File

@@ -1,4 +1,4 @@
const { getLogger } = require('dbgate-tools'); const { getLogger, extractErrorLogData } = require('dbgate-tools');
const logger = getLogger('childProcessChecked'); const logger = getLogger('childProcessChecked');
@@ -12,7 +12,7 @@ function childProcessChecker() {
// This will come once parent dies. // This will come once parent dies.
// One way can be to check for error code ERR_IPC_CHANNEL_CLOSED // One way can be to check for error code ERR_IPC_CHANNEL_CLOSED
// and call process.exit() // and call process.exit()
logger.error({ err }, 'parent died'); logger.error(extractErrorLogData(err), 'parent died');
process.exit(1); process.exit(1);
} }
}, 1000); }, 1000);

View File

@@ -5,7 +5,7 @@ const AsyncLock = require('async-lock');
const lock = new AsyncLock(); const lock = new AsyncLock();
const { fork } = require('child_process'); const { fork } = require('child_process');
const processArgs = require('../utility/processArgs'); const processArgs = require('../utility/processArgs');
const { getLogger } = require('dbgate-tools'); const { getLogger, extractErrorLogData } = require('dbgate-tools');
const pipeForkLogs = require('./pipeForkLogs'); const pipeForkLogs = require('./pipeForkLogs');
const logger = getLogger('sshTunnel'); const logger = getLogger('sshTunnel');
@@ -40,7 +40,7 @@ function callForwardProcess(connection, tunnelConfig, tunnelCacheKey) {
tunnelConfig, tunnelConfig,
}); });
} catch (err) { } catch (err) {
logger.error({ err }, 'Error connecting SSH'); logger.error(extractErrorLogData(err), 'Error connecting SSH');
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
subprocess.on('message', resp => { subprocess.on('message', resp => {

View File

@@ -1,5 +1,5 @@
const crypto = require('crypto'); const crypto = require('crypto');
const { getLogger } = require('dbgate-tools'); const { getLogger, extractErrorLogData } = require('dbgate-tools');
const { getSshTunnel } = require('./sshTunnel'); const { getSshTunnel } = require('./sshTunnel');
const logger = getLogger('sshTunnelProxy'); const logger = getLogger('sshTunnelProxy');
@@ -10,7 +10,7 @@ async function handleGetSshTunnelRequest({ msgid, connection }, subprocess) {
try { try {
subprocess.send({ msgtype: 'getsshtunnel-response', msgid, response }); subprocess.send({ msgtype: 'getsshtunnel-response', msgid, response });
} catch (err) { } catch (err) {
logger.error({ err }, 'Error sending to SSH tunnel'); logger.error(extractErrorLogData(err), 'Error sending to SSH tunnel');
} }
} }

View File

@@ -2,7 +2,7 @@ const _ = require('lodash');
const express = require('express'); const express = require('express');
const getExpressPath = require('./getExpressPath'); const getExpressPath = require('./getExpressPath');
const { MissingCredentialsError } = require('./exceptions'); const { MissingCredentialsError } = require('./exceptions');
const { getLogger } = require('dbgate-tools'); const { getLogger, extractErrorLogData } = require('dbgate-tools');
const logger = getLogger('useController'); const logger = getLogger('useController');
/** /**
@@ -16,7 +16,7 @@ module.exports = function useController(app, electron, route, controller) {
try { try {
controller._init(); controller._init();
} catch (err) { } catch (err) {
logger.error({ err }, `Error initializing controller, exiting application`); logger.error(extractErrorLogData(err), `Error initializing controller, exiting application`);
process.exit(1); process.exit(1);
} }
} }
@@ -78,7 +78,7 @@ module.exports = function useController(app, electron, route, controller) {
const data = await controller[key]({ ...req.body, ...req.query }, req); const data = await controller[key]({ ...req.body, ...req.query }, req);
res.json(data); res.json(data);
} catch (err) { } catch (err) {
logger.error({ err }, `Error when processing route ${route}/${key}`); logger.error(extractErrorLogData(err), `Error when processing route ${route}/${key}`);
if (err instanceof MissingCredentialsError) { if (err instanceof MissingCredentialsError) {
res.json({ res.json({
missingCredentials: true, missingCredentials: true,

View File

@@ -1,4 +1,10 @@
import { createAsyncWriteStream, getLogger, runCommandOnDriver, runQueryOnDriver } from 'dbgate-tools'; import {
createAsyncWriteStream,
extractErrorLogData,
getLogger,
runCommandOnDriver,
runQueryOnDriver,
} from 'dbgate-tools';
import { DatabaseInfo, EngineDriver, ForeignKeyInfo, TableInfo } from 'dbgate-types'; import { DatabaseInfo, EngineDriver, ForeignKeyInfo, TableInfo } from 'dbgate-types';
import _pick from 'lodash/pick'; import _pick from 'lodash/pick';
import _omit from 'lodash/omit'; import _omit from 'lodash/omit';
@@ -255,7 +261,7 @@ export class DataDuplicator {
); );
} }
} catch (err) { } catch (err) {
logger.error({ err }, `Failed duplicator job, rollbacking. ${err.message}`); logger.error(extractErrorLogData(err), `Failed duplicator job, rollbacking. ${err.message}`);
await runCommandOnDriver(this.pool, this.driver, dmp => dmp.rollbackTransaction()); await runCommandOnDriver(this.pool, this.driver, dmp => dmp.rollbackTransaction());
return; return;
} }

View File

@@ -13,6 +13,7 @@ global.IS_DB_MODEL = true;
const program = require('commander'); const program = require('commander');
const dbgateApi = require('dbgate-api'); const dbgateApi = require('dbgate-api');
const { createLogger } = require('pinomin'); const { createLogger } = require('pinomin');
const { extractErrorLogData } = require('dbgate-tools');
const logger = createLogger('dbmodel'); const logger = createLogger('dbmodel');
@@ -22,7 +23,7 @@ async function runAndExit(promise) {
logger.info('Success'); logger.info('Success');
process.exit(); process.exit();
} catch (err) { } catch (err) {
logger.error({ err }, 'Processing failed'); logger.error(extractErrorLogData(err), 'Processing failed');
process.exit(1); process.exit(1);
} }
} }

View File

@@ -6,6 +6,7 @@ import _compact from 'lodash/compact';
import { getLogger } from './getLogger'; import { getLogger } from './getLogger';
import { type Logger } from 'pinomin'; import { type Logger } from 'pinomin';
import { dbNameLogCategory, isCompositeDbName, splitCompositeDbName } from './schemaInfoTools'; import { dbNameLogCategory, isCompositeDbName, splitCompositeDbName } from './schemaInfoTools';
import { extractErrorLogData } from './stringTools';
const logger = getLogger('dbAnalyser'); const logger = getLogger('dbAnalyser');
@@ -90,7 +91,9 @@ export class DatabaseAnalyser {
} }
async incrementalAnalysis(structure) { async incrementalAnalysis(structure) {
logger.info(`Performing incremental analysis, DB=${dbNameLogCategory(this.dbhan.database)}, engine=${this.driver.engine}`); logger.info(
`Performing incremental analysis, DB=${dbNameLogCategory(this.dbhan.database)}, engine=${this.driver.engine}`
);
this.structure = structure; this.structure = structure;
const modifications = await this.getModifications(); const modifications = await this.getModifications();
@@ -336,7 +339,7 @@ export class DatabaseAnalyser {
this.logger.debug({ rows: res.rows.length, template }, `Loaded analyser query`); this.logger.debug({ rows: res.rows.length, template }, `Loaded analyser query`);
return res; return res;
} catch (err) { } catch (err) {
logger.error({ err, message: err.message, template }, 'Error running analyser query'); logger.error(extractErrorLogData(err, { template }), 'Error running analyser query');
return { return {
rows: [], rows: [],
}; };

View File

@@ -12,6 +12,7 @@ import _uniqBy from 'lodash/uniqBy';
import { getLogger } from './getLogger'; import { getLogger } from './getLogger';
import { SqlDumper } from './SqlDumper'; import { SqlDumper } from './SqlDumper';
import { extendDatabaseInfo } from './structureTools'; import { extendDatabaseInfo } from './structureTools';
import { extractErrorLogData } from './stringTools';
const logger = getLogger('sqlGenerator'); const logger = getLogger('sqlGenerator');
@@ -85,7 +86,7 @@ export class SqlGenerator {
} }
private handleException = error => { private handleException = error => {
logger.error({ error }, 'Unhandled error'); logger.error(extractErrorLogData(error), 'Unhandled error');
this.isUnhandledException = true; this.isUnhandledException = true;
}; };

View File

@@ -19,7 +19,8 @@ export type EditorDataType =
const dateTimeStorageRegex = const dateTimeStorageRegex =
/^([0-9]+)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])[Tt]([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]|60)(\.[0-9]+)?(([Zz])|()|([\+|\-]([01][0-9]|2[0-3]):[0-5][0-9]))$/; /^([0-9]+)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])[Tt]([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]|60)(\.[0-9]+)?(([Zz])|()|([\+|\-]([01][0-9]|2[0-3]):[0-5][0-9]))$/;
const dateTimeParseRegex = /^(\d{4})-(\d{2})-(\d{2})[Tt ](\d{2}):(\d{2}):(\d{2})(\.[0-9]+)?(([Zz])|()|([\+|\-]([01][0-9]|2[0-3]):[0-5][0-9]))$/; const dateTimeParseRegex =
/^(\d{4})-(\d{2})-(\d{2})[Tt ](\d{2}):(\d{2}):(\d{2})(\.[0-9]+)?(([Zz])|()|([\+|\-]([01][0-9]|2[0-3]):[0-5][0-9]))$/;
export function arrayToHexString(byteArray) { export function arrayToHexString(byteArray) {
return byteArray.reduce((output, elem) => output + ('0' + elem.toString(16)).slice(-2), '').toUpperCase(); return byteArray.reduce((output, elem) => output + ('0' + elem.toString(16)).slice(-2), '').toUpperCase();
@@ -463,3 +464,31 @@ export function getConvertValueMenu(value, onSetValue, editorTypes?: DataEditorT
}, },
]; ];
} }
export function extractErrorMessage(err, defaultMessage = 'Unknown error') {
if (!err) {
return defaultMessage;
}
if (_isArray(err.errors)) {
try {
return err.errors.map(x => x.message).join('\n');
} catch (e2) {}
}
if (err.message) {
return err.message;
}
const s = `${err}`;
if (s && (!s.endsWith('Error') || s.includes(' '))) {
return s;
}
return defaultMessage;
}
export function extractErrorLogData(err, additionalFields = {}) {
if (!err) return null;
return {
errorMessage: extractErrorMessage(err),
errorObject: err,
...additionalFields,
};
}

View File

@@ -3,7 +3,8 @@ const stream = require('stream');
const driverBases = require('../frontend/drivers'); const driverBases = require('../frontend/drivers');
const Analyser = require('./Analyser'); const Analyser = require('./Analyser');
const mysql2 = require('mysql2'); const mysql2 = require('mysql2');
const { getLogger, createBulkInsertStreamBase, makeUniqueColumnNames } = global.DBGATE_PACKAGES['dbgate-tools']; const { getLogger, createBulkInsertStreamBase, makeUniqueColumnNames, extractErrorLogData } =
global.DBGATE_PACKAGES['dbgate-tools'];
const { MySqlDumper } = require('antares-mysql-dumper'); const { MySqlDumper } = require('antares-mysql-dumper');
const logger = getLogger('mysqlDriver'); const logger = getLogger('mysqlDriver');
@@ -128,7 +129,7 @@ const drivers = driverBases.map(driverBase => ({
}; };
const handleError = error => { const handleError = error => {
logger.error({ error }, 'Stream error'); logger.error(extractErrorLogData(error), 'Stream error');
const { message } = error; const { message } = error;
options.info({ options.info({
message, message,

View File

@@ -5,8 +5,13 @@ const driverBases = require('../frontend/drivers');
const Analyser = require('./Analyser'); const Analyser = require('./Analyser');
const pg = require('pg'); const pg = require('pg');
const pgCopyStreams = require('pg-copy-streams'); const pgCopyStreams = require('pg-copy-streams');
const { getLogger, createBulkInsertStreamBase, makeUniqueColumnNames, extractDbNameFromComposite } = const {
global.DBGATE_PACKAGES['dbgate-tools']; getLogger,
createBulkInsertStreamBase,
makeUniqueColumnNames,
extractDbNameFromComposite,
extractErrorLogData,
} = global.DBGATE_PACKAGES['dbgate-tools'];
const logger = getLogger('postreDriver'); const logger = getLogger('postreDriver');
@@ -155,7 +160,7 @@ const drivers = driverBases.map(driverBase => ({
}); });
query.on('error', error => { query.on('error', error => {
logger.error({ error }, 'Stream error'); logger.error(extractErrorLogData(error), 'Stream error');
const { message, position, procName } = error; const { message, position, procName } = error;
let line = null; let line = null;
if (position) { if (position) {

View File

@@ -3,7 +3,7 @@ const stream = require('stream');
const driverBase = require('../frontend/driver'); const driverBase = require('../frontend/driver');
const Analyser = require('./Analyser'); const Analyser = require('./Analyser');
const { splitQuery, sqliteSplitterOptions } = require('dbgate-query-splitter'); const { splitQuery, sqliteSplitterOptions } = require('dbgate-query-splitter');
const { getLogger, createBulkInsertStreamBase, makeUniqueColumnNames } = global.DBGATE_PACKAGES['dbgate-tools']; const { getLogger, createBulkInsertStreamBase, extractErrorLogData } = global.DBGATE_PACKAGES['dbgate-tools'];
const logger = getLogger('sqliteDriver'); const logger = getLogger('sqliteDriver');
@@ -116,7 +116,7 @@ const driver = {
try { try {
inTransaction(); inTransaction();
} catch (error) { } catch (error) {
logger.error({ error }, 'Stream error'); logger.error(extractErrorLogData(error), 'Stream error');
const { message, procName } = error; const { message, procName } = error;
options.info({ options.info({
message, message,