@@ -34,6 +34,8 @@ final supportsPrepareV3 = sqlite3_libversion_number() >= _firstVersionForV3;
3434final supportsErrorOffset =
3535 sqlite3_libversion_number () >= _firstVersionForErrorOffset;
3636
37+ final databaseFinalizer = NativeFinalizer (addresses.sqlite3_close_v2.cast ());
38+ final statementFinalizer = NativeFinalizer (addresses.sqlite3_finalize.cast ());
3739final sessionDeleteFinalizer = NativeFinalizer (
3840 addresses.sqlite3session_delete.cast (),
3941);
@@ -208,7 +210,7 @@ final class FfiBindings implements RawSqliteBindings {
208210 }
209211
210212 @override
211- SqliteResult <RawSqliteDatabase > sqlite3_open_v2 (
213+ SqliteResult <RawSqliteDatabase ? > sqlite3_open_v2 (
212214 String name,
213215 int flags,
214216 String ? zVfs,
@@ -225,7 +227,10 @@ final class FfiBindings implements RawSqliteBindings {
225227 flags,
226228 vfsPtr,
227229 );
228- final result = SqliteResult (resultCode, FfiDatabase (outDb.value));
230+ final result = (
231+ resultCode: resultCode,
232+ result: outDb.isNullPointer ? null : FfiDatabase (outDb.value),
233+ );
229234
230235 namePtr.free ();
231236 outDb.free ();
@@ -740,7 +745,10 @@ final class FfiChangesetIterator implements RawChangesetIterator, Finalizable {
740745 final value = outValue.value;
741746 outValue.free ();
742747
743- return SqliteResult (result, value.isNullPointer ? null : FfiValue (value));
748+ return (
749+ resultCode: result,
750+ result: value.isNullPointer ? null : FfiValue (value),
751+ );
744752 }
745753
746754 @override
@@ -759,7 +767,10 @@ final class FfiChangesetIterator implements RawChangesetIterator, Finalizable {
759767 final value = outValue.value;
760768 outValue.free ();
761769
762- return SqliteResult (result, value.isNullPointer ? null : FfiValue (value));
770+ return (
771+ resultCode: result,
772+ result: value.isNullPointer ? null : FfiValue (value),
773+ );
763774 }
764775
765776 @override
@@ -800,17 +811,21 @@ final class FfiChangesetIterator implements RawChangesetIterator, Finalizable {
800811 }
801812}
802813
803- final class FfiDatabase implements RawSqliteDatabase {
814+ final class FfiDatabase implements RawSqliteDatabase , Finalizable {
804815 final Pointer <sqlite3> db;
816+ final Object detachToken = Object ();
805817
806818 NativeCallable <_UpdateHook >? _installedUpdateHook;
807819 NativeCallable <_CommitHook >? _installedCommitHook;
808820 NativeCallable <_RollbackHook >? _installedRollbackHook;
809821
810- FfiDatabase (this .db);
822+ FfiDatabase (this .db) {
823+ databaseFinalizer.attach (this , db.cast (), detach: detachToken);
824+ }
811825
812826 @override
813827 int sqlite3_close_v2 () {
828+ databaseFinalizer.detach (detachToken);
814829 return libsqlite3.sqlite3_close_v2 (db);
815830 }
816831
@@ -1085,16 +1100,19 @@ final class FfiStatementCompiler implements RawStatementCompiler {
10851100 final stmt = stmtOut.value;
10861101 final libraryStatement = stmt.isNullPointer ? null : FfiStatement (stmt);
10871102
1088- return SqliteResult ( result, libraryStatement);
1103+ return (resultCode : result, result : libraryStatement);
10891104 }
10901105}
10911106
1092- final class FfiStatement implements RawSqliteStatement {
1107+ final class FfiStatement implements RawSqliteStatement , Finalizable {
10931108 final Pointer <sqlite3_stmt> stmt;
1109+ final Object detachToken = Object ();
10941110
10951111 final List <Pointer > _allocatedArguments = [];
10961112
1097- FfiStatement (this .stmt);
1113+ FfiStatement (this .stmt) {
1114+ statementFinalizer.attach (this , stmt.cast (), detach: detachToken);
1115+ }
10981116
10991117 @visibleForTesting
11001118 List <Pointer > get allocatedArguments => _allocatedArguments;
@@ -1238,6 +1256,7 @@ final class FfiStatement implements RawSqliteStatement {
12381256
12391257 @override
12401258 void sqlite3_finalize () {
1259+ statementFinalizer.detach (detachToken);
12411260 libsqlite3.sqlite3_finalize (stmt);
12421261 }
12431262
0 commit comments