From 232e9324c036998b4331a887695383ae3b609578 Mon Sep 17 00:00:00 2001 From: Mert Can Altin Date: Sun, 18 Jan 2026 20:54:18 +0300 Subject: [PATCH] sqlite: use DictionaryTemplate for run() result --- src/env_properties.h | 1 + src/node_sqlite.cc | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/env_properties.h b/src/env_properties.h index 903158ebbdc2b7..cd76b1fe32970b 100644 --- a/src/env_properties.h +++ b/src/env_properties.h @@ -434,6 +434,7 @@ V(socketaddress_constructor_template, v8::FunctionTemplate) \ V(space_stats_template, v8::DictionaryTemplate) \ V(sqlite_column_template, v8::DictionaryTemplate) \ + V(sqlite_run_result_template, v8::DictionaryTemplate) \ V(sqlite_statement_sync_constructor_template, v8::FunctionTemplate) \ V(sqlite_statement_sync_iterator_constructor_template, v8::FunctionTemplate) \ V(sqlite_session_constructor_template, v8::FunctionTemplate) \ diff --git a/src/node_sqlite.cc b/src/node_sqlite.cc index 6d35236dce0f82..9c2e7007ccc6ac 100644 --- a/src/node_sqlite.cc +++ b/src/node_sqlite.cc @@ -2305,7 +2305,7 @@ MaybeLocal StatementExecutionHelper::Run(Environment* env, sqlite3_step(stmt); int r = sqlite3_reset(stmt); CHECK_ERROR_OR_THROW(isolate, db, r, SQLITE_OK, MaybeLocal()); - Local result = Object::New(isolate); + sqlite3_int64 last_insert_rowid = sqlite3_last_insert_rowid(db->Connection()); sqlite3_int64 changes = sqlite3_changes64(db->Connection()); Local last_insert_rowid_val; @@ -2319,13 +2319,18 @@ MaybeLocal StatementExecutionHelper::Run(Environment* env, changes_val = Number::New(isolate, changes); } - if (result - ->Set(env->context(), - env->last_insert_rowid_string(), - last_insert_rowid_val) - .IsNothing() || - result->Set(env->context(), env->changes_string(), changes_val) - .IsNothing()) { + auto run_result_template = env->sqlite_run_result_template(); + if (run_result_template.IsEmpty()) { + static constexpr std::string_view run_result_keys[] = {"changes", + "lastInsertRowid"}; + run_result_template = DictionaryTemplate::New(isolate, run_result_keys); + env->set_sqlite_run_result_template(run_result_template); + } + + MaybeLocal values[] = {changes_val, last_insert_rowid_val}; + Local result; + if (!NewDictionaryInstance(env->context(), run_result_template, values) + .ToLocal(&result)) { return MaybeLocal(); }