Skip to content

Commit 0ea77f4

Browse files
committed
fix for gh-issue #26
1 parent ca851e4 commit 0ea77f4

File tree

5 files changed

+63
-36
lines changed

5 files changed

+63
-36
lines changed

Diff for: lib/native.js

+15-7
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,18 @@ var NativeQuery = function(text, values, callback) {
119119
if(this.values) {
120120
for(var i = 0, len = this.values.length; i < len; i++) {
121121
var item = this.values[i];
122-
if(item instanceof Date) {
123-
this.values[i] = JSON.stringify(item);
124-
} else {
122+
switch(typeof item) {
123+
case 'undefined':
124+
this.values[i] = null;
125+
break;
126+
case 'object':
127+
this.values[i] = item === null ? null : JSON.stringify(item);
128+
break;
129+
case 'string':
130+
//value already string
131+
break;
132+
default:
133+
//numbers
125134
this.values[i] = item.toString();
126135
}
127136
}
@@ -137,9 +146,8 @@ var p = NativeQuery.prototype;
137146
var mapRowData = function(row) {
138147
var result = {};
139148
for(var i = 0, len = row.length; i < len; i++) {
140-
var item = row[i];
141-
var parser = types.getStringTypeParser(item.type);
142-
result[item.name] = parser(item.value);
149+
var item = row[i];
150+
result[item.name] = item.value == null ? null : types.getStringTypeParser(item.type)(item.value);
143151
}
144152
return result;
145153
}
@@ -174,5 +182,5 @@ module.exports = {
174182
Client: ctor,
175183
connect: pool.connect,
176184
end: pool.end,
177-
defaults: require(__dirname + '/defaults')
185+
defaults: require(__dirname + '/defaults')
178186
};

Diff for: lib/types.js

+4
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ var parseDate = function(isoDate) {
2525
var dateMatcher = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})(\.\d{1,})?/;
2626

2727
var match = dateMatcher.exec(isoDate);
28+
//could not parse date
29+
if(!match) {
30+
return null;
31+
}
2832
var year = match[1];
2933
var month = parseInt(match[2],10)-1;
3034
var day = match[3];

Diff for: src/binding.cc

+16-3
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ class Connection : public EventEmitter {
211211
if(result == 1) {
212212
return Undefined();
213213
}
214+
self->EmitLastError();
214215
THROW("Postgres returned non-1 result from query dispatch.");
215216
}
216217

@@ -444,12 +445,22 @@ class Connection : public EventEmitter {
444445
int fieldCount = PQnfields(result);
445446
for(int fieldNumber = 0; fieldNumber < fieldCount; fieldNumber++) {
446447
Local<Object> field = Object::New();
448+
//name of field
447449
char* fieldName = PQfname(result, fieldNumber);
448-
int fieldType = PQftype(result, fieldNumber);
449-
char* fieldValue = PQgetvalue(result, rowNumber, fieldNumber);
450450
field->Set(name_symbol, String::New(fieldName));
451-
field->Set(value_symbol, String::New(fieldValue));
451+
452+
//oid of type of field
453+
int fieldType = PQftype(result, fieldNumber);
452454
field->Set(type_symbol, Integer::New(fieldType));
455+
456+
//value of field
457+
if(PQgetisnull(result, rowNumber, fieldNumber)) {
458+
field->Set(value_symbol, Null());
459+
} else {
460+
char* fieldValue = PQgetvalue(result, rowNumber, fieldNumber);
461+
field->Set(value_symbol, String::New(fieldValue));
462+
}
463+
453464
row->Set(Integer::New(fieldNumber), field);
454465
}
455466

@@ -578,6 +589,8 @@ class Connection : public EventEmitter {
578589
return 0;
579590
}
580591
paramValues[i] = cString;
592+
} else if(val->IsNull()) {
593+
paramValues[i] = NULL;
581594
} else {
582595
//a paramter was not a string
583596
LOG("Parameter not a string");

Diff for: test/integration/client/notice-tests.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ test('emits notify message', function() {
2222
assert.equal(msg.channel, 'boom');
2323
assert.ok(msg.payload == 'omg!' /*9.x*/ || msg.payload == '' /*8.x*/, "expected blank payload or correct payload but got " + msg.message)
2424
client.end()
25-
}, 500)
25+
}, 100)
2626

2727
});
2828
assert.emits(otherClient, 'notification', function(msg) {

Diff for: test/integration/client/type-coercion-tests.js

+27-25
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,36 @@ var connectionString = helper.connectionString();
44
var testForTypeCoercion = function(type){
55
helper.pg.connect(connectionString, function(err, client) {
66
assert.isNull(err)
7-
client.query("create temp table test_type(col " + type.name + ")");
7+
client.query("create temp table test_type(col " + type.name + ")", assert.calls(function(err, result) {
8+
assert.isNull(err);
9+
test("Coerces " + type.name, function() {
10+
type.values.forEach(function(val) {
811

9-
test("Coerces " + type.name, function() {
10-
type.values.forEach(function(val) {
12+
var insertQuery = client.query('insert into test_type(col) VALUES($1)',[val],assert.calls(function(err, result) {
13+
assert.isNull(err);
14+
}));
1115

12-
var insertQuery = client.query({
13-
name: 'insert type test ' + type.name,
14-
text: 'insert into test_type(col) VALUES($1)',
15-
values: [val]
16-
});
16+
var query = client.query({
17+
name: 'get type ' + type.name ,
18+
text: 'select col from test_type'
19+
});
20+
query.on('error', function(err) {
21+
console.log(err);
22+
throw err;
23+
});
1724

18-
var query = client.query({
19-
name: 'get type ' + type.name ,
20-
text: 'select col from test_type'
21-
});
25+
assert.emits(query, 'row', function(row) {
26+
assert.strictEqual(row.col, val, "expected " + type.name + " of " + val + " but got " + row[0]);
27+
}, "row should have been called for " + type.name + " of " + val);
2228

23-
assert.emits(query, 'row', function(row) {
24-
assert.strictEqual(row.col, val, "expected " + type.name + " of " + val + " but got " + row[0]);
29+
client.query('delete from test_type');
2530
});
2631

27-
client.query({
28-
name: 'delete values',
29-
text: 'delete from test_type'
32+
client.query('drop table test_type', function() {
33+
sink.add();
3034
});
31-
sink.add();
32-
});
33-
34-
client.query('drop table test_type');
35-
});
35+
})
36+
}));
3637
})
3738
};
3839

@@ -82,14 +83,15 @@ var valueCount = 0;
8283
types.forEach(function(type) {
8384
valueCount += type.values.length;
8485
})
85-
sink = new helper.Sink(valueCount, function() {
86+
sink = new helper.Sink(types.length, function() {
8687
helper.pg.end();
8788
})
8889

89-
types.forEach(testForTypeCoercion);
90+
types.forEach(function(type) {
91+
testForTypeCoercion(type)
92+
});
9093

9194
test("timestampz round trip", function() {
92-
9395
var now = new Date();
9496
var client = helper.client();
9597
client.on('error', function(err) {

0 commit comments

Comments
 (0)