@@ -2017,6 +2017,20 @@ MaybeLocal<Name> StatementSync::ColumnNameToName(const int column) {
20172017
20182018void StatementSync::MemoryInfo (MemoryTracker* tracker) const {}
20192019
2020+ bool ExtractRowValues (LocalVector<Value>& row_values,
2021+ int num_cols,
2022+ StatementSync* stmt) {
2023+ row_values.clear ();
2024+ row_values.reserve (num_cols);
2025+
2026+ for (int i = 0 ; i < num_cols; ++i) {
2027+ Local<Value> val;
2028+ if (!stmt->ColumnToValue (i).ToLocal (&val)) return false ;
2029+ row_values.emplace_back (val);
2030+ }
2031+ return true ;
2032+ }
2033+
20202034void StatementSync::All (const FunctionCallbackInfo<Value>& args) {
20212035 StatementSync* stmt;
20222036 ASSIGN_OR_RETURN_UNWRAP (&stmt, args.This ());
@@ -2034,24 +2048,16 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20342048 auto reset = OnScopeLeave ([&]() { sqlite3_reset (stmt->statement_ ); });
20352049 int num_cols = sqlite3_column_count (stmt->statement_ );
20362050 LocalVector<Value> rows (isolate);
2051+ LocalVector<Value> row_values (isolate);
2052+ LocalVector<Name> row_keys (isolate);
20372053
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- }
2054+ while ((r = sqlite3_step (stmt->statement_ )) == SQLITE_ROW) {
2055+ if (!ExtractRowValues (row_values, num_cols, stmt)) return ;
2056+ if (stmt->return_arrays_ ) {
20472057 Local<Array> row_array =
2048- Array::New (isolate, array_values .data (), array_values .size ());
2058+ Array::New (isolate, row_values .data (), row_values .size ());
20492059 rows.emplace_back (row_array);
2050- }
2051- } else {
2052- LocalVector<Name> row_keys (isolate);
2053-
2054- while ((r = sqlite3_step (stmt->statement_ )) == SQLITE_ROW) {
2060+ } else {
20552061 if (row_keys.size () == 0 ) {
20562062 row_keys.reserve (num_cols);
20572063 for (int i = 0 ; i < num_cols; ++i) {
@@ -2061,14 +2067,6 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20612067 }
20622068 }
20632069
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-
20722070 DCHECK_EQ (row_keys.size (), row_values.size ());
20732071 Local<Object> row_obj = Object::New (
20742072 isolate, Null (isolate), row_keys.data (), row_values.data (), num_cols);
@@ -2546,28 +2544,18 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
25462544
25472545 int num_cols = sqlite3_column_count (iter->stmt_ ->statement_ );
25482546 Local<Value> row_value;
2547+ LocalVector<Name> row_keys (isolate);
2548+ LocalVector<Value> row_values (isolate);
25492549
2550+ if (!ExtractRowValues (row_values, num_cols, iter->stmt_ .get ())) return ;
25502551 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 ());
2552+ row_value = Array::New (isolate, row_values.data (), row_values.size ());
25592553 } else {
2560- LocalVector<Name> row_keys (isolate);
2561- LocalVector<Value> row_values (isolate);
25622554 row_keys.reserve (num_cols);
2563- row_values.reserve (num_cols);
25642555 for (int i = 0 ; i < num_cols; ++i) {
25652556 Local<Name> key;
25662557 if (!iter->stmt_ ->ColumnNameToName (i).ToLocal (&key)) return ;
2567- Local<Value> val;
2568- if (!iter->stmt_ ->ColumnToValue (i).ToLocal (&val)) return ;
25692558 row_keys.emplace_back (key);
2570- row_values.emplace_back (val);
25712559 }
25722560
25732561 DCHECK_EQ (row_keys.size (), row_values.size ());
0 commit comments