Skip to content

Commit 6585f85

Browse files
committed
query object now emits query related errors, client object no longer
emits query related errors
1 parent d221d8b commit 6585f85

File tree

3 files changed

+112
-11
lines changed

3 files changed

+112
-11
lines changed

lib/client.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,14 @@ p.connect = function() {
7373

7474
con.on('readyForQuery', function() {
7575
self.readyForQuery = true;
76+
this.activeQuery = null;
7677
self.pulseQueryQueue();
7778
});
7879

7980
con.on('error', function(error) {
80-
self.emit('error', error);
81+
if(!self.activeQuery) {
82+
self.emit('error', error);
83+
}
8184
});
8285
};
8386

@@ -87,6 +90,7 @@ p.pulseQueryQueue = function() {
8790
if(this.queryQueue.length > 0) {
8891
this.readyForQuery = false;
8992
var query = this.queryQueue.shift();
93+
this.activeQuery = query;
9094
query.submit(this.connection);
9195
} else {
9296
this.emit('drain');

lib/query.js

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,30 @@ p.submit = function(connection) {
4949
}
5050
self.emit('row', result);
5151
};
52-
connection.on('rowDescription', handleRowDescription);
53-
connection.on('dataRow', handleDatarow);
54-
connection.once('readyForQuery', function() {
52+
53+
var onError = function(err) {
5554
//remove all listeners
55+
connection.removeListener('rowDescription', handleDatarow);
56+
connection.removeListener('dataRow', handleDatarow);
57+
connection.removeListener('error', onError);
58+
connection.removeListener('readyForQuery', onReadyForQuery);
59+
self.emit('error', err);
60+
self.emit('end');
61+
};
62+
63+
var onReadyForQuery = function() {
64+
//remove all listeners
5665
connection.removeListener('rowDescription', handleRowDescription);
5766
connection.removeListener('dataRow', handleDatarow);
67+
connection.removeListener('readyForQuery', onReadyForQuery);
68+
connection.removeListener('error', onError);
5869
self.emit('end');
59-
});
70+
};
71+
72+
connection.on('rowDescription', handleRowDescription);
73+
connection.on('dataRow', handleDatarow);
74+
connection.on('readyForQuery', onReadyForQuery);
75+
connection.on('error', onError);
6076
};
6177

6278
p.hasBeenParsed = function(connection) {
@@ -104,10 +120,19 @@ p.prepare = function(connection) {
104120

105121
//TODO support EmptyQueryResponse, ErrorResponse, and PortalSuspended
106122
var onCommandComplete = function() {
123+
connection.removeListener('error', onError);
124+
connection.removeListener('commandComplete', onCommandComplete);
125+
connection.sync();
126+
};
127+
128+
var onError = function() {
129+
connection.removeListener('error', onError);
130+
connection.removeListener('commandComplete', onCommandComplete);
107131
connection.sync();
108132
};
109133

110-
connection.once('commandComplete', onCommandComplete);
134+
connection.on('commandComplete', onCommandComplete);
135+
connection.on('error', onError);
111136
};
112137

113138
var dateParser = function(isoDate) {
Lines changed: 77 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,82 @@
11
var helper = require(__dirname + '/test-helper');
22

3-
test('error handling', function(){
3+
var createErorrClient = function() {
44
var client = helper.client();
5-
client.query("select omfg from yodas_soda where pixistix = 'zoiks!!!'");
6-
assert.emits(client, 'error', function(error) {
7-
assert.equal(error.severity, "ERROR");
8-
client.end();
5+
client.on('error', function(err) {
6+
assert.ok(false, "client should not throw query error: " + sys.inspect(err));
7+
})
8+
client.on('drain', client.end.bind(client));
9+
return client;
10+
};
11+
12+
test('error handling', function(){
13+
14+
test('within a simple query', function() {
15+
16+
var client = createErorrClient();
17+
18+
var query = client.query("select omfg from yodas_soda where pixistix = 'zoiks!!!'");
19+
20+
assert.emits(query, 'error', function(error) {
21+
assert.equal(error.severity, "ERROR");
22+
});
23+
24+
});
25+
26+
test('within a prepared statement', function() {
27+
28+
var client = createErorrClient();
29+
30+
var q = client.query("CREATE TEMP TABLE boom(age integer); INSERT INTO boom (age) VALUES (28);");
31+
32+
test("when query is parsing", function() {
33+
//this query wont parse since there ain't no table named bang
34+
35+
var ensureFuture = function(testClient) {
36+
test("client can issue more queries successfully", function() {
37+
var goodQuery = testClient.query("select age from boom");
38+
assert.emits(goodQuery, 'row', function(row) {
39+
assert.equal(row.age, 28);
40+
});
41+
});
42+
};
43+
44+
var query = client.query({
45+
text: "select * from bang where name = $1",
46+
values: ['0']
47+
});
48+
49+
test("query emits the error", function() {
50+
assert.emits(query, 'error', function(err) {
51+
ensureFuture(client);
52+
});
53+
})
54+
55+
test("when a query is binding", function() {
56+
var query = client.query({
57+
text: 'select * from boom where age = $1',
58+
values: ['asldkfjasdf']
59+
});
60+
61+
test("query emits the error", function() {
62+
assert.emits(query, 'error', function(err) {
63+
assert.equal(err.severity, "ERROR");
64+
ensureFuture(client);
65+
});
66+
});
67+
68+
//TODO how to test for errors during execution?
69+
});
70+
})
971
});
72+
73+
test('non-query error', function() {
74+
75+
var client = new Client({
76+
user:'asldkfjsadlfkj'
77+
});
78+
assert.emits(client, 'error');
79+
client.connect();
80+
});
81+
1082
});

0 commit comments

Comments
 (0)