Make more tests pass
This commit is contained in:
parent
9a68682109
commit
b325971fdf
@ -4,8 +4,11 @@ var util = require('util');
|
||||
|
||||
var NativeQuery = require('./query');
|
||||
|
||||
var Client = module.exports = function() {
|
||||
var Client = module.exports = function(config) {
|
||||
EventEmitter.call(this);
|
||||
if(typeof config === 'string') {
|
||||
this.connectionString = config;
|
||||
}
|
||||
this.native = new Native();
|
||||
this._queryQueue = [];
|
||||
};
|
||||
@ -19,11 +22,11 @@ util.inherits(Client, EventEmitter);
|
||||
//the client will emit an error event.
|
||||
Client.prototype.connect = function(cb) {
|
||||
var self = this;
|
||||
this.native.connect(function(err) {
|
||||
this.native.connect(this.connectionString, function(err) {
|
||||
//error handling
|
||||
if(err) {
|
||||
if(cb) return cb(err);
|
||||
return self.emit('error')
|
||||
return self.emit('error', err);
|
||||
}
|
||||
|
||||
//set internal states to connected
|
||||
@ -78,7 +81,7 @@ Client.prototype._pulseQueryQueue = function(initialConnection) {
|
||||
return;
|
||||
}
|
||||
if(this._activeQuery) {
|
||||
if(this._activeQuery.state != 'error' && this._activeQuery.state != 'done') {
|
||||
if(this._activeQuery.state != 'error' && this._activeQuery.state != 'end') {
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -91,6 +94,10 @@ Client.prototype._pulseQueryQueue = function(initialConnection) {
|
||||
}
|
||||
this._activeQuery = query;
|
||||
query.submit();
|
||||
var self = this;
|
||||
query.once('_done', function() {
|
||||
self._pulseQueryQueue();
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
|
@ -9,6 +9,16 @@ var NativeQuery = module.exports = function(native) {
|
||||
this.name = null;
|
||||
this.callback = null;
|
||||
this.state = 'new';
|
||||
|
||||
//if the 'row' event is listened for
|
||||
//then emit them as they come in
|
||||
//without setting singleRowMode to true
|
||||
//this has almost no meaning because libpq
|
||||
//reads all rows into memory befor returning any
|
||||
this._emitRowEvents = false;
|
||||
this.once('newListener', function(event) {
|
||||
if(event === 'row') this._emitRowEvents = true;
|
||||
}.bind(this));
|
||||
};
|
||||
|
||||
util.inherits(NativeQuery, EventEmitter);
|
||||
@ -18,6 +28,9 @@ NativeQuery.prototype.submit = function() {
|
||||
var self = this;
|
||||
|
||||
var after = function(err, rows) {
|
||||
setImmediate(function() {
|
||||
self.emit('_done');
|
||||
});
|
||||
|
||||
//handle possible query error
|
||||
if(err) {
|
||||
@ -26,9 +39,14 @@ NativeQuery.prototype.submit = function() {
|
||||
return self.emit('error', err);
|
||||
}
|
||||
|
||||
//emit row events for each row in the result
|
||||
if(self._emitRowEvents) {
|
||||
rows.forEach(self.emit.bind(self, 'row'));
|
||||
}
|
||||
|
||||
//handle successful result
|
||||
self.state = 'done';
|
||||
self.emit('done');
|
||||
self.state = 'end';
|
||||
self.emit('end');
|
||||
if(self.callback) {
|
||||
self.callback(null, {rows: rows})
|
||||
}
|
||||
|
@ -18,13 +18,14 @@
|
||||
"author": "Brian Carlson <brian.m.carlson@gmail.com>",
|
||||
"main": "./lib",
|
||||
"dependencies": {
|
||||
"generic-pool": "2.1.1",
|
||||
"buffer-writer": "1.0.0",
|
||||
"pgpass": "0.0.3",
|
||||
"generic-pool": "2.1.1",
|
||||
"nan": "~1.3.0",
|
||||
"packet-reader": "0.2.0",
|
||||
"pg-connection-string": "0.1.1",
|
||||
"pg-types": "1.4.0"
|
||||
"pg-native": "0.4.1",
|
||||
"pg-types": "1.4.0",
|
||||
"pgpass": "0.0.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"jshint": "2.5.2",
|
||||
|
@ -1,22 +1,18 @@
|
||||
return console.log('these tests leak pg internals and are not helpful');
|
||||
var helper = require(__dirname+"/../test-helper");
|
||||
var Client = require(__dirname + "/../../lib/native");
|
||||
test('COPY FROM events check', function () {
|
||||
var con = new Client(helper.config),
|
||||
stdinStream = con.copyFrom('COPY person FROM STDIN');
|
||||
assert.emits(con, 'copyInResponse',
|
||||
function () {
|
||||
stdinStream.end();
|
||||
},
|
||||
"backend should emit copyInResponse after COPY FROM query"
|
||||
);
|
||||
assert.emits(con, '_readyForQuery',
|
||||
function () {
|
||||
con.end();
|
||||
},
|
||||
"backend should emit _readyForQuery after data will be coped to stdin stream"
|
||||
);
|
||||
var con = new Client(helper.config);
|
||||
var stdinStream = con.copyFrom('COPY person FROM STDIN');
|
||||
|
||||
assert.emits(con, 'copyInResponse', function () { stdinStream.end(); },
|
||||
"backend should emit copyInResponse after COPY FROM query");
|
||||
|
||||
assert.emits(con, '_readyForQuery', function () { con.end(); },
|
||||
"backend should emit _readyForQuery after data will be coped to stdin stream");
|
||||
con.connect();
|
||||
});
|
||||
|
||||
test('COPY TO events check', function () {
|
||||
var con = new Client(helper.config),
|
||||
stdoutStream = con.copyTo('COPY person TO STDOUT');
|
||||
|
@ -24,13 +24,13 @@ test('many queries', function() {
|
||||
var q = client.query("SELECT * FROM person");
|
||||
assert.emits(q, 'end', function() {
|
||||
count++;
|
||||
})
|
||||
});
|
||||
}
|
||||
assert.emits(client, 'drain', function() {
|
||||
client.end();
|
||||
assert.equal(count, expected);
|
||||
})
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
test('many clients', function() {
|
||||
var clients = [];
|
||||
|
Loading…
Reference in New Issue
Block a user