@@ -2017,6 +2017,19 @@ MaybeLocal<Name> StatementSync::ColumnNameToName(const int column) {
20172017
20182018void StatementSync::MemoryInfo (MemoryTracker* tracker) const {}
20192019
2020+ std::optional<LocalVector<Value>> ExtractRowValues (Isolate* isolate,
2021+ int num_cols,
2022+ StatementSync* stmt) {
2023+ LocalVector<Value> row_values (isolate);
2024+ row_values.reserve (num_cols);
2025+ for (int i = 0 ; i < num_cols; ++i) {
2026+ Local<Value> val;
2027+ if (!stmt->ColumnToValue (i).ToLocal (&val)) return std::nullopt ;
2028+ row_values.emplace_back (val);
2029+ }
2030+ return row_values;
2031+ }
2032+
20202033void StatementSync::All (const FunctionCallbackInfo<Value>& args) {
20212034 StatementSync* stmt;
20222035 ASSIGN_OR_RETURN_UNWRAP (&stmt, args.This ());
@@ -2034,24 +2047,19 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20342047 auto reset = OnScopeLeave ([&]() { sqlite3_reset (stmt->statement_ ); });
20352048 int num_cols = sqlite3_column_count (stmt->statement_ );
20362049 LocalVector<Value> rows (isolate);
2050+ LocalVector<Value> row_values (isolate);
2051+ LocalVector<Name> row_keys (isolate);
20372052
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- }
2053+ while ((r = sqlite3_step (stmt->statement_ )) == SQLITE_ROW) {
2054+ auto maybe_row_values = ExtractRowValues (env->isolate (), num_cols, stmt);
2055+ if (!maybe_row_values.has_value ()) return ;
2056+
2057+ row_values = std::move (maybe_row_values.value ());
2058+ if (stmt->return_arrays_ ) {
20472059 Local<Array> row_array =
2048- Array::New (isolate, array_values .data (), array_values .size ());
2060+ Array::New (isolate, row_values .data (), row_values .size ());
20492061 rows.emplace_back (row_array);
2050- }
2051- } else {
2052- LocalVector<Name> row_keys (isolate);
2053-
2054- while ((r = sqlite3_step (stmt->statement_ )) == SQLITE_ROW) {
2062+ } else {
20552063 if (row_keys.size () == 0 ) {
20562064 row_keys.reserve (num_cols);
20572065 for (int i = 0 ; i < num_cols; ++i) {
@@ -2061,14 +2069,6 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20612069 }
20622070 }
20632071
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-
20722072 DCHECK_EQ (row_keys.size (), row_values.size ());
20732073 Local<Object> row_obj = Object::New (
20742074 isolate, Null (isolate), row_keys.data (), row_values.data (), num_cols);
@@ -2546,28 +2546,23 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
25462546
25472547 int num_cols = sqlite3_column_count (iter->stmt_ ->statement_ );
25482548 Local<Value> row_value;
2549+ LocalVector<Name> row_keys (isolate);
2550+ LocalVector<Value> row_values (isolate);
2551+
2552+ auto maybe_row_values =
2553+ ExtractRowValues (isolate, num_cols, iter->stmt_ .get ());
2554+ if (!maybe_row_values.has_value ()) return ;
2555+
2556+ row_values = std::move (maybe_row_values.value ());
25492557
25502558 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 ());
2559+ row_value = Array::New (isolate, row_values.data (), row_values.size ());
25592560 } else {
2560- LocalVector<Name> row_keys (isolate);
2561- LocalVector<Value> row_values (isolate);
25622561 row_keys.reserve (num_cols);
2563- row_values.reserve (num_cols);
25642562 for (int i = 0 ; i < num_cols; ++i) {
25652563 Local<Name> key;
25662564 if (!iter->stmt_ ->ColumnNameToName (i).ToLocal (&key)) return ;
2567- Local<Value> val;
2568- if (!iter->stmt_ ->ColumnToValue (i).ToLocal (&val)) return ;
25692565 row_keys.emplace_back (key);
2570- row_values.emplace_back (val);
25712566 }
25722567
25732568 DCHECK_EQ (row_keys.size (), row_values.size ());
0 commit comments