@@ -35,11 +35,14 @@ using v8::HandleScope;
35
35
using v8::Int32;
36
36
using v8::Integer;
37
37
using v8::Isolate;
38
+ using v8::JustVoid;
38
39
using v8::Local;
39
40
using v8::LocalVector;
41
+ using v8::Maybe;
40
42
using v8::MaybeLocal;
41
43
using v8::Name;
42
44
using v8::NewStringType;
45
+ using v8::Nothing;
43
46
using v8::Null;
44
47
using v8::Number;
45
48
using v8::Object;
@@ -2017,6 +2020,20 @@ MaybeLocal<Name> StatementSync::ColumnNameToName(const int column) {
2017
2020
2018
2021
void StatementSync::MemoryInfo (MemoryTracker* tracker) const {}
2019
2022
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
+
2020
2037
void StatementSync::All (const FunctionCallbackInfo<Value>& args) {
2021
2038
StatementSync* stmt;
2022
2039
ASSIGN_OR_RETURN_UNWRAP (&stmt, args.This ());
@@ -2034,24 +2051,19 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
2034
2051
auto reset = OnScopeLeave ([&]() { sqlite3_reset (stmt->statement_ ); });
2035
2052
int num_cols = sqlite3_column_count (stmt->statement_ );
2036
2053
LocalVector<Value> rows (isolate);
2054
+ LocalVector<Value> row_values (isolate);
2055
+ LocalVector<Name> row_keys (isolate);
2037
2056
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_ ) {
2047
2063
Local<Array> row_array =
2048
- Array::New (isolate, array_values .data (), array_values .size ());
2064
+ Array::New (isolate, row_values .data (), row_values .size ());
2049
2065
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 {
2055
2067
if (row_keys.size () == 0 ) {
2056
2068
row_keys.reserve (num_cols);
2057
2069
for (int i = 0 ; i < num_cols; ++i) {
@@ -2061,14 +2073,6 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
2061
2073
}
2062
2074
}
2063
2075
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
2076
DCHECK_EQ (row_keys.size (), row_values.size ());
2073
2077
Local<Object> row_obj = Object::New (
2074
2078
isolate, Null (isolate), row_keys.data (), row_values.data (), num_cols);
@@ -2546,28 +2550,21 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
2546
2550
2547
2551
int num_cols = sqlite3_column_count (iter->stmt_ ->statement_ );
2548
2552
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 ;
2549
2559
2550
2560
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 ());
2559
2562
} else {
2560
- LocalVector<Name> row_keys (isolate);
2561
- LocalVector<Value> row_values (isolate);
2562
2563
row_keys.reserve (num_cols);
2563
- row_values.reserve (num_cols);
2564
2564
for (int i = 0 ; i < num_cols; ++i) {
2565
2565
Local<Name> key;
2566
2566
if (!iter->stmt_ ->ColumnNameToName (i).ToLocal (&key)) return ;
2567
- Local<Value> val;
2568
- if (!iter->stmt_ ->ColumnToValue (i).ToLocal (&val)) return ;
2569
2567
row_keys.emplace_back (key);
2570
- row_values.emplace_back (val);
2571
2568
}
2572
2569
2573
2570
DCHECK_EQ (row_keys.size (), row_values.size ());
0 commit comments