Skip to content

Commit df6d955

Browse files
davidmartos96simolus3
authored andcommitted
Add option to enable/disable double quotes as literals
1 parent 994fad0 commit df6d955

File tree

10 files changed

+80
-2
lines changed

10 files changed

+80
-2
lines changed

sqlite3/assets/sqlite3.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,4 +115,7 @@ int sqlite3_backup_remaining(sqlite3_backup *p);
115115
int sqlite3_backup_pagecount(sqlite3_backup *p);
116116

117117
// Extensions
118-
int sqlite3_auto_extension(void *xEntryPoint);
118+
int sqlite3_auto_extension(void *xEntryPoint);
119+
120+
// Database configuration
121+
int sqlite3_db_config(sqlite3 *db, int op, ...);

sqlite3/ffigen.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,8 @@ macros:
1313
include: ['sqlite3.*']
1414
functions:
1515
include: ['sqlite3.*']
16+
variadic-arguments:
17+
sqlite3_db_config:
18+
- [int, int*]
1619
globals:
1720
include: ['sqlite3.*']

sqlite3/lib/src/constants.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,3 +528,7 @@ const SQLITE_UPDATE = 23;
528528

529529
final bigIntMinValue64 = BigInt.parse('-9223372036854775808');
530530
final bigIntMaxValue64 = BigInt.parse('9223372036854775807');
531+
532+
// Connection config options https://www.sqlite.org/c3ref/c_dbconfig_defensive.html
533+
const SQLITE_DBCONFIG_DQS_DML = 1013;
534+
const SQLITE_DBCONFIG_DQS_DDL = 1014;

sqlite3/lib/src/database.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,8 @@ abstract class CommonDatabase {
157157
bool directOnly = true,
158158
});
159159

160+
void configDoubleQuotedStringLiterals({required bool enable});
161+
160162
/// Closes this database and releases associated resources.
161163
void dispose();
162164
}

sqlite3/lib/src/ffi/bindings.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,16 @@ final class FfiDatabase extends RawSqliteDatabase {
267267
);
268268
}
269269

270+
int sqlite3_db_config(int op, int value) {
271+
final result = bindings.bindings.sqlite3_db_config(
272+
db,
273+
op,
274+
value,
275+
nullPtr(),
276+
);
277+
return result;
278+
}
279+
270280
@override
271281
RawStatementCompiler newCompiler(List<int> utf8EncodedSql) {
272282
return FfiStatementCompiler(this, allocateBytes(utf8EncodedSql));

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,6 +1181,33 @@ class Bindings {
11811181
'sqlite3_auto_extension');
11821182
late final _sqlite3_auto_extension = _sqlite3_auto_extensionPtr
11831183
.asFunction<int Function(ffi.Pointer<ffi.Void>)>();
1184+
1185+
int sqlite3_db_config(
1186+
ffi.Pointer<sqlite3> db,
1187+
int op,
1188+
int va,
1189+
ffi.Pointer<ffi.Int> va1,
1190+
) {
1191+
return _sqlite3_db_config(
1192+
db,
1193+
op,
1194+
va,
1195+
va1,
1196+
);
1197+
}
1198+
1199+
late final _sqlite3_db_configPtr = _lookup<
1200+
ffi.NativeFunction<
1201+
ffi.Int Function(
1202+
ffi.Pointer<sqlite3>,
1203+
ffi.Int,
1204+
ffi.VarArgs<
1205+
(
1206+
ffi.Int,
1207+
ffi.Pointer<ffi.Int>,
1208+
)>)>>('sqlite3_db_config');
1209+
late final _sqlite3_db_config = _sqlite3_db_configPtr.asFunction<
1210+
int Function(ffi.Pointer<sqlite3>, int, int, ffi.Pointer<ffi.Int>)>();
11841211
}
11851212

11861213
final class sqlite3_char extends ffi.Opaque {}

sqlite3/lib/src/implementation/bindings.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ abstract base class RawSqliteDatabase {
103103
required RawXFinal xValue,
104104
required RawXStep xInverse,
105105
});
106+
107+
int sqlite3_db_config(int op, int value);
106108
}
107109

108110
/// A stateful wrapper around multiple `sqlite3_prepare` invocations.

sqlite3/lib/src/implementation/database.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,23 @@ base class DatabaseImplementation implements CommonDatabase {
448448
isBroadcast: true,
449449
);
450450
}
451+
452+
@override
453+
void configDoubleQuotedStringLiterals({required bool enable}) {
454+
final value = enable ? 1 : 0;
455+
456+
final resultDML =
457+
database.sqlite3_db_config(SQLITE_DBCONFIG_DQS_DML, value);
458+
if (resultDML != SqlError.SQLITE_OK) {
459+
throwException(this, resultDML);
460+
}
461+
462+
final resultDDL =
463+
database.sqlite3_db_config(SQLITE_DBCONFIG_DQS_DDL, value);
464+
if (resultDDL != SqlError.SQLITE_OK) {
465+
throwException(this, resultDDL);
466+
}
467+
}
451468
}
452469

453470
extension on RawSqliteContext {

sqlite3/lib/src/wasm/bindings.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,11 @@ final class WasmDatabase extends RawSqliteDatabase {
245245

246246
bindings.dart_sqlite3_updates(db, hook != null ? 1 : -1);
247247
}
248+
249+
@override
250+
int sqlite3_db_config(int op, int value) {
251+
return bindings.sqlite3_db_config(db, op, value);
252+
}
248253
}
249254

250255
final class WasmStatementCompiler extends RawStatementCompiler {

sqlite3/lib/src/wasm/wasm_interop.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ class WasmBindings {
7777
_sqlite3_value_bytes,
7878
_sqlite3_value_text,
7979
_sqlite3_value_blob,
80-
_sqlite3_aggregate_context;
80+
_sqlite3_aggregate_context,
81+
_sqlite3_db_config;
8182

8283
final Global _sqlite3_temp_directory;
8384

@@ -150,6 +151,7 @@ class WasmBindings {
150151
_sqlite3_value_blob = instance.functions['sqlite3_value_blob']!,
151152
_sqlite3_aggregate_context =
152153
instance.functions['sqlite3_aggregate_context']!,
154+
_sqlite3_db_config = instance.functions['sqlite3_db_config']!,
153155
_sqlite3_temp_directory = instance.globals['sqlite3_temp_directory']! {
154156
values.bindings = this;
155157
}
@@ -402,6 +404,9 @@ class WasmBindings {
402404
int sqlite3_last_insert_rowid(Pointer db) =>
403405
JsBigInt(_sqlite3_last_insert_rowid(db) as Object).asDartInt;
404406

407+
int sqlite3_db_config(Pointer db, int op, int value) =>
408+
_sqlite3_db_config(db, op, value) as int;
409+
405410
Pointer get sqlite3_temp_directory {
406411
return _sqlite3_temp_directory.value;
407412
}

0 commit comments

Comments
 (0)