@@ -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;
@@ -2009,6 +2012,20 @@ MaybeLocal<Name> StatementSync::ColumnNameToName(const int column) {
2009
2012
2010
2013
void StatementSync::MemoryInfo (MemoryTracker* tracker) const {}
2011
2014
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
+
2012
2029
void StatementSync::All (const FunctionCallbackInfo<Value>& args) {
2013
2030
StatementSync* stmt;
2014
2031
ASSIGN_OR_RETURN_UNWRAP (&stmt, args.This ());
@@ -2026,24 +2043,19 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
2026
2043
auto reset = OnScopeLeave ([&]() { sqlite3_reset (stmt->statement_ ); });
2027
2044
int num_cols = sqlite3_column_count (stmt->statement_ );
2028
2045
LocalVector<Value> rows (isolate);
2046
+ LocalVector<Value> row_values (isolate);
2047
+ LocalVector<Name> row_keys (isolate);
2029
2048
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_ ) {
2039
2055
Local<Array> row_array =
2040
- Array::New (isolate, array_values .data (), array_values .size ());
2056
+ Array::New (isolate, row_values .data (), row_values .size ());
2041
2057
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 {
2047
2059
if (row_keys.size () == 0 ) {
2048
2060
row_keys.reserve (num_cols);
2049
2061
for (int i = 0 ; i < num_cols; ++i) {
@@ -2053,14 +2065,6 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
2053
2065
}
2054
2066
}
2055
2067
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
-
2064
2068
DCHECK_EQ (row_keys.size (), row_values.size ());
2065
2069
Local<Object> row_obj = Object::New (
2066
2070
isolate, Null (isolate), row_keys.data (), row_values.data (), num_cols);
@@ -2538,28 +2542,21 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
2538
2542
2539
2543
int num_cols = sqlite3_column_count (iter->stmt_ ->statement_ );
2540
2544
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 ;
2541
2551
2542
2552
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 ());
2551
2554
} else {
2552
- LocalVector<Name> row_keys (isolate);
2553
- LocalVector<Value> row_values (isolate);
2554
2555
row_keys.reserve (num_cols);
2555
- row_values.reserve (num_cols);
2556
2556
for (int i = 0 ; i < num_cols; ++i) {
2557
2557
Local<Name> key;
2558
2558
if (!iter->stmt_ ->ColumnNameToName (i).ToLocal (&key)) return ;
2559
- Local<Value> val;
2560
- if (!iter->stmt_ ->ColumnToValue (i).ToLocal (&val)) return ;
2561
2559
row_keys.emplace_back (key);
2562
- row_values.emplace_back (val);
2563
2560
}
2564
2561
2565
2562
DCHECK_EQ (row_keys.size (), row_values.size ());
0 commit comments