From 1b1808558e4ae27cf8a6423fa472f18fb7c3a90b Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 26 May 2023 15:42:14 +0200 Subject: [PATCH] [jOOQ/jOOQ#14997] Use awaitSingle instead of awaitFirstOrNull in transactionCoroutine to correctly sequence transaction script --- .../kotlin/coroutines/CoroutineExtensions.kt | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/jOOQ-kotlin-coroutines/src/main/kotlin/org/jooq/kotlin/coroutines/CoroutineExtensions.kt b/jOOQ-kotlin-coroutines/src/main/kotlin/org/jooq/kotlin/coroutines/CoroutineExtensions.kt index 8840b53ead..af3823cd97 100644 --- a/jOOQ-kotlin-coroutines/src/main/kotlin/org/jooq/kotlin/coroutines/CoroutineExtensions.kt +++ b/jOOQ-kotlin-coroutines/src/main/kotlin/org/jooq/kotlin/coroutines/CoroutineExtensions.kt @@ -1,7 +1,8 @@ package org.jooq.kotlin.coroutines import kotlin.coroutines.CoroutineContext -import kotlinx.coroutines.reactive.awaitFirstOrNull +import kotlin.coroutines.EmptyCoroutineContext +import kotlinx.coroutines.reactive.awaitSingle import kotlinx.coroutines.reactor.mono import org.jooq.Configuration import org.jooq.DSLContext @@ -10,20 +11,18 @@ import org.jooq.DSLContext // Extensions to bridge between the reactive-streams and the coroutine world // ---------------------------------------------------------------------------- -suspend fun DSLContext.transactionCoroutine(transactional: suspend (Configuration) -> T): T { - @Suppress("UNCHECKED_CAST") - return transactionPublisher { c -> - mono { - transactional.invoke(c) - } - }.awaitFirstOrNull() as T -} +suspend fun DSLContext.transactionCoroutine(transactional: suspend (Configuration) -> T): T = + transactionCoroutine(EmptyCoroutineContext, transactional) + suspend fun DSLContext.transactionCoroutine(context: CoroutineContext, transactional: suspend (Configuration) -> T): T { - @Suppress("UNCHECKED_CAST") + // [#14997] Wrap values in an auxiliary class in order to allow nulls, which awaitSingle() + // doesn't allow, otherwise + data class Wrap(val t: T) + return transactionPublisher { c -> mono(context) { - transactional.invoke(c) + Wrap(transactional.invoke(c)) } - }.awaitFirstOrNull() as T + }.awaitSingle().t } \ No newline at end of file