Skip to content

Commit 98e2ed5

Browse files
committed
Revert "Native finalizer for db and stmt"
This reverts commit 7023618. Running into dart-lang/sdk#61887
1 parent 7023618 commit 98e2ed5

File tree

8 files changed

+38
-69
lines changed

8 files changed

+38
-69
lines changed

sqlite3/CHANGELOG.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
- You should drop your dependencies on `sqlite3_flutter_libs` and
77
`sqlcipher_flutter_libs` when upgrading.
88
- __Breaking change__: Parameters to `SqliteException`s are now named.
9-
- Use native finalizers to clear statements, parameters and sessions. This makes
10-
closing databases after e.g. a reload much more efficient.
119

1210
## 2.9.4
1311

sqlite3/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ For native platforms, the basic sketch for using this library is to:
1919
open a temporary in-memory database.
2020
3. Use `Database.execute` or `Database.prepare` to execute statements directly
2121
or by preparing them first.
22+
4. Don't forget to close prepared statements or the database with `dispose()`
23+
once you no longer need them.
2224

2325
For a more complete example on how to use this library, see the [example](https://pub.dev/packages/sqlite3/example).
2426

sqlite3/lib/src/ffi/bindings.dart

Lines changed: 9 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ final supportsPrepareV3 = sqlite3_libversion_number() >= _firstVersionForV3;
3434
final supportsErrorOffset =
3535
sqlite3_libversion_number() >= _firstVersionForErrorOffset;
3636

37-
final databaseFinalizer = NativeFinalizer(addresses.sqlite3_close_v2.cast());
38-
final statementFinalizer = NativeFinalizer(addresses.sqlite3_finalize.cast());
3937
final sessionDeleteFinalizer = NativeFinalizer(
4038
addresses.sqlite3session_delete.cast(),
4139
);
@@ -210,7 +208,7 @@ final class FfiBindings implements RawSqliteBindings {
210208
}
211209

212210
@override
213-
SqliteResult<RawSqliteDatabase?> sqlite3_open_v2(
211+
SqliteResult<RawSqliteDatabase> sqlite3_open_v2(
214212
String name,
215213
int flags,
216214
String? zVfs,
@@ -227,10 +225,7 @@ final class FfiBindings implements RawSqliteBindings {
227225
flags,
228226
vfsPtr,
229227
);
230-
final result = (
231-
resultCode: resultCode,
232-
result: outDb.isNullPointer ? null : FfiDatabase(outDb.value),
233-
);
228+
final result = SqliteResult(resultCode, FfiDatabase(outDb.value));
234229

235230
namePtr.free();
236231
outDb.free();
@@ -745,10 +740,7 @@ final class FfiChangesetIterator implements RawChangesetIterator, Finalizable {
745740
final value = outValue.value;
746741
outValue.free();
747742

748-
return (
749-
resultCode: result,
750-
result: value.isNullPointer ? null : FfiValue(value),
751-
);
743+
return SqliteResult(result, value.isNullPointer ? null : FfiValue(value));
752744
}
753745

754746
@override
@@ -767,10 +759,7 @@ final class FfiChangesetIterator implements RawChangesetIterator, Finalizable {
767759
final value = outValue.value;
768760
outValue.free();
769761

770-
return (
771-
resultCode: result,
772-
result: value.isNullPointer ? null : FfiValue(value),
773-
);
762+
return SqliteResult(result, value.isNullPointer ? null : FfiValue(value));
774763
}
775764

776765
@override
@@ -811,21 +800,17 @@ final class FfiChangesetIterator implements RawChangesetIterator, Finalizable {
811800
}
812801
}
813802

814-
final class FfiDatabase implements RawSqliteDatabase, Finalizable {
803+
final class FfiDatabase implements RawSqliteDatabase {
815804
final Pointer<sqlite3> db;
816-
final Object detachToken = Object();
817805

818806
NativeCallable<_UpdateHook>? _installedUpdateHook;
819807
NativeCallable<_CommitHook>? _installedCommitHook;
820808
NativeCallable<_RollbackHook>? _installedRollbackHook;
821809

822-
FfiDatabase(this.db) {
823-
databaseFinalizer.attach(this, db.cast(), detach: detachToken);
824-
}
810+
FfiDatabase(this.db);
825811

826812
@override
827813
int sqlite3_close_v2() {
828-
databaseFinalizer.detach(detachToken);
829814
return libsqlite3.sqlite3_close_v2(db);
830815
}
831816

@@ -1100,19 +1085,16 @@ final class FfiStatementCompiler implements RawStatementCompiler {
11001085
final stmt = stmtOut.value;
11011086
final libraryStatement = stmt.isNullPointer ? null : FfiStatement(stmt);
11021087

1103-
return (resultCode: result, result: libraryStatement);
1088+
return SqliteResult(result, libraryStatement);
11041089
}
11051090
}
11061091

1107-
final class FfiStatement implements RawSqliteStatement, Finalizable {
1092+
final class FfiStatement implements RawSqliteStatement {
11081093
final Pointer<sqlite3_stmt> stmt;
1109-
final Object detachToken = Object();
11101094

11111095
final List<Pointer> _allocatedArguments = [];
11121096

1113-
FfiStatement(this.stmt) {
1114-
statementFinalizer.attach(this, stmt.cast(), detach: detachToken);
1115-
}
1097+
FfiStatement(this.stmt);
11161098

11171099
@visibleForTesting
11181100
List<Pointer> get allocatedArguments => _allocatedArguments;
@@ -1256,7 +1238,6 @@ final class FfiStatement implements RawSqliteStatement, Finalizable {
12561238

12571239
@override
12581240
void sqlite3_finalize() {
1259-
statementFinalizer.detach(detachToken);
12601241
libsqlite3.sqlite3_finalize(stmt);
12611242
}
12621243

sqlite3/lib/src/ffi/libsqlite3.g.dart

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -866,10 +866,6 @@ class _SymbolAddresses {
866866
const _SymbolAddresses();
867867
ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
868868
get sqlite3_free => ffi.Native.addressOf(self.sqlite3_free);
869-
ffi.Pointer<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3>)>>
870-
get sqlite3_close_v2 => ffi.Native.addressOf(self.sqlite3_close_v2);
871-
ffi.Pointer<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3_stmt>)>>
872-
get sqlite3_finalize => ffi.Native.addressOf(self.sqlite3_finalize);
873869
ffi.Pointer<
874870
ffi.NativeFunction<ffi.Void Function(ffi.Pointer<sqlite3_session>)>
875871
>

sqlite3/lib/src/implementation/bindings.dart

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ abstract interface class RawSqliteBindings {
116116

117117
String? sqlite3_temp_directory;
118118

119-
SqliteResult<RawSqliteDatabase?> sqlite3_open_v2(
119+
SqliteResult<RawSqliteDatabase> sqlite3_open_v2(
120120
String name,
121121
int flags,
122122
String? zVfs,
@@ -166,9 +166,15 @@ abstract interface class RawSqliteSession {
166166
}
167167

168168
/// Combines a sqlite result code and the result object.
169-
///
170-
/// The result is only assumed to be valid if the result code is zero.
171-
typedef SqliteResult<T> = ({T result, int resultCode});
169+
final class SqliteResult<T> {
170+
final int resultCode;
171+
172+
/// The result of the operation, which is assumed to be valid if [resultCode]
173+
/// is zero.
174+
final T result;
175+
176+
SqliteResult(this.resultCode, this.result);
177+
}
172178

173179
typedef RawXFunc = void Function(RawSqliteContext, List<RawSqliteValue>);
174180
typedef RawXStep = void Function(RawSqliteContext, List<RawSqliteValue>);

sqlite3/lib/src/implementation/sqlite3.dart

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -70,28 +70,19 @@ base class Sqlite3Implementation implements CommonSqlite3 {
7070

7171
final result = bindings.sqlite3_open_v2(filename, flags, vfs);
7272
if (result.resultCode != SqlError.SQLITE_OK) {
73-
if (result.result case final db?) {
74-
// Even with an opening error, we usually still get a database (the only
75-
// exception is if SQLite can't allocate the db structure).
76-
final exception = createExceptionRaw(
77-
bindings,
78-
db,
79-
result.resultCode,
80-
operation: 'opening the database',
81-
);
82-
// Close the database after creating the exception, which needs to read
83-
// the extended error from the database.
84-
db.sqlite3_close_v2();
85-
throw exception;
86-
} else {
87-
throw SqliteException(
88-
extendedResultCode: result.resultCode,
89-
message: 'Could not open database',
90-
);
91-
}
73+
final exception = createExceptionRaw(
74+
bindings,
75+
result.result,
76+
result.resultCode,
77+
operation: 'opening the database',
78+
);
79+
// Close the database after creating the exception, which needs to read
80+
// the extended error from the database.
81+
result.result.sqlite3_close_v2();
82+
throw exception;
9283
}
9384

94-
return wrapDatabase(result.result!..sqlite3_extended_result_codes(1));
85+
return wrapDatabase(result.result..sqlite3_extended_result_codes(1));
9586
}
9687

9788
@override

sqlite3/lib/src/wasm/bindings.dart

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ final class WasmSqliteBindings implements RawSqliteBindings {
5656
}
5757

5858
@override
59-
SqliteResult<RawSqliteDatabase?> sqlite3_open_v2(
59+
SqliteResult<RawSqliteDatabase> sqlite3_open_v2(
6060
String name,
6161
int flags,
6262
String? zVfs,
@@ -74,10 +74,7 @@ final class WasmSqliteBindings implements RawSqliteBindings {
7474
..free(vfsPtr);
7575
if (zVfs != null) bindings.free(vfsPtr);
7676

77-
return (
78-
resultCode: result,
79-
result: dbPtr != 0 ? WasmDatabase(bindings, dbPtr) : null,
80-
);
77+
return SqliteResult(result, WasmDatabase(bindings, dbPtr));
8178
}
8279

8380
@override
@@ -446,7 +443,7 @@ final class WasmStatementCompiler implements RawStatementCompiler {
446443
final stmt = database.bindings.memory.int32ValueOfPointer(stmtOut);
447444
final libraryStatement = stmt == 0 ? null : WasmStatement(database, stmt);
448445

449-
return (resultCode: result, result: libraryStatement);
446+
return SqliteResult(result, libraryStatement);
450447
}
451448
}
452449

@@ -924,9 +921,9 @@ final class WasmChangesetIterator implements RawChangesetIterator {
924921
final value = _bindings.memory.int32ValueOfPointer(outValue);
925922
_bindings.free(outValue);
926923

927-
return (
928-
resultCode: resultCode,
929-
result: value != 0 ? WasmValue(_bindings, value) : null,
924+
return SqliteResult(
925+
resultCode,
926+
value != 0 ? WasmValue(_bindings, value) : null,
930927
);
931928
}
932929

sqlite3/tool/generate_bindings.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ DeclarationFilters _includeSqlite3Only = DeclarationFilters(
4646
shouldInclude: (d) => d.isSqlite3Symbol,
4747
shouldIncludeSymbolAddress: (decl) {
4848
return switch (decl.originalName) {
49-
'sqlite3_close_v2' => true,
50-
'sqlite3_finalize' => true,
5149
'sqlite3changeset_finalize' => true,
5250
'sqlite3session_delete' => true,
5351
'sqlite3_free' => true,

0 commit comments

Comments
 (0)