Skip to content

Commit

Permalink
feat: add support for foreign key configuration
Browse files Browse the repository at this point in the history
Fixes #5
  • Loading branch information
Tamim Attafi committed Mar 26, 2024
1 parent ab0d53b commit db530a3
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 14 deletions.
Original file line number Diff line number Diff line change
@@ -1,13 +1,24 @@
package com.attafitamim.kabin.core.database

import android.content.Context
import androidx.sqlite.db.SupportSQLiteDatabase

private const val DEFAULT_CACHE_SIZE = 20

typealias OpenCallback = (db: SupportSQLiteDatabase) -> Unit

private fun createDefaultCallback(
foreignKeyConstraintsEnabled: Boolean
): OpenCallback = { db ->
db.setForeignKeyConstraintsEnabled(foreignKeyConstraintsEnabled)
}

actual class KabinDatabaseConfiguration(
val context: Context,
val name: String? = null,
val cacheSize: Int = DEFAULT_CACHE_SIZE,
val useNoBackupDirectory: Boolean = false,
val windowSizeBytes: Long? = null,
val foreignKeyConstraintsEnabled: Boolean = true,
val onOpen: OpenCallback? = createDefaultCallback(foreignKeyConstraintsEnabled)
)
Original file line number Diff line number Diff line change
@@ -1,19 +1,34 @@
package com.attafitamim.kabin.core.driver

import androidx.sqlite.db.SupportSQLiteDatabase
import app.cash.sqldelight.async.coroutines.synchronous
import app.cash.sqldelight.db.QueryResult
import app.cash.sqldelight.db.SqlDriver
import app.cash.sqldelight.db.SqlSchema
import app.cash.sqldelight.driver.android.AndroidSqliteDriver
import com.attafitamim.kabin.core.database.KabinDatabaseConfiguration
import com.attafitamim.kabin.core.database.OpenCallback

private fun createCallback(
schema: SqlSchema<QueryResult.Value<Unit>>,
onOpen: OpenCallback?,
) = object : AndroidSqliteDriver.Callback(schema) {
override fun onOpen(db: SupportSQLiteDatabase) {
onOpen?.invoke(db)
}
}

actual fun KabinDatabaseConfiguration.createDriver(
schema: SqlSchema<QueryResult.AsyncValue<Unit>>,
): SqlDriver = AndroidSqliteDriver(
schema.synchronous(),
context,
name,
cacheSize = cacheSize,
useNoBackupDirectory = useNoBackupDirectory,
windowSizeBytes = windowSizeBytes
)
): SqlDriver {
val synchronousSchema = schema.synchronous()
return AndroidSqliteDriver(
synchronousSchema,
context,
name,
cacheSize = cacheSize,
useNoBackupDirectory = useNoBackupDirectory,
windowSizeBytes = windowSizeBytes,
callback = createCallback(synchronousSchema, onOpen)
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@ actual class KabinDatabaseConfiguration(
val url: String,
val properties: Properties = Properties(),
val migrateEmptySchema: Boolean = false,
val callbacks: Array<out AfterVersion> = emptyArray()
val callbacks: Array<out AfterVersion> = emptyArray(),
val foreignKeyConstraintsEnabled: Boolean = true
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,22 @@ import app.cash.sqldelight.db.SqlDriver
import app.cash.sqldelight.db.SqlSchema
import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver
import com.attafitamim.kabin.core.database.KabinDatabaseConfiguration
import java.util.Properties

private const val FOREIGN_KEY_FLAG = "foreign_keys"

private fun Properties.appendFlags(
foreignKeyConstraintsEnabled: Boolean
) = apply {
put(FOREIGN_KEY_FLAG, foreignKeyConstraintsEnabled)
}

actual fun KabinDatabaseConfiguration.createDriver(
schema: SqlSchema<QueryResult.AsyncValue<Unit>>,
): SqlDriver = JdbcSqliteDriver(
url,
properties,
properties.appendFlags(foreignKeyConstraintsEnabled),
schema.synchronous(),
migrateEmptySchema,
*callbacks
)
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,22 @@ package com.attafitamim.kabin.core.database
import app.cash.sqldelight.db.AfterVersion
import co.touchlab.sqliter.DatabaseConfiguration

typealias OnConfiguration = (DatabaseConfiguration) -> DatabaseConfiguration

private fun createConfiguration(
foreignKeyConstraintsEnabled: Boolean
): OnConfiguration = { config ->
val extendedConfig = DatabaseConfiguration.Extended(
foreignKeyConstraints = foreignKeyConstraintsEnabled
)

config.copy(extendedConfig = extendedConfig)
}

actual class KabinDatabaseConfiguration(
val name: String,
val maxReaderConnections: Int = 1,
val onConfiguration: (DatabaseConfiguration) -> DatabaseConfiguration = { it },
val callbacks: Array<out AfterVersion> = emptyArray()
val callbacks: Array<out AfterVersion> = emptyArray(),
val foreignKeyConstraintsEnabled: Boolean = true,
val onConfiguration: OnConfiguration = createConfiguration(foreignKeyConstraintsEnabled)
)
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ class MainActivity : AppCompatActivity() {
private val playground: Playground by lazy {
val configuration = KabinDatabaseConfiguration(
context = this,
name = "sample-database"
name = "sample-database",
foreignKeyConstraintsEnabled = true
)

Playground(configuration)
Expand Down

0 comments on commit db530a3

Please sign in to comment.