@@ -544,19 +544,32 @@ static const napi_type_tag PreparedStatementTypeTag = {
544
544
0xA8B03DAD16D34416 , 0x9735A7E1F2A1240C
545
545
};
546
546
547
- void FinalizePreparedStatement (Napi::BasicEnv, duckdb_prepared_statement prepared_statement) {
548
- if (prepared_statement) {
549
- duckdb_destroy_prepare (&prepared_statement);
550
- prepared_statement = nullptr ;
551
- }
547
+ typedef struct {
548
+ duckdb_prepared_statement prepared;
549
+ } duckdb_prepared_statement_holder;
550
+
551
+ duckdb_prepared_statement_holder *CreatePreparedStatementHolder (duckdb_prepared_statement prepared) {
552
+ auto prepared_statement_holder_ptr = reinterpret_cast <duckdb_prepared_statement_holder*>(duckdb_malloc (sizeof (duckdb_prepared_statement_holder)));
553
+ prepared_statement_holder_ptr->prepared = prepared;
554
+ return prepared_statement_holder_ptr;
552
555
}
553
556
554
- Napi::External<_duckdb_prepared_statement> CreateExternalForPreparedStatement (Napi::Env env, duckdb_prepared_statement prepared_statement) {
555
- return CreateExternal<_duckdb_prepared_statement>(env, PreparedStatementTypeTag, prepared_statement, FinalizePreparedStatement);
557
+ void FinalizePreparedStatementHolder (Napi::BasicEnv, duckdb_prepared_statement_holder *prepared_statement_holder_ptr) {
558
+ // duckdb_destroy_prepare is a no-op if already destroyed
559
+ duckdb_destroy_prepare (&prepared_statement_holder_ptr->prepared );
560
+ duckdb_free (prepared_statement_holder_ptr);
561
+ }
562
+
563
+ Napi::External<duckdb_prepared_statement_holder> CreateExternalForPreparedStatement (Napi::Env env, duckdb_prepared_statement prepared_statement) {
564
+ return CreateExternal<duckdb_prepared_statement_holder>(env, PreparedStatementTypeTag, CreatePreparedStatementHolder (prepared_statement), FinalizePreparedStatementHolder);
565
+ }
566
+
567
+ duckdb_prepared_statement_holder *GetPreparedStatementHolderFromExternal (Napi::Env env, Napi::Value value) {
568
+ return GetDataFromExternal<duckdb_prepared_statement_holder>(env, PreparedStatementTypeTag, value, " Invalid prepared statement argument" );
556
569
}
557
570
558
571
duckdb_prepared_statement GetPreparedStatementFromExternal (Napi::Env env, Napi::Value value) {
559
- return GetDataFromExternal<_duckdb_prepared_statement> (env, PreparedStatementTypeTag, value, " Invalid prepared statement argument " ) ;
572
+ return GetPreparedStatementHolderFromExternal (env, value)-> prepared ;
560
573
}
561
574
562
575
static const napi_type_tag ResultTypeTag = {
@@ -1232,6 +1245,7 @@ class DuckDBNodeAddon : public Napi::Addon<DuckDBNodeAddon> {
1232
1245
InstanceMethod (" decimal_to_double" , &DuckDBNodeAddon::decimal_to_double),
1233
1246
1234
1247
InstanceMethod (" prepare" , &DuckDBNodeAddon::prepare),
1248
+ InstanceMethod (" destroy_prepare_sync" , &DuckDBNodeAddon::destroy_prepare_sync),
1235
1249
InstanceMethod (" nparams" , &DuckDBNodeAddon::nparams),
1236
1250
InstanceMethod (" parameter_name" , &DuckDBNodeAddon::parameter_name),
1237
1251
InstanceMethod (" param_type" , &DuckDBNodeAddon::param_type),
@@ -1996,7 +2010,14 @@ class DuckDBNodeAddon : public Napi::Addon<DuckDBNodeAddon> {
1996
2010
}
1997
2011
1998
2012
// DUCKDB_API void duckdb_destroy_prepare(duckdb_prepared_statement *prepared_statement);
1999
- // not exposed: destroyed in finalizer
2013
+ // function destroy_prepare_sync(prepared_statement: PreparedStatement): void
2014
+ Napi::Value destroy_prepare_sync (const Napi::CallbackInfo& info) {
2015
+ auto env = info.Env ();
2016
+ auto prepared_statement_holder_ptr = GetPreparedStatementHolderFromExternal (env, info[0 ]);
2017
+ // duckdb_destroy_prepare is a no-op if already destroyed
2018
+ duckdb_destroy_prepare (&prepared_statement_holder_ptr->prepared );
2019
+ return env.Undefined ();
2020
+ }
2000
2021
2001
2022
// DUCKDB_API const char *duckdb_prepare_error(duckdb_prepared_statement prepared_statement);
2002
2023
// not exposed: prepare rejects promise with error
@@ -4391,7 +4412,7 @@ NODE_API_ADDON(DuckDBNodeAddon)
4391
4412
---
4392
4413
411 total functions
4393
4414
4394
- 242 instance methods
4415
+ 243 instance methods
4395
4416
1 unimplemented logical type function
4396
4417
13 unimplemented scalar function functions
4397
4418
4 unimplemented scalar function set functions
@@ -4407,7 +4428,7 @@ NODE_API_ADDON(DuckDBNodeAddon)
4407
4428
6 unimplemented table description functions
4408
4429
8 unimplemented tasks functions
4409
4430
12 unimplemented cast function functions
4410
- 24 functions not exposed
4431
+ 23 functions not exposed
4411
4432
+ 41 unimplemented deprecated functions (of 47)
4412
4433
---
4413
4434
411 functions accounted for
0 commit comments