diff --git a/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/DatabaseTransactions.kt b/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/DatabaseTransactions.kt index bef95829df5..2f2c5e21f1e 100644 --- a/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/DatabaseTransactions.kt +++ b/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/DatabaseTransactions.kt @@ -2,33 +2,36 @@ package dev.inmo.micro_utils.repos import android.database.sqlite.SQLiteDatabase import dev.inmo.micro_utils.coroutines.safely -import kotlinx.coroutines.newSingleThreadContext -import kotlinx.coroutines.withContext +import kotlinx.coroutines.* +import java.util.concurrent.Executors import kotlin.coroutines.CoroutineContext import kotlin.coroutines.coroutineContext -object InTransaction: CoroutineContext.Element, CoroutineContext.Key { - override val key: CoroutineContext.Key = InTransaction +class TransactionContext( + val databaseContext: CoroutineContext +): CoroutineContext.Element { + override val key: CoroutineContext.Key = TransactionContext + + companion object : CoroutineContext.Key } suspend fun SQLiteDatabase.transaction(block: suspend SQLiteDatabase.() -> T): T { - return when { - coroutineContext[InTransaction] == InTransaction -> { + return coroutineContext[TransactionContext] ?.let { + withContext(it.databaseContext) { block() } - else -> { - withContext(InTransaction) { - beginTransaction() - safely( - { - endTransaction() - throw it - } - ) { - block().also { - setTransactionSuccessful() - endTransaction() - } + } ?: Executors.newSingleThreadExecutor().asCoroutineDispatcher().let { context -> + withContext(TransactionContext(context) + context) { + beginTransaction() + safely( + { + endTransaction() + throw it + } + ) { + block().also { + setTransactionSuccessful() + endTransaction() } } }