Skip to content

Commit

Permalink
Add support for request cancellation in msnodesqlv8 driver
Browse files Browse the repository at this point in the history
  • Loading branch information
patriksimek committed Jul 5, 2018
1 parent 3f9d3d5 commit db2f555
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 12 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ v4.2.0 (2018-XX-XX)
-------------------
[new] Added TVP support for msnodesqlv8 driver
[new] Added support for information messages in msnodesqlv8 driver
[new] Added support for request cancellation in msnodesqlv8 driver
[fix] Fixed Tedious deprecation warnings
[fix] Fixed ResourceRequest timed out error
[fix] All query and batch methods now have the same interface
Expand Down
31 changes: 23 additions & 8 deletions lib/msnodesqlv8.js
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,12 @@ class Request extends base.Request {
if (!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 base.RequestError('Canceled.', 'ECANCEL'))
}

const done = (err, rowCount) => {
if (err) {
if ((typeof err.sqlstate === 'string') && (err.sqlstate.toLowerCase() === '08s01')) {
Expand Down Expand Up @@ -429,6 +435,12 @@ class Request extends base.Request {

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 base.RequestError('Canceled.', 'ECANCEL'))
}

const params = []
for (let name in this.parameters) {
let param = this.parameters[name]
Expand All @@ -443,6 +455,14 @@ class Request extends base.Request {
query_str: command,
query_timeout: config.requestTimeout / 1000 // msnodesqlv8 timeouts are in seconds (<1 second not supported)
}, params)

this._cancel = () => {
debug('request(%d): cancel', IDS.get(this))
req.cancelQuery(err => {
if (err) debug('request(%d): failed to cancel', IDS.get(this), err)
})
}

req.on('meta', metadata => {
if (row) {
if (isChunkedRecordset) {
Expand Down Expand Up @@ -570,7 +590,9 @@ class Request extends base.Request {

err = new base.RequestError(err)
err.code = 'EREQUEST'
err.state = err.sqlstate

delete this._cancel
this.parent.release(connection)

debug('request(%d): failed', IDS.get(this), err)
Expand Down Expand Up @@ -626,6 +648,7 @@ class Request extends base.Request {
}
}

delete this._cancel
this.parent.release(connection)

debug('request(%d): completed', IDS.get(this))
Expand Down Expand Up @@ -713,14 +736,6 @@ class Request extends base.Request {
})
})
}

/*
Cancel currently executed request.
*/

cancel () {
return false // Request canceling is not implemented by msnodesql driver.
}
}

module.exports = Object.assign({
Expand Down
6 changes: 3 additions & 3 deletions lib/tedious.js
Original file line number Diff line number Diff line change
Expand Up @@ -466,7 +466,7 @@ class Request extends base.Request {
errors.push(err)
}

this._cancel = null
delete this._cancel

let error
if (errors.length && !this.stream) {
Expand Down Expand Up @@ -621,7 +621,7 @@ class Request extends base.Request {
}
}

this._cancel = null
delete this._cancel

let error
if (errors.length && !this.stream) {
Expand Down Expand Up @@ -912,7 +912,7 @@ class Request extends base.Request {
errors.push(err)
}

this._cancel = null
delete this._cancel

let error
if (errors.length && !this.stream) {
Expand Down
2 changes: 1 addition & 1 deletion test/msnodesqlv8/msnodesqlv8.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ describe('msnodesqlv8', function () {
it('prepared statement in transaction', done => TESTS['prepared statement in transaction'](done))
it('transaction with rollback', done => TESTS['transaction with rollback'](done))
it.skip('transaction with commit (temporarily disabled because of issues introduced in 0.5.3)', done => TESTS['transaction with commit'](done))
it.skip('cancel request (not supported by msnodesqlv8)', done => TESTS['cancel request'](done))
it('cancel request', done => TESTS['cancel request'](done))
it('request timeout', done => TESTS['request timeout'](done))
it('dataLength type correction', done => TESTS['dataLength type correction'](done))
it.skip('chunked json support (requires SQL Server 2016)', done => TESTS['chunked json support'](done))
Expand Down

0 comments on commit db2f555

Please sign in to comment.