@@ -36,12 +36,11 @@ void MysqlResult::Init(Handle<Object> target) {
36
36
NODE_SET_PROTOTYPE_METHOD (constructor_template, " dataSeekSync" , MysqlResult::DataSeekSync);
37
37
NODE_SET_PROTOTYPE_METHOD (constructor_template, " fetchAll" , MysqlResult::FetchAll);
38
38
NODE_SET_PROTOTYPE_METHOD (constructor_template, " fetchAllSync" , MysqlResult::FetchAllSync);
39
- NODE_SET_PROTOTYPE_METHOD (constructor_template, " fetchArraySync" , MysqlResult::FetchArraySync);
40
39
NODE_SET_PROTOTYPE_METHOD (constructor_template, " fetchFieldSync" , MysqlResult::FetchFieldSync);
41
40
NODE_SET_PROTOTYPE_METHOD (constructor_template, " fetchFieldDirectSync" , MysqlResult::FetchFieldDirectSync);
42
41
NODE_SET_PROTOTYPE_METHOD (constructor_template, " fetchFieldsSync" , MysqlResult::FetchFieldsSync);
43
42
NODE_SET_PROTOTYPE_METHOD (constructor_template, " fetchLengthsSync" , MysqlResult::FetchLengthsSync);
44
- NODE_SET_PROTOTYPE_METHOD (constructor_template, " fetchObjectSync " , MysqlResult::FetchObjectSync );
43
+ NODE_SET_PROTOTYPE_METHOD (constructor_template, " fetchRowSync " , MysqlResult::FetchRowSync );
45
44
NODE_SET_PROTOTYPE_METHOD (constructor_template, " fieldSeekSync" , MysqlResult::FieldSeekSync);
46
45
NODE_SET_PROTOTYPE_METHOD (constructor_template, " fieldTellSync" , MysqlResult::FieldTellSync);
47
46
NODE_SET_PROTOTYPE_METHOD (constructor_template, " freeSync" , MysqlResult::FreeSync);
@@ -350,9 +349,8 @@ void MysqlResult::EIO_After_FetchAll(uv_work_t *req) {
350
349
}
351
350
352
351
for (j = 0 ; j < num_fields; j++) {
353
- js_field = GetFieldValue (fields[j],
354
- result_row[j],
355
- field_lengths[j]);
352
+ js_field = GetFieldValue (fields[j], result_row[j], field_lengths[j]);
353
+
356
354
if (fetchAll_req->results_as_array ) {
357
355
js_result_row->Set (Integer::NewFromUnsigned (j), js_field);
358
356
} else if (fetchAll_req->results_nest_tables ) {
@@ -560,9 +558,8 @@ Handle<Value> MysqlResult::FetchAllSync(const Arguments& args) {
560
558
}
561
559
562
560
for (j = 0 ; j < num_fields; j++) {
563
- js_field = GetFieldValue (fields[j],
564
- result_row[j],
565
- field_lengths[j]);
561
+ js_field = GetFieldValue (fields[j], result_row[j], field_lengths[j]);
562
+
566
563
if (results_as_array) {
567
564
js_result_row->Set (Integer::NewFromUnsigned (j), js_field);
568
565
} else if (results_nest_tables) {
@@ -584,44 +581,6 @@ Handle<Value> MysqlResult::FetchAllSync(const Arguments& args) {
584
581
return scope.Close (js_result);
585
582
}
586
583
587
- /* *
588
- * MysqlResult#fetchArraySync() -> Array
589
- *
590
- * Fetch a result row as an array
591
- **/
592
- Handle<Value> MysqlResult::FetchArraySync (const Arguments& args) {
593
- HandleScope scope;
594
-
595
- MysqlResult *res = OBJUNWRAP<MysqlResult>(args.Holder ());
596
-
597
- MYSQLRES_MUSTBE_VALID;
598
-
599
- MYSQL_FIELD *fields = mysql_fetch_fields (res->_res );
600
- uint32_t num_fields = mysql_num_fields (res->_res );
601
- uint32_t j = 0 ;
602
-
603
- Local<Array> js_result_row;
604
- Local<Value> js_field;
605
-
606
- MYSQL_ROW result_row = mysql_fetch_row (res->_res );
607
-
608
- if (!result_row) {
609
- return scope.Close (False ());
610
- }
611
-
612
- unsigned long *field_lengths = mysql_fetch_lengths (res->_res );
613
-
614
- js_result_row = Array::New ();
615
-
616
- for ( j = 0 ; j < num_fields; j++ ) {
617
- js_field = GetFieldValue (fields[j], result_row[j], field_lengths[j]);
618
-
619
- js_result_row->Set (Integer::NewFromUnsigned (j), js_field);
620
- }
621
-
622
- return scope.Close (js_result_row);
623
- }
624
-
625
584
/* *
626
585
* MysqlResult#fetchFieldSync() -> Object
627
586
*
@@ -743,39 +702,72 @@ Handle<Value> MysqlResult::FetchLengthsSync(const Arguments& args) {
743
702
}
744
703
745
704
/* *
746
- * MysqlResult#fetchObjectSync() -> Object
705
+ * MysqlResult#fetchRowSync([options]) -> Array|Object
706
+ * - options (Object): Fetch style options (optional)
747
707
*
748
- * Fetch a result row as an object
708
+ * Fetch one row from result
749
709
**/
750
- Handle<Value> MysqlResult::FetchObjectSync (const Arguments& args) {
710
+ Handle<Value> MysqlResult::FetchRowSync (const Arguments& args) {
751
711
HandleScope scope;
752
712
753
713
MysqlResult *res = OBJUNWRAP<MysqlResult>(args.Holder ());
754
714
755
715
MYSQLRES_MUSTBE_VALID;
756
716
717
+ bool results_as_array = false ;
718
+ bool results_nest_tables = false ;
719
+
720
+ if (args.Length () > 0 ) {
721
+ if (!args[0 ]->IsObject ()) {
722
+ return THREXC (" fetchRowSync can handle only (options) or none arguments" );
723
+ }
724
+ if (args[0 ]->ToObject ()->Has (V8STR (" asArray" ))) {
725
+ results_as_array = args[0 ]->ToObject ()->Get (V8STR (" asArray" ))->BooleanValue ();
726
+ }
727
+ if (args[0 ]->ToObject ()->Has (V8STR (" nestTables" ))) {
728
+ results_nest_tables = args[0 ]->ToObject ()->Get (V8STR (" nestTables" ))->BooleanValue ();
729
+ }
730
+ }
731
+
732
+ if (results_as_array && results_nest_tables) {
733
+ return THREXC (" You can't mix 'asArray' and 'nestTables' options" );
734
+ }
735
+
757
736
MYSQL_FIELD *fields = mysql_fetch_fields (res->_res );
758
737
uint32_t num_fields = mysql_num_fields (res->_res );
759
- MYSQL_ROW result_row;
760
738
uint32_t j = 0 ;
761
739
762
740
Local<Object> js_result_row;
763
741
Local<Value> js_field;
764
742
765
- result_row = mysql_fetch_row (res->_res );
743
+ MYSQL_ROW result_row = mysql_fetch_row (res->_res );
766
744
767
745
if (!result_row) {
768
746
return scope.Close (False ());
769
747
}
770
748
771
749
unsigned long *field_lengths = mysql_fetch_lengths (res->_res );
772
750
773
- js_result_row = Object::New ();
751
+ if (results_as_array) {
752
+ js_result_row = Array::New ();
753
+ } else {
754
+ js_result_row = Object::New ();
755
+ }
774
756
775
757
for ( j = 0 ; j < num_fields; j++ ) {
776
758
js_field = GetFieldValue (fields[j], result_row[j], field_lengths[j]);
777
759
778
- js_result_row->Set (V8STR (fields[j].name ), js_field);
760
+ if (results_as_array) {
761
+ js_result_row->Set (Integer::NewFromUnsigned (j), js_field);
762
+ } else if (results_nest_tables) {
763
+ if (!js_result_row->Has (V8STR (fields[j].table ))) {
764
+ js_result_row->Set (V8STR (fields[j].table ), Object::New ());
765
+ }
766
+ js_result_row->Get (V8STR (fields[j].table ))->ToObject ()
767
+ ->Set (V8STR (fields[j].name ), js_field);
768
+ } else {
769
+ js_result_row->Set (V8STR (fields[j].name ), js_field);
770
+ }
779
771
}
780
772
781
773
return scope.Close (js_result_row);
0 commit comments