@@ -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;
@@ -2009,6 +2012,20 @@ MaybeLocal<Name> StatementSync::ColumnNameToName(const int column) {
20092012
20102013void StatementSync::MemoryInfo (MemoryTracker* tracker) const {}
20112014
2015+ Maybe<void > ExtractRowValues (Isolate* isolate,
2016+ int num_cols,
2017+ StatementSync* stmt,
2018+ LocalVector<Value>* row_values) {
2019+ row_values->clear ();
2020+ row_values->reserve (num_cols);
2021+ for (int i = 0 ; i < num_cols; ++i) {
2022+ Local<Value> val;
2023+ if (!stmt->ColumnToValue (i).ToLocal (&val)) return Nothing<void >();
2024+ row_values->emplace_back (val);
2025+ }
2026+ return JustVoid ();
2027+ }
2028+
20122029void StatementSync::All (const FunctionCallbackInfo<Value>& args) {
20132030 StatementSync* stmt;
20142031 ASSIGN_OR_RETURN_UNWRAP (&stmt, args.This ());
@@ -2026,24 +2043,19 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20262043 auto reset = OnScopeLeave ([&]() { sqlite3_reset (stmt->statement_ ); });
20272044 int num_cols = sqlite3_column_count (stmt->statement_ );
20282045 LocalVector<Value> rows (isolate);
2046+ LocalVector<Value> row_values (isolate);
2047+ LocalVector<Name> row_keys (isolate);
20292048
2030- if (stmt->return_arrays_ ) {
2031- while ((r = sqlite3_step (stmt->statement_ )) == SQLITE_ROW) {
2032- LocalVector<Value> array_values (isolate);
2033- array_values.reserve (num_cols);
2034- for (int i = 0 ; i < num_cols; ++i) {
2035- Local<Value> val;
2036- if (!stmt->ColumnToValue (i).ToLocal (&val)) return ;
2037- array_values.emplace_back (val);
2038- }
2049+ while ((r = sqlite3_step (stmt->statement_ )) == SQLITE_ROW) {
2050+ auto maybe_row_values =
2051+ ExtractRowValues (env->isolate (), num_cols, stmt, &row_values);
2052+ if (maybe_row_values.IsNothing ()) return ;
2053+
2054+ if (stmt->return_arrays_ ) {
20392055 Local<Array> row_array =
2040- Array::New (isolate, array_values .data (), array_values .size ());
2056+ Array::New (isolate, row_values .data (), row_values .size ());
20412057 rows.emplace_back (row_array);
2042- }
2043- } else {
2044- LocalVector<Name> row_keys (isolate);
2045-
2046- while ((r = sqlite3_step (stmt->statement_ )) == SQLITE_ROW) {
2058+ } else {
20472059 if (row_keys.size () == 0 ) {
20482060 row_keys.reserve (num_cols);
20492061 for (int i = 0 ; i < num_cols; ++i) {
@@ -2053,14 +2065,6 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20532065 }
20542066 }
20552067
2056- LocalVector<Value> row_values (isolate);
2057- row_values.reserve (num_cols);
2058- for (int i = 0 ; i < num_cols; ++i) {
2059- Local<Value> val;
2060- if (!stmt->ColumnToValue (i).ToLocal (&val)) return ;
2061- row_values.emplace_back (val);
2062- }
2063-
20642068 DCHECK_EQ (row_keys.size (), row_values.size ());
20652069 Local<Object> row_obj = Object::New (
20662070 isolate, Null (isolate), row_keys.data (), row_values.data (), num_cols);
@@ -2538,28 +2542,21 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
25382542
25392543 int num_cols = sqlite3_column_count (iter->stmt_ ->statement_ );
25402544 Local<Value> row_value;
2545+ LocalVector<Name> row_keys (isolate);
2546+ LocalVector<Value> row_values (isolate);
2547+
2548+ auto maybe_row_values =
2549+ ExtractRowValues (isolate, num_cols, iter->stmt_ .get (), &row_values);
2550+ if (maybe_row_values.IsNothing ()) return ;
25412551
25422552 if (iter->stmt_ ->return_arrays_ ) {
2543- LocalVector<Value> array_values (isolate);
2544- array_values.reserve (num_cols);
2545- for (int i = 0 ; i < num_cols; ++i) {
2546- Local<Value> val;
2547- if (!iter->stmt_ ->ColumnToValue (i).ToLocal (&val)) return ;
2548- array_values.emplace_back (val);
2549- }
2550- row_value = Array::New (isolate, array_values.data (), array_values.size ());
2553+ row_value = Array::New (isolate, row_values.data (), row_values.size ());
25512554 } else {
2552- LocalVector<Name> row_keys (isolate);
2553- LocalVector<Value> row_values (isolate);
25542555 row_keys.reserve (num_cols);
2555- row_values.reserve (num_cols);
25562556 for (int i = 0 ; i < num_cols; ++i) {
25572557 Local<Name> key;
25582558 if (!iter->stmt_ ->ColumnNameToName (i).ToLocal (&key)) return ;
2559- Local<Value> val;
2560- if (!iter->stmt_ ->ColumnToValue (i).ToLocal (&val)) return ;
25612559 row_keys.emplace_back (key);
2562- row_values.emplace_back (val);
25632560 }
25642561
25652562 DCHECK_EQ (row_keys.size (), row_values.size ());
0 commit comments