diff --git a/CHANGELOG.md b/CHANGELOG.md index 94996f76..546ac324 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## 1.0.0-BETA31 * Added helpers for Attachment syncing. +* Fix `getNextCrudTransaction()` only returning a single item. ## 1.0.0-BETA30 diff --git a/core/src/commonIntegrationTest/kotlin/com/powersync/DatabaseTest.kt b/core/src/commonIntegrationTest/kotlin/com/powersync/DatabaseTest.kt index 63f1478d..250d72c3 100644 --- a/core/src/commonIntegrationTest/kotlin/com/powersync/DatabaseTest.kt +++ b/core/src/commonIntegrationTest/kotlin/com/powersync/DatabaseTest.kt @@ -369,4 +369,25 @@ class DatabaseTest { val count = database.get("SELECT COUNT(*) from people") { it.getLong(0)!! } count shouldBe 1 } + + @Test + fun testCrudTransaction() = + databaseTest { + database.execute("INSERT INTO users (id, name, email) VALUES (uuid(), ?, ?)", listOf("a", "a@example.org")) + + database.writeTransaction { + it.execute("INSERT INTO users (id, name, email) VALUES (uuid(), ?, ?)", listOf("b", "b@example.org")) + it.execute("INSERT INTO users (id, name, email) VALUES (uuid(), ?, ?)", listOf("c", "c@example.org")) + } + + var transaction = database.getNextCrudTransaction() + transaction!!.crud shouldHaveSize 1 + transaction.complete(null) + + transaction = database.getNextCrudTransaction() + transaction!!.crud shouldHaveSize 2 + transaction.complete(null) + + database.getNextCrudTransaction() shouldBe null + } } diff --git a/core/src/commonMain/kotlin/com/powersync/bucket/BucketStorage.kt b/core/src/commonMain/kotlin/com/powersync/bucket/BucketStorage.kt index 94ca52df..654bc3c7 100644 --- a/core/src/commonMain/kotlin/com/powersync/bucket/BucketStorage.kt +++ b/core/src/commonMain/kotlin/com/powersync/bucket/BucketStorage.kt @@ -14,6 +14,11 @@ internal interface BucketStorage { fun nextCrudItem(transaction: PowerSyncTransaction): CrudEntry? + fun getCrudItemsByTransactionId( + transactionId: Int, + transaction: PowerSyncTransaction, + ): List + suspend fun hasCrud(): Boolean fun hasCrud(transaction: PowerSyncTransaction): Boolean diff --git a/core/src/commonMain/kotlin/com/powersync/bucket/BucketStorageImpl.kt b/core/src/commonMain/kotlin/com/powersync/bucket/BucketStorageImpl.kt index 2bdd340b..3f647b29 100644 --- a/core/src/commonMain/kotlin/com/powersync/bucket/BucketStorageImpl.kt +++ b/core/src/commonMain/kotlin/com/powersync/bucket/BucketStorageImpl.kt @@ -41,13 +41,24 @@ internal class BucketStorageImpl( return id ?: throw IllegalStateException("Client ID not found") } - override suspend fun nextCrudItem(): CrudEntry? = db.getOptional(sql = nextCrudQuery, mapper = nextCrudMapper) + override suspend fun nextCrudItem(): CrudEntry? = db.getOptional(sql = nextCrudQuery, mapper = crudEntryMapper) override fun nextCrudItem(transaction: PowerSyncTransaction): CrudEntry? = - transaction.getOptional(sql = nextCrudQuery, mapper = nextCrudMapper) + transaction.getOptional(sql = nextCrudQuery, mapper = crudEntryMapper) + + override fun getCrudItemsByTransactionId( + transactionId: Int, + transaction: PowerSyncTransaction, + ): List = + transaction.getAll( + sql = transactionCrudQuery, + parameters = listOf(transactionId), + mapper = crudEntryMapper, + ) private val nextCrudQuery = "SELECT id, tx_id, data FROM ${InternalTable.CRUD} ORDER BY id ASC LIMIT 1" - private val nextCrudMapper: (SqlCursor) -> CrudEntry = { cursor -> + private val transactionCrudQuery = "SELECT id, tx_id, data FROM ${InternalTable.CRUD} WHERE tx_id = ? ORDER BY id ASC" + private val crudEntryMapper: (SqlCursor) -> CrudEntry = { cursor -> CrudEntry.fromRow( CrudRow( id = cursor.getString(0)!!, diff --git a/core/src/commonMain/kotlin/com/powersync/db/PowerSyncDatabaseImpl.kt b/core/src/commonMain/kotlin/com/powersync/db/PowerSyncDatabaseImpl.kt index 504d8e16..cb56d606 100644 --- a/core/src/commonMain/kotlin/com/powersync/db/PowerSyncDatabaseImpl.kt +++ b/core/src/commonMain/kotlin/com/powersync/db/PowerSyncDatabaseImpl.kt @@ -298,15 +298,10 @@ internal class PowerSyncDatabaseImpl( if (txId == null) { listOf(entry) } else { - transaction.getAll("SELECT id, tx_id, data FROM ps_crud ORDER BY id ASC LIMIT 1") { - CrudEntry.fromRow( - CrudRow( - id = it.getString("id"), - data = it.getString("data"), - txId = it.getLongOptional("tx_id")?.toInt(), - ), - ) - } + bucketStorage.getCrudItemsByTransactionId( + transactionId = txId, + transaction = transaction, + ) } return@readTransaction CrudTransaction( diff --git a/gradle.properties b/gradle.properties index 6cc158f7..c5c974e7 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-BETA30 +LIBRARY_VERSION=1.0.0-BETA31 GITHUB_REPO=https://github.com/powersync-ja/powersync-kotlin.git # POM POM_URL=https://github.com/powersync-ja/powersync-kotlin/