Skip to content

Commit 38ddd17

Browse files
author
Tamim Attafi
committed
fix: nested transaction error on iOS
1 parent c29e7f8 commit 38ddd17

File tree

4 files changed

+29
-19
lines changed

4 files changed

+29
-19
lines changed

convention/publishing/src/main/kotlin/com/attafitamim/kabin/publish/PublishConventions.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import org.gradle.api.publish.maven.MavenPomScm
1010

1111
class PublishConventions : Plugin<Project> {
1212

13-
private val version = "0.1.0-alpha06"
13+
private val version = "0.1.0-alpha07"
1414
private val group = "com.attafitamim.kabin"
1515

1616
override fun apply(project: Project) {

library/core/src/commonMain/kotlin/com/attafitamim/kabin/core/database/KabinBaseDatabase.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ abstract class KabinBaseDatabase(
1111
) : KabinDatabase {
1212

1313
private val queries = KabinSuspendingQueries(driver)
14+
1415
abstract suspend fun clearTables()
1516

1617
final override suspend fun clear() {
1718
queries.safeGlobalTransaction(configuration) {
1819
clearTables()
19-
}.await()
20+
}
2021
}
2122
}

library/core/src/commonMain/kotlin/com/attafitamim/kabin/core/database/KabinSqlSchema.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import com.attafitamim.kabin.core.database.configuration.KabinDatabaseConfigurat
88
import com.attafitamim.kabin.core.exceptions.SqlMigrationMissing
99
import com.attafitamim.kabin.core.migration.KabinMigrationStrategy
1010
import com.attafitamim.kabin.core.migration.Migration
11-
import com.attafitamim.kabin.core.utils.safeGlobalTransaction
11+
import com.attafitamim.kabin.core.utils.safeGlobalQuery
1212

1313
abstract class KabinSqlSchema(
1414
val migrations: List<Migration>,
@@ -21,7 +21,7 @@ abstract class KabinSqlSchema(
2121
abstract suspend fun createTables(driver: SqlDriver)
2222

2323
override fun create(driver: SqlDriver): QueryResult.AsyncValue<Unit> =
24-
driver.safeGlobalTransaction(configuration) {
24+
driver.safeGlobalQuery(configuration) {
2525
createTables(driver)
2626
}
2727

@@ -30,7 +30,7 @@ abstract class KabinSqlSchema(
3030
oldVersion: Long,
3131
newVersion: Long,
3232
vararg callbacks: AfterVersion
33-
): QueryResult.AsyncValue<Unit> = driver.safeGlobalTransaction(configuration) {
33+
): QueryResult.AsyncValue<Unit> = driver.safeGlobalQuery(configuration) {
3434
when {
3535
oldVersion == newVersion -> callbacks.notifyAll(driver)
3636
oldVersion > newVersion -> handleMissingMigration(oldVersion, newVersion, driver, callbacks)

library/core/src/commonMain/kotlin/com/attafitamim/kabin/core/utils/KabinUtils.kt

+23-14
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,30 @@ suspend inline fun <T> KabinSuspendingQueries.safeTransactionWithResult(
2424
body()
2525
}
2626

27-
inline fun SqlDriver.safeGlobalTransaction(
27+
inline fun SqlDriver.safeGlobalQuery(
2828
configuration: KabinDatabaseConfiguration,
29-
noinline body: suspend TransactionCallbacks.() -> Unit
30-
): QueryResult.AsyncValue<Unit> = KabinSuspendingQueries(this)
31-
.safeGlobalTransaction(configuration, body)
29+
noinline body: suspend () -> Unit
30+
): QueryResult.AsyncValue<Unit> = with(KabinSuspendingQueries(this)) {
31+
QueryResult.AsyncValue {
32+
try {
33+
tryToggleForeignKeys(configuration, enabled = false)
34+
tryDifferForeignKeys(configuration, enabled = true)
35+
body()
36+
} finally {
37+
tryToggleForeignKeys(configuration, enabled = true)
38+
tryDifferForeignKeys(configuration, enabled = false)
39+
}
40+
}
41+
}
3242

33-
inline fun KabinSuspendingQueries.safeGlobalTransaction(
43+
suspend inline fun KabinSuspendingQueries.safeGlobalTransaction(
3444
configuration: KabinDatabaseConfiguration,
3545
noinline body: suspend TransactionCallbacks.() -> Unit
36-
) = QueryResult.AsyncValue {
37-
try {
38-
tryToggleForeignKeys(configuration, enabled = false)
39-
safeTransaction(configuration, body = body)
40-
} finally {
41-
tryToggleForeignKeys(configuration, enabled = true)
42-
}
46+
) = try {
47+
tryToggleForeignKeys(configuration, enabled = false)
48+
safeTransaction(configuration, body = body)
49+
} finally {
50+
tryToggleForeignKeys(configuration, enabled = true)
4351
}
4452

4553
suspend fun KabinSuspendingQueries.tryToggleForeignKeys(
@@ -52,9 +60,10 @@ suspend fun KabinSuspendingQueries.tryToggleForeignKeys(
5260
}
5361

5462
suspend fun KabinSuspendingQueries.tryDifferForeignKeys(
55-
configuration: KabinDatabaseConfiguration
63+
configuration: KabinDatabaseConfiguration,
64+
enabled: Boolean = true
5665
) = with(configuration.extendedConfig) {
5766
if (foreignKeyConstraintsEnabled && deferForeignKeysInsideTransaction) {
58-
deferForeignKeys()
67+
deferForeignKeys(enabled)
5968
}
6069
}

0 commit comments

Comments
 (0)