Skip to content

Commit 3477bed

Browse files
committed
Merge fetchArraySync and fetchObjectSync to fetchRowSync([options])
Fixes #114
1 parent 3c5c2d9 commit 3477bed

File tree

6 files changed

+153
-113
lines changed

6 files changed

+153
-113
lines changed

doc/examples.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ conn.realQuerySync("SHOW TABLES;");
4949
result = conn.storeResultSync();
5050

5151
util.puts("Tables in database '" + database + "':");
52-
while ((row = result.fetchArraySync())) {
52+
while ((row = result.fetchRowSync({"asArray": true}))) {
5353
util.puts(row[0]);
5454
}
5555
util.puts("");

src/mysql_bindings_result.cc

Lines changed: 45 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,11 @@ void MysqlResult::Init(Handle<Object> target) {
3636
NODE_SET_PROTOTYPE_METHOD(constructor_template, "dataSeekSync", MysqlResult::DataSeekSync);
3737
NODE_SET_PROTOTYPE_METHOD(constructor_template, "fetchAll", MysqlResult::FetchAll);
3838
NODE_SET_PROTOTYPE_METHOD(constructor_template, "fetchAllSync", MysqlResult::FetchAllSync);
39-
NODE_SET_PROTOTYPE_METHOD(constructor_template, "fetchArraySync", MysqlResult::FetchArraySync);
4039
NODE_SET_PROTOTYPE_METHOD(constructor_template, "fetchFieldSync", MysqlResult::FetchFieldSync);
4140
NODE_SET_PROTOTYPE_METHOD(constructor_template, "fetchFieldDirectSync", MysqlResult::FetchFieldDirectSync);
4241
NODE_SET_PROTOTYPE_METHOD(constructor_template, "fetchFieldsSync", MysqlResult::FetchFieldsSync);
4342
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);
4544
NODE_SET_PROTOTYPE_METHOD(constructor_template, "fieldSeekSync", MysqlResult::FieldSeekSync);
4645
NODE_SET_PROTOTYPE_METHOD(constructor_template, "fieldTellSync", MysqlResult::FieldTellSync);
4746
NODE_SET_PROTOTYPE_METHOD(constructor_template, "freeSync", MysqlResult::FreeSync);
@@ -350,9 +349,8 @@ void MysqlResult::EIO_After_FetchAll(uv_work_t *req) {
350349
}
351350

352351
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+
356354
if (fetchAll_req->results_as_array) {
357355
js_result_row->Set(Integer::NewFromUnsigned(j), js_field);
358356
} else if (fetchAll_req->results_nest_tables) {
@@ -560,9 +558,8 @@ Handle<Value> MysqlResult::FetchAllSync(const Arguments& args) {
560558
}
561559

562560
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+
566563
if (results_as_array) {
567564
js_result_row->Set(Integer::NewFromUnsigned(j), js_field);
568565
} else if (results_nest_tables) {
@@ -584,44 +581,6 @@ Handle<Value> MysqlResult::FetchAllSync(const Arguments& args) {
584581
return scope.Close(js_result);
585582
}
586583

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-
625584
/**
626585
* MysqlResult#fetchFieldSync() -> Object
627586
*
@@ -743,39 +702,72 @@ Handle<Value> MysqlResult::FetchLengthsSync(const Arguments& args) {
743702
}
744703

745704
/**
746-
* MysqlResult#fetchObjectSync() -> Object
705+
* MysqlResult#fetchRowSync([options]) -> Array|Object
706+
* - options (Object): Fetch style options (optional)
747707
*
748-
* Fetch a result row as an object
708+
* Fetch one row from result
749709
**/
750-
Handle<Value> MysqlResult::FetchObjectSync(const Arguments& args) {
710+
Handle<Value> MysqlResult::FetchRowSync(const Arguments& args) {
751711
HandleScope scope;
752712

753713
MysqlResult *res = OBJUNWRAP<MysqlResult>(args.Holder());
754714

755715
MYSQLRES_MUSTBE_VALID;
756716

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+
757736
MYSQL_FIELD *fields = mysql_fetch_fields(res->_res);
758737
uint32_t num_fields = mysql_num_fields(res->_res);
759-
MYSQL_ROW result_row;
760738
uint32_t j = 0;
761739

762740
Local<Object> js_result_row;
763741
Local<Value> js_field;
764742

765-
result_row = mysql_fetch_row(res->_res);
743+
MYSQL_ROW result_row = mysql_fetch_row(res->_res);
766744

767745
if (!result_row) {
768746
return scope.Close(False());
769747
}
770748

771749
unsigned long *field_lengths = mysql_fetch_lengths(res->_res);
772750

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+
}
774756

775757
for ( j = 0; j < num_fields; j++ ) {
776758
js_field = GetFieldValue(fields[j], result_row[j], field_lengths[j]);
777759

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+
}
779771
}
780772

781773
return scope.Close(js_result_row);

src/mysql_bindings_result.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,6 @@ class MysqlResult : public node::ObjectWrap {
9696

9797
static Handle<Value> FetchAllSync(const Arguments& args);
9898

99-
static Handle<Value> FetchArraySync(const Arguments& args);
100-
10199
static Handle<Value> FetchFieldSync(const Arguments& args);
102100

103101
static Handle<Value> FetchFieldDirectSync(const Arguments& args);
@@ -106,7 +104,7 @@ class MysqlResult : public node::ObjectWrap {
106104

107105
static Handle<Value> FetchLengthsSync(const Arguments& args);
108106

109-
static Handle<Value> FetchObjectSync(const Arguments& args);
107+
static Handle<Value> FetchRowSync(const Arguments& args);
110108

111109
static Handle<Value> FieldSeekSync(const Arguments& args);
112110

0 commit comments

Comments
 (0)