Skip to content

Commit 6010c5c

Browse files
committed
Added query timeout to native client
1 parent 9798622 commit 6010c5c

File tree

1 file changed

+43
-2
lines changed

1 file changed

+43
-2
lines changed

lib/native/client.js

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,14 +146,21 @@ Client.prototype.connect = function (callback) {
146146
Client.prototype.query = function (config, values, callback) {
147147
var query
148148
var result
149-
150-
if (typeof config.submit === 'function') {
149+
var readTimeout
150+
var readTimeoutTimer
151+
var queryCallback
152+
153+
if (config === null || config === undefined) {
154+
throw new TypeError('Client was passed a null or undefined query')
155+
} else if (typeof config.submit === 'function') {
156+
readTimeout = config.query_timeout || this.connectionParameters.query_timeout
151157
result = query = config
152158
// accept query(new Query(...), (err, res) => { }) style
153159
if (typeof values === 'function') {
154160
config.callback = values
155161
}
156162
} else {
163+
readTimeout = this.connectionParameters.query_timeout
157164
query = new NativeQuery(config, values, callback)
158165
if (!query.callback) {
159166
let resolveOut, rejectOut
@@ -165,6 +172,40 @@ Client.prototype.query = function (config, values, callback) {
165172
}
166173
}
167174

175+
if (readTimeout) {
176+
queryCallback = query.callback
177+
178+
readTimeoutTimer = setTimeout(() => {
179+
var error = new Error('Query read timeout')
180+
181+
process.nextTick(() => {
182+
query.handleError(error, this.connection)
183+
})
184+
185+
if (typeof queryCallback === 'function') {
186+
queryCallback(error)
187+
188+
// we already returned an error,
189+
// just do nothing if query completes
190+
query.callback = () => {
191+
}
192+
}
193+
194+
// Remove from queue
195+
var index = this._queryQueue.indexOf(query)
196+
if (index > -1) {
197+
this._queryQueue.splice(index, 1)
198+
}
199+
200+
this._pulseQueryQueue()
201+
}, readTimeout)
202+
203+
query.callback = (err, res) => {
204+
clearTimeout(readTimeoutTimer)
205+
queryCallback(err, res)
206+
}
207+
}
208+
168209
if (!this._queryable) {
169210
query.native = this.native
170211
process.nextTick(() => {

0 commit comments

Comments
 (0)