diff --git a/index.js b/index.js index 71a4223f..2d8e088b 100644 --- a/index.js +++ b/index.js @@ -32,14 +32,28 @@ Cursor.prototype.submit = function(connection) { }, true) con.flush() + + con.once('noData', ifNoData) + con.once('rowDescription', function () { + con.removeListener('noData', ifNoData); + }); + + function ifNoData () { + self.state = 'idle' + self._shiftQueue(); + } +} + +Cursor.prototype._shiftQueue = function () { + if(this._queue.length) { + this._getRows.apply(this, this._queue.shift()) + } } Cursor.prototype.handleRowDescription = function(msg) { this._result.addFields(msg.fields) this.state = 'idle' - if(this._queue.length) { - this._getRows.apply(this, this._queue.shift()) - } + this._shiftQueue(); } Cursor.prototype.handleDataRow = function(msg) { @@ -103,7 +117,7 @@ Cursor.prototype._getRows = function(rows, cb) { } Cursor.prototype.end = function(cb) { - if(this.statue != 'initialized') { + if(this.state != 'initialized') { this.connection.sync() } this.connection.end() diff --git a/package.json b/package.json index a886f903..5485318d 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "test": "test" }, "scripts": { - "test": "node test/" + "test": "mocha test/" }, "author": "Brian M. Carlson", "license": "MIT", diff --git a/test/no-data-handling.js b/test/no-data-handling.js new file mode 100644 index 00000000..9bcbef83 --- /dev/null +++ b/test/no-data-handling.js @@ -0,0 +1,25 @@ +var assert = require('assert') +var pg = require('pg.js'); +var Cursor = require('../'); + +describe('queries with no data', function () { + beforeEach(function(done) { + var client = this.client = new pg.Client() + client.connect(done) + }) + + + afterEach(function() { + this.client.end() + }) + + it('handles queries that return no data', function (done) { + var cursor = new Cursor('CREATE TEMPORARY TABLE whatwhat (thing int)') + this.client.query(cursor) + cursor.read(100, function (err, rows) { + assert.ifError(err) + assert.equal(rows.length, 0) + done() + }) + }); +});