Skip to content

Commit

Permalink
fix(db2/formatError): added support for reporting stack that triggere…
Browse files Browse the repository at this point in the history
…d the query
  • Loading branch information
joaoe committed Jan 10, 2022
1 parent 0ca7ab2 commit 4c9f602
Showing 1 changed file with 20 additions and 16 deletions.
36 changes: 20 additions & 16 deletions lib/dialects/db2/query.js
Expand Up @@ -22,7 +22,7 @@ class Query extends AbstractQuery {
return value;
}

async _run(connection, sql, parameters) {
async _run(connection, sql, parameters) {
this.sql = sql;
const benchmark = this.sequelize.options.benchmark || this.options.benchmark;
let queryBegin;
Expand All @@ -31,40 +31,42 @@ class Query extends AbstractQuery {
} else {
this.sequelize.log(`Executing (${ this.connection.uuid || 'default' }): ${ this.sql}`, this.options);
}

const errStack = new Error().stack;
return new Promise((resolve, reject) => {
// TRANSACTION SUPPORT
if (_.startsWith(this.sql, 'BEGIN TRANSACTION')) {
connection.beginTransaction(err => {
if (err) {
reject(this.formatError(err));
reject(this.formatError(err, errStack));
} else {
resolve(this.formatResults());
}
});
} else if (_.startsWith(this.sql, 'COMMIT TRANSACTION')) {
connection.commitTransaction(err => {
if (err) {
reject(this.formatError(err));
reject(this.formatError(err, errStack));
} else {
resolve(this.formatResults());
}
});
} else if (_.startsWith(this.sql, 'ROLLBACK TRANSACTION')) {
connection.rollbackTransaction(err => {
if (err) {
reject(this.formatError(err));
reject(this.formatError(err, errStack));
} else {
resolve(this.formatResults());
}
});
} else if (_.startsWith(this.sql, 'SAVE TRANSACTION')) {
connection.commitTransaction(err => {
if (err) {
reject(this.formatError(err));
reject(this.formatError(err, errStack));
} else {
connection.beginTransaction(err => {
if (err) {
reject(this.formatError(err));
reject(this.formatError(err, errStack));
} else {
resolve(this.formatResults());
}
Expand All @@ -90,7 +92,7 @@ class Query extends AbstractQuery {
}

connection.prepare(newSql, (err, stmt) => {
if (err) { reject(this.formatError(err)); }
if (err) { reject(this.formatError(err, errStack)); }
stmt.execute(params, (err, result, outparams) => {
debug(`executed(${this.connection.uuid || 'default'}):${newSql} ${parameters ? JSON.stringify(parameters) : ''}`);

Expand All @@ -108,7 +110,7 @@ class Query extends AbstractQuery {
if (err) {
err.sql = sql;
stmt.closeSync();
reject(this.formatError(err, connection, parameters));
reject(this.formatError(err, errStack, connection, parameters));
} else {
let data = [];
let metadata = [];
Expand Down Expand Up @@ -333,7 +335,7 @@ class Query extends AbstractQuery {
});
}

formatError(err, conn, parameters) {
formatError(err, errStack, conn, parameters) {
let match;

if (!(err && err.message)) {
Expand Down Expand Up @@ -389,7 +391,7 @@ class Query extends AbstractQuery {
));
});

return new sequelizeErrors.UniqueConstraintError({ message, errors, parent: err, fields });
return new sequelizeErrors.UniqueConstraintError({ message, errors, parent: err, fields, stack: errStack });
}

match = err.message.match(/SQL0532N {2}A parent row cannot be deleted because the relationship "(.*)" restricts the deletion/) ||
Expand All @@ -399,7 +401,8 @@ class Query extends AbstractQuery {
return new sequelizeErrors.ForeignKeyConstraintError({
fields: null,
index: match[1],
parent: err
parent: err,
stack: errStack
});
}

Expand All @@ -413,11 +416,12 @@ class Query extends AbstractQuery {
message: match[0],
constraint,
table,
parent: err
parent: err,
stack: errStack
});
}

return new sequelizeErrors.DatabaseError(err);
return new sequelizeErrors.DatabaseError(err, { stack: errStack });
}


Expand Down Expand Up @@ -446,7 +450,7 @@ class Query extends AbstractQuery {
result = result || this.sql.startsWith('SELECT NAME AS "name", TBNAME AS "tableName", UNIQUERULE AS "keyType", COLNAMES, INDEXTYPE AS "type" FROM SYSIBM.SYSINDEXES');
return result;
}

handleShowIndexesQuery(data) {
let currItem;
const result = [];
Expand All @@ -460,7 +464,7 @@ class Query extends AbstractQuery {
unique: item.keyType === 'U',
type: item.type
};

_.forEach(item.COLNAMES.replace(/\+|-/g, x => { return ` ${ x}`; }).split(' '), column => {
let columnName = column.trim();
if ( columnName ) {
Expand All @@ -476,7 +480,7 @@ class Query extends AbstractQuery {
result.push(currItem);
}
});
return result;
return result;
}

handleInsertQuery(results, metaData) {
Expand Down

0 comments on commit 4c9f602

Please sign in to comment.