From adeb1334296a8194214cb5d2f7e828fada7537f0 Mon Sep 17 00:00:00 2001 From: lihenggui Date: Wed, 23 Oct 2024 15:59:06 -0700 Subject: [PATCH] Inject db drivers by platform --- .../samples/apps/nowinandroid/di/AppModule.kt | 2 +- core/database/build.gradle.kts | 1 + ...{DriverProvider.kt => Database.android.kt} | 17 +++-- .../core/database/di/DatabaseModule.kt | 68 +++++++++++-------- .../core/database/di/DriverProvider.kt | 27 -------- .../di/{DriverProvider.kt => Database.jvm.kt} | 21 +++--- .../{DriverProvider.kt => Database.native.kt} | 17 ++--- 7 files changed, 68 insertions(+), 85 deletions(-) rename core/database/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/{DriverProvider.kt => Database.android.kt} (81%) delete mode 100644 core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DriverProvider.kt rename core/database/src/jvmMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/{DriverProvider.kt => Database.jvm.kt} (76%) rename core/database/src/nativeMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/{DriverProvider.kt => Database.native.kt} (80%) diff --git a/app/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/di/AppModule.kt b/app/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/di/AppModule.kt index 92d7cab0b..e50fac659 100644 --- a/app/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/di/AppModule.kt +++ b/app/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/di/AppModule.kt @@ -60,7 +60,7 @@ internal val appModules = module { includes( *commonModule().toTypedArray(), AnalyticsModule().module, - *databaseModule().toTypedArray(), + databaseModule, dataModule, dataStoreModule(), *networkModule().toTypedArray(), diff --git a/core/database/build.gradle.kts b/core/database/build.gradle.kts index f0463937c..0daefc5e5 100644 --- a/core/database/build.gradle.kts +++ b/core/database/build.gradle.kts @@ -35,6 +35,7 @@ kotlin { implementation(libs.sqldelight.primitive.adapters) } androidMain.dependencies { + implementation(libs.koin.android) implementation(libs.sqldelight.android.driver) } androidUnitTest.dependencies { diff --git a/core/database/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DriverProvider.kt b/core/database/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/Database.android.kt similarity index 81% rename from core/database/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DriverProvider.kt rename to core/database/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/Database.android.kt index c3242f6a7..b21e88e70 100644 --- a/core/database/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DriverProvider.kt +++ b/core/database/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/Database.android.kt @@ -19,21 +19,20 @@ package com.google.samples.apps.nowinandroid.core.database.di import android.content.Context import androidx.sqlite.db.SupportSQLiteDatabase import app.cash.sqldelight.async.coroutines.synchronous -import app.cash.sqldelight.db.QueryResult.AsyncValue +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 app.cash.sqldelight.driver.android.AndroidSqliteDriver.Callback -import org.koin.core.annotation.Single +import org.koin.android.ext.koin.androidContext +import org.koin.dsl.module -@Single -internal actual class DriverProvider(val context: Context) { - - actual suspend fun provideDbDriver( - schema: SqlSchema>, - ): SqlDriver { +internal actual val driverModule = module { + single { + val schema: SqlSchema> = get() + val context: Context = androidContext() val synchronousSchema = schema.synchronous() - return AndroidSqliteDriver( + AndroidSqliteDriver( schema = synchronousSchema, context = context, name = "nia-database.db", diff --git a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DatabaseModule.kt b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DatabaseModule.kt index 859f004bb..3654250b3 100644 --- a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DatabaseModule.kt +++ b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DatabaseModule.kt @@ -16,42 +16,54 @@ package com.google.samples.apps.nowinandroid.core.database.di +import app.cash.sqldelight.db.QueryResult import app.cash.sqldelight.db.SqlDriver +import app.cash.sqldelight.db.SqlSchema import com.google.samples.apps.nowinandroid.core.database.NiaDatabase import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceDao +import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceDaoInterface import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceFtsDao +import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceFtsDaoInterface import com.google.samples.apps.nowinandroid.core.database.dao.RecentSearchQueryDao +import com.google.samples.apps.nowinandroid.core.database.dao.RecentSearchQueryDaoInterface import com.google.samples.apps.nowinandroid.core.database.dao.TopicDao +import com.google.samples.apps.nowinandroid.core.database.dao.TopicDaoInterface import com.google.samples.apps.nowinandroid.core.database.dao.TopicFtsDao -import kotlinx.coroutines.runBlocking -import org.koin.core.annotation.ComponentScan -import org.koin.core.annotation.Module +import com.google.samples.apps.nowinandroid.core.database.dao.TopicFtsDaoInterface +import com.google.samples.apps.nowinandroid.core.di.coroutineDispatcherModule +import org.koin.core.module.Module import org.koin.dsl.module -import org.koin.ksp.generated.module -internal val driverModule = module { - single { NiaDatabase.Schema } - single { - val driverProvider: DriverProvider = get() - // TODO check if we can remove runBlocking - runBlocking { - driverProvider.provideDbDriver(get()) - } +internal expect val driverModule: Module + +internal val schemaModule = module { + single>> { NiaDatabase.Schema } +} + +internal val dbModule = module { + single { (driver: SqlDriver) -> + NiaDatabase(driver) } } internal val daoModule = module { - single { (driver: SqlDriver) -> NiaDatabase(driver) } - - factory { (database: NiaDatabase) -> TopicDao(database, get()) } + factory { (database: NiaDatabase) -> + TopicDao(database, get()) + } - factory { (database: NiaDatabase) -> NewsResourceDao(database, get()) } + factory { (database: NiaDatabase) -> + NewsResourceDao(database, get()) + } - factory { (database: NiaDatabase) -> TopicFtsDao(database, get()) } + factory { (database: NiaDatabase) -> + TopicFtsDao(database, get()) + } - factory { (database: NiaDatabase) -> NewsResourceFtsDao(database, get()) } + factory { (database: NiaDatabase) -> + NewsResourceFtsDao(database, get()) + } - factory { (database: NiaDatabase) -> + factory { (database: NiaDatabase) -> RecentSearchQueryDao( database, get(), @@ -59,12 +71,12 @@ internal val daoModule = module { } } -fun databaseModule() = listOf( - driverModule, - DatabaseModule().module, - daoModule, -) - -@Module -@ComponentScan -class DatabaseModule +val databaseModule: Module get() = module { + includes(coroutineDispatcherModule) + includes( + schemaModule, + driverModule, + dbModule, + daoModule, + ) +} \ No newline at end of file diff --git a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DriverProvider.kt b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DriverProvider.kt deleted file mode 100644 index 552b88a39..000000000 --- a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DriverProvider.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2024 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.samples.apps.nowinandroid.core.database.di - -import app.cash.sqldelight.db.QueryResult.AsyncValue -import app.cash.sqldelight.db.SqlDriver -import app.cash.sqldelight.db.SqlSchema - -internal expect class DriverProvider { - suspend fun provideDbDriver( - schema: SqlSchema>, - ): SqlDriver -} diff --git a/core/database/src/jvmMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DriverProvider.kt b/core/database/src/jvmMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/Database.jvm.kt similarity index 76% rename from core/database/src/jvmMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DriverProvider.kt rename to core/database/src/jvmMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/Database.jvm.kt index 49c92cdc3..8218e101c 100644 --- a/core/database/src/jvmMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DriverProvider.kt +++ b/core/database/src/jvmMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/Database.jvm.kt @@ -19,20 +19,23 @@ package com.google.samples.apps.nowinandroid.core.database.di import app.cash.sqldelight.db.QueryResult.AsyncValue import app.cash.sqldelight.db.SqlDriver import app.cash.sqldelight.db.SqlSchema + import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver -import org.koin.core.annotation.Single -import java.util.Properties +import kotlinx.coroutines.runBlocking -@Single -internal actual class DriverProvider { +import org.koin.dsl.module +import java.util.Properties - actual suspend fun provideDbDriver( - schema: SqlSchema>, - ): SqlDriver { - return JdbcSqliteDriver( +internal actual val driverModule = module { + single { (schema: SqlSchema>) -> + JdbcSqliteDriver( url = JdbcSqliteDriver.IN_MEMORY, properties = Properties().apply { put("foreign_keys", "true") }, ) - .also { schema.create(it).await() } + .also { + runBlocking { + schema.create(it).await() + } + } } } diff --git a/core/database/src/nativeMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DriverProvider.kt b/core/database/src/nativeMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/Database.native.kt similarity index 80% rename from core/database/src/nativeMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DriverProvider.kt rename to core/database/src/nativeMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/Database.native.kt index e88bc8506..97f8195b1 100644 --- a/core/database/src/nativeMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/DriverProvider.kt +++ b/core/database/src/nativeMain/kotlin/com/google/samples/apps/nowinandroid/core/database/di/Database.native.kt @@ -23,17 +23,12 @@ import app.cash.sqldelight.db.SqlSchema import app.cash.sqldelight.driver.native.NativeSqliteDriver import co.touchlab.sqliter.DatabaseConfiguration import co.touchlab.sqliter.DatabaseConfiguration.Extended -import org.koin.core.annotation.Single +import org.koin.dsl.module -@Single -internal actual class DriverProvider { - - actual suspend fun provideDbDriver( - schema: SqlSchema>, - ): SqlDriver { - val synchronousSchema = schema.synchronous() - return NativeSqliteDriver( - schema = synchronousSchema, +internal actual val driverModule = module { + single { (schema: SqlSchema>) -> + NativeSqliteDriver( + schema = schema.synchronous(), name = "nia-database.db", onConfiguration = { config: DatabaseConfiguration -> config.copy( @@ -42,4 +37,4 @@ internal actual class DriverProvider { }, ) } -} +} \ No newline at end of file