@@ -2017,6 +2017,20 @@ MaybeLocal<Name> StatementSync::ColumnNameToName(const int column) {
2017
2017
2018
2018
void StatementSync::MemoryInfo (MemoryTracker* tracker) const {}
2019
2019
2020
+ bool ExtractRowValues (LocalVector<Value>& row_values,
2021
+ int num_cols,
2022
+ StatementSync* stmt) {
2023
+ row_values.clear ();
2024
+ row_values.reserve (num_cols);
2025
+
2026
+ for (int i = 0 ; i < num_cols; ++i) {
2027
+ Local<Value> val;
2028
+ if (!stmt->ColumnToValue (i).ToLocal (&val)) return false ;
2029
+ row_values.emplace_back (val);
2030
+ }
2031
+ return true ;
2032
+ }
2033
+
2020
2034
void StatementSync::All (const FunctionCallbackInfo<Value>& args) {
2021
2035
StatementSync* stmt;
2022
2036
ASSIGN_OR_RETURN_UNWRAP (&stmt, args.This ());
@@ -2034,24 +2048,16 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
2034
2048
auto reset = OnScopeLeave ([&]() { sqlite3_reset (stmt->statement_ ); });
2035
2049
int num_cols = sqlite3_column_count (stmt->statement_ );
2036
2050
LocalVector<Value> rows (isolate);
2051
+ LocalVector<Value> row_values (isolate);
2052
+ LocalVector<Name> row_keys (isolate);
2037
2053
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
- }
2054
+ while ((r = sqlite3_step (stmt->statement_ )) == SQLITE_ROW) {
2055
+ if (!ExtractRowValues (row_values, num_cols, stmt)) return ;
2056
+ if (stmt->return_arrays_ ) {
2047
2057
Local<Array> row_array =
2048
- Array::New (isolate, array_values .data (), array_values .size ());
2058
+ Array::New (isolate, row_values .data (), row_values .size ());
2049
2059
rows.emplace_back (row_array);
2050
- }
2051
- } else {
2052
- LocalVector<Name> row_keys (isolate);
2053
-
2054
- while ((r = sqlite3_step (stmt->statement_ )) == SQLITE_ROW) {
2060
+ } else {
2055
2061
if (row_keys.size () == 0 ) {
2056
2062
row_keys.reserve (num_cols);
2057
2063
for (int i = 0 ; i < num_cols; ++i) {
@@ -2061,14 +2067,6 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
2061
2067
}
2062
2068
}
2063
2069
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
-
2072
2070
DCHECK_EQ (row_keys.size (), row_values.size ());
2073
2071
Local<Object> row_obj = Object::New (
2074
2072
isolate, Null (isolate), row_keys.data (), row_values.data (), num_cols);
@@ -2546,28 +2544,18 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
2546
2544
2547
2545
int num_cols = sqlite3_column_count (iter->stmt_ ->statement_ );
2548
2546
Local<Value> row_value;
2547
+ LocalVector<Name> row_keys (isolate);
2548
+ LocalVector<Value> row_values (isolate);
2549
2549
2550
+ if (!ExtractRowValues (row_values, num_cols, iter->stmt_ .get ())) return ;
2550
2551
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 ());
2552
+ row_value = Array::New (isolate, row_values.data (), row_values.size ());
2559
2553
} else {
2560
- LocalVector<Name> row_keys (isolate);
2561
- LocalVector<Value> row_values (isolate);
2562
2554
row_keys.reserve (num_cols);
2563
- row_values.reserve (num_cols);
2564
2555
for (int i = 0 ; i < num_cols; ++i) {
2565
2556
Local<Name> key;
2566
2557
if (!iter->stmt_ ->ColumnNameToName (i).ToLocal (&key)) return ;
2567
- Local<Value> val;
2568
- if (!iter->stmt_ ->ColumnToValue (i).ToLocal (&val)) return ;
2569
2558
row_keys.emplace_back (key);
2570
- row_values.emplace_back (val);
2571
2559
}
2572
2560
2573
2561
DCHECK_EQ (row_keys.size (), row_values.size ());
0 commit comments