diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/DatabaseConfiguration.kt b/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/DatabaseConfiguration.kt index 25755cfb..80628c84 100644 --- a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/DatabaseConfiguration.kt +++ b/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/DatabaseConfiguration.kt @@ -36,7 +36,9 @@ data class DatabaseConfiguration( val busyTimeout: Int = 5000, val pageSize: Int? = null, val basePath: String? = null, - ) + val synchronousFlag: SynchronousFlag? = null, + val recursiveTriggers: Boolean = false + ) data class Logging( val logger: Logger = WarningLogger, val verboseDataCalls: Boolean = false @@ -94,3 +96,7 @@ enum class JournalMode { } } } + +enum class SynchronousFlag(val value: Int) { + OFF(0), NORMAL(1), FULL(2), EXTRA(3); +} diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/DatabaseConnection.kt b/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/DatabaseConnection.kt index fe311e9d..21be9e43 100644 --- a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/DatabaseConnection.kt +++ b/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/DatabaseConnection.kt @@ -105,10 +105,15 @@ fun DatabaseConnection.updateJournalMode(value: JournalMode): JournalMode { } fun DatabaseConnection.updateForeignKeyConstraints(enabled: Boolean) { - val newValue = if (enabled) { - 1 - } else { - 0 - } - withStatement("PRAGMA foreign_keys=$newValue") { execute() } + withStatement("PRAGMA foreign_keys=${enabled.toInt()}") { execute() } +} + +fun DatabaseConnection.updateSynchronousFlag(flag: SynchronousFlag) { + withStatement("PRAGMA synchronous=${flag.value}") { execute() } } + +fun DatabaseConnection.updateRecursiveTriggers(enabled: Boolean) { + withStatement("PRAGMA recursive_triggers=${enabled.toInt()}") { execute() } +} + +private fun Boolean.toInt(): Int = if (this) 1 else 0 \ No newline at end of file diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/native/NativeDatabaseManager.kt b/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/native/NativeDatabaseManager.kt index aea538eb..12ffe9cf 100644 --- a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/native/NativeDatabaseManager.kt +++ b/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/native/NativeDatabaseManager.kt @@ -58,6 +58,10 @@ class NativeDatabaseManager(private val path:String, val conn = NativeDatabaseConnection(this, connectionPtrArg) configuration.lifecycleConfig.onCreateConnection(conn) + if (configuration.extendedConfig.synchronousFlag != null) { + conn.updateSynchronousFlag(configuration.extendedConfig.synchronousFlag) + } + if (configuration.encryptionConfig.rekey == null) { configuration.encryptionConfig.key?.let { conn.setCipherKey(it) } } else { @@ -69,9 +73,15 @@ class NativeDatabaseManager(private val path:String, } } - if(configuration.extendedConfig.foreignKeyConstraints){ - conn.updateForeignKeyConstraints(true) - } + // These flags should be explicitly set on each connection at all times. + // + // "should set the foreign key enforcement flag [...] and not depend on the default setting." + // https://www.sqlite.org/pragma.html#pragma_foreign_keys + // "Recursive triggers may be turned on by default in future versions of SQLite." + // https://www.sqlite.org/pragma.html#pragma_recursive_triggers + conn.updateForeignKeyConstraints(configuration.extendedConfig.foreignKeyConstraints) + conn.updateRecursiveTriggers(configuration.extendedConfig.recursiveTriggers) + if(newConnection.value == 0){ conn.updateJournalMode(configuration.journalMode)