Skip to content

Commit a4fe471

Browse files
committed
Use native finalizers for arguments
1 parent 6f1e786 commit a4fe471

File tree

5 files changed

+13
-56
lines changed

5 files changed

+13
-56
lines changed

sqlite3/assets/sqlite3.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ sqlite3_char *sqlite3_column_name(sqlite3_stmt *pStmt, int N);
6868
sqlite3_char *sqlite3_column_table_name(sqlite3_stmt *pStmt, int N);
6969

7070
int sqlite3_bind_blob64(sqlite3_stmt *pStmt, int index, void *data,
71-
uint64_t length, void *destructor);
71+
uint64_t length, void(*destructor)(void*));
7272
int sqlite3_bind_double(sqlite3_stmt *pStmt, int index, double data);
7373
int sqlite3_bind_int64(sqlite3_stmt *pStmt, int index, int64_t data);
7474
int sqlite3_bind_null(sqlite3_stmt *pStmt, int index);
7575
int sqlite3_bind_text(sqlite3_stmt *pStmt, int index, sqlite3_char *data,
76-
int length, void *destructor);
76+
int length, void(*destructor)(void*));
7777

7878
void *sqlite3_column_blob(sqlite3_stmt *pStmt, int iCol);
7979
double sqlite3_column_double(sqlite3_stmt *pStmt, int iCol);

sqlite3/lib/src/ffi/bindings.dart

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import 'dart:ffi';
66
import 'dart:typed_data';
77

88
import 'package:ffi/ffi.dart' as ffi;
9-
import 'package:meta/meta.dart';
109

1110
import '../constants.dart';
1211
import '../exception.dart';
@@ -1131,34 +1130,23 @@ final class FfiStatement implements RawSqliteStatement, Finalizable {
11311130
final Pointer<sqlite3_stmt> stmt;
11321131
final Object _detachToken = Object();
11331132

1134-
final List<Pointer> _allocatedArguments = [];
1135-
11361133
FfiStatement(this.stmt) {
11371134
statementFinalizer.attach(this, stmt.cast(), detach: _detachToken);
11381135
}
11391136

1140-
@visibleForTesting
1141-
List<Pointer> get allocatedArguments => _allocatedArguments;
1142-
11431137
@override
1144-
void deallocateArguments() {
1145-
for (final arg in _allocatedArguments) {
1146-
arg.free();
1147-
}
1148-
_allocatedArguments.clear();
1149-
}
1138+
void deallocateArguments() {}
11501139

11511140
@override
11521141
int sqlite3_bind_blob64(int index, List<int> value) {
11531142
final ptr = allocateBytes(value);
1154-
_allocatedArguments.add(ptr);
11551143

11561144
return libsqlite3.sqlite3_bind_blob64(
11571145
stmt,
11581146
index,
11591147
ptr.cast(),
11601148
value.length,
1161-
nullPtr(),
1149+
allocate.nativeFree,
11621150
);
11631151
}
11641152

@@ -1211,14 +1199,13 @@ final class FfiStatement implements RawSqliteStatement, Finalizable {
12111199
int sqlite3_bind_text(int index, String value) {
12121200
final bytes = utf8.encode(value);
12131201
final ptr = allocateBytes(bytes);
1214-
_allocatedArguments.add(ptr);
12151202

12161203
return libsqlite3.sqlite3_bind_text(
12171204
stmt,
12181205
index,
12191206
ptr.cast(),
12201207
bytes.length,
1221-
nullPtr(),
1208+
allocate.nativeFree,
12221209
);
12231210
}
12241211

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -250,15 +250,16 @@ external ffi.Pointer<sqlite3_char> sqlite3_column_table_name(
250250
ffi.Int,
251251
ffi.Pointer<ffi.Void>,
252252
ffi.Uint64,
253-
ffi.Pointer<ffi.Void>,
253+
ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>,
254254
)
255255
>()
256256
external int sqlite3_bind_blob64(
257257
ffi.Pointer<sqlite3_stmt> pStmt,
258258
int index,
259259
ffi.Pointer<ffi.Void> data,
260260
int length,
261-
ffi.Pointer<ffi.Void> destructor,
261+
ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
262+
destructor,
262263
);
263264

264265
@ffi.Native<ffi.Int Function(ffi.Pointer<sqlite3_stmt>, ffi.Int, ffi.Double)>()
@@ -284,15 +285,16 @@ external int sqlite3_bind_null(ffi.Pointer<sqlite3_stmt> pStmt, int index);
284285
ffi.Int,
285286
ffi.Pointer<sqlite3_char>,
286287
ffi.Int,
287-
ffi.Pointer<ffi.Void>,
288+
ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>,
288289
)
289290
>()
290291
external int sqlite3_bind_text(
291292
ffi.Pointer<sqlite3_stmt> pStmt,
292293
int index,
293294
ffi.Pointer<sqlite3_char> data,
294295
int length,
295-
ffi.Pointer<ffi.Void> destructor,
296+
ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>
297+
destructor,
296298
);
297299

298300
@ffi.Native<

sqlite3/lib/src/wasm/sqlite3_wasm.g.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ extension type SqliteExports(JSObject raw) implements JSObject {
8383
int index,
8484
Pointer /*<void *>*/ data,
8585
JSBigInt length,
86-
Pointer /*<void *>*/ destructor,
86+
Pointer /*<void (*)(void * )*>*/ destructor,
8787
);
8888
external int sqlite3_bind_double(
8989
Pointer /*<struct sqlite3_stmt *>*/ pStmt,
@@ -104,7 +104,7 @@ extension type SqliteExports(JSObject raw) implements JSObject {
104104
int index,
105105
Pointer /*<struct sqlite3_char *>*/ data,
106106
int length,
107-
Pointer /*<void *>*/ destructor,
107+
Pointer /*<void (*)(void * )*>*/ destructor,
108108
);
109109
external Pointer /*<void *>*/ sqlite3_column_blob(
110110
Pointer /*<struct sqlite3_stmt *>*/ pStmt,

sqlite3/test/ffi/prepared_statement_test.dart

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
library;
33

44
import 'package:sqlite3/sqlite3.dart';
5-
import 'package:sqlite3/src/ffi/implementation.dart';
65
import 'package:test/test.dart';
76

87
import '../common/prepared_statement.dart';
@@ -12,35 +11,4 @@ void main() {
1211
final hasReturning = version.versionNumber > 3035000;
1312

1413
testPreparedStatements(() => sqlite3, supportsReturning: hasReturning);
15-
16-
group('deallocates statement arguments', () {
17-
late Database database;
18-
19-
setUp(() => database = sqlite3.openInMemory());
20-
tearDown(() => database.dispose());
21-
22-
test('after binding different args', () {
23-
final stmt = database.prepare('SELECT ?;');
24-
stmt.execute(['this needs to be allocated and copied into ffi buffer']);
25-
expect(
26-
(stmt as FfiStatementImplementation).ffiStatement.allocatedArguments,
27-
isNotEmpty,
28-
);
29-
30-
stmt.execute([3]);
31-
expect(stmt.ffiStatement.allocatedArguments, isEmpty);
32-
});
33-
34-
test('after disposing statement', () {
35-
final stmt = database.prepare('SELECT ?;');
36-
stmt.execute(['this needs to be allocated and copied into ffi buffer']);
37-
expect(
38-
(stmt as FfiStatementImplementation).ffiStatement.allocatedArguments,
39-
isNotEmpty,
40-
);
41-
42-
stmt.dispose();
43-
expect(stmt.ffiStatement.allocatedArguments, isEmpty);
44-
});
45-
});
4614
}

0 commit comments

Comments
 (0)