From 45b12c8eae61ed87e441bfee74566feb5ed8c3df Mon Sep 17 00:00:00 2001 From: Edy Silva Date: Thu, 28 Aug 2025 01:12:52 -0300 Subject: [PATCH 1/2] src,sqlite: refactor value conversion --- src/node_sqlite.cc | 69 +++++++++++++++++++++------------------------- src/node_sqlite.h | 4 +-- 2 files changed, 34 insertions(+), 39 deletions(-) diff --git a/src/node_sqlite.cc b/src/node_sqlite.cc index d941ccca998c09..56f38408e2b883 100644 --- a/src/node_sqlite.cc +++ b/src/node_sqlite.cc @@ -2017,6 +2017,19 @@ MaybeLocal StatementSync::ColumnNameToName(const int column) { void StatementSync::MemoryInfo(MemoryTracker* tracker) const {} +std::optional> ExtractRowValues(Isolate* isolate, + int num_cols, + StatementSync* stmt) { + 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 std::nullopt; + row_values.emplace_back(val); + } + return row_values; +} + void StatementSync::All(const FunctionCallbackInfo& args) { StatementSync* stmt; ASSIGN_OR_RETURN_UNWRAP(&stmt, args.This()); @@ -2034,24 +2047,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); + if (!maybe_row_values.has_value()) return; + + row_values = std::move(maybe_row_values.value()); + 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 +2069,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 +2546,23 @@ 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()); + if (!maybe_row_values.has_value()) return; + + row_values = std::move(maybe_row_values.value()); 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; }; From ae606026aa560907dbd6535914ebc9e02ae5cac4 Mon Sep 17 00:00:00 2001 From: Edy Silva Date: Sun, 31 Aug 2025 00:36:35 -0300 Subject: [PATCH 2/2] src: use Maybe instead of std::optional --- src/node_sqlite.cc | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/node_sqlite.cc b/src/node_sqlite.cc index 56f38408e2b883..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,17 +2020,18 @@ MaybeLocal StatementSync::ColumnNameToName(const int column) { void StatementSync::MemoryInfo(MemoryTracker* tracker) const {} -std::optional> ExtractRowValues(Isolate* isolate, - int num_cols, - StatementSync* stmt) { - LocalVector row_values(isolate); - row_values.reserve(num_cols); +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 std::nullopt; - row_values.emplace_back(val); + if (!stmt->ColumnToValue(i).ToLocal(&val)) return Nothing(); + row_values->emplace_back(val); } - return row_values; + return JustVoid(); } void StatementSync::All(const FunctionCallbackInfo& args) { @@ -2051,10 +2055,10 @@ void StatementSync::All(const FunctionCallbackInfo& args) { LocalVector row_keys(isolate); while ((r = sqlite3_step(stmt->statement_)) == SQLITE_ROW) { - auto maybe_row_values = ExtractRowValues(env->isolate(), num_cols, stmt); - if (!maybe_row_values.has_value()) return; + auto maybe_row_values = + ExtractRowValues(env->isolate(), num_cols, stmt, &row_values); + if (maybe_row_values.IsNothing()) return; - row_values = std::move(maybe_row_values.value()); if (stmt->return_arrays_) { Local row_array = Array::New(isolate, row_values.data(), row_values.size()); @@ -2550,10 +2554,8 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo& args) { LocalVector row_values(isolate); auto maybe_row_values = - ExtractRowValues(isolate, num_cols, iter->stmt_.get()); - if (!maybe_row_values.has_value()) return; - - row_values = std::move(maybe_row_values.value()); + ExtractRowValues(isolate, num_cols, iter->stmt_.get(), &row_values); + if (maybe_row_values.IsNothing()) return; if (iter->stmt_->return_arrays_) { row_value = Array::New(isolate, row_values.data(), row_values.size());