Skip to content

Commit b76ced7

Browse files
author
bmc
committed
begin type coercion for libpq
1 parent 47591d6 commit b76ced7

File tree

5 files changed

+35
-6
lines changed

5 files changed

+35
-6
lines changed

lib/native.js

+18-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,24 @@ var NativeQuery = function(text, values, callback) {
136136
sys.inherits(NativeQuery, EventEmitter);
137137
var p = NativeQuery.prototype;
138138

139-
p.handleRow = function(row) {
139+
//maps from native rowdata into api compatible row object
140+
var mapRowData = function(row) {
141+
var result = {};
142+
for(var i = 0, len = row.length; i < len; i++) {
143+
var item = row[i];
144+
switch(item.type) {
145+
case 23:
146+
result[item.name] = parseInt(item.value);
147+
break;
148+
default:
149+
result[item.name] = item.value;
150+
}
151+
}
152+
return result;
153+
}
154+
155+
p.handleRow = function(rowData) {
156+
var row = mapRowData(rowData);
140157
if(this.callback) {
141158
this.rows.push(row);
142159
}

src/binding.cc

+9-2
Original file line numberDiff line numberDiff line change
@@ -330,11 +330,18 @@ class Connection : public EventEmitter {
330330
int rowCount = PQntuples(result);
331331
for(int rowNumber = 0; rowNumber < rowCount; rowNumber++) {
332332
//create result object for this row
333-
Local<Object> row = Object::New();
333+
Local<Array> row = Array::New();
334334
int fieldCount = PQnfields(result);
335335
for(int fieldNumber = 0; fieldNumber < fieldCount; fieldNumber++) {
336+
Local<Object> field = Object::New();
336337
char* fieldName = PQfname(result, fieldNumber);
337-
row->Set(String::New(fieldName), WrapFieldValue(result, rowNumber, fieldNumber));
338+
int fieldType = PQftype(result, fieldNumber);
339+
char* fieldValue = PQgetvalue(result, rowNumber, fieldNumber);
340+
//TODO use symbols here
341+
field->Set(String::New("name"), String::New(fieldName));
342+
field->Set(String::New("value"), String::New(fieldValue));
343+
field->Set(String::New("type"), Integer::New(fieldType));
344+
row->Set(Integer::New(fieldNumber), field);
338345
}
339346

340347
//not sure about what to dealloc or scope#Close here

test/cli.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ for(var i = 0; i < args.length; i++) {
3838
case '-t':
3939
case '--test':
4040
config.test = args[++i];
41-
case '--libpq':
42-
config.libpq = (args[++i] == "true");
41+
case '--native':
42+
config.native = (args[++i] == "true");
4343
default:
4444
break;
4545
}

test/integration/client/api-tests.js

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
var helper = require(__dirname + '/../test-helper');
22
var pg = require(__dirname + '/../../../lib');
3+
4+
if(helper.args.native) {
5+
pg = require(__dirname + '/../../../lib/native')
6+
}
7+
38
if(helper.args.libpq) {
49
pg = require(__dirname + "/../../../lib/binding");
510
}

wscript

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Options, Utils
22
from os import unlink, symlink, popen
3-
from os.path import exists
3+
from os.path import exists
44

55
srcdir = '.'
66
blddir = 'build'

0 commit comments

Comments
 (0)