@@ -2062,6 +2062,24 @@ MaybeLocal<Name> StatementExecutionHelper::ColumnNameToName(Environment* env,
20622062
20632063void StatementSync::MemoryInfo (MemoryTracker* tracker) const {}
20642064
2065+ Maybe<void > ExtractRowValues (Environment* env,
2066+ sqlite3_stmt* stmt,
2067+ int num_cols,
2068+ bool use_big_ints,
2069+ LocalVector<Value>* row_values) {
2070+ row_values->clear ();
2071+ row_values->reserve (num_cols);
2072+ for (int i = 0 ; i < num_cols; ++i) {
2073+ Local<Value> val;
2074+ if (!StatementExecutionHelper::ColumnToValue (env, stmt, i, use_big_ints)
2075+ .ToLocal (&val)) {
2076+ return Nothing<void >();
2077+ }
2078+ row_values->emplace_back (val);
2079+ }
2080+ return JustVoid ();
2081+ }
2082+
20652083Local<Value> StatementExecutionHelper::All (Environment* env,
20662084 DatabaseSync* db,
20672085 sqlite3_stmt* stmt,
@@ -2074,24 +2092,17 @@ Local<Value> StatementExecutionHelper::All(Environment* env,
20742092 LocalVector<Value> row_values (isolate);
20752093 LocalVector<Name> row_keys (isolate);
20762094
2077- if (return_arrays) {
2078- while ((r = sqlite3_step (stmt)) == SQLITE_ROW) {
2079- LocalVector<Value> array_values (isolate);
2080- array_values.reserve (num_cols);
2081- for (int i = 0 ; i < num_cols; ++i) {
2082- Local<Value> val;
2083- if (!ColumnToValue (env, stmt, i, use_big_ints).ToLocal (&val))
2084- return Undefined (isolate);
2085- array_values.emplace_back (val);
2086- }
2087- Local<Array> row_array =
2088- Array::New (isolate, array_values.data (), array_values.size ());
2089- rows.emplace_back (row_array);
2095+ while ((r = sqlite3_step (stmt)) == SQLITE_ROW) {
2096+ if (ExtractRowValues (env, stmt, num_cols, use_big_ints, &row_values)
2097+ .IsNothing ()) {
2098+ return Undefined (isolate);
20902099 }
2091- } else {
2092- LocalVector<Name> row_keys (isolate);
20932100
2094- while ((r = sqlite3_step (stmt)) == SQLITE_ROW) {
2101+ if (return_arrays) {
2102+ Local<Array> row_array =
2103+ Array::New (isolate, row_values.data (), row_values.size ());
2104+ rows.emplace_back (row_array);
2105+ } else {
20952106 if (row_keys.size () == 0 ) {
20962107 row_keys.reserve (num_cols);
20972108 for (int i = 0 ; i < num_cols; ++i) {
@@ -2101,16 +2112,6 @@ Local<Value> StatementExecutionHelper::All(Environment* env,
21012112 row_keys.emplace_back (key);
21022113 }
21032114 }
2104-
2105- LocalVector<Value> row_values (isolate);
2106- row_values.reserve (num_cols);
2107- for (int i = 0 ; i < num_cols; ++i) {
2108- Local<Value> val;
2109- if (!ColumnToValue (env, stmt, i, use_big_ints).ToLocal (&val))
2110- return Undefined (isolate);
2111- row_values.emplace_back (val);
2112- }
2113-
21142115 DCHECK_EQ (row_keys.size (), row_values.size ());
21152116 Local<Object> row_obj = Object::New (
21162117 isolate, Null (isolate), row_keys.data (), row_values.data (), num_cols);
@@ -2211,36 +2212,26 @@ Local<Value> StatementExecutionHelper::Get(Environment* env,
22112212 return Undefined (isolate);
22122213 }
22132214
2215+ LocalVector<Value> row_values (isolate);
2216+ if (ExtractRowValues (env, stmt, num_cols, use_big_ints, &row_values)
2217+ .IsNothing ()) {
2218+ return Undefined (isolate);
2219+ }
2220+
22142221 if (return_arrays) {
2215- LocalVector<Value> array_values (isolate);
2216- array_values.reserve (num_cols);
2217- for (int i = 0 ; i < num_cols; ++i) {
2218- MaybeLocal<Value> val =
2219- StatementExecutionHelper::ColumnToValue (env, stmt, i, use_big_ints);
2220- if (val.IsEmpty ()) return Undefined (isolate);
2221- array_values.emplace_back (val.ToLocalChecked ());
2222- }
2223- return Array::New (isolate, array_values.data (), array_values.size ());
2222+ return Array::New (isolate, row_values.data (), row_values.size ());
22242223 } else {
22252224 LocalVector<Name> keys (isolate);
22262225 keys.reserve (num_cols);
2227- LocalVector<Value> values (isolate);
2228- values.reserve (num_cols);
2229-
22302226 for (int i = 0 ; i < num_cols; ++i) {
2231- MaybeLocal<Name> key =
2232- StatementExecutionHelper::ColumnNameToName (env, stmt, i);
2227+ MaybeLocal<Name> key = ColumnNameToName (env, stmt, i);
22332228 if (key.IsEmpty ()) return Undefined (isolate);
2234- MaybeLocal<Value> val =
2235- StatementExecutionHelper::ColumnToValue (env, stmt, i, use_big_ints);
2236- if (val.IsEmpty ()) return Undefined (isolate);
22372229 keys.emplace_back (key.ToLocalChecked ());
2238- values.emplace_back (val.ToLocalChecked ());
22392230 }
22402231
2241- DCHECK_EQ (keys.size (), values .size ());
2232+ DCHECK_EQ (keys.size (), row_values .size ());
22422233 return Object::New (
2243- isolate, Null (isolate), keys.data (), values .data (), num_cols);
2234+ isolate, Null (isolate), keys.data (), row_values .data (), num_cols);
22442235 }
22452236}
22462237
@@ -2945,15 +2936,13 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
29452936 LocalVector<Name> row_keys (isolate);
29462937 LocalVector<Value> row_values (isolate);
29472938
2948- row_values.reserve (num_cols);
2949- for (int i = 0 ; i < num_cols; ++i) {
2950- Local<Value> val;
2951- if (!StatementExecutionHelper::ColumnToValue (
2952- env, iter->stmt_ ->statement_ , i, iter->stmt_ ->use_big_ints_ )
2953- .ToLocal (&val)) {
2954- return ;
2955- }
2956- row_values.emplace_back (val);
2939+ if (ExtractRowValues (env,
2940+ iter->stmt_ ->statement_ ,
2941+ num_cols,
2942+ iter->stmt_ ->use_big_ints_ ,
2943+ &row_values)
2944+ .IsNothing ()) {
2945+ return ;
29572946 }
29582947
29592948 if (iter->stmt_ ->return_arrays_ ) {
0 commit comments