From 2d3d007e60acf9088657af220b3e5966db20bbaf Mon Sep 17 00:00:00 2001 From: Marco Romano Date: Fri, 13 Oct 2023 14:55:12 +0200 Subject: [PATCH 1/2] Find and replace --- gradle/libs.versions.toml | 10 +++++----- .../encrypteddb/SqlCipherDriverFactory.kt | 4 ++-- .../session-storage/impl/build.gradle.kts | 18 ++++++++++-------- .../impl/DatabaseSessionStore.kt | 6 +++--- .../impl/DatabaseSessionStoreTests.kt | 2 +- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 43e24a9e1b..7b4032a4a7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -43,7 +43,7 @@ appyx = "1.4.0" dependencycheck = "8.4.0" dependencyanalysis = "1.25.0" stem = "2.3.0" -sqldelight = "1.5.5" +sqldelight = "2.0.0" telephoto = "0.6.2" wysiwyg = "2.14.1" @@ -146,9 +146,9 @@ timber = "com.jakewharton.timber:timber:5.0.1" matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.1.62" matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" } matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", version.ref = "wysiwyg" } -sqldelight-driver-android = { module = "com.squareup.sqldelight:android-driver", version.ref = "sqldelight" } -sqldelight-driver-jvm = { module = "com.squareup.sqldelight:sqlite-driver", version.ref = "sqldelight" } -sqldelight-coroutines = { module = "com.squareup.sqldelight:coroutines-extensions", version.ref = "sqldelight" } +sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" } +sqldelight-driver-jvm = { module = "app.cash.sqldelight:sqlite-driver", version.ref = "sqldelight" } +sqldelight-coroutines = { module = "app.cash.sqldelight:coroutines-extensions", version.ref = "sqldelight" } sqlcipher = "net.zetetic:android-database-sqlcipher:4.5.4" sqlite = "androidx.sqlite:sqlite-ktx:2.3.1" unifiedpush = "com.github.UnifiedPush:android-connector:2.1.1" @@ -203,7 +203,7 @@ dependencycheck = { id = "org.owasp.dependencycheck", version.ref = "dependencyc dependencyanalysis = { id = "com.autonomousapps.dependency-analysis", version.ref = "dependencyanalysis" } paparazzi = "app.cash.paparazzi:1.3.1" kover = "org.jetbrains.kotlinx.kover:0.6.1" -sqldelight = { id = "com.squareup.sqldelight", version.ref = "sqldelight" } +sqldelight = { id = "app.cash.sqldelight", version.ref = "sqldelight" } # Version '4.3.1.3277' introduced some regressions in CI time (more than 2x slower), so make sure # this is no longer the case before upgrading. diff --git a/libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/SqlCipherDriverFactory.kt b/libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/SqlCipherDriverFactory.kt index 5258c388c5..5de674d1ca 100644 --- a/libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/SqlCipherDriverFactory.kt +++ b/libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/SqlCipherDriverFactory.kt @@ -17,8 +17,8 @@ package io.element.encrypteddb import android.content.Context -import com.squareup.sqldelight.android.AndroidSqliteDriver -import com.squareup.sqldelight.db.SqlDriver +import app.cash.sqldelight.android.AndroidSqliteDriver +import app.cash.sqldelight.db.SqlDriver import io.element.encrypteddb.passphrase.PassphraseProvider import net.sqlcipher.database.SupportFactory diff --git a/libraries/session-storage/impl/build.gradle.kts b/libraries/session-storage/impl/build.gradle.kts index 4e76c7de9c..03de9acf86 100644 --- a/libraries/session-storage/impl/build.gradle.kts +++ b/libraries/session-storage/impl/build.gradle.kts @@ -50,13 +50,15 @@ dependencies { } sqldelight { - database("SessionDatabase") { - // https://cashapp.github.io/sqldelight/1.5.4/multiplatform_sqlite/migrations/ - // To generate a .db file from your latest schema, run this task - // ./gradlew generateDebugSessionDatabaseSchema - // Test migration by running - // ./gradlew verifySqlDelightMigration - schemaOutputDirectory = File("src/main/sqldelight/databases") - verifyMigrations = true + databases { + create("SessionDatabase") { + // https://cashapp.github.io/sqldelight/2.0.0/android_sqlite/migrations/ + // To generate a .db file from your latest schema, run this task + // ./gradlew generateDebugSessionDatabaseSchema + // Test migration by running + // ./gradlew verifySqlDelightMigration + schemaOutputDirectory = File("src/main/sqldelight/databases") + verifyMigrations = true + } } } diff --git a/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt index 0ca63d52a7..d799a39dac 100644 --- a/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt +++ b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt @@ -17,9 +17,9 @@ package io.element.android.libraries.sessionstorage.impl import com.squareup.anvil.annotations.ContributesBinding -import com.squareup.sqldelight.runtime.coroutines.asFlow -import com.squareup.sqldelight.runtime.coroutines.mapToList -import com.squareup.sqldelight.runtime.coroutines.mapToOneOrNull +import app.cash.sqldelight.runtime.coroutines.asFlow +import app.cash.sqldelight.runtime.coroutines.mapToList +import app.cash.sqldelight.runtime.coroutines.mapToOneOrNull import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.SingleIn import io.element.android.libraries.sessionstorage.api.LoggedInState diff --git a/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTests.kt b/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTests.kt index 4ca932f48f..30c586abe0 100644 --- a/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTests.kt +++ b/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTests.kt @@ -18,7 +18,7 @@ package io.element.android.libraries.sessionstorage.impl import app.cash.turbine.test import com.google.common.truth.Truth.assertThat -import com.squareup.sqldelight.sqlite.driver.JdbcSqliteDriver +import app.cash.sqldelight.sqlite.driver.JdbcSqliteDriver import io.element.android.libraries.matrix.session.SessionData import io.element.android.libraries.sessionstorage.api.LoggedInState import io.element.android.libraries.sessionstorage.api.LoginType From 57ccafca425ac08f91daa1236955b5552161be52 Mon Sep 17 00:00:00 2001 From: Marco Romano Date: Fri, 13 Oct 2023 15:17:12 +0200 Subject: [PATCH 2/2] Other fixes as per https://cashapp.github.io/sqldelight/2.0.0/upgrading-2.0/ --- .../element/encrypteddb/SqlCipherDriverFactory.kt | 6 ++++-- .../sessionstorage/impl/DatabaseSessionStore.kt | 12 +++++++----- .../impl/DatabaseSessionStoreTests.kt | 15 +++++++++++++-- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/SqlCipherDriverFactory.kt b/libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/SqlCipherDriverFactory.kt index 5de674d1ca..cabc41b4ed 100644 --- a/libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/SqlCipherDriverFactory.kt +++ b/libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/SqlCipherDriverFactory.kt @@ -17,8 +17,10 @@ package io.element.encrypteddb import android.content.Context -import app.cash.sqldelight.android.AndroidSqliteDriver +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 io.element.encrypteddb.passphrase.PassphraseProvider import net.sqlcipher.database.SupportFactory @@ -35,7 +37,7 @@ class SqlCipherDriverFactory( * @param name The name of the database to create. * @param context Android [Context], used to instantiate the driver. */ - fun create(schema: SqlDriver.Schema, name: String, context: Context): SqlDriver { + fun create(schema: SqlSchema>, name: String, context: Context): SqlDriver { val passphrase = passphraseProvider.getPassphrase() val factory = SupportFactory(passphrase) return AndroidSqliteDriver(schema = schema, context = context, name = name, factory = factory) diff --git a/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt index d799a39dac..c437a4ef08 100644 --- a/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt +++ b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt @@ -16,10 +16,11 @@ package io.element.android.libraries.sessionstorage.impl +import app.cash.sqldelight.coroutines.asFlow +import app.cash.sqldelight.coroutines.mapToList +import app.cash.sqldelight.coroutines.mapToOneOrNull import com.squareup.anvil.annotations.ContributesBinding -import app.cash.sqldelight.runtime.coroutines.asFlow -import app.cash.sqldelight.runtime.coroutines.mapToList -import app.cash.sqldelight.runtime.coroutines.mapToOneOrNull +import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.SingleIn import io.element.android.libraries.sessionstorage.api.LoggedInState @@ -34,12 +35,13 @@ import javax.inject.Inject @ContributesBinding(AppScope::class) class DatabaseSessionStore @Inject constructor( private val database: SessionDatabase, + private val dispatchers: CoroutineDispatchers, ) : SessionStore { override fun isLoggedIn(): Flow { return database.sessionDataQueries.selectFirst() .asFlow() - .mapToOneOrNull() + .mapToOneOrNull(dispatchers.io) .map { if (it == null) { LoggedInState.NotLoggedIn @@ -96,7 +98,7 @@ class DatabaseSessionStore @Inject constructor( Timber.w("Observing session list!") return database.sessionDataQueries.selectAll() .asFlow() - .mapToList() + .mapToList(dispatchers.io) .map { it.map { sessionData -> sessionData.toApiModel() } } } diff --git a/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTests.kt b/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTests.kt index 30c586abe0..cb5569fb62 100644 --- a/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTests.kt +++ b/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTests.kt @@ -16,12 +16,15 @@ package io.element.android.libraries.sessionstorage.impl +import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver import app.cash.turbine.test import com.google.common.truth.Truth.assertThat -import app.cash.sqldelight.sqlite.driver.JdbcSqliteDriver +import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.matrix.session.SessionData import io.element.android.libraries.sessionstorage.api.LoggedInState import io.element.android.libraries.sessionstorage.api.LoginType +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test @@ -44,6 +47,7 @@ class DatabaseSessionStoreTests { loginType = LoginType.UNKNOWN.name, ) + @OptIn(ExperimentalCoroutinesApi::class) @Before fun setup() { // Initialise in memory SQLite driver @@ -51,7 +55,14 @@ class DatabaseSessionStoreTests { SessionDatabase.Schema.create(driver) database = SessionDatabase(driver) - databaseSessionStore = DatabaseSessionStore(database) + databaseSessionStore = DatabaseSessionStore( + database = database, + dispatchers = CoroutineDispatchers( + io = UnconfinedTestDispatcher(), + computation = UnconfinedTestDispatcher(), + main = UnconfinedTestDispatcher(), + ) + ) } @Test