Browse Source

Merge pull request #1569 from vector-im/julioromano/sqldelight2

Migrate SqlDelight to 2.0.0
pull/1573/head
Benoit Marty 11 months ago committed by GitHub
parent
commit
27758b542d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      gradle/libs.versions.toml
  2. 8
      libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/SqlCipherDriverFactory.kt
  3. 18
      libraries/session-storage/impl/build.gradle.kts
  4. 12
      libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt
  5. 15
      libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTests.kt

10
gradle/libs.versions.toml

@ -43,7 +43,7 @@ appyx = "1.4.0"
dependencycheck = "8.4.0" dependencycheck = "8.4.0"
dependencyanalysis = "1.25.0" dependencyanalysis = "1.25.0"
stem = "2.3.0" stem = "2.3.0"
sqldelight = "1.5.5" sqldelight = "2.0.0"
telephoto = "0.6.2" telephoto = "0.6.2"
wysiwyg = "2.14.1" 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_sdk = "org.matrix.rustcomponents:sdk-android:0.1.62"
matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" } matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" }
matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", 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-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" }
sqldelight-driver-jvm = { module = "com.squareup.sqldelight:sqlite-driver", version.ref = "sqldelight" } sqldelight-driver-jvm = { module = "app.cash.sqldelight:sqlite-driver", version.ref = "sqldelight" }
sqldelight-coroutines = { module = "com.squareup.sqldelight:coroutines-extensions", version.ref = "sqldelight" } sqldelight-coroutines = { module = "app.cash.sqldelight:coroutines-extensions", version.ref = "sqldelight" }
sqlcipher = "net.zetetic:android-database-sqlcipher:4.5.4" sqlcipher = "net.zetetic:android-database-sqlcipher:4.5.4"
sqlite = "androidx.sqlite:sqlite-ktx:2.3.1" sqlite = "androidx.sqlite:sqlite-ktx:2.3.1"
unifiedpush = "com.github.UnifiedPush:android-connector:2.1.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" } dependencyanalysis = { id = "com.autonomousapps.dependency-analysis", version.ref = "dependencyanalysis" }
paparazzi = "app.cash.paparazzi:1.3.1" paparazzi = "app.cash.paparazzi:1.3.1"
kover = "org.jetbrains.kotlinx.kover:0.6.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 # 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. # this is no longer the case before upgrading.

8
libraries/encrypted-db/src/main/kotlin/io/element/encrypteddb/SqlCipherDriverFactory.kt

