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

Commit 7c61b08

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 Reviewed-By: René <contact.9a5d6388@renegade334.me.uk>
1 parent 7aff78d commit 7c61b08

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() {
@@ -2634,6 +2631,10 @@ StatementSync::StatementSync(Environment* env,
26342631
}
26352632

26362633
StatementSync::~StatementSync() {
2634+
Close();
2635+
}
2636+
2637+
void StatementSync::Close() {
26372638
if (!IsFinalized()) {
26382639
db_->UntrackStatement(this);
26392640
Finalize();
@@ -2654,6 +2655,12 @@ inline bool StatementSync::IsFinalized() {
26542655
return statement_ == nullptr;
26552656
}
26562657

2658+
void StatementSync::Close(const FunctionCallbackInfo<Value>& args) {
2659+
StatementSync* stmt;
2660+
ASSIGN_OR_RETURN_UNWRAP(&stmt, args.This());
2661+
stmt->Close();
2662+
}
2663+
26572664
inline int StatementSync::ResetStatement() {
26582665
reset_generation_++;
26592666
return sqlite3_reset(statement_);
@@ -3687,6 +3694,7 @@ Local<FunctionTemplate> StatementSync::GetConstructorTemplate(
36873694
isolate, tmpl, "setReadBigInts", StatementSync::SetReadBigInts);
36883695
SetProtoMethod(
36893696
isolate, tmpl, "setReturnArrays", StatementSync::SetReturnArrays);
3697+
SetProtoDispose(isolate, tmpl, StatementSync::Close);
36903698
env->set_sqlite_statement_sync_constructor_template(tmpl);
36913699
}
36923700
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)