@@ -35,11 +35,14 @@ using v8::HandleScope;
3535using v8::Int32;
3636using v8::Integer;
3737using v8::Isolate;
38+ using v8::JustVoid;
3839using v8::Local;
3940using v8::LocalVector;
41+ using v8::Maybe;
4042using v8::MaybeLocal;
4143using v8::Name;
4244using v8::NewStringType;
45+ using v8::Nothing;
4346using v8::Null;
4447using v8::Number;
4548using v8::Object;
@@ -2017,6 +2020,20 @@ MaybeLocal<Name> StatementSync::ColumnNameToName(const int column) {
20172020
20182021void StatementSync::MemoryInfo (MemoryTracker* tracker) const {}
20192022
2023+ Maybe<void > ExtractRowValues (Isolate* isolate,
2024+ int num_cols,
2025+ StatementSync* stmt,
2026+ LocalVector<Value>* row_values) {
2027+ row_values->clear ();
2028+ row_values->reserve (num_cols);
2029+ for (int i = 0 ; i < num_cols; ++i) {
2030+ Local<Value> val;
2031+ if (!stmt->ColumnToValue (i).ToLocal (&val)) return Nothing<void >();
2032+ row_values->emplace_back (val);
2033+ }
2034+ return JustVoid ();
2035+ }
2036+
20202037void StatementSync::All (const FunctionCallbackInfo<Value>& args) {
20212038 StatementSync* stmt;
20222039 ASSIGN_OR_RETURN_UNWRAP (&stmt, args.This ());
@@ -2034,24 +2051,19 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20342051 auto reset = OnScopeLeave ([&]() { sqlite3_reset (stmt->statement_ ); });
20352052 int num_cols = sqlite3_column_count (stmt->statement_ );
20362053 LocalVector<Value> rows (isolate);
2054+ LocalVector<Value> row_values (isolate);
2055+ LocalVector<Name> row_keys (isolate);
20372056
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- }
2057+ while ((r = sqlite3_step (stmt->statement_ )) == SQLITE_ROW) {
2058+ auto maybe_row_values =
2059+ ExtractRowValues (env->isolate (), num_cols, stmt, &row_values);
2060+ if (maybe_row_values.IsNothing ()) return ;
2061+
2062+ if (stmt->return_arrays_ ) {
20472063 Local<Array> row_array =
2048- Array::New (isolate, array_values .data (), array_values .size ());
2064+ Array::New (isolate, row_values .data (), row_values .size ());
20492065 rows.emplace_back (row_array);
2050- }
2051- } else {
2052- LocalVector<Name> row_keys (isolate);
2053-
2054- while ((r = sqlite3_step (stmt->statement_ )) == SQLITE_ROW) {
2066+ } else {
20552067 if (row_keys.size () == 0 ) {
20562068 row_keys.reserve (num_cols);
20572069 for (int i = 0 ; i < num_cols; ++i) {
@@ -2061,14 +2073,6 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20612073 }
20622074 }
20632075
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-
20722076 DCHECK_EQ (row_keys.size (), row_values.size ());
20732077 Local<Object> row_obj = Object::New (
20742078 isolate, Null (isolate), row_keys.data (), row_values.data (), num_cols);
@@ -2546,28 +2550,21 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
25462550
25472551 int num_cols = sqlite3_column_count (iter->stmt_ ->statement_ );
25482552 Local<Value> row_value;
2553+ LocalVector<Name> row_keys (isolate);
2554+ LocalVector<Value> row_values (isolate);
2555+
2556+ auto maybe_row_values =
2557+ ExtractRowValues (isolate, num_cols, iter->stmt_ .get (), &row_values);
2558+ if (maybe_row_values.IsNothing ()) return ;
25492559
25502560 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 ());
2561+ row_value = Array::New (isolate, row_values.data (), row_values.size ());
25592562 } else {
2560- LocalVector<Name> row_keys (isolate);
2561- LocalVector<Value> row_values (isolate);
25622563 row_keys.reserve (num_cols);
2563- row_values.reserve (num_cols);
25642564 for (int i = 0 ; i < num_cols; ++i) {
25652565 Local<Name> key;
25662566 if (!iter->stmt_ ->ColumnNameToName (i).ToLocal (&key)) return ;
2567- Local<Value> val;
2568- if (!iter->stmt_ ->ColumnToValue (i).ToLocal (&val)) return ;
25692567 row_keys.emplace_back (key);
2570- row_values.emplace_back (val);
25712568 }
25722569
25732570 DCHECK_EQ (row_keys.size (), row_values.size ());
0 commit comments