From 85b67d90d6c70cb6a5e6b8d47bfca7e8501a9ac9 Mon Sep 17 00:00:00 2001 From: Dan Hensby Date: Fri, 2 Jul 2021 11:09:43 +0100 Subject: [PATCH 1/2] Fix handling of errors when adding rows to bulk operations --- lib/tedious/request.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/tedious/request.js b/lib/tedious/request.js index 11d04695..6e4a023a 100644 --- a/lib/tedious/request.js +++ b/lib/tedious/request.js @@ -325,7 +325,11 @@ class Request extends BaseRequest { } for (const row of table.rows) { - bulk.addRow(row) + try { + bulk.addRow(row) + } catch (e) { + return handleError(true, connection, e) + } } if (table.create) { From 8d801dae5005ce9415bb81d1b841f711ea784d9c Mon Sep 17 00:00:00 2001 From: Dan Hensby Date: Fri, 2 Jul 2021 11:16:14 +0100 Subject: [PATCH 2/2] Refactor callback to automatically release the connection to prevent developer mistakes --- lib/tedious/request.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/tedious/request.js b/lib/tedious/request.js index 6e4a023a..eac531c2 100644 --- a/lib/tedious/request.js +++ b/lib/tedious/request.js @@ -266,14 +266,21 @@ class Request extends BaseRequest { } this.parent.acquire(this, (err, connection) => { - if (err) return callback(err) + const callbackWithRelease = (err, ...args) => { + try { + this.parent.release(connection); + } catch (e) { + // noop + } + callback(err, ...args); + } + if (err) return callbackWithRelease(err) debug('connection(%d): borrowed to request #%d', IDS.get(connection), IDS.get(this)) if (this.canceled) { debug('request(%d): canceled', IDS.get(this)) - this.parent.release(connection) - return callback(new RequestError('Canceled.', 'ECANCEL')) + return callbackWithRelease(new RequestError('Canceled.', 'ECANCEL')) } this._cancel = () => { @@ -307,13 +314,12 @@ class Request extends BaseRequest { connection.removeListener(event, errorHandlers[event]) } - this.parent.release(connection) hasReturned = true if (this.stream) { - callback(null, rowCount) + callbackWithRelease(null, rowCount) } else { - callback(error, rowCount) + callbackWithRelease(error, rowCount) } } }