diff --git a/lib/tedious/request.js b/lib/tedious/request.js index 11d04695..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) } } } @@ -325,7 +331,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) {