Skip to content

Commit

Permalink
Merge pull request #201 from rkistner/get-autocommit
Browse files Browse the repository at this point in the history
Expose sqlite3_get_autocommit
  • Loading branch information
simolus3 authored Dec 21, 2023
2 parents 1009ef0 + 167912d commit 5ecd0c0
Show file tree
Hide file tree
Showing 9 changed files with 50 additions and 1 deletion.
1 change: 1 addition & 0 deletions sqlite3/assets/sqlite3.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ void *sqlite3_update_hook(sqlite3 *,
void (*)(void *, int, sqlite3_char const *,
sqlite3_char const *, int64_t),
void *);
int sqlite3_get_autocommit(sqlite3 *db);

// Statements
int sqlite3_prepare_v2(sqlite3 *db, const sqlite3_char *zSql, int nByte,
Expand Down
6 changes: 6 additions & 0 deletions sqlite3/lib/src/database.dart
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,12 @@ abstract class CommonDatabase {
bool directOnly = true,
});

/// Checks whether the connection is in autocommit mode. The connection is in
/// autocommit by default, except when inside a transaction.
///
/// For details, see https://www.sqlite.org/c3ref/get_autocommit.html
bool get autocommit;

/// Closes this database and releases associated resources.
void dispose();
}
Expand Down
5 changes: 5 additions & 0 deletions sqlite3/lib/src/ffi/bindings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,11 @@ final class FfiDatabase extends RawSqliteDatabase {
return result;
}

@override
int sqlite3_get_autocommit() {
return bindings.bindings.sqlite3_get_autocommit(db);
}

@override
RawStatementCompiler newCompiler(List<int> utf8EncodedSql) {
return FfiStatementCompiler(this, allocateBytes(utf8EncodedSql));
Expand Down
14 changes: 14 additions & 0 deletions sqlite3/lib/src/ffi/sqlite3.g.dart
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,20 @@ class Bindings {
ffi.Int64)>>,
ffi.Pointer<ffi.Void>)>();

int sqlite3_get_autocommit(
ffi.Pointer<sqlite3> db,
) {
return _sqlite3_get_autocommit(
db,
);
}

late final _sqlite3_get_autocommitPtr =
_lookup<ffi.NativeFunction<ffi.Int Function(ffi.Pointer<sqlite3>)>>(
'sqlite3_get_autocommit');
late final _sqlite3_get_autocommit = _sqlite3_get_autocommitPtr
.asFunction<int Function(ffi.Pointer<sqlite3>)>();

int sqlite3_prepare_v2(
ffi.Pointer<sqlite3> db,
ffi.Pointer<sqlite3_char> zSql,
Expand Down
1 change: 1 addition & 0 deletions sqlite3/lib/src/implementation/bindings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ abstract base class RawSqliteDatabase {
});

int sqlite3_db_config(int op, int value);
int sqlite3_get_autocommit();
}

/// A stateful wrapper around multiple `sqlite3_prepare` invocations.
Expand Down
5 changes: 5 additions & 0 deletions sqlite3/lib/src/implementation/database.dart
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,11 @@ base class DatabaseImplementation implements CommonDatabase {
@override
int get lastInsertRowId => database.sqlite3_last_insert_rowid();

@override
bool get autocommit {
return database.sqlite3_get_autocommit() != 0;
}

List<StatementImplementation> _prepareInternal(String sql,
{bool persistent = false,
bool vtab = true,
Expand Down
5 changes: 5 additions & 0 deletions sqlite3/lib/src/wasm/bindings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,11 @@ final class WasmDatabase extends RawSqliteDatabase {
bindings.dart_sqlite3_updates(db, hook != null ? 1 : -1);
}

@override
int sqlite3_get_autocommit() {
return bindings.sqlite3_get_autocommit(db);
}

@override
int sqlite3_db_config(int op, int value) {
return bindings.sqlite3_db_config(db, op, value);
Expand Down
6 changes: 5 additions & 1 deletion sqlite3/lib/src/wasm/wasm_interop.dart
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ class WasmBindings {
_sqlite3_value_bytes,
_sqlite3_value_text,
_sqlite3_value_blob,
_sqlite3_aggregate_context;
_sqlite3_aggregate_context,
_sqlite3_get_autocommit;

final Function? _sqlite3_db_config;

Expand Down Expand Up @@ -152,6 +153,7 @@ class WasmBindings {
_sqlite3_value_blob = instance.functions['sqlite3_value_blob']!,
_sqlite3_aggregate_context =
instance.functions['sqlite3_aggregate_context']!,
_sqlite3_get_autocommit = instance.functions['sqlite3_get_autocommit']!,
_sqlite3_db_config = instance.functions['dart_sqlite3_db_config_int'],
_sqlite3_temp_directory = instance.globals['sqlite3_temp_directory']! {
values.bindings = this;
Expand Down Expand Up @@ -405,6 +407,8 @@ class WasmBindings {
int sqlite3_last_insert_rowid(Pointer db) =>
JsBigInt(_sqlite3_last_insert_rowid(db) as Object).asDartInt;

int sqlite3_get_autocommit(Pointer db) => _sqlite3_get_autocommit(db) as int;

int sqlite3_db_config(Pointer db, int op, int value) {
final function = _sqlite3_db_config;
if (function != null) {
Expand Down
8 changes: 8 additions & 0 deletions sqlite3/test/common/database.dart
Original file line number Diff line number Diff line change
Expand Up @@ -762,6 +762,14 @@ void testDatabase(
);
});
});

test('autocommit', () {
expect(database.autocommit, equals(true));
database.execute('BEGIN');
expect(database.autocommit, equals(false));
database.execute('ROLLBACK');
expect(database.autocommit, equals(true));
});
}

/// Aggregate function that counts the length of all string parameters it
Expand Down

0 comments on commit 5ecd0c0

Please sign in to comment.