From 2efe451ee63e31ec79e06dd86722da128ad0f275 Mon Sep 17 00:00:00 2001 From: brianc Date: Wed, 3 Nov 2010 23:06:07 -0500 Subject: [PATCH] added Row object instead of returning raw dataRow object w/ coerced types --- lib/query.js | 9 +++++---- lib/row.js | 7 +++++++ test/integration/client/no-data-tests.js | 2 +- .../client/prepared-statement-tests.js | 14 ++++++------- test/integration/client/simple-query-tests.js | 6 +++--- .../integration/client/type-coercion-tests.js | 4 ++-- test/unit/client/simple-query-tests.js | 5 +++-- test/unit/client/typed-query-results.js | 4 ++-- test/unit/row-tests.js | 20 +++++++++++++++++++ 9 files changed, 50 insertions(+), 21 deletions(-) create mode 100644 lib/row.js create mode 100644 test/unit/row-tests.js diff --git a/lib/query.js b/lib/query.js index 542c3854..64a3df46 100644 --- a/lib/query.js +++ b/lib/query.js @@ -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); diff --git a/lib/row.js b/lib/row.js new file mode 100644 index 00000000..c81b0ba8 --- /dev/null +++ b/lib/row.js @@ -0,0 +1,7 @@ +var sys = require('sys'); +var Row = function() { +}; +sys.inherits(Row, Array); +var p = Row.prototype; + +module.exports = Row; diff --git a/test/integration/client/no-data-tests.js b/test/integration/client/no-data-tests.js index c8375bb9..c0d8ecf8 100644 --- a/test/integration/client/no-data-tests.js +++ b/test/integration/client/no-data-tests.js @@ -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)); diff --git a/test/integration/client/prepared-statement-tests.js b/test/integration/client/prepared-statement-tests.js index 304fea7a..9f76a9b8 100644 --- a/test/integration/client/prepared-statement-tests.js +++ b/test/integration/client/prepared-statement-tests.js @@ -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); }); }); diff --git a/test/integration/client/simple-query-tests.js b/test/integration/client/simple-query-tests.js index 70c66dbc..13789e6f 100644 --- a/test/integration/client/simple-query-tests.js +++ b/test/integration/client/simple-query-tests.js @@ -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)); diff --git a/test/integration/client/type-coercion-tests.js b/test/integration/client/type-coercion-tests.js index b062b4b9..e7e27765 100644 --- a/test/integration/client/type-coercion-tests.js +++ b/test/integration/client/type-coercion-tests.js @@ -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()); diff --git a/test/unit/client/simple-query-tests.js b/test/unit/client/simple-query-tests.js index facc1063..fe286e7c 100644 --- a/test/unit/client/simple-query-tests.js +++ b/test/unit/client/simple-query-tests.js @@ -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"); diff --git a/test/unit/client/typed-query-results.js b/test/unit/client/typed-query-results.js index 0368a329..b4247327 100644 --- a/test/unit/client/typed-query-results.js +++ b/test/unit/client/typed-query-results.js @@ -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); }); } }); diff --git a/test/unit/row-tests.js b/test/unit/row-tests.js new file mode 100644 index 00000000..1a0af99f --- /dev/null +++ b/test/unit/row-tests.js @@ -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); + }); +});