Skip to content

Commit d5fd3a9

Browse files
huntj88michaelbull
authored andcommitted
Add CoroutineScope receiver to transaction & withConnection
See: #1
1 parent 24c4b66 commit d5fd3a9

File tree

3 files changed

+16
-8
lines changed

3 files changed

+16
-8
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ The primary higher-order function exposed by the library is the
2727
[`transaction`][transaction] function.
2828

2929
```kotlin
30-
suspend inline fun <T> transaction(crossinline block: suspend () -> T): T
30+
suspend inline fun <T> transaction(crossinline block: suspend CoroutineScope.() -> T): T
3131
```
3232

3333
Calling this function with a specific suspending block will run the block in

src/main/kotlin/com/github/michaelbull/jdbc/Connection.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.github.michaelbull.jdbc.context.CoroutineConnection
44
import com.github.michaelbull.jdbc.context.CoroutineDataSource
55
import com.github.michaelbull.jdbc.context.dataSource
66
import com.github.michaelbull.logging.InlineLogger
7+
import kotlinx.coroutines.CoroutineScope
78
import kotlinx.coroutines.withContext
89
import java.sql.Connection
910
import java.sql.SQLException
@@ -27,7 +28,7 @@ internal val logger = InlineLogger()
2728
* [with the context][withContext] of a new [CoroutineConnection] and an attempt will be made to [Connection.close]
2829
* it afterwards.
2930
*/
30-
suspend inline fun <T> withConnection(crossinline block: suspend () -> T): T {
31+
suspend inline fun <T> withConnection(crossinline block: suspend CoroutineScope.() -> T): T {
3132
contract {
3233
callsInPlace(block, InvocationKind.AT_MOST_ONCE)
3334
}
@@ -37,7 +38,9 @@ suspend inline fun <T> withConnection(crossinline block: suspend () -> T): T {
3738
return if (connection.isNullOrClosed()) {
3839
newConnection(block)
3940
} else {
40-
block()
41+
withContext(coroutineContext) {
42+
block()
43+
}
4144
}
4245
}
4346

@@ -49,7 +52,7 @@ suspend inline fun <T> withConnection(crossinline block: suspend () -> T): T {
4952
* [IllegalStateException] is thrown.
5053
*/
5154
@PublishedApi
52-
internal suspend inline fun <T> newConnection(crossinline block: suspend () -> T): T {
55+
internal suspend inline fun <T> newConnection(crossinline block: suspend CoroutineScope.() -> T): T {
5356
contract {
5457
callsInPlace(block, InvocationKind.AT_MOST_ONCE)
5558
}

src/main/kotlin/com/github/michaelbull/jdbc/Transaction.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.github.michaelbull.jdbc.context.CoroutineConnection
44
import com.github.michaelbull.jdbc.context.CoroutineTransaction
55
import com.github.michaelbull.jdbc.context.connection
66
import com.github.michaelbull.jdbc.context.transaction
7+
import kotlinx.coroutines.CoroutineScope
78
import kotlinx.coroutines.withContext
89
import java.sql.Connection
910
import kotlin.contracts.InvocationKind
@@ -26,7 +27,7 @@ import kotlin.coroutines.coroutineContext
2627
* the transaction will [rollback][Connection.rollback] and re-throw the [Throwable], otherwise the transaction will
2728
* [commit][Connection.commit] and return the result of type [T].
2829
*/
29-
suspend inline fun <T> transaction(crossinline block: suspend () -> T): T {
30+
suspend inline fun <T> transaction(crossinline block: suspend CoroutineScope.() -> T): T {
3031
contract {
3132
callsInPlace(block, InvocationKind.AT_MOST_ONCE)
3233
}
@@ -39,7 +40,11 @@ suspend inline fun <T> transaction(crossinline block: suspend () -> T): T {
3940
execute(block)
4041
}
4142
}
42-
existingTransaction.isRunning -> block()
43+
44+
existingTransaction.isRunning -> withContext(coroutineContext) {
45+
block()
46+
}
47+
4348
else -> error("Attempted to start new transaction within: $existingTransaction")
4449
}
4550
}
@@ -53,7 +58,7 @@ suspend inline fun <T> transaction(crossinline block: suspend () -> T): T {
5358
* [commit][Connection.commit].
5459
*/
5560
@PublishedApi
56-
internal suspend inline fun <T> execute(crossinline block: suspend () -> T): T {
61+
internal suspend inline fun <T> execute(crossinline block: suspend CoroutineScope.() -> T): T {
5762
contract {
5863
callsInPlace(block, InvocationKind.AT_MOST_ONCE)
5964
}
@@ -65,7 +70,7 @@ internal suspend inline fun <T> execute(crossinline block: suspend () -> T): T {
6570
connection.autoCommit = false
6671

6772
try {
68-
val result = block()
73+
val result = withContext(coroutineContext) { block() }
6974
transaction.complete()
7075
connection.commit()
7176
return result

0 commit comments

Comments
 (0)