diff --git a/.idea/artifacts/database_jvm.xml b/.idea/artifacts/database_jvm.xml new file mode 100644 index 00000000..a32d631c --- /dev/null +++ b/.idea/artifacts/database_jvm.xml @@ -0,0 +1,8 @@ + + + $PROJECT_DIR$/database/build/libs + + + + + \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 39eec84b..0d31a976 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -44,7 +44,6 @@ dependencies { implementation(Dependencies.ThirdParty.accompanistFlow) implementation(Dependencies.ThirdParty.Moshi.lib) implementation(Dependencies.ThirdParty.Retrofit.moshi) - implementation(Dependencies.ThirdParty.SQLDelight.androidDriver) testImplementation(kotlin("test-junit")) androidTestImplementation(kotlin("test-junit")) } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/injection/DatabaseModule.kt b/app/src/main/java/dev/msfjarvis/lobsters/injection/DatabaseModule.kt index a960454d..6638523a 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/injection/DatabaseModule.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/injection/DatabaseModule.kt @@ -1,41 +1,29 @@ package dev.msfjarvis.lobsters.injection import android.content.Context -import com.squareup.sqldelight.android.AndroidSqliteDriver -import com.squareup.sqldelight.db.SqlDriver import dagger.Module import dagger.Provides -import dagger.Reusable import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent -import dev.msfjarvis.lobsters.data.local.SavedPost +import dev.msfjarvis.lobsters.data.local.DriverFactory +import dev.msfjarvis.lobsters.data.local.createDatabase import dev.msfjarvis.lobsters.database.LobstersDatabase -import dev.msfjarvis.lobsters.model.TagsAdapter import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) object DatabaseModule { - @Provides - @Reusable - fun providesTagsAdapter(): TagsAdapter { - return TagsAdapter() - } - @Provides @Singleton - fun providesSqlDriver(@ApplicationContext context: Context): SqlDriver { - return AndroidSqliteDriver(LobstersDatabase.Schema, context, "SavedPosts.db") + fun providesDriverFactory(@ApplicationContext context: Context): DriverFactory { + return DriverFactory(context) } @Provides @Singleton - fun providesLobstersDatabase(sqlDriver: SqlDriver, tagsAdapter: TagsAdapter): LobstersDatabase { - return LobstersDatabase( - sqlDriver, - SavedPost.Adapter(tagsAdapter), - ) + fun providesLobstersDatabase(driverFactory: DriverFactory): LobstersDatabase { + return createDatabase(driverFactory) } } diff --git a/database/build.gradle.kts b/database/build.gradle.kts index daaf6ca9..763013a7 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -1,11 +1,48 @@ plugins { - kotlin("jvm") + kotlin("multiplatform") + id("com.android.library") id("com.squareup.sqldelight") `lobsters-plugin` } -dependencies { - testImplementation(Dependencies.Kotlin.Coroutines.core) - testImplementation(Dependencies.ThirdParty.SQLDelight.jvmDriver) - testImplementation(kotlin("test-junit")) +// workaround for https://youtrack.jetbrains.com/issue/KT-43944 +android { + configurations { + create("androidTestApi") + create("androidTestDebugApi") + create("androidTestReleaseApi") + create("testApi") + create("testDebugApi") + create("testReleaseApi") + } +} + +kotlin { + jvm() + android() + + sourceSets { + val commonMain by getting { + } + val jvmTest by getting { + dependencies { + implementation(Dependencies.Kotlin.Coroutines.core) + implementation(kotlin("test-junit")) + } + } + val jvmMain by getting { + dependencies { + implementation(Dependencies.ThirdParty.SQLDelight.jvmDriver) + } + } + val androidMain by getting { + dependencies { + implementation(Dependencies.ThirdParty.SQLDelight.androidDriver) + } + } + } +} + +android { + sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") } diff --git a/database/src/androidMain/AndroidManifest.xml b/database/src/androidMain/AndroidManifest.xml new file mode 100644 index 00000000..4ee754c1 --- /dev/null +++ b/database/src/androidMain/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/database/src/androidMain/kotlin/dev/msfjarvis/lobsters/data/local/Database.kt b/database/src/androidMain/kotlin/dev/msfjarvis/lobsters/data/local/Database.kt new file mode 100644 index 00000000..37209b72 --- /dev/null +++ b/database/src/androidMain/kotlin/dev/msfjarvis/lobsters/data/local/Database.kt @@ -0,0 +1,12 @@ +package dev.msfjarvis.lobsters.data.local + +import android.content.Context +import com.squareup.sqldelight.android.AndroidSqliteDriver +import com.squareup.sqldelight.db.SqlDriver +import dev.msfjarvis.lobsters.database.LobstersDatabase + +actual class DriverFactory(private val context: Context) { + actual fun createDriver(): SqlDriver { + return AndroidSqliteDriver(LobstersDatabase.Schema, context, LobstersDatabaseName) + } +} diff --git a/database/src/commonMain/kotlin/dev/msfjarvis/lobsters/data/local/Database.kt b/database/src/commonMain/kotlin/dev/msfjarvis/lobsters/data/local/Database.kt new file mode 100644 index 00000000..1ab3266e --- /dev/null +++ b/database/src/commonMain/kotlin/dev/msfjarvis/lobsters/data/local/Database.kt @@ -0,0 +1,18 @@ +package dev.msfjarvis.lobsters.data.local + +import com.squareup.sqldelight.db.SqlDriver +import dev.msfjarvis.lobsters.data.model.TagsAdapter +import dev.msfjarvis.lobsters.database.LobstersDatabase + +internal const val LobstersDatabaseName = "SavedPosts.db" + +expect class DriverFactory { + fun createDriver(): SqlDriver +} + +private fun getTagsAdapter() = TagsAdapter() + +fun createDatabase(driverFactory: DriverFactory): LobstersDatabase { + val driver = driverFactory.createDriver() + return LobstersDatabase(driver, SavedPost.Adapter(getTagsAdapter())) +} diff --git a/database/src/main/java/dev/msfjarvis/lobsters/model/TagsAdapter.kt b/database/src/commonMain/kotlin/dev/msfjarvis/lobsters/data/model/TagsAdapter.kt similarity index 90% rename from database/src/main/java/dev/msfjarvis/lobsters/model/TagsAdapter.kt rename to database/src/commonMain/kotlin/dev/msfjarvis/lobsters/data/model/TagsAdapter.kt index a4a04588..3b8fcb48 100644 --- a/database/src/main/java/dev/msfjarvis/lobsters/model/TagsAdapter.kt +++ b/database/src/commonMain/kotlin/dev/msfjarvis/lobsters/data/model/TagsAdapter.kt @@ -1,4 +1,4 @@ -package dev.msfjarvis.lobsters.model +package dev.msfjarvis.lobsters.data.model import com.squareup.sqldelight.ColumnAdapter diff --git a/database/src/main/sqldelight/dev/msfjarvis/lobsters/data/local/SavedPost.sq b/database/src/commonMain/sqldelight/dev/msfjarvis/lobsters/data/local/SavedPost.sq similarity index 100% rename from database/src/main/sqldelight/dev/msfjarvis/lobsters/data/local/SavedPost.sq rename to database/src/commonMain/sqldelight/dev/msfjarvis/lobsters/data/local/SavedPost.sq diff --git a/database/src/jvmMain/kotlin/dev/msfjarvis/lobsters/data/local/Database.kt b/database/src/jvmMain/kotlin/dev/msfjarvis/lobsters/data/local/Database.kt new file mode 100644 index 00000000..9883a8a3 --- /dev/null +++ b/database/src/jvmMain/kotlin/dev/msfjarvis/lobsters/data/local/Database.kt @@ -0,0 +1,13 @@ +package dev.msfjarvis.lobsters.data.local + +import com.squareup.sqldelight.db.SqlDriver +import com.squareup.sqldelight.sqlite.driver.JdbcSqliteDriver +import dev.msfjarvis.lobsters.database.LobstersDatabase + +actual class DriverFactory { + actual fun createDriver(): SqlDriver { + val driver: SqlDriver = JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY) + LobstersDatabase.Schema.create(driver) + return driver + } +} diff --git a/database/src/test/java/dev/msfjarvis/lobsters/data/local/SqlDelightQueriesTest.kt b/database/src/jvmTest/kotlin/dev/msfjarvis/lobsters/data/local/SqlDelightQueriesTest.kt similarity index 98% rename from database/src/test/java/dev/msfjarvis/lobsters/data/local/SqlDelightQueriesTest.kt rename to database/src/jvmTest/kotlin/dev/msfjarvis/lobsters/data/local/SqlDelightQueriesTest.kt index 68bee231..5ca12981 100644 --- a/database/src/test/java/dev/msfjarvis/lobsters/data/local/SqlDelightQueriesTest.kt +++ b/database/src/jvmTest/kotlin/dev/msfjarvis/lobsters/data/local/SqlDelightQueriesTest.kt @@ -1,8 +1,8 @@ package dev.msfjarvis.lobsters.data.local import com.squareup.sqldelight.sqlite.driver.JdbcSqliteDriver +import dev.msfjarvis.lobsters.data.model.TagsAdapter import dev.msfjarvis.lobsters.database.LobstersDatabase -import dev.msfjarvis.lobsters.model.TagsAdapter import kotlin.test.Test import kotlin.test.assertEquals import kotlinx.coroutines.runBlocking