@@ -34,11 +34,14 @@ using v8::HandleScope;
3434using v8::Int32;
3535using v8::Integer;
3636using v8::Isolate;
37+ using v8::JustVoid;
3738using v8::Local;
3839using v8::LocalVector;
40+ using v8::Maybe;
3941using v8::MaybeLocal;
4042using v8::Name;
4143using v8::NewStringType;
44+ using v8::Nothing;
4245using v8::Null;
4346using v8::Number;
4447using v8::Object;
@@ -2008,6 +2011,20 @@ MaybeLocal<Name> StatementSync::ColumnNameToName(const int column) {
20082011
20092012void StatementSync::MemoryInfo (MemoryTracker* tracker) const {}
20102013
2014+ Maybe<void > ExtractRowValues (Isolate* isolate,
2015+ int num_cols,
2016+ StatementSync* stmt,
2017+ LocalVector<Value>* row_values) {
2018+ row_values->clear ();
2019+ row_values->reserve (num_cols);
2020+ for (int i = 0 ; i < num_cols; ++i) {
2021+ Local<Value> val;
2022+ if (!stmt->ColumnToValue (i).ToLocal (&val)) return Nothing<void >();
2023+ row_values->emplace_back (val);
2024+ }
2025+ return JustVoid ();
2026+ }
2027+
20112028void StatementSync::All (const FunctionCallbackInfo<Value>& args) {
20122029 StatementSync* stmt;
20132030 ASSIGN_OR_RETURN_UNWRAP (&stmt, args.This ());
@@ -2025,24 +2042,19 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20252042 auto reset = OnScopeLeave ([&]() { sqlite3_reset (stmt->statement_ ); });
20262043 int num_cols = sqlite3_column_count (stmt->statement_ );
20272044 LocalVector<Value> rows (isolate);
2045+ LocalVector<Value> row_values (isolate);
2046+ LocalVector<Name> row_keys (isolate);
20282047
2029- if (stmt->return_arrays_ ) {
2030- while ((r = sqlite3_step (stmt->statement_ )) == SQLITE_ROW) {
2031- LocalVector<Value> array_values (isolate);
2032- array_values.reserve (num_cols);
2033- for (int i = 0 ; i < num_cols; ++i) {
2034- Local<Value> val;
2035- if (!stmt->ColumnToValue (i).ToLocal (&val)) return ;
2036- array_values.emplace_back (val);
2037- }
2048+ while ((r = sqlite3_step (stmt->statement_ )) == SQLITE_ROW) {
2049+ auto maybe_row_values =
2050+ ExtractRowValues (env->isolate (), num_cols, stmt, &row_values);
2051+ if (maybe_row_values.IsNothing ()) return ;
2052+
2053+ if (stmt->return_arrays_ ) {
20382054 Local<Array> row_array =
2039- Array::New (isolate, array_values .data (), array_values .size ());
2055+ Array::New (isolate, row_values .data (), row_values .size ());
20402056 rows.emplace_back (row_array);
2041- }
2042- } else {
2043- LocalVector<Name> row_keys (isolate);
2044-
2045- while ((r = sqlite3_step (stmt->statement_ )) == SQLITE_ROW) {
2057+ } else {
20462058 if (row_keys.size () == 0 ) {
20472059 row_keys.reserve (num_cols);
20482060 for (int i = 0 ; i < num_cols; ++i) {
@@ -2052,14 +2064,6 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20522064 }
20532065 }
20542066
2055- LocalVector<Value> row_values (isolate);
2056- row_values.reserve (num_cols);
2057- for (int i = 0 ; i < num_cols; ++i) {
2058- Local<Value> val;
2059- if (!stmt->ColumnToValue (i).ToLocal (&val)) return ;
2060- row_values.emplace_back (val);
2061- }
2062-
20632067 DCHECK_EQ (row_keys.size (), row_values.size ());
20642068 Local<Object> row_obj = Object::New (
20652069 isolate, Null (isolate), row_keys.data (), row_values.data (), num_cols);
@@ -2537,28 +2541,21 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
25372541
25382542 int num_cols = sqlite3_column_count (iter->stmt_ ->statement_ );
25392543 Local<Value> row_value;
2544+ LocalVector<Name> row_keys (isolate);
2545+ LocalVector<Value> row_values (isolate);
2546+
2547+ auto maybe_row_values =
2548+ ExtractRowValues (isolate, num_cols, iter->stmt_ .get (), &row_values);
2549+ if (maybe_row_values.IsNothing ()) return ;
25402550
25412551 if (iter->stmt_ ->return_arrays_ ) {
2542- LocalVector<Value> array_values (isolate);
2543- array_values.reserve (num_cols);
2544- for (int i = 0 ; i < num_cols; ++i) {
2545- Local<Value> val;
2546- if (!iter->stmt_ ->ColumnToValue (i).ToLocal (&val)) return ;
2547- array_values.emplace_back (val);
2548- }
2549- row_value = Array::New (isolate, array_values.data (), array_values.size ());
2552+ row_value = Array::New (isolate, row_values.data (), row_values.size ());
25502553 } else {
2551- LocalVector<Name> row_keys (isolate);
2552- LocalVector<Value> row_values (isolate);
25532554 row_keys.reserve (num_cols);
2554- row_values.reserve (num_cols);
25552555 for (int i = 0 ; i < num_cols; ++i) {
25562556 Local<Name> key;
25572557 if (!iter->stmt_ ->ColumnNameToName (i).ToLocal (&key)) return ;
2558- Local<Value> val;
2559- if (!iter->stmt_ ->ColumnToValue (i).ToLocal (&val)) return ;
25602558 row_keys.emplace_back (key);
2561- row_values.emplace_back (val);
25622559 }
25632560
25642561 DCHECK_EQ (row_keys.size (), row_values.size ());
0 commit comments