Skip to content

Commit 4e1354b

Browse files
committed
Add possibility to use hash with options in res.fetchAll*(), extract tests with options to complex/test-fetchAll.js
1 parent 46f34af commit 4e1354b

File tree

3 files changed

+176
-68
lines changed

3 files changed

+176
-68
lines changed

src/mysql_bindings_result.cc

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,7 @@ int MysqlResult::EIO_FetchAll(eio_req *req) {
413413
/**
414414
* Fetches all result rows as an array
415415
*
416+
* @param {Boolean|Object} 'results_array' (optional)
416417
* @param {Function(error, rows)} callback
417418
*/
418419
Handle<Value> MysqlResult::FetchAll(const Arguments& args) {
@@ -422,10 +423,22 @@ Handle<Value> MysqlResult::FetchAll(const Arguments& args) {
422423
#else
423424
int arg_pos = 0;
424425
bool results_array = false;
425-
if(args.Length() > arg_pos && args[arg_pos]->IsBoolean()) {
426-
results_array = args[arg_pos]->BooleanValue();
427-
arg_pos++;
426+
427+
if (args.Length() > 0) {
428+
if (args[0]->IsBoolean()) {
429+
results_array = args[0]->BooleanValue();
430+
arg_pos++;
431+
} else if (args[0]->IsObject() && !args[0]->IsFunction()) {
432+
if (args[0]->ToObject()->Has(V8STR("array"))) {
433+
results_array = args[0]->ToObject()
434+
->Get(V8STR("array"))->BooleanValue();
435+
}
436+
arg_pos++;
437+
}
438+
// NOT here, because any function is object
439+
// arg_pos++;
428440
}
441+
429442
REQ_FUN_ARG(arg_pos, callback)
430443

431444
MysqlResult *res = OBJUNWRAP<MysqlResult>(args.This()); // NOLINT
@@ -456,6 +469,7 @@ Handle<Value> MysqlResult::FetchAll(const Arguments& args) {
456469
/**
457470
* Fetches all result rows as an array
458471
*
472+
* @param {Boolean|Object} 'results_array' (optional)
459473
* @return {Array}
460474
*/
461475
Handle<Value> MysqlResult::FetchAllSync(const Arguments& args) {
@@ -465,7 +479,18 @@ Handle<Value> MysqlResult::FetchAllSync(const Arguments& args) {
465479

466480
MYSQLRES_MUSTBE_VALID;
467481

468-
bool results_array = (args.Length() > 0 && args[0]->IsBoolean()) ? args[0]->BooleanValue() : false;
482+
bool results_array = false;
483+
484+
if (args.Length() > 0) {
485+
if (args[0]->IsBoolean()) {
486+
results_array = args[0]->BooleanValue();
487+
} else if (args[0]->IsObject()) {
488+
if (args[0]->ToObject()->Has(V8STR("array"))) {
489+
results_array = args[0]->ToObject()
490+
->Get(V8STR("array"))->BooleanValue();
491+
}
492+
}
493+
}
469494

470495
MYSQL_FIELD *fields = mysql_fetch_fields(res->_res);
471496
uint32_t num_fields = mysql_num_fields(res->_res);

tests/complex/test-fetchAll.js

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
/*
2+
Copyright (C) 2010, Oleg Efimov <[email protected]>
3+
4+
See license text in LICENSE file
5+
*/
6+
7+
// Load configuration
8+
var cfg = require("../config").cfg;
9+
10+
// Require modules
11+
var
12+
mysql_libmysqlclient = require("../../mysql-libmysqlclient");
13+
14+
exports.FetchAllWithBooleanOption = function (test) {
15+
test.expect(9);
16+
17+
var
18+
conn = mysql_libmysqlclient.createConnectionSync(cfg.host, cfg.user, cfg.password, cfg.database),
19+
res;
20+
test.ok(conn, "mysql_libmysqlclient.createConnectionSync(host, user, password, database)");
21+
22+
res = conn.querySync("SELECT size, colors FROM " + cfg.test_table + " WHERE size='small';");
23+
test.ok(res, "SELECT");
24+
25+
res.fetchAll(false, function (err, rows) {
26+
test.ok(err === null, "res.fetchAll() err===null");
27+
test.same(rows, [{size: 'small', colors: ['red']}], "conn.querySync('SELECT ...').fetchAllSync(false)");
28+
res.freeSync();
29+
30+
res = conn.querySync("SELECT size, colors FROM " + cfg.test_table + " WHERE size='small';");
31+
test.ok(res, "SELECT");
32+
33+
res.fetchAll(true, function (err, rows) {
34+
test.ok(err === null, "res.fetchAll() err===null");
35+
test.ok(Array.isArray(rows), "Result returns an array");
36+
test.ok(Array.isArray(rows[0]), "Result returns an array of arrays");
37+
test.same(rows, [['small', ['red']]], "conn.querySync('SELECT ...').fetchAll(true)");
38+
res.freeSync();
39+
40+
conn.closeSync();
41+
test.done();
42+
});
43+
});
44+
};
45+
46+
exports.FetchAllSyncWithBooleanOption = function (test) {
47+
test.expect(7);
48+
49+
var
50+
conn = mysql_libmysqlclient.createConnectionSync(cfg.host, cfg.user, cfg.password, cfg.database),
51+
res,
52+
rows;
53+
test.ok(conn, "mysql_libmysqlclient.createConnectionSync(host, user, password, database)");
54+
55+
res = conn.querySync("SELECT size, colors FROM " + cfg.test_table + " WHERE size='small';");
56+
test.ok(res, "SELECT");
57+
58+
rows = res.fetchAllSync(false);
59+
test.same(rows, [{size: 'small', colors: ['red']}], "conn.querySync('SELECT ...').fetchAllSync(false)");
60+
res.freeSync();
61+
62+
res = conn.querySync("SELECT size, colors FROM " + cfg.test_table + " WHERE size='small';");
63+
test.ok(res, "SELECT");
64+
65+
rows = res.fetchAllSync(true);
66+
test.ok(Array.isArray(rows), "Result returns an array");
67+
test.ok(Array.isArray(rows[0]), "Result returns an array of arrays");
68+
test.same(rows, [['small', ['red']]], "conn.querySync('SELECT ...').fetchAllSync(true)");
69+
res.freeSync();
70+
71+
conn.closeSync();
72+
test.done();
73+
};
74+
75+
exports.FetchAllWithObjectArrayOption = function (test) {
76+
test.expect(9);
77+
78+
var
79+
conn = mysql_libmysqlclient.createConnectionSync(cfg.host, cfg.user, cfg.password, cfg.database),
80+
res;
81+
test.ok(conn, "mysql_libmysqlclient.createConnectionSync(host, user, password, database)");
82+
83+
res = conn.querySync("SELECT size, colors FROM " + cfg.test_table + " WHERE size='small';");
84+
test.ok(res, "SELECT");
85+
86+
res.fetchAll({'array': false}, function (err, rows) {
87+
test.ok(err === null, "res.fetchAll() err===null");
88+
test.same(rows, [{size: 'small', colors: ['red']}], "conn.querySync('SELECT ...').fetchAllSync({'array': false})");
89+
res.freeSync();
90+
91+
res = conn.querySync("SELECT size, colors FROM " + cfg.test_table + " WHERE size='small';");
92+
test.ok(res, "SELECT");
93+
94+
res.fetchAll({'array': true}, function (err, rows) {
95+
test.ok(err === null, "res.fetchAll() err===null");
96+
test.ok(Array.isArray(rows), "Result returns an array");
97+
test.ok(Array.isArray(rows[0]), "Result returns an array of arrays");
98+
test.same(rows, [['small', ['red']]], "conn.querySync('SELECT ...').fetchAll({'array': true})");
99+
res.freeSync();
100+
101+
conn.closeSync();
102+
test.done();
103+
});
104+
});
105+
};
106+
107+
exports.FetchAllSyncWithObjectArrayOption = function (test) {
108+
test.expect(7);
109+
110+
var
111+
conn = mysql_libmysqlclient.createConnectionSync(cfg.host, cfg.user, cfg.password, cfg.database),
112+
res,
113+
rows;
114+
test.ok(conn, "mysql_libmysqlclient.createConnectionSync(host, user, password, database)");
115+
116+
res = conn.querySync("SELECT size, colors FROM " + cfg.test_table + " WHERE size='small';");
117+
test.ok(res, "SELECT");
118+
119+
rows = res.fetchAllSync({'array': false});
120+
test.same(rows, [{size: 'small', colors: ['red']}], "conn.querySync('SELECT ...').fetchAllSync({'array': false})");
121+
res.freeSync();
122+
123+
res = conn.querySync("SELECT size, colors FROM " + cfg.test_table + " WHERE size='small';");
124+
test.ok(res, "SELECT");
125+
126+
rows = res.fetchAllSync({'array': true});
127+
test.ok(Array.isArray(rows), "Result returns an array");
128+
test.ok(Array.isArray(rows[0]), "Result returns an array of arrays");
129+
test.same(rows, [['small', ['red']]], "conn.querySync('SELECT ...').fetchAllSync({'array': true})");
130+
res.freeSync();
131+
132+
conn.closeSync();
133+
test.done();
134+
};
135+

tests/simple/test-class-mysqlresult.js

Lines changed: 12 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -114,59 +114,6 @@ exports.FetchAll = function (test) {
114114
res;
115115
test.ok(conn, "mysql_libmysqlclient.createConnectionSync(host, user, password, database)");
116116

117-
res = conn.querySync("SHOW TABLES;");
118-
test.ok(res, "conn.querySync('SHOW TABLES;')");
119-
120-
res.fetchAll(function (err, tables) {
121-
test.ok(err === null, "res.fetchAll() err===null");
122-
test.ok(tables, "res.fetchAll() result");
123-
conn.closeSync();
124-
125-
test.done();
126-
});
127-
};
128-
129-
exports.FetchAllWithArrayOption = function (test) {
130-
test.expect(5);
131-
132-
var conn = mysql_libmysqlclient.createConnectionSync(cfg.host, cfg.user, cfg.password, cfg.database),
133-
res;
134-
test.ok(conn, "mysql_libmysqlclient.createConnectionSync(host, user, password, database)");
135-
136-
res = conn.querySync("SHOW TABLES;");
137-
test.ok(res, "conn.querySync('SHOW TABLES;')");
138-
139-
res.fetchAll(true,function (err, tables) {
140-
test.ok(err === null, "res.fetchAll() err===null");
141-
test.ok(tables, "res.fetchAll() result");
142-
test.ok(Array.isArray(tables[0]), "Result returns an array of array");
143-
conn.closeSync();
144-
145-
test.done();
146-
});
147-
};
148-
149-
exports.FetchAllSync = function (test) {
150-
test.expect(7);
151-
152-
var conn = mysql_libmysqlclient.createConnectionSync(cfg.host, cfg.user, cfg.password, cfg.database),
153-
res,
154-
tables,
155-
rows;
156-
test.ok(conn, "mysql_libmysqlclient.createConnectionSync(host, user, password, database)");
157-
158-
res = conn.querySync("SHOW TABLES;");
159-
test.ok(res, "conn.querySync('SHOW TABLES;')");
160-
tables = res.fetchAllSync();
161-
test.ok(tables, "res.fetchAllSync()");
162-
res = false;
163-
tables.forEach(function (table) {
164-
if (table.Tables_in_test === cfg.test_table) {
165-
res = true;
166-
}
167-
});
168-
test.ok(res, "res.fetchAllSync() show test table");
169-
170117
res = conn.querySync("DELETE FROM " + cfg.test_table + ";");
171118
res = conn.querySync("INSERT INTO " + cfg.test_table +
172119
" (random_number, random_boolean) VALUES ('1', '1');") && res;
@@ -178,17 +125,19 @@ exports.FetchAllSync = function (test) {
178125

179126
res = conn.querySync("SELECT random_number from " + cfg.test_table +
180127
" WHERE random_boolean='0';");
181-
test.ok(res, "SELECT");
182-
rows = res.fetchAllSync();
183-
test.same(rows, [{random_number: 3}], "conn.querySync('SELECT ...').fetchAllSync()");
184-
185-
conn.closeSync();
186128

187-
test.done();
129+
res.fetchAll(function (err, rows) {
130+
test.ok(err === null, "res.fetchAll() err===null");
131+
test.same(rows, [{random_number: 3}], "conn.querySync('SELECT ...').fetchAll()");
132+
res.freeSync();
133+
conn.closeSync();
134+
135+
test.done();
136+
});
188137
};
189138

190-
exports.FetchAllSyncWithArrayOption = function (test) {
191-
test.expect(8);
139+
exports.FetchAllSync = function (test) {
140+
test.expect(7);
192141

193142
var conn = mysql_libmysqlclient.createConnectionSync(cfg.host, cfg.user, cfg.password, cfg.database),
194143
res,
@@ -220,9 +169,8 @@ exports.FetchAllSyncWithArrayOption = function (test) {
220169
res = conn.querySync("SELECT random_number from " + cfg.test_table +
221170
" WHERE random_boolean='0';");
222171
test.ok(res, "SELECT");
223-
rows = res.fetchAllSync(true);
224-
test.ok(Array.isArray(rows[0]), "Result returns an array of array");
225-
test.same(rows, [[3]], "conn.querySync('SELECT ...').fetchAllSync()");
172+
rows = res.fetchAllSync();
173+
test.same(rows, [{random_number: 3}], "conn.querySync('SELECT ...').fetchAllSync()");
226174

227175
conn.closeSync();
228176

0 commit comments

Comments
 (0)