@@ -1997,6 +1997,16 @@ bool StatementSync::BindValue(const Local<Value>& value, const int index) {
19971997 return true ;
19981998}
19991999
2000+ MaybeLocal<Value> ColumnToValue (Isolate* isolate,
2001+ sqlite3_stmt* statement,
2002+ const int column,
2003+ const bool use_big_ints) {
2004+ MaybeLocal<Value> js_val = MaybeLocal<Value>();
2005+ SQLITE_VALUE_TO_JS (
2006+ column, isolate, use_big_ints, js_val, statement, column);
2007+ return js_val;
2008+ }
2009+
20002010MaybeLocal<Value> StatementSync::ColumnToValue (const int column) {
20012011 Isolate* isolate = env ()->isolate ();
20022012 MaybeLocal<Value> js_val = MaybeLocal<Value>();
@@ -2017,6 +2027,20 @@ MaybeLocal<Name> StatementSync::ColumnNameToName(const int column) {
20172027
20182028void StatementSync::MemoryInfo (MemoryTracker* tracker) const {}
20192029
2030+ bool ExtractRowValues (LocalVector<Value>& row_values,
2031+ int num_cols,
2032+ StatementSync* stmt) {
2033+ row_values.clear ();
2034+ row_values.reserve (num_cols);
2035+
2036+ for (int i = 0 ; i < num_cols; ++i) {
2037+ Local<Value> val;
2038+ if (!stmt->ColumnToValue (i).ToLocal (&val)) return false ;
2039+ row_values.emplace_back (val);
2040+ }
2041+ return true ;
2042+ }
2043+
20202044void StatementSync::All (const FunctionCallbackInfo<Value>& args) {
20212045 StatementSync* stmt;
20222046 ASSIGN_OR_RETURN_UNWRAP (&stmt, args.This ());
@@ -2034,24 +2058,16 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20342058 auto reset = OnScopeLeave ([&]() { sqlite3_reset (stmt->statement_ ); });
20352059 int num_cols = sqlite3_column_count (stmt->statement_ );
20362060 LocalVector<Value> rows (isolate);
2061+ LocalVector<Value> row_values (isolate);
2062+ LocalVector<Name> row_keys (isolate);
20372063
2038- if (stmt->return_arrays_ ) {
2039- while ((r = sqlite3_step (stmt->statement_ )) == SQLITE_ROW) {
2040- LocalVector<Value> array_values (isolate);
2041- array_values.reserve (num_cols);
2042- for (int i = 0 ; i < num_cols; ++i) {
2043- Local<Value> val;
2044- if (!stmt->ColumnToValue (i).ToLocal (&val)) return ;
2045- array_values.emplace_back (val);
2046- }
2064+ while ((r = sqlite3_step (stmt->statement_ )) == SQLITE_ROW) {
2065+ if (!ExtractRowValues (row_values, num_cols, stmt)) return ;
2066+ if (stmt->return_arrays_ ) {
20472067 Local<Array> row_array =
2048- Array::New (isolate, array_values .data (), array_values .size ());
2068+ Array::New (isolate, row_values .data (), row_values .size ());
20492069 rows.emplace_back (row_array);
2050- }
2051- } else {
2052- LocalVector<Name> row_keys (isolate);
2053-
2054- while ((r = sqlite3_step (stmt->statement_ )) == SQLITE_ROW) {
2070+ } else {
20552071 if (row_keys.size () == 0 ) {
20562072 row_keys.reserve (num_cols);
20572073 for (int i = 0 ; i < num_cols; ++i) {
@@ -2061,14 +2077,6 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20612077 }
20622078 }
20632079
2064- LocalVector<Value> row_values (isolate);
2065- row_values.reserve (num_cols);
2066- for (int i = 0 ; i < num_cols; ++i) {
2067- Local<Value> val;
2068- if (!stmt->ColumnToValue (i).ToLocal (&val)) return ;
2069- row_values.emplace_back (val);
2070- }
2071-
20722080 DCHECK_EQ (row_keys.size (), row_values.size ());
20732081 Local<Object> row_obj = Object::New (
20742082 isolate, Null (isolate), row_keys.data (), row_values.data (), num_cols);
@@ -2546,28 +2554,18 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
25462554
25472555 int num_cols = sqlite3_column_count (iter->stmt_ ->statement_ );
25482556 Local<Value> row_value;
2557+ LocalVector<Name> row_keys (isolate);
2558+ LocalVector<Value> row_values (isolate);
25492559
2560+ if (!ExtractRowValues (row_values, num_cols, iter->stmt_ .get ())) return ;
25502561 if (iter->stmt_ ->return_arrays_ ) {
2551- LocalVector<Value> array_values (isolate);
2552- array_values.reserve (num_cols);
2553- for (int i = 0 ; i < num_cols; ++i) {
2554- Local<Value> val;
2555- if (!iter->stmt_ ->ColumnToValue (i).ToLocal (&val)) return ;
2556- array_values.emplace_back (val);
2557- }
2558- row_value = Array::New (isolate, array_values.data (), array_values.size ());
2562+ row_value = Array::New (isolate, row_values.data (), row_values.size ());
25592563 } else {
2560- LocalVector<Name> row_keys (isolate);
2561- LocalVector<Value> row_values (isolate);
25622564 row_keys.reserve (num_cols);
2563- row_values.reserve (num_cols);
25642565 for (int i = 0 ; i < num_cols; ++i) {
25652566 Local<Name> key;
25662567 if (!iter->stmt_ ->ColumnNameToName (i).ToLocal (&key)) return ;
2567- Local<Value> val;
2568- if (!iter->stmt_ ->ColumnToValue (i).ToLocal (&val)) return ;
25692568 row_keys.emplace_back (key);
2570- row_values.emplace_back (val);
25712569 }
25722570
25732571 DCHECK_EQ (row_keys.size (), row_values.size ());
0 commit comments