diff --git a/src/node_sqlite.cc b/src/node_sqlite.cc index d941ccca998c09..696b45bf4da21c 100644 --- a/src/node_sqlite.cc +++ b/src/node_sqlite.cc @@ -35,11 +35,14 @@ using v8::HandleScope; using v8::Int32; using v8::Integer; using v8::Isolate; +using v8::JustVoid; using v8::Local; using v8::LocalVector; +using v8::Maybe; using v8::MaybeLocal; using v8::Name; using v8::NewStringType; +using v8::Nothing; using v8::Null; using v8::Number; using v8::Object; @@ -2017,6 +2020,20 @@ MaybeLocal StatementSync::ColumnNameToName(const int column) { void StatementSync::MemoryInfo(MemoryTracker* tracker) const {} +Maybe ExtractRowValues(Isolate* isolate, + int num_cols, + StatementSync* stmt, + LocalVector* row_values) { + row_values->clear(); + row_values->reserve(num_cols); + for (int i = 0; i < num_cols; ++i) { + Local val; + if (!stmt->ColumnToValue(i).ToLocal(&val)) return Nothing(); + row_values->emplace_back(val); + } + return JustVoid(); +} + void StatementSync::All(const FunctionCallbackInfo& args) { StatementSync* stmt; ASSIGN_OR_RETURN_UNWRAP(&stmt, args.This()); @@ -2034,24 +2051,19 @@ void StatementSync::All(const FunctionCallbackInfo& args) { auto reset = OnScopeLeave([&]() { sqlite3_reset(stmt->statement_); }); int num_cols = sqlite3_column_count(stmt->statement_); LocalVector rows(isolate); + LocalVector row_values(isolate); + LocalVector row_keys(isolate); - if (stmt->return_arrays_) { - while ((r = sqlite3_step(stmt->statement_)) == SQLITE_ROW) { - LocalVector array_values(isolate); - array_values.reserve(num_cols); - for (int i = 0; i < num_cols; ++i) { - Local val; - if (!stmt->ColumnToValue(i).ToLocal(&val)) return; - array_values.emplace_back(val); - } + while ((r = sqlite3_step(stmt->statement_)) == SQLITE_ROW) { + auto maybe_row_values = + ExtractRowValues(env->isolate(), num_cols, stmt, &row_values); + if (maybe_row_values.IsNothing()) return; + + if (stmt->return_arrays_) { Local row_array = - Array::New(isolate, array_values.data(), array_values.size()); + Array::New(isolate, row_values.data(), row_values.size()); rows.emplace_back(row_array); - } - } else { - LocalVector row_keys(isolate); - - while ((r = sqlite3_step(stmt->statement_)) == SQLITE_ROW) { + } else { if (row_keys.size() == 0) { row_keys.reserve(num_cols); for (int i = 0; i < num_cols; ++i) { @@ -2061,14 +2073,6 @@ void StatementSync::All(const FunctionCallbackInfo& args) { } } - LocalVector row_values(isolate); - row_values.reserve(num_cols); - for (int i = 0; i < num_cols; ++i) { - Local val; - if (!stmt->ColumnToValue(i).ToLocal(&val)) return; - row_values.emplace_back(val); - } - DCHECK_EQ(row_keys.size(), row_values.size()); Local row_obj = Object::New( isolate, Null(isolate), row_keys.data(), row_values.data(), num_cols); @@ -2546,28 +2550,21 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo& args) { int num_cols = sqlite3_column_count(iter->stmt_->statement_); Local row_value; + LocalVector row_keys(isolate); + LocalVector row_values(isolate); + + auto maybe_row_values = + ExtractRowValues(isolate, num_cols, iter->stmt_.get(), &row_values); + if (maybe_row_values.IsNothing()) return; if (iter->stmt_->return_arrays_) { - LocalVector array_values(isolate); - array_values.reserve(num_cols); - for (int i = 0; i < num_cols; ++i) { - Local val; - if (!iter->stmt_->ColumnToValue(i).ToLocal(&val)) return; - array_values.emplace_back(val); - } - row_value = Array::New(isolate, array_values.data(), array_values.size()); + row_value = Array::New(isolate, row_values.data(), row_values.size()); } else { - LocalVector row_keys(isolate); - LocalVector row_values(isolate); row_keys.reserve(num_cols); - row_values.reserve(num_cols); for (int i = 0; i < num_cols; ++i) { Local key; if (!iter->stmt_->ColumnNameToName(i).ToLocal(&key)) return; - Local val; - if (!iter->stmt_->ColumnToValue(i).ToLocal(&val)) return; row_keys.emplace_back(key); - row_values.emplace_back(val); } DCHECK_EQ(row_keys.size(), row_values.size()); diff --git a/src/node_sqlite.h b/src/node_sqlite.h index 983dde6d851efb..5bc6366398406b 100644 --- a/src/node_sqlite.h +++ b/src/node_sqlite.h @@ -174,6 +174,8 @@ class StatementSync : public BaseObject { const v8::FunctionCallbackInfo& args); static void SetReadBigInts(const v8::FunctionCallbackInfo& args); static void SetReturnArrays(const v8::FunctionCallbackInfo& args); + v8::MaybeLocal ColumnToValue(const int column); + v8::MaybeLocal ColumnNameToName(const int column); void Finalize(); bool IsFinalized(); @@ -191,8 +193,6 @@ class StatementSync : public BaseObject { std::optional> bare_named_params_; bool BindParams(const v8::FunctionCallbackInfo& args); bool BindValue(const v8::Local& value, const int index); - v8::MaybeLocal ColumnToValue(const int column); - v8::MaybeLocal ColumnNameToName(const int column); friend class StatementSyncIterator; };