11// .pragma(string sql, [boolean simpleResult]) -> array
22
3- Data::Row* PragmaMakeRowOfStrings (char ** strings, int len) {
4- Data::Row* row = new Data::Row ();
5- row->column_count = len;
6- row->values = new Data::Value* [len];
7- for (int i=0 ; i<len; ++i) {
8- row->values [i] = new Data::Text (Nan::New (strings[i]).ToLocalChecked ());
9- }
10- return row;
11- }
3+ typedef struct PragmaInfo {
4+ v8::Local<v8::Value> rows;
5+ bool simple;
6+ bool after_first;
7+ } PragmaInfo;
128
139int PragmaCallback (void * x, int column_count, char ** results, char ** column_names) {
14- List<Data::Row>* table = static_cast <List<Data::Row>*>(x);
15- table[0 ].Add (PragmaMakeRowOfStrings (column_names, column_count));
16- table[1 ].Add (PragmaMakeRowOfStrings (results, column_count));
10+ PragmaInfo* pragma_info = static_cast <PragmaInfo*>(x);
11+
12+ if (pragma_info->simple ) {
13+ if (!pragma_info->after_first ) {
14+ pragma_info->after_first = true ;
15+ pragma_info->rows = Nan::New (results[0 ]).ToLocalChecked ();
16+ }
17+ } else {
18+ v8::Local<v8::Object> row = Nan::New<v8::Object>();
19+ for (int i=0 ; i<column_count; ++i) {
20+ Nan::Set (row, Nan::New (column_names[i]).ToLocalChecked (), Nan::New (results[i]).ToLocalChecked ());
21+ }
22+ v8::Local<v8::Array> rows = v8::Local<v8::Array>::Cast (pragma_info->rows );
23+ Nan::Set (rows, rows->Length (), row);
24+ }
25+
1726 return 0 ;
1827}
1928
@@ -34,35 +43,18 @@ NAN_METHOD(Database::Pragma) {
3443 char * err;
3544
3645 // Executes the SQL on the database handle.
37- List<Data::Row> table[ 2 ] {List<Data::Row>{}, List<Data::Row>{} };
38- sqlite3_exec (db->db_handle , *utf8, PragmaCallback, table , &err);
46+ PragmaInfo pragma_info = {Nan::New<v8::Array>(), simple_result, false };
47+ sqlite3_exec (db->db_handle , *utf8, PragmaCallback, &pragma_info , &err);
3948 if (err != NULL ) {
4049 CONCAT2 (message, " SQLite: " , err);
4150 sqlite3_free (err);
4251 return Nan::ThrowError (message);
4352 }
4453 sqlite3_free (err);
4554
46- if (simple_result) {
47- Data::Row* values = table[1 ].Shift ();
48- if (values == NULL ) {
49- info.GetReturnValue ().Set (Nan::Undefined ());
50- } else {
51- info.GetReturnValue ().Set (values->values [0 ]->ToJS ());
52- }
53- delete values;
55+ if (simple_result && !pragma_info.after_first ) {
56+ info.GetReturnValue ().Set (Nan::Undefined ());
5457 } else {
55- unsigned int i = 0 ;
56- v8::Local<v8::Array> arr = Nan::New<v8::Array>();
57- table[0 ].Flush ([&arr, &i, &table] (Data::Row* keys) {
58- Data::Row* values = table[1 ].Shift ();
59- v8::Local<v8::Object> object = Nan::New<v8::Object>();
60- for (int j=0 ; j<keys->column_count ; ++j) {
61- Nan::Set (object, v8::Local<v8::String>::Cast (keys->values [j]->ToJS ()), values->values [j]->ToJS ());
62- }
63- Nan::Set (arr, i++, object);
64- delete values;
65- });
66- info.GetReturnValue ().Set (arr);
58+ info.GetReturnValue ().Set (pragma_info.rows );
6759 }
6860}
0 commit comments