diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ef3acb8..53fde3b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,18 @@ # Changelog +## 1.0.0-BETA9 + +* Re-enable SKIE `SuspendInterop` +* Move transaction functions out of `PowerSyncTransactionFactory` to avoid threading issues in Swift SDK + ## 1.0.0-BETA8 -* Disable Skie `SuspendInterop` plugin to fix overriding `suspend` functions in Swift +* Disable SKIE `SuspendInterop` plugin to fix overriding `suspend` functions in Swift ## 1.0.0-BETA7 * Update supabase connector to use supabase-kt version 3 -* Handle postgres error codes in supabase connector +* Handle Postgres error codes in supabase connector ## 1.0.0-BETA6 diff --git a/PowerSync/build.gradle.kts b/PowerSync/build.gradle.kts index 0945296a..c7e5e2af 100644 --- a/PowerSync/build.gradle.kts +++ b/PowerSync/build.gradle.kts @@ -41,16 +41,6 @@ kotlin { } } -skie { - features { - group { - // We turn this off as the suspend interop feature results in - // threading issues when implementing SDK in Swift - SuspendInterop.Enabled(false) - } - } -} - kmmbridge { artifactManager.set(SonatypePortalPublishArtifactManager(project, repositoryName = null)) artifactManager.finalizeValue() diff --git a/core/src/commonMain/kotlin/com/powersync/db/PowerSyncDatabaseImpl.kt b/core/src/commonMain/kotlin/com/powersync/db/PowerSyncDatabaseImpl.kt index f7dbbae8..6bb096ab 100644 --- a/core/src/commonMain/kotlin/com/powersync/db/PowerSyncDatabaseImpl.kt +++ b/core/src/commonMain/kotlin/com/powersync/db/PowerSyncDatabaseImpl.kt @@ -4,6 +4,7 @@ import app.cash.sqldelight.async.coroutines.awaitAsList import app.cash.sqldelight.async.coroutines.awaitAsOne import app.cash.sqldelight.db.SqlCursor import co.touchlab.kermit.Logger +import co.touchlab.skie.configuration.annotations.SuspendInterop import com.powersync.DatabaseDriverFactory import com.powersync.PowerSyncDatabase import com.powersync.PsSqlDriver diff --git a/core/src/commonMain/kotlin/com/powersync/db/internal/InternalDatabaseImpl.kt b/core/src/commonMain/kotlin/com/powersync/db/internal/InternalDatabaseImpl.kt index 74785480..9c5fb369 100644 --- a/core/src/commonMain/kotlin/com/powersync/db/internal/InternalDatabaseImpl.kt +++ b/core/src/commonMain/kotlin/com/powersync/db/internal/InternalDatabaseImpl.kt @@ -9,7 +9,7 @@ import app.cash.sqldelight.coroutines.mapToList import app.cash.sqldelight.db.QueryResult import app.cash.sqldelight.db.SqlCursor import app.cash.sqldelight.db.SqlPreparedStatement -import com.powersync.PowerSyncTransaction +import com.persistence.PowersyncQueries import com.powersync.PsSqlDriver import com.powersync.persistence.PsDatabase import com.powersync.utils.JsonUtil @@ -27,11 +27,36 @@ internal class InternalDatabaseImpl( private val scope: CoroutineScope, ) : InternalDatabase { override val transactor: PsDatabase = PsDatabase(driver) - override val queries = transactor.powersyncQueries + override val queries: PowersyncQueries = transactor.powersyncQueries + private val transaction = + object : PowerSyncTransaction { + override suspend fun execute( + sql: String, + parameters: List?, + ): Long = this@InternalDatabaseImpl.execute(sql, parameters ?: emptyList()) + + override suspend fun get( + sql: String, + parameters: List?, + mapper: (SqlCursor) -> RowType, + ): RowType = this@InternalDatabaseImpl.get(sql, parameters ?: emptyList(), mapper) + + override suspend fun getAll( + sql: String, + parameters: List?, + mapper: (SqlCursor) -> RowType, + ): List = this@InternalDatabaseImpl.getAll(sql, parameters ?: emptyList(), mapper) + + override suspend fun getOptional( + sql: String, + parameters: List?, + mapper: (SqlCursor) -> RowType, + ): RowType? = this@InternalDatabaseImpl.getOptional(sql, parameters ?: emptyList(), mapper) + } companion object { - const val POWERSYNC_TABLE_MATCH = "(^ps_data__|^ps_data_local__)" - const val DEFAULT_WATCH_THROTTLE_MS = 30L + const val POWERSYNC_TABLE_MATCH: String = "(^ps_data__|^ps_data_local__)" + const val DEFAULT_WATCH_THROTTLE_MS: Long = 30L } init { @@ -159,13 +184,11 @@ internal class InternalDatabaseImpl( override suspend fun readTransaction(callback: suspend (PowerSyncTransaction) -> R): R = transactor.transactionWithResult(noEnclosing = true) { - val transaction = PowerSyncTransaction(this@InternalDatabaseImpl) callback(transaction) } override suspend fun writeTransaction(callback: suspend (PowerSyncTransaction) -> R): R = transactor.transactionWithResult(noEnclosing = true) { - val transaction = PowerSyncTransaction(this@InternalDatabaseImpl) callback(transaction) } diff --git a/core/src/commonMain/kotlin/com/powersync/db/internal/PowerSyncTransactionFactory.kt b/core/src/commonMain/kotlin/com/powersync/db/internal/PowerSyncTransactionFactory.kt deleted file mode 100644 index f5a32508..00000000 --- a/core/src/commonMain/kotlin/com/powersync/db/internal/PowerSyncTransactionFactory.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.powersync - -import app.cash.sqldelight.db.SqlCursor -import com.powersync.db.internal.InternalDatabaseImpl -import com.powersync.db.internal.PowerSyncTransaction - -internal fun PowerSyncTransaction(internalDatabase: InternalDatabaseImpl): PowerSyncTransaction { - val transaction = - object : PowerSyncTransaction { - override suspend fun execute( - sql: String, - parameters: List?, - ): Long = internalDatabase.execute(sql, parameters ?: emptyList()) - - override suspend fun get( - sql: String, - parameters: List?, - mapper: (SqlCursor) -> RowType, - ): RowType = internalDatabase.get(sql, parameters ?: emptyList(), mapper) - - override suspend fun getAll( - sql: String, - parameters: List?, - mapper: (SqlCursor) -> RowType, - ): List = internalDatabase.getAll(sql, parameters ?: emptyList(), mapper) - - override suspend fun getOptional( - sql: String, - parameters: List?, - mapper: (SqlCursor) -> RowType, - ): RowType? = internalDatabase.getOptional(sql, parameters ?: emptyList(), mapper) - } - - return transaction -} diff --git a/gradle.properties b/gradle.properties index 931868e4..62b5f235 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ development=true RELEASE_SIGNING_ENABLED=true # Library config GROUP=com.powersync -LIBRARY_VERSION=1.0.0-BETA8 +LIBRARY_VERSION=1.0.0-BETA9 GITHUB_REPO=https://github.com/powersync-ja/powersync-kotlin.git # POM POM_URL=https://github.com/powersync-ja/powersync-kotlin/ diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d0ae66ac..86c48d74 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ compose-preview = "1.7.2" # plugins android-gradle-plugin = "8.5.1" kmmBridge = "0.5.7" -skie = "0.9.3" +skie = "0.9.5" maven-publish = "0.27.0" download-plugin = "5.5.0" grammerKit = "0.1.12"