@ -17,8 +17,10 @@
package io.element.encrypteddb package io.element.encrypteddb
import android.content.Context import android.content.Context
import com.squareup.sqldelight.android.AndroidSqliteDriver import app.cash.sqldelight.db.QueryResult
import com.squareup.sqldelight.db.SqlDriver 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 io.element.encrypteddb.passphrase.PassphraseProvider
import net.sqlcipher.database.SupportFactory import net.sqlcipher.database.SupportFactory
@ -35,7 +37,7 @@ class SqlCipherDriverFactory(
* @param name The name of the database to create. * @param name The name of the database to create.
* @param context Android [Context], used to instantiate the driver. * @param context Android [Context], used to instantiate the driver.
*/ */
fun create(schema: SqlDriver.Schema, name: String, context: Context): SqlDriver { fun create(schema: SqlSchema<QueryResult.Value<Unit>>, name: String, context: Context): SqlDriver {
val passphrase = passphraseProvider.getPassphrase() val passphrase = passphraseProvider.getPassphrase()
val factory = SupportFactory(passphrase) val factory = SupportFactory(passphrase)
return AndroidSqliteDriver(schema = schema, context = context, name = name, factory = factory) return AndroidSqliteDriver(schema = schema, context = context, name = name, factory = factory)

18
libraries/session-storage/impl/build.gradle.kts

@ -50,13 +50,15 @@ dependencies {
} }
sqldelight { sqldelight {
database("SessionDatabase") { databases {
// https://cashapp.github.io/sqldelight/1.5.4/multiplatform_sqlite/migrations/ create("SessionDatabase") {
// To generate a .db file from your latest schema, run this task // https://cashapp.github.io/sqldelight/2.0.0/android_sqlite/migrations/
// ./gradlew generateDebugSessionDatabaseSchema // To generate a .db file from your latest schema, run this task
// Test migration by running // ./gradlew generateDebugSessionDatabaseSchema
// ./gradlew verifySqlDelightMigration // Test migration by running
schemaOutputDirectory = File("src/main/sqldelight/databases") // ./gradlew verifySqlDelightMigration
verifyMigrations = true schemaOutputDirectory = File("src/main/sqldelight/databases")
verifyMigrations = true
}
} }
} }

12
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 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 com.squareup.anvil.annotations.ContributesBinding
import com.squareup.sqldelight.runtime.coroutines.asFlow import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import com.squareup.sqldelight.runtime.coroutines.mapToList
import com.squareup.sqldelight.runtime.coroutines.mapToOneOrNull
import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.SingleIn import io.element.android.libraries.di.SingleIn
import io.element.android.libraries.sessionstorage.api.LoggedInState import io.element.android.libraries.sessionstorage.api.LoggedInState
@ -34,12 +35,13 @@ import javax.inject.Inject
@ContributesBinding(AppScope::class) @ContributesBinding(AppScope::class)
class DatabaseSessionStore @Inject constructor( class DatabaseSessionStore @Inject constructor(
private val database: SessionDatabase, private val database: SessionDatabase,
private val dispatchers: CoroutineDispatchers,
) : SessionStore { ) : SessionStore {
override fun isLoggedIn(): Flow<LoggedInState> { override fun isLoggedIn(): Flow<LoggedInState> {
return database.sessionDataQueries.selectFirst() return database.sessionDataQueries.selectFirst()
.asFlow() .asFlow()
.mapToOneOrNull() .mapToOneOrNull(dispatchers.io)
.map { .map {
if (it == null) { if (it == null) {
LoggedInState.NotLoggedIn LoggedInState.NotLoggedIn
@ -96,7 +98,7 @@ class DatabaseSessionStore @Inject constructor(
Timber.w("Observing session list!") Timber.w("Observing session list!")
return database.sessionDataQueries.selectAll() return database.sessionDataQueries.selectAll()
.asFlow() .asFlow()
.mapToList() .mapToList(dispatchers.io)
.map { it.map { sessionData -> sessionData.toApiModel() } } .map { it.map { sessionData -> sessionData.toApiModel() } }
} }

15
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 package io.element.android.libraries.sessionstorage.impl
import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver
import app.cash.turbine.test import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import com.squareup.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.matrix.session.SessionData
import io.element.android.libraries.sessionstorage.api.LoggedInState import io.element.android.libraries.sessionstorage.api.LoggedInState
import io.element.android.libraries.sessionstorage.api.LoginType import io.element.android.libraries.sessionstorage.api.LoginType
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
@ -44,6 +47,7 @@ class DatabaseSessionStoreTests {
loginType = LoginType.UNKNOWN.name, loginType = LoginType.UNKNOWN.name,
) )
@OptIn(ExperimentalCoroutinesApi::class)
@Before @Before
fun setup() { fun setup() {
// Initialise in memory SQLite driver // Initialise in memory SQLite driver
@ -51,7 +55,14 @@ class DatabaseSessionStoreTests {
SessionDatabase.Schema.create(driver) SessionDatabase.Schema.create(driver)
database = SessionDatabase(driver) database = SessionDatabase(driver)
databaseSessionStore = DatabaseSessionStore(database) databaseSessionStore = DatabaseSessionStore(
database = database,
dispatchers = CoroutineDispatchers(
io = UnconfinedTestDispatcher(),
computation = UnconfinedTestDispatcher(),
main = UnconfinedTestDispatcher(),
)
)
} }
@Test @Test

Loading…
Cancel
Save