added Row object instead of returning raw dataRow object w/ coerced types

This commit is contained in:
brianc 2010-11-03 23:06:07 -05:00
parent 477d0744fa
commit 2efe451ee6
9 changed files with 50 additions and 21 deletions

View File

@ -1,5 +1,6 @@
var EventEmitter = require('events').EventEmitter;
var sys = require('sys');var sys = require('sys');
var Row = require(__dirname + '/row');
var Query = function(config) {
this.text = config.text;
@ -39,12 +40,12 @@ p.submit = function(connection) {
});
};
var handleDatarow = function(msg) {
var result = new Row();
for(var i = 0; i < msg.fields.length; i++) {
if(msg.fields[i] !== null) {
msg.fields[i] = converters[i](msg.fields[i]);
}
var rawValue = msg.fields[i];
result.push(rawValue === null ? null : converters[i](rawValue));
}
self.emit('row', msg);
self.emit('row', result);
};
connection.on('rowDescription', handleRowDescription);
connection.on('dataRow', handleDatarow);

7
lib/row.js Normal file
View File

@ -0,0 +1,7 @@
var sys = require('sys');
var Row = function() {
};
sys.inherits(Row, Array);
var p = Row.prototype;
module.exports = Row;

View File

@ -27,7 +27,7 @@ test("noData message handling", function() {
});
assert.emits(query, 'row', function(row) {
assert.strictEqual(row.fields[0],100)
assert.strictEqual(row[0],100)
});
client.on('drain', client.end.bind(client));

View File

@ -9,7 +9,7 @@ test("simple, unnamed prepared statement", function(){
});
assert.emits(query, 'row', function(row) {
assert.equal(row.fields[0], 20);
assert.equal(row[0], 20);
});
assert.emits(query, 'end', function() {
@ -39,7 +39,7 @@ test("named prepared statement", function() {
});
assert.emits(query, 'row', function(row) {
assert.equal(row.fields[0], 'Brian');
assert.equal(row[0], 'Brian');
});
assert.emits(query, 'end', function() {
@ -57,7 +57,7 @@ test("named prepared statement", function() {
});
assert.emits(cachedQuery, 'row', function(row) {
assert.equal(row.fields[0], 'Aaron');
assert.equal(row[0], 'Aaron');
});
assert.emits(cachedQuery, 'end', function() {
@ -75,11 +75,11 @@ test("named prepared statement", function() {
test("gets first row", function() {
assert.emits(q, 'row', function(row) {
assert.equal(row.fields[0], "Aaron");
assert.equal(row[0], "Aaron");
test("gets second row", function() {
assert.emits(q, 'row', function(row) {
assert.equal(row.fields[0], "Brian");
assert.equal(row[0], "Brian");
});
});
@ -112,7 +112,7 @@ test("prepared statements on different clients", function() {
});
test('gets right data back', function() {
assert.emits(query, 'row', function(row) {
assert.equal(row.fields[0], 26);
assert.equal(row[0], 26);
});
});
@ -136,7 +136,7 @@ test("prepared statements on different clients", function() {
test('gets right data', function() {
assert.emits(query, 'row', function(row) {
assert.equal(row.fields[0], 1);
assert.equal(row[0], 1);
});
});

View File

@ -10,7 +10,7 @@ test("simple query interface", function() {
var rows = [];
query.on('row', function(row) {
rows.push(row.fields[0])
rows.push(row[0])
});
assert.emits(query, 'end', function() {
@ -30,9 +30,9 @@ test("multiple simple queries", function() {
client.query("insert into bang(name) VALUES ('yes');");
var query = client.query("select name from bang");
assert.emits(query, 'row', function(row) {
assert.equal(row.fields[0], 'boom');
assert.equal(row[0], 'boom');
assert.emits(query, 'row', function(row) {
assert.equal(row.fields[0],'yes');
assert.equal(row[0],'yes');
});
});
client.on('drain', client.end.bind(client));

View File

@ -21,7 +21,7 @@ var testForTypeCoercion = function(type){
});
assert.emits(query, 'row', function(row) {
assert.strictEqual(row.fields[0], val, "expected " + type.name + " of " + val + " but got " + row.fields[0]);
assert.strictEqual(row[0], val, "expected " + type.name + " of " + val + " but got " + row[0]);
});
client.query({
@ -97,7 +97,7 @@ test("timestampz round trip", function() {
values: ['now']
});
assert.emits(result, 'row', function(row) {
var date = row.fields[1];
var date = row[1];
assert.equal(date.getYear(),now.getYear());
assert.equal(date.getMonth(), now.getMonth());
assert.equal(date.getDate(), now.getDate());

View File

@ -83,13 +83,14 @@ test('executing query', function() {
test('handles dataRow messages', function() {
assert.emits(query, 'row', function(row) {
assert.equal(row.fields[0], "hi");
assert.equal(row[0], "hi");
assert.equal(row.length, 1);
});
var handled = con.emit('dataRow', { fields: ["hi"] });
assert.ok(handled, "should have handled first data row message");
assert.emits(query, 'row', function(row) {
assert.equal(row.fields[0], "bye");
assert.equal(row[0], "bye");
});
var handledAgain = con.emit('dataRow', { fields: ["bye"] });
assert.ok(handledAgain, "should have handled seciond data row message");

View File

@ -104,9 +104,9 @@ test('typed results', function() {
test('parses ' + tests[i].name, function() {
var expected = tests[i].expected;
if(typeof expected === 'function') {
return expected(row.fields[i]);
return expected(row[i]);
}
assert.strictEqual(row.fields[i], expected);
assert.strictEqual(row[i], expected);
});
}
});

20
test/unit/row-tests.js Normal file
View File

@ -0,0 +1,20 @@
//mostly just testing simple row api
require(__dirname + "/test-helper");
var Row = require('row');
test("is Array-like", function() {
var row = new Row();
test("has length", function() {
assert.strictEqual(row.length, 0);
});
test("can push", function() {
row.push(1);
assert.length(row, 1);
assert.strictEqual(row[0], 1);
});
test("can unshift", function() {
row.unshift(2);
assert.length(row, 2);
assert.strictEqual(row[0], 2);
});
});