From 999d20a19d43813bbf2c550cb056ea4f65c585c0 Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Thu, 4 Jan 2024 16:48:43 +0100 Subject: [PATCH 01/11] fix: wip, failed to start due to role/db init --- gradle/libs.versions.toml | 3 ++ persistence/build.gradle.kts | 5 ++- .../persistence/db/GlobalDatabaseProvider.kt | 23 +++++++++++-- .../kalium/persistence/db/UserDatabase.kt | 34 ++++++++++++------- 4 files changed, 48 insertions(+), 17 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 14681faa0ed..24e241e2792 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -164,6 +164,7 @@ sqldelight-androidxPaging = { module = "app.cash.sqldelight:androidx-paging3-ext sqldelight-nativeDriver = { module = "app.cash.sqldelight:native-driver", version.ref = "sqldelight" } sqldelight-jvmDriver = { module = "app.cash.sqldelight:sqlite-driver", version.ref = "sqldelight" } sqldelight-jsDriver = { module = "app.cash.sqldelight:web-worker-driver", version.ref = "sqldelight" } +sqldelight-jdbcDriver = { module = "app.cash.sqldelight:jdbc-driver", version.ref = "sqldelight" } sqldelight-primitiveAdapters = { module = "app.cash.sqldelight:primitive-adapters", version.ref = "sqldelight" } sqldelight-dialect = { module = "app.cash.sqldelight:sqlite-3-33-dialect", version.ref = "sqldelight" } sqldelight-postgres = { module = "app.cash.sqldelight:postgresql-dialect", version.ref = "sqldelight" } @@ -171,6 +172,8 @@ sqldelight-r2dbc = { module = "app.cash.sqldelight:r2dbc-driver", version.ref = sqldelight-async = { module = "app.cash.sqldelight:async-extensions", version.ref = "sqldelight" } r2dbc-postgres = { module = "org.postgresql:r2dbc-postgresql", version.ref = "postgres" } r2dbc-spi = { module = "io.r2dbc:r2dbc-spi", version.ref = "r2dbc" } +hikaricp = { module = "com.zaxxer:HikariCP", version = "5.0.1" } +postgres-driver = { module = "org.postgresql:postgresql", version = "42.5.4" } # mocks and testing mockative-runtime = { module = "io.mockative:mockative", version.ref = "mockative" } diff --git a/persistence/build.gradle.kts b/persistence/build.gradle.kts index 8a61fb92815..009e003d668 100644 --- a/persistence/build.gradle.kts +++ b/persistence/build.gradle.kts @@ -87,7 +87,10 @@ kotlin { } val jvmMain by getting { dependencies { - implementation(libs.sqldelight.jvmDriver) + implementation(libs.sqldelight.jvmDriver) // rename to something else ? as jvm should be parametrized + implementation(libs.sqldelight.jdbcDriver) + implementation(libs.hikaricp) + implementation(libs.postgres.driver) } } val jvmTest by getting diff --git a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseProvider.kt b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseProvider.kt index 39e9f178011..a285ea32c6a 100644 --- a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseProvider.kt +++ b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseProvider.kt @@ -21,20 +21,23 @@ package com.wire.kalium.persistence.db import app.cash.sqldelight.EnumColumnAdapter import app.cash.sqldelight.adapter.primitive.IntColumnAdapter import app.cash.sqldelight.db.SqlDriver -import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver +import app.cash.sqldelight.driver.jdbc.asJdbcDriver import com.wire.kalium.persistence.Accounts import com.wire.kalium.persistence.CurrentAccount import com.wire.kalium.persistence.GlobalDatabase import com.wire.kalium.persistence.ServerConfiguration +import com.wire.kalium.persistence.adapter.LogoutReasonAdapter import com.wire.kalium.persistence.adapter.QualifiedIDAdapter import com.wire.kalium.persistence.daokaliumdb.AccountsDAO import com.wire.kalium.persistence.daokaliumdb.AccountsDAOImpl -import com.wire.kalium.persistence.adapter.LogoutReasonAdapter import com.wire.kalium.persistence.daokaliumdb.ServerConfigurationDAO import com.wire.kalium.persistence.daokaliumdb.ServerConfigurationDAOImpl import com.wire.kalium.persistence.util.FileNameUtil import com.wire.kalium.util.KaliumDispatcherImpl +import com.zaxxer.hikari.HikariConfig +import com.zaxxer.hikari.HikariDataSource import java.io.File +import javax.sql.DataSource import kotlin.coroutines.CoroutineContext // TODO(refactor): Unify creation just like it's done for UserDataBase @@ -53,7 +56,7 @@ actual class GlobalDatabaseProvider( // Make sure all intermediate directories exist storePath.mkdirs() - val driver: SqlDriver = JdbcSqliteDriver("jdbc:sqlite:${databasePath.absolutePath}") + val driver: SqlDriver = createDataSource("jdbc:postgresql://localhost:5432/$dbName").asJdbcDriver() if (!databaseExists) { GlobalDatabase.Schema.create(driver) @@ -78,6 +81,20 @@ actual class GlobalDatabaseProvider( database.globalDatabasePropertiesQueries.enableForeignKeyContraints() } + private fun createDataSource(driverUri: String): DataSource { + val dataSourceConfig = HikariConfig().apply { + driverClassName = "org.postgresql.Driver" // todo. parameterize + jdbcUrl = driverUri + username = "postgres" + password = "" + maximumPoolSize = 3 + isAutoCommit = false + transactionIsolation = "TRANSACTION_REPEATABLE_READ" + validate() + } + return HikariDataSource(dataSourceConfig) + } + actual val serverConfigurationDAO: ServerConfigurationDAO get() = ServerConfigurationDAOImpl(database.serverConfigurationQueries, queriesContext) diff --git a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/UserDatabase.kt b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/UserDatabase.kt index 1605995b60a..b4a4171b97d 100644 --- a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/UserDatabase.kt +++ b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/UserDatabase.kt @@ -21,12 +21,16 @@ package com.wire.kalium.persistence.db import app.cash.sqldelight.db.SqlDriver +import app.cash.sqldelight.driver.jdbc.asJdbcDriver import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver import com.wire.kalium.persistence.UserDatabase import com.wire.kalium.persistence.dao.UserIDEntity +import com.zaxxer.hikari.HikariConfig +import com.zaxxer.hikari.HikariDataSource import kotlinx.coroutines.CoroutineDispatcher import java.io.File import java.util.Properties +import javax.sql.DataSource private const val DATABASE_NAME = "main.db" @@ -63,11 +67,11 @@ actual fun userDatabaseBuilder( // Make sure all intermediate directories exist storageData.file.mkdirs() - val driver: SqlDriver = sqlDriver("jdbc:sqlite:${databasePath.absolutePath}", enableWAL) + val driver: SqlDriver = sqlDriver(userId.toString(), false) - if (!databaseExists) { +// if (!databaseExists) { UserDatabase.Schema.create(driver) - } +// } return UserDatabaseBuilder(userId, driver, dispatcher, platformDatabaseData, !passphrase.isNullOrBlank()) } @@ -90,17 +94,21 @@ internal actual fun getDatabaseAbsoluteFileLocation( return if (dbFile.exists()) dbFile.absolutePath else null } -private fun sqlDriver(driverUri: String, enableWAL: Boolean): SqlDriver = JdbcSqliteDriver( - driverUri, - Properties(1).apply { - put("foreign_keys", "true") - if (enableWAL) { - put("journal_mode", "wal") - } else { - put("journal_mode", "delete") - } +private fun sqlDriver(userId: String, enableWAL: Boolean): SqlDriver = createDataSourceForUserDB(userId).asJdbcDriver() + +private fun createDataSourceForUserDB(userId: String): DataSource { + val dataSourceConfig = HikariConfig().apply { + driverClassName = "org.postgresql.Driver" //todo. parameterize + jdbcUrl = "jdbc:postgresql://localhost:5432/$userId" + username = "postgres" + password = "" + maximumPoolSize = 3 + isAutoCommit = false + transactionIsolation = "TRANSACTION_REPEATABLE_READ" + validate() } -) + return HikariDataSource(dataSourceConfig) +} /** * Creates an in-memory user database, From 7d4261f75423d3815f75322ab96fa8f80bf501e0 Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Sat, 4 May 2024 00:33:48 +0200 Subject: [PATCH 02/11] fix: wip, not merge, ansi sql and globaldb migrated to pg --- .../com/wire/kalium/persistence/Accounts.sq | 5 ++- .../wire/kalium/persistence/CurrentAccount.sq | 2 +- .../persistence/GlobalDatabaseProperties.sq | 3 -- .../kalium/persistence/ServerConfiguration.sq | 8 ++-- .../src/commonMain/db_global/migrations/3.sqm | 4 +- .../persistence/daokaliumdb/AccountsDAO.kt | 26 ++++++------- .../daokaliumdb/ServerConfigurationDAO.kt | 39 +++++++++++-------- .../persistence/db/GlobalDatabaseProvider.kt | 20 ++++++---- .../kalium/persistence/db/UserDatabase.kt | 34 +++++++--------- 9 files changed, 71 insertions(+), 70 deletions(-) diff --git a/persistence/src/commonMain/db_global/com/wire/kalium/persistence/Accounts.sq b/persistence/src/commonMain/db_global/com/wire/kalium/persistence/Accounts.sq index 3130400058e..274b0cac392 100644 --- a/persistence/src/commonMain/db_global/com/wire/kalium/persistence/Accounts.sq +++ b/persistence/src/commonMain/db_global/com/wire/kalium/persistence/Accounts.sq @@ -2,6 +2,7 @@ import com.wire.kalium.persistence.dao.ManagedByEntity; import com.wire.kalium.persistence.dao.QualifiedIDEntity; import com.wire.kalium.persistence.model.LogoutReason; import kotlin.Boolean; +import kotlin.Int; CREATE TABLE Accounts ( id TEXT AS QualifiedIDEntity PRIMARY KEY NOT NULL, @@ -10,12 +11,12 @@ CREATE TABLE Accounts ( tenant TEXT, server_config_id TEXT NOT NULL, logout_reason TEXT AS LogoutReason, - isPersistentWebSocketEnabled INTEGER AS Boolean NOT NULL DEFAULT 0, + isPersistentWebSocketEnabled INTEGER AS Int NOT NULL DEFAULT 0, managed_by TEXT AS ManagedByEntity ); insertOrReplace: -INSERT OR REPLACE INTO Accounts (id, scim_external_id, subject, tenant, server_config_id, logout_reason, isPersistentWebSocketEnabled) +INSERT INTO Accounts (id, scim_external_id, subject, tenant, server_config_id, logout_reason, isPersistentWebSocketEnabled) VALUES (:id, :scimExternalId, :subject, :tenant, :serverConfigId, :logoutReason,:isPersistentWebSocketEnabled); delete: diff --git a/persistence/src/commonMain/db_global/com/wire/kalium/persistence/CurrentAccount.sq b/persistence/src/commonMain/db_global/com/wire/kalium/persistence/CurrentAccount.sq index d1a8b6ac658..a2c48892a22 100644 --- a/persistence/src/commonMain/db_global/com/wire/kalium/persistence/CurrentAccount.sq +++ b/persistence/src/commonMain/db_global/com/wire/kalium/persistence/CurrentAccount.sq @@ -7,7 +7,7 @@ CREATE TABLE CurrentAccount ( ); update: -INSERT OR REPLACE INTO CurrentAccount (id, user_id) VALUES (1, :user_id); +INSERT INTO CurrentAccount (id, user_id) VALUES (1, :user_id); currentAccountInfo: SELECT id, logout_reason FROM Accounts WHERE id = (SELECT user_id FROM CurrentAccount WHERE id = 1); diff --git a/persistence/src/commonMain/db_global/com/wire/kalium/persistence/GlobalDatabaseProperties.sq b/persistence/src/commonMain/db_global/com/wire/kalium/persistence/GlobalDatabaseProperties.sq index 7fbdb5dbd98..e69de29bb2d 100644 --- a/persistence/src/commonMain/db_global/com/wire/kalium/persistence/GlobalDatabaseProperties.sq +++ b/persistence/src/commonMain/db_global/com/wire/kalium/persistence/GlobalDatabaseProperties.sq @@ -1,3 +0,0 @@ - -enableForeignKeyContraints: -PRAGMA foreign_keys = 1; diff --git a/persistence/src/commonMain/db_global/com/wire/kalium/persistence/ServerConfiguration.sq b/persistence/src/commonMain/db_global/com/wire/kalium/persistence/ServerConfiguration.sq index b09efc6e29a..7a29e6b605a 100644 --- a/persistence/src/commonMain/db_global/com/wire/kalium/persistence/ServerConfiguration.sq +++ b/persistence/src/commonMain/db_global/com/wire/kalium/persistence/ServerConfiguration.sq @@ -10,12 +10,12 @@ CREATE TABLE ServerConfiguration ( blackListUrl TEXT NOT NULL, teamsUrl TEXT NOT NULL, websiteUrl TEXT NOT NULL, - isOnPremises INTEGER AS Boolean NOT NULL, + isOnPremises INTEGER AS Int NOT NULL, domain TEXT, commonApiVersion INTEGER AS Int NOT NULL, - federation INTEGER AS Boolean NOT NULL, + federation INTEGER AS Int NOT NULL, apiProxyHost TEXT, - apiProxyNeedsAuthentication INTEGER AS Boolean, + apiProxyNeedsAuthentication INTEGER AS Int, apiProxyPort INTEGER AS Int, lastBlackListCheck TEXT, CONSTRAINT server_config_unique UNIQUE (title, apiBaseUrl, webSocketBaseUrl, domain, apiProxyHost, apiProxyPort) @@ -25,7 +25,7 @@ deleteById: DELETE FROM ServerConfiguration WHERE id = ?; insert: -INSERT OR FAIL INTO ServerConfiguration(id, apiBaseUrl, accountBaseUrl, webSocketBaseUrl, blackListUrl, teamsUrl, websiteUrl, title, isOnPremises, federation, domain, commonApiVersion, apiProxyHost, apiProxyNeedsAuthentication, apiProxyPort) +INSERT INTO ServerConfiguration(id, apiBaseUrl, accountBaseUrl, webSocketBaseUrl, blackListUrl, teamsUrl, websiteUrl, title, isOnPremises, federation, domain, commonApiVersion, apiProxyHost, apiProxyNeedsAuthentication, apiProxyPort) VALUES( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?,?); updateApiVersion: diff --git a/persistence/src/commonMain/db_global/migrations/3.sqm b/persistence/src/commonMain/db_global/migrations/3.sqm index 2c31ce86111..c04aff089d6 100644 --- a/persistence/src/commonMain/db_global/migrations/3.sqm +++ b/persistence/src/commonMain/db_global/migrations/3.sqm @@ -1,4 +1,4 @@ -import kotlin.Boolean; +import kotlin.Int; ALTER TABLE Accounts -ADD COLUMN isPersistentWebSocketEnabled INTEGER AS Boolean NOT NULL DEFAULT(0); +ADD COLUMN isPersistentWebSocketEnabled INTEGER AS Int NOT NULL DEFAULT(0); diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt index 78bbe428126..77109ab266e 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt @@ -64,10 +64,10 @@ internal object AccountMapper { fun fromPersistentWebSocketStatus( user_id: UserIDEntity, - isPersistentWebSocketEnabled: Boolean, + isPersistentWebSocketEnabled: Int, ): PersistentWebSocketStatusEntity = PersistentWebSocketStatusEntity( userIDEntity = user_id, - isPersistentWebSocketEnabled = isPersistentWebSocketEnabled + isPersistentWebSocketEnabled = isPersistentWebSocketEnabled == 1 ) fun fromFullAccountInfo( @@ -77,7 +77,7 @@ internal object AccountMapper { tenant: String?, server_config_id: String, logout_reason: LogoutReason?, - isPersistentWebSocketEnabled: Boolean, + isPersistentWebSocketEnabled: Int, managedBy: ManagedByEntity? ): FullAccountEntity = FullAccountEntity( info = fromAccount(id, logout_reason), @@ -106,18 +106,18 @@ internal object AccountMapper { blackListUrl: String, teamsUrl: String, websiteUrl: String, - isOnPremises: Boolean, + isOnPremises: Int, domain: String?, commonApiVersion: Int, - federation: Boolean, + federation: Int, apiProxyHost: String?, apiProxyPort: Int?, - apiProxyNeedsAuthentication: Boolean?, + apiProxyNeedsAuthentication: Int?, title: String ): Pair { val apiProxy: ServerConfigEntity.ApiProxy? = if (apiProxyHost != null && apiProxyPort != null && apiProxyNeedsAuthentication != null) { - ServerConfigEntity.ApiProxy(apiProxyNeedsAuthentication, apiProxyHost, apiProxyPort) + ServerConfigEntity.ApiProxy(apiProxyNeedsAuthentication == 1, apiProxyHost, apiProxyPort) } else { null } @@ -131,14 +131,14 @@ internal object AccountMapper { blackList = blackListUrl, teams = teamsUrl, website = websiteUrl, - isOnPremises = isOnPremises, + isOnPremises = isOnPremises == 1, apiProxy = apiProxy, title = title ), metaData = ServerConfigEntity.MetaData( domain = domain, apiVersion = commonApiVersion, - federation = federation, + federation = federation == 1, ) ) @@ -210,7 +210,7 @@ internal class AccountsDAOImpl internal constructor( id = userIDEntity, serverConfigId = serverConfigId, logoutReason = null, - isPersistentWebSocketEnabled = isPersistentWebSocketEnabled + isPersistentWebSocketEnabled = isPersistentWebSocketEnabled.toInt() ) } @@ -242,7 +242,7 @@ internal class AccountsDAOImpl internal constructor( override suspend fun isFederated(userIDEntity: UserIDEntity): Boolean? = withContext(queriesContext) { - queries.isFederationEnabled(userIDEntity).executeAsOneOrNull() + queries.isFederationEnabled(userIDEntity).executeAsOneOrNull() == 1 } override suspend fun doesValidAccountExists(userIDEntity: UserIDEntity): Boolean = withContext(queriesContext) { @@ -289,11 +289,11 @@ internal class AccountsDAOImpl internal constructor( override suspend fun updatePersistentWebSocketStatus(userIDEntity: UserIDEntity, isPersistentWebSocketEnabled: Boolean) = withContext(queriesContext) { - queries.updatePersistentWebSocketStatus(isPersistentWebSocketEnabled, userIDEntity) + queries.updatePersistentWebSocketStatus(isPersistentWebSocketEnabled.toInt(), userIDEntity) } override suspend fun persistentWebSocketStatus(userIDEntity: UserIDEntity): Boolean = withContext(queriesContext) { - queries.persistentWebSocketStatus(userIDEntity).executeAsOne() + queries.persistentWebSocketStatus(userIDEntity).executeAsOne() == 1 } override suspend fun getAllValidAccountPersistentWebSocketStatus(): Flow> = diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAO.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAO.kt index 707e857eb1c..6295a8ac2fd 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAO.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAO.kt @@ -43,12 +43,12 @@ internal object ServerConfigMapper { blackListUrl: String, teamsUrl: String, websiteUrl: String, - isOnPremises: Boolean, + isOnPremises: Int, domain: String?, commonApiVersion: Int, - federation: Boolean, + federation: Int, apiProxyHost: String?, - apiProxyNeedsAuthentication: Boolean?, + apiProxyNeedsAuthentication: Int?, apiProxyPort: Int?, lastBlackListCheck: String? ): ServerConfigEntity = ServerConfigEntity( @@ -61,17 +61,17 @@ internal object ServerConfigMapper { teams = teamsUrl, website = websiteUrl, title = title, - isOnPremises = isOnPremises, + isOnPremises = isOnPremises == 1, apiProxy = if (apiProxyHost != null && apiProxyNeedsAuthentication != null && apiProxyPort != null) { ServerConfigEntity.ApiProxy( - needsAuthentication = apiProxyNeedsAuthentication, + needsAuthentication = apiProxyNeedsAuthentication == 1, host = apiProxyHost, port = apiProxyPort ) } else null ), ServerConfigEntity.MetaData( - federation = federation, + federation = federation == 1, apiVersion = commonApiVersion, domain = domain ) @@ -86,12 +86,12 @@ internal object ServerConfigMapper { blackListUrl: String?, teamsUrl: String?, websiteUrl: String?, - isOnPremises: Boolean?, + isOnPremises: Int?, domain: String?, commonApiVersion: Int?, - federation: Boolean?, + federation: Int?, apiProxyHost: String?, - apiProxyNeedsAuthentication: Boolean?, + apiProxyNeedsAuthentication: Int?, apiProxyPort: Int?, lastBlackListCheck: String?, id_: QualifiedIDEntity, @@ -106,12 +106,12 @@ internal object ServerConfigMapper { blackListUrl = blackListUrl!!, teamsUrl = teamsUrl!!, websiteUrl = websiteUrl!!, - isOnPremises = isOnPremises!!, + isOnPremises = isOnPremises!!.toInt(), domain = domain, commonApiVersion = commonApiVersion!!, - federation = federation!!, + federation = federation!!.toInt(), apiProxyHost = apiProxyHost, - apiProxyNeedsAuthentication = apiProxyNeedsAuthentication, + apiProxyNeedsAuthentication = apiProxyNeedsAuthentication?.toInt(), apiProxyPort = apiProxyPort, lastBlackListCheck = lastBlackListCheck ), @@ -175,19 +175,19 @@ internal class ServerConfigurationDAOImpl internal constructor( teamsUrl, websiteUrl, title, - isOnPremises, - federation, + isOnPremises.toInt(), + federation.toInt(), domain, commonApiVersion, apiProxyHost, - apiProxyNeedsAuthentication, + apiProxyNeedsAuthentication?.toInt(), apiProxyPort ) } } override suspend fun allConfigFlow(): Flow> = - queries.storedConfig(mapper = mapper::fromServerConfiguration).asFlow().flowOn(queriesContext).mapToList() + queries.storedConfig(mapper = ServerConfigMapper::fromServerConfiguration).asFlow().flowOn(queriesContext).mapToList() override suspend fun allConfig(): List = withContext(queriesContext) { queries.storedConfig(mapper = mapper::fromServerConfiguration).executeAsList() @@ -234,3 +234,10 @@ internal class ServerConfigurationDAOImpl internal constructor( queries.updateLastBlackListCheckByIds(date, configIds) } } + +fun Boolean.toInt(): Int { + return when (this) { + true -> 1 + false -> 0 + } +} diff --git a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseProvider.kt b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseProvider.kt index d0a601347d9..ecfce0ff2fa 100644 --- a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseProvider.kt +++ b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseProvider.kt @@ -58,37 +58,41 @@ actual class GlobalDatabaseProvider( val driver: SqlDriver = createDataSource("jdbc:postgresql://localhost:5432/$dbName").asJdbcDriver() - if (!databaseExists) { +// if (!databaseExists) { GlobalDatabase.Schema.create(driver) - } +// } database = GlobalDatabase( driver, ServerConfigurationAdapter = ServerConfiguration.Adapter( commonApiVersionAdapter = IntColumnAdapter, - apiProxyPortAdapter = IntColumnAdapter + isOnPremisesAdapter = IntColumnAdapter, + apiProxyPortAdapter = IntColumnAdapter, + federationAdapter = IntColumnAdapter, + apiProxyNeedsAuthenticationAdapter = IntColumnAdapter ), AccountsAdapter = Accounts.Adapter( idAdapter = QualifiedIDAdapter, logout_reasonAdapter = LogoutReasonAdapter, - managed_byAdapter = EnumColumnAdapter() + managed_byAdapter = EnumColumnAdapter(), + isPersistentWebSocketEnabledAdapter = IntColumnAdapter ), CurrentAccountAdapter = CurrentAccount.Adapter( user_idAdapter = QualifiedIDAdapter ) ) - database.globalDatabasePropertiesQueries.enableForeignKeyContraints() + //database.globalDatabasePropertiesQueries.enableForeignKeyContraints() } private fun createDataSource(driverUri: String): DataSource { val dataSourceConfig = HikariConfig().apply { driverClassName = "org.postgresql.Driver" // todo. parameterize jdbcUrl = driverUri - username = "postgres" - password = "" + username = "global" + password = "global" maximumPoolSize = 3 - isAutoCommit = false + isAutoCommit = true transactionIsolation = "TRANSACTION_REPEATABLE_READ" validate() } diff --git a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/UserDatabase.kt b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/UserDatabase.kt index cb64b0768e3..5fd5a53b190 100644 --- a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/UserDatabase.kt +++ b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/UserDatabase.kt @@ -21,16 +21,12 @@ package com.wire.kalium.persistence.db import app.cash.sqldelight.db.SqlDriver -import app.cash.sqldelight.driver.jdbc.asJdbcDriver import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver import com.wire.kalium.persistence.UserDatabase import com.wire.kalium.persistence.dao.UserIDEntity -import com.zaxxer.hikari.HikariConfig -import com.zaxxer.hikari.HikariDataSource import kotlinx.coroutines.CoroutineDispatcher import java.io.File import java.util.Properties -import javax.sql.DataSource private const val DATABASE_NAME = "main.db" @@ -67,11 +63,11 @@ actual fun userDatabaseBuilder( // Make sure all intermediate directories exist storageData.file.mkdirs() - val driver: SqlDriver = sqlDriver(userId.toString(), false) + val driver: SqlDriver = sqlDriver("jdbc:sqlite:${databasePath.absolutePath}", enableWAL) -// if (!databaseExists) { + if (!databaseExists) { UserDatabase.Schema.create(driver) -// } + } return UserDatabaseBuilder(userId, driver, dispatcher, platformDatabaseData, !passphrase.isNullOrBlank()) } @@ -94,21 +90,17 @@ internal actual fun getDatabaseAbsoluteFileLocation( return if (dbFile.exists()) dbFile.absolutePath else null } -private fun sqlDriver(userId: String, enableWAL: Boolean): SqlDriver = createDataSourceForUserDB(userId).asJdbcDriver() - -private fun createDataSourceForUserDB(userId: String): DataSource { - val dataSourceConfig = HikariConfig().apply { - driverClassName = "org.postgresql.Driver" //todo. parameterize - jdbcUrl = "jdbc:postgresql://localhost:5432/$userId" - username = "postgres" - password = "" - maximumPoolSize = 3 - isAutoCommit = false - transactionIsolation = "TRANSACTION_REPEATABLE_READ" - validate() +private fun sqlDriver(driverUri: String, enableWAL: Boolean): SqlDriver = JdbcSqliteDriver( + driverUri, + Properties(1).apply { + put("foreign_keys", "true") + if (enableWAL) { + put("journal_mode", "wal") + } else { + put("journal_mode", "delete") + } } - return HikariDataSource(dataSourceConfig) -} +) /** * Creates an in-memory user database, From d6368015e98535f8bd5116443ddc2c9fc3aafc75 Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Sat, 4 May 2024 10:01:23 +0200 Subject: [PATCH 03/11] fix: wip, not merge, mimic boolean to bridge compat between pg and sqlite --- .../com/wire/kalium/persistence/Accounts.sq | 3 +- .../kalium/persistence/ServerConfiguration.sq | 7 ++-- .../adapter/CrossCompatBooleanAdapter.kt | 38 +++++++++++++++++++ .../wire/kalium/persistence/dao/BooleanExt.kt | 20 ++++++++++ .../persistence/daokaliumdb/AccountsDAO.kt | 27 ++++++------- .../daokaliumdb/ServerConfigurationDAO.kt | 38 ++++++++----------- .../persistence/db/GlobalDatabaseProvider.kt | 11 ++++-- 7 files changed, 101 insertions(+), 43 deletions(-) create mode 100644 persistence/src/commonMain/kotlin/com/wire/kalium/persistence/adapter/CrossCompatBooleanAdapter.kt create mode 100644 persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/BooleanExt.kt diff --git a/persistence/src/commonMain/db_global/com/wire/kalium/persistence/Accounts.sq b/persistence/src/commonMain/db_global/com/wire/kalium/persistence/Accounts.sq index 274b0cac392..e6fff03cbaf 100644 --- a/persistence/src/commonMain/db_global/com/wire/kalium/persistence/Accounts.sq +++ b/persistence/src/commonMain/db_global/com/wire/kalium/persistence/Accounts.sq @@ -1,6 +1,7 @@ import com.wire.kalium.persistence.dao.ManagedByEntity; import com.wire.kalium.persistence.dao.QualifiedIDEntity; import com.wire.kalium.persistence.model.LogoutReason; +import com.wire.kalium.persistence.dao.BooleanEntity; import kotlin.Boolean; import kotlin.Int; @@ -11,7 +12,7 @@ CREATE TABLE Accounts ( tenant TEXT, server_config_id TEXT NOT NULL, logout_reason TEXT AS LogoutReason, - isPersistentWebSocketEnabled INTEGER AS Int NOT NULL DEFAULT 0, + isPersistentWebSocketEnabled INTEGER AS BooleanEntity NOT NULL DEFAULT 0, managed_by TEXT AS ManagedByEntity ); diff --git a/persistence/src/commonMain/db_global/com/wire/kalium/persistence/ServerConfiguration.sq b/persistence/src/commonMain/db_global/com/wire/kalium/persistence/ServerConfiguration.sq index 7a29e6b605a..b1249a12ce2 100644 --- a/persistence/src/commonMain/db_global/com/wire/kalium/persistence/ServerConfiguration.sq +++ b/persistence/src/commonMain/db_global/com/wire/kalium/persistence/ServerConfiguration.sq @@ -1,5 +1,6 @@ import kotlin.Boolean; import kotlin.Int; +import com.wire.kalium.persistence.dao.BooleanEntity; CREATE TABLE ServerConfiguration ( id TEXT PRIMARY KEY NOT NULL, @@ -10,12 +11,12 @@ CREATE TABLE ServerConfiguration ( blackListUrl TEXT NOT NULL, teamsUrl TEXT NOT NULL, websiteUrl TEXT NOT NULL, - isOnPremises INTEGER AS Int NOT NULL, + isOnPremises INTEGER AS BooleanEntity NOT NULL, domain TEXT, commonApiVersion INTEGER AS Int NOT NULL, - federation INTEGER AS Int NOT NULL, + federation INTEGER AS BooleanEntity NOT NULL, apiProxyHost TEXT, - apiProxyNeedsAuthentication INTEGER AS Int, + apiProxyNeedsAuthentication INTEGER AS BooleanEntity, apiProxyPort INTEGER AS Int, lastBlackListCheck TEXT, CONSTRAINT server_config_unique UNIQUE (title, apiBaseUrl, webSocketBaseUrl, domain, apiProxyHost, apiProxyPort) diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/adapter/CrossCompatBooleanAdapter.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/adapter/CrossCompatBooleanAdapter.kt new file mode 100644 index 00000000000..68fda79abb4 --- /dev/null +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/adapter/CrossCompatBooleanAdapter.kt @@ -0,0 +1,38 @@ +/* + * Wire + * Copyright (C) 2024 Wire Swiss GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + */ +package com.wire.kalium.persistence.adapter + +import app.cash.sqldelight.ColumnAdapter +import com.wire.kalium.persistence.dao.BooleanEntity + +internal object CrossCompatBooleanAdapter : ColumnAdapter { + override fun decode(databaseValue: Long?): BooleanEntity { + return databaseValue == 1L + } + + override fun encode(value: BooleanEntity): Long { + return value.toLong() + } +} + +fun Boolean.toLong(): Long { + return when (this) { + true -> 1 + false -> 0 + } +} diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/BooleanExt.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/BooleanExt.kt new file mode 100644 index 00000000000..20df1cc3716 --- /dev/null +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/BooleanExt.kt @@ -0,0 +1,20 @@ +/* + * Wire + * Copyright (C) 2024 Wire Swiss GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + */ +package com.wire.kalium.persistence.dao + +typealias BooleanEntity = Boolean diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt index 77109ab266e..b396327a9f1 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt @@ -21,6 +21,7 @@ package com.wire.kalium.persistence.daokaliumdb import app.cash.sqldelight.coroutines.asFlow import com.wire.kalium.persistence.AccountsQueries import com.wire.kalium.persistence.CurrentAccountQueries +import com.wire.kalium.persistence.dao.BooleanEntity import com.wire.kalium.persistence.dao.ManagedByEntity import com.wire.kalium.persistence.dao.QualifiedIDEntity import com.wire.kalium.persistence.dao.UserIDEntity @@ -64,10 +65,10 @@ internal object AccountMapper { fun fromPersistentWebSocketStatus( user_id: UserIDEntity, - isPersistentWebSocketEnabled: Int, + isPersistentWebSocketEnabled: Boolean, ): PersistentWebSocketStatusEntity = PersistentWebSocketStatusEntity( userIDEntity = user_id, - isPersistentWebSocketEnabled = isPersistentWebSocketEnabled == 1 + isPersistentWebSocketEnabled = isPersistentWebSocketEnabled ) fun fromFullAccountInfo( @@ -77,7 +78,7 @@ internal object AccountMapper { tenant: String?, server_config_id: String, logout_reason: LogoutReason?, - isPersistentWebSocketEnabled: Int, + isPersistentWebSocketEnabled: Boolean, managedBy: ManagedByEntity? ): FullAccountEntity = FullAccountEntity( info = fromAccount(id, logout_reason), @@ -106,18 +107,18 @@ internal object AccountMapper { blackListUrl: String, teamsUrl: String, websiteUrl: String, - isOnPremises: Int, + isOnPremises: BooleanEntity, domain: String?, commonApiVersion: Int, - federation: Int, + federation: BooleanEntity, apiProxyHost: String?, apiProxyPort: Int?, - apiProxyNeedsAuthentication: Int?, + apiProxyNeedsAuthentication: BooleanEntity?, title: String ): Pair { val apiProxy: ServerConfigEntity.ApiProxy? = if (apiProxyHost != null && apiProxyPort != null && apiProxyNeedsAuthentication != null) { - ServerConfigEntity.ApiProxy(apiProxyNeedsAuthentication == 1, apiProxyHost, apiProxyPort) + ServerConfigEntity.ApiProxy(apiProxyNeedsAuthentication, apiProxyHost, apiProxyPort) } else { null } @@ -131,14 +132,14 @@ internal object AccountMapper { blackList = blackListUrl, teams = teamsUrl, website = websiteUrl, - isOnPremises = isOnPremises == 1, + isOnPremises = isOnPremises, apiProxy = apiProxy, title = title ), metaData = ServerConfigEntity.MetaData( domain = domain, apiVersion = commonApiVersion, - federation = federation == 1, + federation = federation, ) ) @@ -210,7 +211,7 @@ internal class AccountsDAOImpl internal constructor( id = userIDEntity, serverConfigId = serverConfigId, logoutReason = null, - isPersistentWebSocketEnabled = isPersistentWebSocketEnabled.toInt() + isPersistentWebSocketEnabled = isPersistentWebSocketEnabled ) } @@ -242,7 +243,7 @@ internal class AccountsDAOImpl internal constructor( override suspend fun isFederated(userIDEntity: UserIDEntity): Boolean? = withContext(queriesContext) { - queries.isFederationEnabled(userIDEntity).executeAsOneOrNull() == 1 + queries.isFederationEnabled(userIDEntity).executeAsOneOrNull() } override suspend fun doesValidAccountExists(userIDEntity: UserIDEntity): Boolean = withContext(queriesContext) { @@ -289,11 +290,11 @@ internal class AccountsDAOImpl internal constructor( override suspend fun updatePersistentWebSocketStatus(userIDEntity: UserIDEntity, isPersistentWebSocketEnabled: Boolean) = withContext(queriesContext) { - queries.updatePersistentWebSocketStatus(isPersistentWebSocketEnabled.toInt(), userIDEntity) + queries.updatePersistentWebSocketStatus(isPersistentWebSocketEnabled, userIDEntity) } override suspend fun persistentWebSocketStatus(userIDEntity: UserIDEntity): Boolean = withContext(queriesContext) { - queries.persistentWebSocketStatus(userIDEntity).executeAsOne() == 1 + queries.persistentWebSocketStatus(userIDEntity).executeAsOne() } override suspend fun getAllValidAccountPersistentWebSocketStatus(): Flow> = diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAO.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAO.kt index 6295a8ac2fd..84bb104162b 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAO.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAO.kt @@ -20,6 +20,7 @@ package com.wire.kalium.persistence.daokaliumdb import app.cash.sqldelight.coroutines.asFlow import com.wire.kalium.persistence.ServerConfigurationQueries +import com.wire.kalium.persistence.dao.BooleanEntity import com.wire.kalium.persistence.dao.QualifiedIDEntity import com.wire.kalium.persistence.dao.UserIDEntity import com.wire.kalium.persistence.model.ServerConfigEntity @@ -43,12 +44,12 @@ internal object ServerConfigMapper { blackListUrl: String, teamsUrl: String, websiteUrl: String, - isOnPremises: Int, + isOnPremises: BooleanEntity, domain: String?, commonApiVersion: Int, - federation: Int, + federation: BooleanEntity, apiProxyHost: String?, - apiProxyNeedsAuthentication: Int?, + apiProxyNeedsAuthentication: BooleanEntity?, apiProxyPort: Int?, lastBlackListCheck: String? ): ServerConfigEntity = ServerConfigEntity( @@ -61,17 +62,17 @@ internal object ServerConfigMapper { teams = teamsUrl, website = websiteUrl, title = title, - isOnPremises = isOnPremises == 1, + isOnPremises = isOnPremises, apiProxy = if (apiProxyHost != null && apiProxyNeedsAuthentication != null && apiProxyPort != null) { ServerConfigEntity.ApiProxy( - needsAuthentication = apiProxyNeedsAuthentication == 1, + needsAuthentication = apiProxyNeedsAuthentication, host = apiProxyHost, port = apiProxyPort ) } else null ), ServerConfigEntity.MetaData( - federation = federation == 1, + federation = federation, apiVersion = commonApiVersion, domain = domain ) @@ -86,12 +87,12 @@ internal object ServerConfigMapper { blackListUrl: String?, teamsUrl: String?, websiteUrl: String?, - isOnPremises: Int?, + isOnPremises: BooleanEntity?, domain: String?, commonApiVersion: Int?, - federation: Int?, + federation: BooleanEntity?, apiProxyHost: String?, - apiProxyNeedsAuthentication: Int?, + apiProxyNeedsAuthentication: BooleanEntity?, apiProxyPort: Int?, lastBlackListCheck: String?, id_: QualifiedIDEntity, @@ -106,12 +107,12 @@ internal object ServerConfigMapper { blackListUrl = blackListUrl!!, teamsUrl = teamsUrl!!, websiteUrl = websiteUrl!!, - isOnPremises = isOnPremises!!.toInt(), + isOnPremises = isOnPremises!!, domain = domain, commonApiVersion = commonApiVersion!!, - federation = federation!!.toInt(), + federation = federation!!, apiProxyHost = apiProxyHost, - apiProxyNeedsAuthentication = apiProxyNeedsAuthentication?.toInt(), + apiProxyNeedsAuthentication = apiProxyNeedsAuthentication, apiProxyPort = apiProxyPort, lastBlackListCheck = lastBlackListCheck ), @@ -175,12 +176,12 @@ internal class ServerConfigurationDAOImpl internal constructor( teamsUrl, websiteUrl, title, - isOnPremises.toInt(), - federation.toInt(), + isOnPremises, + federation, domain, commonApiVersion, apiProxyHost, - apiProxyNeedsAuthentication?.toInt(), + apiProxyNeedsAuthentication, apiProxyPort ) } @@ -234,10 +235,3 @@ internal class ServerConfigurationDAOImpl internal constructor( queries.updateLastBlackListCheckByIds(date, configIds) } } - -fun Boolean.toInt(): Int { - return when (this) { - true -> 1 - false -> 0 - } -} diff --git a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseProvider.kt b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseProvider.kt index ecfce0ff2fa..5fb147b2003 100644 --- a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseProvider.kt +++ b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseProvider.kt @@ -18,6 +18,7 @@ package com.wire.kalium.persistence.db +import app.cash.sqldelight.ColumnAdapter import app.cash.sqldelight.EnumColumnAdapter import app.cash.sqldelight.adapter.primitive.IntColumnAdapter import app.cash.sqldelight.db.SqlDriver @@ -26,8 +27,10 @@ import com.wire.kalium.persistence.Accounts import com.wire.kalium.persistence.CurrentAccount import com.wire.kalium.persistence.GlobalDatabase import com.wire.kalium.persistence.ServerConfiguration +import com.wire.kalium.persistence.adapter.CrossCompatBooleanAdapter import com.wire.kalium.persistence.adapter.LogoutReasonAdapter import com.wire.kalium.persistence.adapter.QualifiedIDAdapter +import com.wire.kalium.persistence.dao.BooleanEntity import com.wire.kalium.persistence.daokaliumdb.AccountsDAO import com.wire.kalium.persistence.daokaliumdb.AccountsDAOImpl import com.wire.kalium.persistence.daokaliumdb.ServerConfigurationDAO @@ -66,16 +69,16 @@ actual class GlobalDatabaseProvider( driver, ServerConfigurationAdapter = ServerConfiguration.Adapter( commonApiVersionAdapter = IntColumnAdapter, - isOnPremisesAdapter = IntColumnAdapter, + isOnPremisesAdapter = CrossCompatBooleanAdapter as ColumnAdapter, apiProxyPortAdapter = IntColumnAdapter, - federationAdapter = IntColumnAdapter, - apiProxyNeedsAuthenticationAdapter = IntColumnAdapter + federationAdapter = CrossCompatBooleanAdapter as ColumnAdapter, + apiProxyNeedsAuthenticationAdapter = CrossCompatBooleanAdapter as ColumnAdapter ), AccountsAdapter = Accounts.Adapter( idAdapter = QualifiedIDAdapter, logout_reasonAdapter = LogoutReasonAdapter, managed_byAdapter = EnumColumnAdapter(), - isPersistentWebSocketEnabledAdapter = IntColumnAdapter + isPersistentWebSocketEnabledAdapter = CrossCompatBooleanAdapter as ColumnAdapter ), CurrentAccountAdapter = CurrentAccount.Adapter( user_idAdapter = QualifiedIDAdapter From 636288aef0a35ad0a9fdee65e5debeec9ea323f5 Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Sat, 4 May 2024 10:03:00 +0200 Subject: [PATCH 04/11] fix: wip, not merge, mimic boolean to bridge compat between pg and sqlite --- persistence/src/commonMain/db_global/migrations/3.sqm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/persistence/src/commonMain/db_global/migrations/3.sqm b/persistence/src/commonMain/db_global/migrations/3.sqm index c04aff089d6..3527f9c7b71 100644 --- a/persistence/src/commonMain/db_global/migrations/3.sqm +++ b/persistence/src/commonMain/db_global/migrations/3.sqm @@ -1,4 +1,4 @@ -import kotlin.Int; +import com.wire.kalium.persistence.dao.BooleanEntity; ALTER TABLE Accounts -ADD COLUMN isPersistentWebSocketEnabled INTEGER AS Int NOT NULL DEFAULT(0); +ADD COLUMN isPersistentWebSocketEnabled INTEGER AS BooleanEntity NOT NULL DEFAULT(0); From 546546a1ad3173e0d22da2ff520b20c068c028ee Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Sat, 4 May 2024 12:57:59 +0200 Subject: [PATCH 05/11] chore: cleanup --- .../kalium/persistence/daokaliumdb/AccountsDAO.kt | 7 +++---- .../daokaliumdb/ServerConfigurationDAO.kt | 13 ++++++------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt index b396327a9f1..78bbe428126 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt @@ -21,7 +21,6 @@ package com.wire.kalium.persistence.daokaliumdb import app.cash.sqldelight.coroutines.asFlow import com.wire.kalium.persistence.AccountsQueries import com.wire.kalium.persistence.CurrentAccountQueries -import com.wire.kalium.persistence.dao.BooleanEntity import com.wire.kalium.persistence.dao.ManagedByEntity import com.wire.kalium.persistence.dao.QualifiedIDEntity import com.wire.kalium.persistence.dao.UserIDEntity @@ -107,13 +106,13 @@ internal object AccountMapper { blackListUrl: String, teamsUrl: String, websiteUrl: String, - isOnPremises: BooleanEntity, + isOnPremises: Boolean, domain: String?, commonApiVersion: Int, - federation: BooleanEntity, + federation: Boolean, apiProxyHost: String?, apiProxyPort: Int?, - apiProxyNeedsAuthentication: BooleanEntity?, + apiProxyNeedsAuthentication: Boolean?, title: String ): Pair { val apiProxy: ServerConfigEntity.ApiProxy? = diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAO.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAO.kt index 84bb104162b..effc9ea41af 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAO.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAO.kt @@ -20,7 +20,6 @@ package com.wire.kalium.persistence.daokaliumdb import app.cash.sqldelight.coroutines.asFlow import com.wire.kalium.persistence.ServerConfigurationQueries -import com.wire.kalium.persistence.dao.BooleanEntity import com.wire.kalium.persistence.dao.QualifiedIDEntity import com.wire.kalium.persistence.dao.UserIDEntity import com.wire.kalium.persistence.model.ServerConfigEntity @@ -44,12 +43,12 @@ internal object ServerConfigMapper { blackListUrl: String, teamsUrl: String, websiteUrl: String, - isOnPremises: BooleanEntity, + isOnPremises: Boolean, domain: String?, commonApiVersion: Int, - federation: BooleanEntity, + federation: Boolean, apiProxyHost: String?, - apiProxyNeedsAuthentication: BooleanEntity?, + apiProxyNeedsAuthentication: Boolean?, apiProxyPort: Int?, lastBlackListCheck: String? ): ServerConfigEntity = ServerConfigEntity( @@ -87,12 +86,12 @@ internal object ServerConfigMapper { blackListUrl: String?, teamsUrl: String?, websiteUrl: String?, - isOnPremises: BooleanEntity?, + isOnPremises: Boolean?, domain: String?, commonApiVersion: Int?, - federation: BooleanEntity?, + federation: Boolean?, apiProxyHost: String?, - apiProxyNeedsAuthentication: BooleanEntity?, + apiProxyNeedsAuthentication: Boolean?, apiProxyPort: Int?, lastBlackListCheck: String?, id_: QualifiedIDEntity, From 38737b00fa03e0b209fbc1d5c6ab8c90d848191f Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Sat, 4 May 2024 14:57:12 +0200 Subject: [PATCH 06/11] chore: cleanup --- persistence/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence/build.gradle.kts b/persistence/build.gradle.kts index 38787e3d428..d24d39de962 100644 --- a/persistence/build.gradle.kts +++ b/persistence/build.gradle.kts @@ -86,7 +86,7 @@ kotlin { } val jvmMain by getting { dependencies { - implementation(libs.sqldelight.jvmDriver) // rename to something else ? as jvm should be parametrized + implementation(libs.sqldelight.jvmDriver) implementation(libs.sqldelight.jdbcDriver) implementation(libs.hikaricp) implementation(libs.postgres.driver) From a88d521f2904584868c62a91e800de71d3d219b0 Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Fri, 10 May 2024 17:55:24 +0200 Subject: [PATCH 07/11] chore: merge from develop --- .../persistence/db/GlobalDatabaseBuilder.kt | 3 ++- .../kalium/persistence/db/GlobalDatabase.kt | 17 +++++++++++++---- .../wire/kalium/persistence/GlobalDBBaseTest.kt | 6 ++++-- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseBuilder.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseBuilder.kt index 93a013eb7fb..194d685821a 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseBuilder.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseBuilder.kt @@ -29,6 +29,7 @@ import com.wire.kalium.persistence.ServerConfiguration import com.wire.kalium.persistence.adapter.CrossCompatBooleanAdapter import com.wire.kalium.persistence.adapter.LogoutReasonAdapter import com.wire.kalium.persistence.adapter.QualifiedIDAdapter +import com.wire.kalium.persistence.dao.BooleanEntity import com.wire.kalium.persistence.daokaliumdb.AccountsDAO import com.wire.kalium.persistence.daokaliumdb.AccountsDAOImpl import com.wire.kalium.persistence.daokaliumdb.ServerConfigurationDAO @@ -68,7 +69,7 @@ class GlobalDatabaseBuilder internal constructor( ) init { - database.globalDatabasePropertiesQueries.enableForeignKeyContraints() + //database.globalDatabasePropertiesQueries.enableForeignKeyContraints() } val serverConfigurationDAO: ServerConfigurationDAO diff --git a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabase.kt b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabase.kt index a79f7eb787c..007b5c297c3 100644 --- a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabase.kt +++ b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabase.kt @@ -48,7 +48,7 @@ actual fun globalDatabaseProvider( } // Make sure all intermediate directories exist - storageData.file.mkdirs() + // storageData.file.mkdirs() val driver = createDataSource("jdbc:postgresql://localhost:5432/${FileNameUtil.globalDBName()}").asJdbcDriver() val databaseExists = driver.databaseExists(FileNameUtil.globalDBName()) if (!databaseExists) { @@ -87,9 +87,18 @@ private fun createDataSource(driverUri: String): DataSource { fun JdbcDriver.databaseExists(dbName: String): Boolean { val result = executeQuery( - null, """SELECT EXISTS(SELECT datname FROM pg_catalog.pg_database WHERE datname = ?));""", - { app.cash.sqldelight.db.QueryResult.Value(it.getBoolean(0)) }, 0 - ) { bindString(0, dbName) } + Int.MIN_VALUE, """SELECT datname FROM pg_catalog.pg_database WHERE datname = ?""", + { + if (it.next().value) { + val result = it.getString(0) + println("THE RESULT: ${result}") + app.cash.sqldelight.db.QueryResult.Value(result?.isNotEmpty()) + } else { + app.cash.sqldelight.db.QueryResult.Value(false) + } + }, 0 + ) { bindString(0, dbName) } + println("Exists: ${result.value}") return result.value ?: false } diff --git a/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt b/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt index 64f8f267ed1..ed91028f20b 100644 --- a/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt +++ b/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt @@ -22,12 +22,14 @@ import com.wire.kalium.persistence.db.GlobalDatabaseBuilder import com.wire.kalium.persistence.db.PlatformDatabaseData import com.wire.kalium.persistence.db.StorageData import com.wire.kalium.persistence.db.globalDatabaseProvider -import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.TestDispatcher +import kotlinx.coroutines.test.UnconfinedTestDispatcher import java.nio.file.Files actual abstract class GlobalDBBaseTest { - private val dispatcher: TestDispatcher = StandardTestDispatcher() + @OptIn(ExperimentalCoroutinesApi::class) + private val dispatcher: TestDispatcher = UnconfinedTestDispatcher() private val databaseFile = Files.createTempDirectory("test-storage").toFile().resolve("test-kalium.db") actual fun deleteDatabase() { From 6bd3c2ce8b2602faed2735d672a50308f4cdcf01 Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Mon, 13 May 2024 16:02:17 +0200 Subject: [PATCH 08/11] chore: test running on pg --- .../db_global/com/wire/kalium/persistence/Accounts.sq | 6 ++++++ .../com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt | 5 +++++ .../com/wire/kalium/persistence/globalDB/AccountsDAOTest.kt | 5 +++-- .../kotlin/com/wire/kalium/persistence/db/GlobalDatabase.kt | 4 ++-- .../kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt | 1 + 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/persistence/src/commonMain/db_global/com/wire/kalium/persistence/Accounts.sq b/persistence/src/commonMain/db_global/com/wire/kalium/persistence/Accounts.sq index e6fff03cbaf..6f5d55ef48e 100644 --- a/persistence/src/commonMain/db_global/com/wire/kalium/persistence/Accounts.sq +++ b/persistence/src/commonMain/db_global/com/wire/kalium/persistence/Accounts.sq @@ -92,3 +92,9 @@ FROM Accounts INNER JOIN ServerConfiguration ON Accounts.server_config_id = ServerConfiguration.id WHERE Accounts.logout_reason IS NULL; + +truncateAllForTesting { + DELETE FROM Accounts; + DELETE FROM CurrentAccount; + DELETE FROM ServerConfiguration; +} diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt index 78bbe428126..d4d4d8f8f29 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt @@ -177,6 +177,7 @@ interface AccountsDAO { suspend fun getAllValidAccountPersistentWebSocketStatus(): Flow> suspend fun getAccountManagedBy(userIDEntity: UserIDEntity): ManagedByEntity? suspend fun validAccountWithServerConfigId(): Map + suspend fun truncateAllForTesting() } @Suppress("TooManyFunctions") @@ -314,4 +315,8 @@ internal class AccountsDAOImpl internal constructor( override fun fullAccountInfo(userIDEntity: UserIDEntity): FullAccountEntity? = queries.fullAccountInfo(userIDEntity, mapper = mapper::fromFullAccountInfo).executeAsOneOrNull() + + override suspend fun truncateAllForTesting() { + queries.truncateAllForTesting() + } } diff --git a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/globalDB/AccountsDAOTest.kt b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/globalDB/AccountsDAOTest.kt index 31ba21d5bb5..b00647b3edd 100644 --- a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/globalDB/AccountsDAOTest.kt +++ b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/globalDB/AccountsDAOTest.kt @@ -31,6 +31,7 @@ import com.wire.kalium.persistence.model.ServerConfigEntity import com.wire.kalium.persistence.model.SsoIdEntity import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest +import kotlin.test.AfterTest import kotlin.test.BeforeTest import kotlin.test.Test import kotlin.test.assertEquals @@ -39,11 +40,11 @@ import kotlin.test.assertNull @OptIn(ExperimentalCoroutinesApi::class) class AccountsDAOTest : GlobalDBBaseTest() { - lateinit var globalDatabaseBuilder: GlobalDatabaseBuilder + var globalDatabaseBuilder: GlobalDatabaseBuilder = createDatabase() @BeforeTest fun setUp() = runTest { - deleteDatabase() + globalDatabaseBuilder.accountsDAO.truncateAllForTesting() globalDatabaseBuilder = createDatabase() with(SERVER_CONFIG) { diff --git a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabase.kt b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabase.kt index 007b5c297c3..98a6b51dfc3 100644 --- a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabase.kt +++ b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabase.kt @@ -87,7 +87,7 @@ private fun createDataSource(driverUri: String): DataSource { fun JdbcDriver.databaseExists(dbName: String): Boolean { val result = executeQuery( - Int.MIN_VALUE, """SELECT datname FROM pg_catalog.pg_database WHERE datname = ?""", + Int.MIN_VALUE, """SELECT table_name FROM information_schema.tables where table_name = 'accounts'""", { if (it.next().value) { val result = it.getString(0) @@ -98,7 +98,7 @@ fun JdbcDriver.databaseExists(dbName: String): Boolean { } }, 0 - ) { bindString(0, dbName) } + ) { } println("Exists: ${result.value}") return result.value ?: false } diff --git a/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt b/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt index ed91028f20b..c97317599dd 100644 --- a/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt +++ b/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt @@ -18,6 +18,7 @@ package com.wire.kalium.persistence +import app.cash.sqldelight.driver.jdbc.JdbcDriver import com.wire.kalium.persistence.db.GlobalDatabaseBuilder import com.wire.kalium.persistence.db.PlatformDatabaseData import com.wire.kalium.persistence.db.StorageData From 512cb5bf9ceabbd203bbeb1def0573612d0d3b0d Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Mon, 13 May 2024 17:19:23 +0200 Subject: [PATCH 09/11] chore: test running testcontainers --- gradle/libs.versions.toml | 1 + persistence/build.gradle.kts | 1 + .../kalium/persistence/GlobalDBBaseTest.kt | 2 +- .../kalium/persistence/GlobalDBBaseTest.kt | 3 +- .../kalium/persistence/GlobalDBBaseTest.kt | 2 +- .../kalium/persistence/GlobalDBBaseTest.kt | 3 +- .../kalium/persistence/GlobalDBBaseTest.kt | 3 +- .../kalium/persistence/db/GlobalDatabase.kt | 53 +++++++++++-------- .../persistence/db/PlatformDatabaseData.kt | 1 + .../kalium/persistence/db/UserDatabase.kt | 1 + .../kalium/persistence/GlobalDBBaseTest.kt | 10 ++-- .../daokaliumdb/ServerConfigurationDAOTest.kt | 4 +- .../persistence/globalDB/AccountsDAOTest.kt | 22 ++++++-- 13 files changed, 67 insertions(+), 39 deletions(-) rename persistence/src/{commonTest => jvmTest}/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAOTest.kt (97%) rename persistence/src/{commonTest => jvmTest}/kotlin/com/wire/kalium/persistence/globalDB/AccountsDAOTest.kt (94%) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 17c52543b3d..23755b68ee1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -199,6 +199,7 @@ mockative-processor = { module = "io.mockative:mockative-processor", version.ref turbine = { module = "app.cash.turbine:turbine", version.ref = "turbine" } mockk = { module = "io.mockk:mockk", version.ref = "mockk" } konsist = { module = "com.lemonappdev:konsist", version.ref = "konsist" } +testContainers-postgres = { module = "org.testcontainers:postgresql", version = "1.19.6" } # detekt detekt-cli = { module = "io.gitlab.arturbosch.detekt:detekt-cli", version.ref = "detekt" } diff --git a/persistence/build.gradle.kts b/persistence/build.gradle.kts index d27c2ce1069..80a60f13125 100644 --- a/persistence/build.gradle.kts +++ b/persistence/build.gradle.kts @@ -91,6 +91,7 @@ kotlin { implementation(libs.sqlite.xerialDriver) implementation(libs.hikaricp) implementation(libs.postgres.driver) + implementation(libs.testContainers.postgres) } } val jvmTest by getting diff --git a/persistence/src/androidInstrumentedTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt b/persistence/src/androidInstrumentedTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt index cfbb214b97b..a8a38839556 100644 --- a/persistence/src/androidInstrumentedTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt +++ b/persistence/src/androidInstrumentedTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt @@ -34,7 +34,7 @@ actual abstract class GlobalDBBaseTest { context.deleteDatabase(FileNameUtil.globalDBName()) } - actual fun createDatabase(): GlobalDatabaseBuilder = globalDatabaseProvider( + actual fun createDatabase(platformDatabaseData: PlatformDatabaseData): GlobalDatabaseBuilder = globalDatabaseProvider( platformDatabaseData = PlatformDatabaseData(ApplicationProvider.getApplicationContext()), queriesContext = KaliumDispatcherImpl.unconfined, passphrase = GlobalDatabaseSecret("test_db_secret".toByteArray()), diff --git a/persistence/src/androidUnitTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt b/persistence/src/androidUnitTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt index edb29062eb1..0e1776e07cf 100644 --- a/persistence/src/androidUnitTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt +++ b/persistence/src/androidUnitTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt @@ -19,13 +19,14 @@ package com.wire.kalium.persistence import com.wire.kalium.persistence.db.GlobalDatabaseBuilder +import com.wire.kalium.persistence.db.PlatformDatabaseData actual abstract class GlobalDBBaseTest { actual fun deleteDatabase() { TODO("Not yet implemented") } - actual fun createDatabase(): GlobalDatabaseBuilder { + actual fun createDatabase(platformDatabaseData: PlatformDatabaseData): GlobalDatabaseBuilder { TODO("Not yet implemented") } } diff --git a/persistence/src/appleTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt b/persistence/src/appleTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt index 48d3e69d0d2..4d6239a66ad 100644 --- a/persistence/src/appleTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt +++ b/persistence/src/appleTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt @@ -37,7 +37,7 @@ actual abstract class GlobalDBBaseTest { deleteDatabase(FileNameUtil.globalDBName(), storePath) } - actual fun createDatabase(): GlobalDatabaseBuilder { + actual fun createDatabase(platformDatabaseData: PlatformDatabaseData): GlobalDatabaseBuilder { return globalDatabaseProvider( PlatformDatabaseData(StorageData.FileBacked(storePath)), StandardTestDispatcher(), null, false ) diff --git a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt index e4b88696644..43ec5e146a2 100644 --- a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt +++ b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt @@ -19,8 +19,9 @@ package com.wire.kalium.persistence import com.wire.kalium.persistence.db.GlobalDatabaseBuilder +import com.wire.kalium.persistence.db.PlatformDatabaseData expect abstract class GlobalDBBaseTest() { fun deleteDatabase() - fun createDatabase(): GlobalDatabaseBuilder + fun createDatabase(platformDatabaseData: PlatformDatabaseData): GlobalDatabaseBuilder } diff --git a/persistence/src/jsTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt b/persistence/src/jsTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt index edb29062eb1..0e1776e07cf 100644 --- a/persistence/src/jsTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt +++ b/persistence/src/jsTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt @@ -19,13 +19,14 @@ package com.wire.kalium.persistence import com.wire.kalium.persistence.db.GlobalDatabaseBuilder +import com.wire.kalium.persistence.db.PlatformDatabaseData actual abstract class GlobalDBBaseTest { actual fun deleteDatabase() { TODO("Not yet implemented") } - actual fun createDatabase(): GlobalDatabaseBuilder { + actual fun createDatabase(platformDatabaseData: PlatformDatabaseData): GlobalDatabaseBuilder { TODO("Not yet implemented") } } diff --git a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabase.kt b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabase.kt index 98a6b51dfc3..e075e29fe73 100644 --- a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabase.kt +++ b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabase.kt @@ -18,7 +18,7 @@ package com.wire.kalium.persistence.db -import app.cash.sqldelight.driver.jdbc.JdbcDriver +import app.cash.sqldelight.db.SqlDriver import app.cash.sqldelight.driver.jdbc.asJdbcDriver import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver import com.wire.kalium.persistence.GlobalDatabase @@ -34,25 +34,34 @@ actual fun globalDatabaseProvider( passphrase: GlobalDatabaseSecret?, enableWAL: Boolean, ): GlobalDatabaseBuilder { - val storageData = platformDatabaseData.storageData - if (storageData is StorageData.InMemory) { - return createGlobalInMemoryDatabase(queriesContext) - } - - if (storageData !is StorageData.FileBacked) { - throw IllegalStateException("Unsupported storage data type: $storageData") - } - if (passphrase != null) { throw NotImplementedError("Encrypted DB is not supported on JVM") } - // Make sure all intermediate directories exist - // storageData.file.mkdirs() - val driver = createDataSource("jdbc:postgresql://localhost:5432/${FileNameUtil.globalDBName()}").asJdbcDriver() - val databaseExists = driver.databaseExists(FileNameUtil.globalDBName()) - if (!databaseExists) { - GlobalDatabase.Schema.create(driver) + val driver = when (val storageData = platformDatabaseData.storageData) { + is StorageData.InMemory -> return createGlobalInMemoryDatabase(queriesContext) + is StorageData.FileBacked -> { + val databasePath = storageData.file.resolve(FileNameUtil.globalDBName()) + val databaseExists = databasePath.exists() + storageData.file.mkdirs() + val driver = databaseDriver("jdbc:sqlite:${databasePath.absolutePath}") { + isWALEnabled = enableWAL + areForeignKeyConstraintsEnforced = true + } + if (!databaseExists) { + GlobalDatabase.Schema.create(driver) + } + driver + } + + is StorageData.RDBMS -> { + val driver = createDataSource(storageData).asJdbcDriver() + val databaseExists = driver.databaseExists(FileNameUtil.globalDBName()) + if (!databaseExists) { + GlobalDatabase.Schema.create(driver) + } + driver + } } return GlobalDatabaseBuilder(driver, platformDatabaseData, queriesContext) @@ -71,12 +80,12 @@ fun createGlobalInMemoryDatabase(dispatcher: CoroutineDispatcher): GlobalDatabas return GlobalDatabaseBuilder(driver, PlatformDatabaseData(StorageData.InMemory), dispatcher) } -private fun createDataSource(driverUri: String): DataSource { +private fun createDataSource(storageData: StorageData.RDBMS): DataSource { val dataSourceConfig = HikariConfig().apply { driverClassName = "org.postgresql.Driver" - jdbcUrl = driverUri - username = "global" - password = "global" + jdbcUrl = storageData.uri + username = storageData.username + password = storageData.password maximumPoolSize = 3 isAutoCommit = true transactionIsolation = "TRANSACTION_REPEATABLE_READ" @@ -85,7 +94,7 @@ private fun createDataSource(driverUri: String): DataSource { return HikariDataSource(dataSourceConfig) } -fun JdbcDriver.databaseExists(dbName: String): Boolean { +fun SqlDriver.databaseExists(dbName: String): Boolean { val result = executeQuery( Int.MIN_VALUE, """SELECT table_name FROM information_schema.tables where table_name = 'accounts'""", { @@ -98,7 +107,7 @@ fun JdbcDriver.databaseExists(dbName: String): Boolean { } }, 0 - ) { } + ) { } println("Exists: ${result.value}") return result.value ?: false } diff --git a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/PlatformDatabaseData.kt b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/PlatformDatabaseData.kt index 2cf574d3f33..b234728f41e 100644 --- a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/PlatformDatabaseData.kt +++ b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/PlatformDatabaseData.kt @@ -29,6 +29,7 @@ actual data class PlatformDatabaseData( sealed interface StorageData { data class FileBacked(val file: File) : StorageData data object InMemory : StorageData + data class RDBMS(val uri: String, val username: String, val password: String) : StorageData } fun databaseDriver(uri: String, config: DriverConfigurationBuilder.() -> Unit = {}): SqlDriver { diff --git a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/UserDatabase.kt b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/UserDatabase.kt index cf5b97a23e0..f37f146c98c 100644 --- a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/UserDatabase.kt +++ b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/UserDatabase.kt @@ -117,4 +117,5 @@ internal actual fun nuke( ): Boolean = when (val storageData = platformDatabaseData.storageData) { StorageData.InMemory -> clearInMemoryDatabase(userId) is StorageData.FileBacked -> storageData.file.resolve(DATABASE_NAME).delete() + is StorageData.RDBMS -> throw NotImplementedError("RDBMS nuke is not supported on JVM, truncate by query") } diff --git a/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt b/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt index c97317599dd..21c716207fa 100644 --- a/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt +++ b/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/GlobalDBBaseTest.kt @@ -18,10 +18,8 @@ package com.wire.kalium.persistence -import app.cash.sqldelight.driver.jdbc.JdbcDriver import com.wire.kalium.persistence.db.GlobalDatabaseBuilder import com.wire.kalium.persistence.db.PlatformDatabaseData -import com.wire.kalium.persistence.db.StorageData import com.wire.kalium.persistence.db.globalDatabaseProvider import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.TestDispatcher @@ -31,17 +29,15 @@ import java.nio.file.Files actual abstract class GlobalDBBaseTest { @OptIn(ExperimentalCoroutinesApi::class) private val dispatcher: TestDispatcher = UnconfinedTestDispatcher() - private val databaseFile = Files.createTempDirectory("test-storage").toFile().resolve("test-kalium.db") + val databaseFile = Files.createTempDirectory("test-storage").toFile().resolve("test-kalium.db") actual fun deleteDatabase() { databaseFile.delete() } - actual fun createDatabase(): GlobalDatabaseBuilder { + actual fun createDatabase(platformDatabaseData: PlatformDatabaseData): GlobalDatabaseBuilder { return globalDatabaseProvider( - platformDatabaseData = PlatformDatabaseData( - StorageData.FileBacked(databaseFile) - ), + platformDatabaseData = platformDatabaseData, queriesContext = dispatcher, passphrase = null, enableWAL = false diff --git a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAOTest.kt b/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAOTest.kt similarity index 97% rename from persistence/src/commonTest/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAOTest.kt rename to persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAOTest.kt index 5ab0fe61e87..05df3cabefc 100644 --- a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAOTest.kt +++ b/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAOTest.kt @@ -22,6 +22,8 @@ package com.wire.kalium.persistence.daokaliumdb import com.wire.kalium.persistence.GlobalDBBaseTest import com.wire.kalium.persistence.db.GlobalDatabaseBuilder +import com.wire.kalium.persistence.db.PlatformDatabaseData +import com.wire.kalium.persistence.db.StorageData import com.wire.kalium.persistence.model.ServerConfigEntity import com.wire.kalium.persistence.utils.stubs.newServerConfig import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -45,7 +47,7 @@ class ServerConfigurationDAOTest : GlobalDBBaseTest() { @BeforeTest fun setup() { - globalDatabaseBuilder = createDatabase() + globalDatabaseBuilder = createDatabase(PlatformDatabaseData(StorageData.FileBacked(databaseFile))) } @AfterTest diff --git a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/globalDB/AccountsDAOTest.kt b/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/globalDB/AccountsDAOTest.kt similarity index 94% rename from persistence/src/commonTest/kotlin/com/wire/kalium/persistence/globalDB/AccountsDAOTest.kt rename to persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/globalDB/AccountsDAOTest.kt index b00647b3edd..9a2e39fb5e8 100644 --- a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/globalDB/AccountsDAOTest.kt +++ b/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/globalDB/AccountsDAOTest.kt @@ -26,12 +26,15 @@ import com.wire.kalium.persistence.daokaliumdb.FullAccountEntity import com.wire.kalium.persistence.daokaliumdb.PersistentWebSocketStatusEntity import com.wire.kalium.persistence.daokaliumdb.ServerConfigurationDAO import com.wire.kalium.persistence.db.GlobalDatabaseBuilder +import com.wire.kalium.persistence.db.PlatformDatabaseData +import com.wire.kalium.persistence.db.StorageData import com.wire.kalium.persistence.model.LogoutReason import com.wire.kalium.persistence.model.ServerConfigEntity import com.wire.kalium.persistence.model.SsoIdEntity import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest -import kotlin.test.AfterTest +import org.junit.Rule +import org.testcontainers.containers.PostgreSQLContainer import kotlin.test.BeforeTest import kotlin.test.Test import kotlin.test.assertEquals @@ -40,12 +43,23 @@ import kotlin.test.assertNull @OptIn(ExperimentalCoroutinesApi::class) class AccountsDAOTest : GlobalDBBaseTest() { - var globalDatabaseBuilder: GlobalDatabaseBuilder = createDatabase() + @JvmField + @Rule + var postgresContainer: PostgreSQLContainer<*> = PostgreSQLContainer("postgres:15-alpine") + + lateinit var globalDatabaseBuilder: GlobalDatabaseBuilder @BeforeTest fun setUp() = runTest { - globalDatabaseBuilder.accountsDAO.truncateAllForTesting() - globalDatabaseBuilder = createDatabase() + globalDatabaseBuilder = createDatabase( + PlatformDatabaseData( + StorageData.RDBMS( + postgresContainer.jdbcUrl, + postgresContainer.username, + postgresContainer.password, + ) + ) + ) with(SERVER_CONFIG) { globalDatabaseBuilder.serverConfigurationDAO.insert( From d8d5afb1b4e5522a31dc91e4d0268570421c3280 Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Mon, 13 May 2024 17:37:35 +0200 Subject: [PATCH 10/11] chore: test running testcontainers --- detekt/baseline.xml | 10 ++++----- .../com/wire/kalium/persistence/Accounts.sq | 6 ----- .../persistence/daokaliumdb/AccountsDAO.kt | 5 ----- .../persistence/db/GlobalDatabaseBuilder.kt | 2 +- .../kalium/persistence/db/GlobalDatabase.kt | 22 ++++++++++--------- .../persistence/db/PlatformDatabaseData.kt | 2 +- .../kalium/persistence/db/UserDatabase.kt | 2 +- .../persistence/globalDB/AccountsDAOTest.kt | 2 +- 8 files changed, 21 insertions(+), 30 deletions(-) diff --git a/detekt/baseline.xml b/detekt/baseline.xml index 48731680cd8..438b722e59e 100644 --- a/detekt/baseline.xml +++ b/detekt/baseline.xml @@ -128,6 +128,8 @@ ArgumentListWrapping:GetPaginatedFlowOfMessagesBySearchQueryAndConversationIdUseCase.kt$GetPaginatedFlowOfMessagesBySearchQueryAndConversationIdUseCase$( searchQuery, conversationId, pagingConfig, startingOffset ) ArgumentListWrapping:GetSessionsUseCase.kt$GetSessionsUseCase$( { when (it) { StorageFailure.DataNotFound -> GetAllSessionsResult.Failure.NoSessionFound is StorageFailure.Generic -> GetAllSessionsResult.Failure.Generic(it) } }, { GetAllSessionsResult.Success(it) } ) ArgumentListWrapping:GetUserInfoUseCase.kt$GetUserInfoUseCaseImpl$( { GetUserInfoResult.Failure }, { team -> GetUserInfoResult.Success(otherUser, team) }) + ArgumentListWrapping:GlobalDBBaseTest.kt$GlobalDBBaseTest$( PlatformDatabaseData(StorageData.FileBacked(storePath)), StandardTestDispatcher(), null, false ) + ArgumentListWrapping:GlobalDatabase.kt$( identifier = Int.MIN_VALUE, sql = """SELECT table_name FROM information_schema.tables where table_name = 'accounts'""", mapper = { if (it.next().value) { val result = it.getString(0) println("THE RESULT: $result") app.cash.sqldelight.db.QueryResult.Value(result?.isNotEmpty()) } else { app.cash.sqldelight.db.QueryResult.Value(false) } }, parameters = 0 ) ArgumentListWrapping:GuestRoomConfigHandler.kt$GuestRoomConfigHandler$( { false }, { it.isGuestRoomLinkEnabled != status } ) ArgumentListWrapping:HandleExternalRequestAction.kt$( """ Hey there, I hope you're doing well. I've got a bit of a craving for bananas, and I was wondering if you might be able to share a few with me? It would mean a lot. 😊 Thanks a bunch, A friendly monkey 🍌🐡 """.trimIndent(), """ Yo, I'm in need of some bananas, my friend. Can you hook me up? I'd appreciate it big time. Respect, A neutral monkey 🍌 """.trimIndent(), """ Listen up, I ain't messin' around. I want them bananas, and I want 'em now. You better deliver or there'll be consequences. No games, An evil monkey πŸŒπŸ‘ΏπŸ’€ """.trimIndent() ) ArgumentListWrapping:InstanceService.kt$InstanceService$( instanceRequest.email, instanceRequest.password, true, secondFactorVerificationCode = instanceRequest.verificationCode ) @@ -307,6 +309,7 @@ CommentSpacing:UserDAOTest.kt$UserDAOTest$//given EmptyFunctionBlock:FileTestHelper.kt$FileTestHelper${ } EmptyKtFile:FetchApiVersionUseCaseTest.kt$.FetchApiVersionUseCaseTest.kt + Filename:BooleanExt.kt$com.wire.kalium.persistence.dao.BooleanExt.kt Filename:ConversationStatus.kt$com.wire.kalium.logic.data.conversation.ConversationStatus.kt Filename:FileUtilTest.kt$com.wire.kalium.util.FileUtilTest.kt Filename:GetOtherUserClientsUseCaseTest.kt$com.wire.kalium.logic.feature.client.GetOtherUserClientsUseCaseTest.kt @@ -401,6 +404,7 @@ LongParameterList:ToggleReactionUseCase.kt$ToggleReactionUseCase$( clientId: ClientId, conversationId: ConversationId, date: String, messageId: String, removedReaction: String, currentReactions: UserReactions ) MagicNumber:ConversationStatus.kt$MutedConversationStatus.AllMuted$3 MagicNumber:GlobalCallManager.kt$LogHandlerImpl$3 + MagicNumber:GlobalDatabase.kt$3 MagicNumber:NetworkUtils.kt$300 MagicNumber:NetworkUtils.kt$399 MagicNumber:NetworkUtils.kt$400 @@ -411,10 +415,6 @@ MatchingDeclarationName:ConversationStatus.kt$MutedConversationStatus MatchingDeclarationName:CryptoboxCRUDStore.module_@wireapp_cryptobox.kt$CryptoboxCRUDStore : PreKeyStore MatchingDeclarationName:CryptoboxSession.module_@wireapp_cryptobox.kt$CryptoboxSession - MatchingDeclarationName:DriverBuilder.android.kt$DriverBuilder - MatchingDeclarationName:DriverBuilder.apple.kt$DriverBuilder - MatchingDeclarationName:DriverBuilder.js.kt$DriverBuilder - MatchingDeclarationName:DriverBuilder.jvm.kt$DriverBuilder MatchingDeclarationName:Encoder.module_@wireapp_cbor.kt$Encoder MatchingDeclarationName:FileUtilTest.kt$FileTestHelper MatchingDeclarationName:GetOtherUserClientsUseCaseTest.kt$ObserveClientsByUserIdUseCaseTest @@ -939,7 +939,7 @@ UnusedPrivateProperty:build.gradle.kts$val jvmMain by getting { dependencies { implementation(libs.apacheTika) } } UnusedPrivateProperty:build.gradle.kts$val jvmMain by getting { dependencies { implementation(libs.coroutines.core) } } UnusedPrivateProperty:build.gradle.kts$val jvmMain by getting { dependencies { implementation(libs.ktor.okHttp) implementation(libs.okhttp.loggingInterceptor) } } - UnusedPrivateProperty:build.gradle.kts$val jvmMain by getting { dependencies { implementation(libs.sqldelight.jvmDriver) implementation(libs.sqlite.xerialDriver) } } + UnusedPrivateProperty:build.gradle.kts$val jvmMain by getting { dependencies { implementation(libs.sqldelight.jvmDriver) implementation(libs.sqldelight.jdbcDriver) implementation(libs.sqlite.xerialDriver) implementation(libs.hikaricp) implementation(libs.postgres.driver) implementation(libs.testContainers.postgres) } } UnusedPrivateProperty:build.gradle.kts$val jvmMain by getting { dependencies { implementation(project(":logic")) implementation(project(":calling")) } } UnusedPrivateProperty:build.gradle.kts$val jvmTest by getting UnusedPrivateProperty:build.gradle.kts$val jvmTest by getting { dependencies { implementation(libs.konsist) } } diff --git a/persistence/src/commonMain/db_global/com/wire/kalium/persistence/Accounts.sq b/persistence/src/commonMain/db_global/com/wire/kalium/persistence/Accounts.sq index 6f5d55ef48e..e6fff03cbaf 100644 --- a/persistence/src/commonMain/db_global/com/wire/kalium/persistence/Accounts.sq +++ b/persistence/src/commonMain/db_global/com/wire/kalium/persistence/Accounts.sq @@ -92,9 +92,3 @@ FROM Accounts INNER JOIN ServerConfiguration ON Accounts.server_config_id = ServerConfiguration.id WHERE Accounts.logout_reason IS NULL; - -truncateAllForTesting { - DELETE FROM Accounts; - DELETE FROM CurrentAccount; - DELETE FROM ServerConfiguration; -} diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt index d4d4d8f8f29..78bbe428126 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/AccountsDAO.kt @@ -177,7 +177,6 @@ interface AccountsDAO { suspend fun getAllValidAccountPersistentWebSocketStatus(): Flow> suspend fun getAccountManagedBy(userIDEntity: UserIDEntity): ManagedByEntity? suspend fun validAccountWithServerConfigId(): Map - suspend fun truncateAllForTesting() } @Suppress("TooManyFunctions") @@ -315,8 +314,4 @@ internal class AccountsDAOImpl internal constructor( override fun fullAccountInfo(userIDEntity: UserIDEntity): FullAccountEntity? = queries.fullAccountInfo(userIDEntity, mapper = mapper::fromFullAccountInfo).executeAsOneOrNull() - - override suspend fun truncateAllForTesting() { - queries.truncateAllForTesting() - } } diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseBuilder.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseBuilder.kt index 194d685821a..e5e1b562b90 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseBuilder.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabaseBuilder.kt @@ -69,7 +69,7 @@ class GlobalDatabaseBuilder internal constructor( ) init { - //database.globalDatabasePropertiesQueries.enableForeignKeyContraints() + // database.globalDatabasePropertiesQueries.enableForeignKeyContraints() } val serverConfigurationDAO: ServerConfigurationDAO diff --git a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabase.kt b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabase.kt index e075e29fe73..09ec2bb4321 100644 --- a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabase.kt +++ b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/GlobalDatabase.kt @@ -54,9 +54,9 @@ actual fun globalDatabaseProvider( driver } - is StorageData.RDBMS -> { + is StorageData.Postgres -> { val driver = createDataSource(storageData).asJdbcDriver() - val databaseExists = driver.databaseExists(FileNameUtil.globalDBName()) + val databaseExists = driver.databaseExists() if (!databaseExists) { GlobalDatabase.Schema.create(driver) } @@ -80,13 +80,14 @@ fun createGlobalInMemoryDatabase(dispatcher: CoroutineDispatcher): GlobalDatabas return GlobalDatabaseBuilder(driver, PlatformDatabaseData(StorageData.InMemory), dispatcher) } -private fun createDataSource(storageData: StorageData.RDBMS): DataSource { +private fun createDataSource(storageData: StorageData.Postgres): DataSource { val dataSourceConfig = HikariConfig().apply { + val poolSize = 3 driverClassName = "org.postgresql.Driver" jdbcUrl = storageData.uri username = storageData.username password = storageData.password - maximumPoolSize = 3 + maximumPoolSize = poolSize isAutoCommit = true transactionIsolation = "TRANSACTION_REPEATABLE_READ" validate() @@ -94,20 +95,21 @@ private fun createDataSource(storageData: StorageData.RDBMS): DataSource { return HikariDataSource(dataSourceConfig) } -fun SqlDriver.databaseExists(dbName: String): Boolean { +fun SqlDriver.databaseExists(): Boolean { val result = executeQuery( - Int.MIN_VALUE, """SELECT table_name FROM information_schema.tables where table_name = 'accounts'""", - { + identifier = Int.MIN_VALUE, sql = """SELECT table_name FROM information_schema.tables where table_name = 'accounts'""", + mapper = { if (it.next().value) { val result = it.getString(0) - println("THE RESULT: ${result}") + println("THE RESULT: $result") app.cash.sqldelight.db.QueryResult.Value(result?.isNotEmpty()) } else { app.cash.sqldelight.db.QueryResult.Value(false) } - }, 0 - ) { } + }, + parameters = 0 + ) println("Exists: ${result.value}") return result.value ?: false } diff --git a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/PlatformDatabaseData.kt b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/PlatformDatabaseData.kt index b234728f41e..50834db385e 100644 --- a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/PlatformDatabaseData.kt +++ b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/PlatformDatabaseData.kt @@ -29,7 +29,7 @@ actual data class PlatformDatabaseData( sealed interface StorageData { data class FileBacked(val file: File) : StorageData data object InMemory : StorageData - data class RDBMS(val uri: String, val username: String, val password: String) : StorageData + data class Postgres(val uri: String, val username: String, val password: String) : StorageData } fun databaseDriver(uri: String, config: DriverConfigurationBuilder.() -> Unit = {}): SqlDriver { diff --git a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/UserDatabase.kt b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/UserDatabase.kt index f37f146c98c..c9f7587a387 100644 --- a/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/UserDatabase.kt +++ b/persistence/src/jvmMain/kotlin/com/wire/kalium/persistence/db/UserDatabase.kt @@ -117,5 +117,5 @@ internal actual fun nuke( ): Boolean = when (val storageData = platformDatabaseData.storageData) { StorageData.InMemory -> clearInMemoryDatabase(userId) is StorageData.FileBacked -> storageData.file.resolve(DATABASE_NAME).delete() - is StorageData.RDBMS -> throw NotImplementedError("RDBMS nuke is not supported on JVM, truncate by query") + is StorageData.Postgres -> throw NotImplementedError("RDBMS nuke is not supported on JVM, truncate by query") } diff --git a/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/globalDB/AccountsDAOTest.kt b/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/globalDB/AccountsDAOTest.kt index 9a2e39fb5e8..add0815979b 100644 --- a/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/globalDB/AccountsDAOTest.kt +++ b/persistence/src/jvmTest/kotlin/com/wire/kalium/persistence/globalDB/AccountsDAOTest.kt @@ -53,7 +53,7 @@ class AccountsDAOTest : GlobalDBBaseTest() { fun setUp() = runTest { globalDatabaseBuilder = createDatabase( PlatformDatabaseData( - StorageData.RDBMS( + StorageData.Postgres( postgresContainer.jdbcUrl, postgresContainer.username, postgresContainer.password, From 712a72e8eb8c45dc45d46e9cf334613fee3b1521 Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Tue, 14 May 2024 09:50:13 +0200 Subject: [PATCH 11/11] chore: cleanup --- .../kalium/persistence/daokaliumdb/ServerConfigurationDAO.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAO.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAO.kt index effc9ea41af..707e857eb1c 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAO.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/daokaliumdb/ServerConfigurationDAO.kt @@ -187,7 +187,7 @@ internal class ServerConfigurationDAOImpl internal constructor( } override suspend fun allConfigFlow(): Flow> = - queries.storedConfig(mapper = ServerConfigMapper::fromServerConfiguration).asFlow().flowOn(queriesContext).mapToList() + queries.storedConfig(mapper = mapper::fromServerConfiguration).asFlow().flowOn(queriesContext).mapToList() override suspend fun allConfig(): List = withContext(queriesContext) { queries.storedConfig(mapper = mapper::fromServerConfiguration).executeAsList()