sqlite: add StatementSync.prototype[Symbol.dispose]() · nodejs/node@adbc757 · GitHub
Skip to content

Commit adbc757

Browse files
araujoguiaduh95
authored andcommitted
sqlite: add StatementSync.prototype[Symbol.dispose]()
This extends explicit resource management support to prepared statements, allowing a StatementSync to be deterministically finalized via a `using` declaration, mirroring the existing DatabaseSync and Session dispose methods. Signed-off-by: Guilherme Araújo <arauujogui@gmail.com> PR-URL: #64232 Backport-PR-URL: #66128 Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
1 parent c162c68 commit adbc757

4 files changed

Lines changed: 66 additions & 4 deletions

File tree

‎doc/api/sqlite.md‎

Lines changed: 9 additions & 0 deletions

‎src/node_sqlite.cc‎

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,10 +1058,7 @@ void DatabaseSync::FinalizeStatements() {
10581058
}
10591059

10601060
void DatabaseSync::UntrackStatement(StatementSync* statement) {
1061-
auto it = statements_.find(statement);
1062-
if (it != statements_.end()) {
1063-
statements_.erase(it);
1064-
}
1061+
statements_.erase(statement);
10651062
}
10661063

10671064
inline bool DatabaseSync::IsOpen() {
@@ -2669,6 +2666,10 @@ StatementSync::StatementSync(Environment* env,
26692666
}
26702667

26712668
StatementSync::~StatementSync() {
2669+
Close();
2670+
}
2671+
2672+
void StatementSync::Close() {
26722673
if (!IsFinalized()) {
26732674
db_->UntrackStatement(this);
26742675
Finalize();
@@ -2689,6 +2690,12 @@ inline bool StatementSync::IsFinalized() {
26892690
return statement_ == nullptr;
26902691
}
26912692

2693+
void StatementSync::Close(const FunctionCallbackInfo<Value>& args) {
2694+
StatementSync* stmt;
2695+
ASSIGN_OR_RETURN_UNWRAP(&stmt, args.This());
2696+
stmt->Close();
2697+
}
2698+
26922699
inline int StatementSync::ResetStatement() {
26932700
reset_generation_++;
26942701
return sqlite3_reset(statement_);
@@ -3727,6 +3734,7 @@ Local<FunctionTemplate> StatementSync::GetConstructorTemplate(
37273734
isolate, tmpl, "setReadBigInts", StatementSync::SetReadBigInts);
37283735
SetProtoMethod(
37293736
isolate, tmpl, "setReturnArrays", StatementSync::SetReturnArrays);
3737+
SetProtoDispose(isolate, tmpl, StatementSync::Close);
37303738
env->set_sqlite_statement_sync_constructor_template(tmpl);
37313739
}
37323740
return tmpl;

‎src/node_sqlite.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,7 @@ class StatementSync : public BaseObject {
284284
const v8::FunctionCallbackInfo<v8::Value>& args);
285285
static void SetReadBigInts(const v8::FunctionCallbackInfo<v8::Value>& args);
286286
static void SetReturnArrays(const v8::FunctionCallbackInfo<v8::Value>& args);
287+
static void Close(const v8::FunctionCallbackInfo<v8::Value>& args);
287288
v8::MaybeLocal<v8::Value> ColumnToValue(const int column);
288289
v8::MaybeLocal<v8::Name> ColumnNameToName(const int column);
289290
bool GetCachedColumnNames(v8::LocalVector<v8::Name>* keys);
@@ -295,6 +296,7 @@ class StatementSync : public BaseObject {
295296

296297
private:
297298
~StatementSync() override;
299+
void Close();
298300
BaseObjectPtr<DatabaseSync> db_;
299301
sqlite3_stmt* statement_;
300302
bool return_arrays_ = false;

‎test/parallel/test-sqlite-statement-sync.js‎

Lines changed: 43 additions & 0 deletions

0 commit comments

Comments
 (0)