@@ -61,7 +61,7 @@ class Connection : public ObjectWrap {
61
61
routine_symbol = NODE_PSYMBOL (" routine" );
62
62
name_symbol = NODE_PSYMBOL (" name" );
63
63
value_symbol = NODE_PSYMBOL (" value" );
64
- type_symbol = NODE_PSYMBOL (" type " );
64
+ type_symbol = NODE_PSYMBOL (" dataTypeID " );
65
65
channel_symbol = NODE_PSYMBOL (" channel" );
66
66
payload_symbol = NODE_PSYMBOL (" payload" );
67
67
command_symbol = NODE_PSYMBOL (" command" );
@@ -522,13 +522,41 @@ class Connection : public ObjectWrap {
522
522
}
523
523
return false ;
524
524
}
525
+
526
+ // maps the postgres tuple results to v8 objects
527
+ // and emits row events
528
+ // TODO look at emitting fewer events because the back & forth between
529
+ // javascript & c++ might introduce overhead (requires benchmarking)
530
+ void EmitRowDescription (const PGresult* result)
531
+ {
532
+ HandleScope scope;
533
+ Local<Array> row = Array::New ();
534
+ int fieldCount = PQnfields (result);
535
+ for (int fieldNumber = 0 ; fieldNumber < fieldCount; fieldNumber++) {
536
+ Local<Object> field = Object::New ();
537
+ // name of field
538
+ char * fieldName = PQfname (result, fieldNumber);
539
+ field->Set (name_symbol, String::New (fieldName));
540
+
541
+ // oid of type of field
542
+ int fieldType = PQftype (result, fieldNumber);
543
+ field->Set (type_symbol, Integer::New (fieldType));
544
+
545
+ row->Set (Integer::New (fieldNumber), field);
546
+ }
547
+
548
+ Handle <Value> e = (Handle <Value>)row;
549
+ Emit (" _rowDescription" , &e);
550
+ }
551
+
525
552
bool HandleResult (PGresult* result)
526
553
{
527
554
TRACE (" PQresultStatus" );
528
555
ExecStatusType status = PQresultStatus (result);
529
556
switch (status) {
530
557
case PGRES_TUPLES_OK:
531
558
{
559
+ EmitRowDescription (result);
532
560
HandleTuplesResult (result);
533
561
EmitCommandMetaData (result);
534
562
return true ;
@@ -592,24 +620,14 @@ class Connection : public ObjectWrap {
592
620
Local<Array> row = Array::New ();
593
621
int fieldCount = PQnfields (result);
594
622
for (int fieldNumber = 0 ; fieldNumber < fieldCount; fieldNumber++) {
595
- Local<Object> field = Object::New ();
596
- // name of field
597
- char * fieldName = PQfname (result, fieldNumber);
598
- field->Set (name_symbol, String::New (fieldName));
599
-
600
- // oid of type of field
601
- int fieldType = PQftype (result, fieldNumber);
602
- field->Set (type_symbol, Integer::New (fieldType));
603
623
604
624
// value of field
605
625
if (PQgetisnull (result, rowNumber, fieldNumber)) {
606
- field ->Set (value_symbol , Null ());
626
+ row ->Set (Integer::New (fieldNumber) , Null ());
607
627
} else {
608
628
char * fieldValue = PQgetvalue (result, rowNumber, fieldNumber);
609
- field ->Set (value_symbol , String::New (fieldValue));
629
+ row ->Set (Integer::New (fieldNumber) , String::New (fieldValue));
610
630
}
611
-
612
- row->Set (Integer::New (fieldNumber), field);
613
631
}
614
632
615
633
Handle <Value> e = (Handle <Value>)row;
0 commit comments