diff --git a/src/main/kotlin/fr/postgresjson/connexion/Connection.kt b/src/main/kotlin/fr/postgresjson/connexion/Connection.kt index 8a57b46..9fcd2d6 100644 --- a/src/main/kotlin/fr/postgresjson/connexion/Connection.kt +++ b/src/main/kotlin/fr/postgresjson/connexion/Connection.kt @@ -1,7 +1,6 @@ package fr.postgresjson.connexion import com.fasterxml.jackson.core.type.TypeReference -import com.github.jasync.sql.db.Connection import com.github.jasync.sql.db.QueryResult import com.github.jasync.sql.db.ResultSet import com.github.jasync.sql.db.general.ArrayRowData @@ -14,7 +13,6 @@ import fr.postgresjson.entity.Serializable import fr.postgresjson.serializer.Serializer import fr.postgresjson.utils.LoggerDelegate import org.slf4j.Logger -import java.util.concurrent.CompletableFuture import kotlin.random.Random typealias SelectOneCallback = QueryResult.(T?) -> Unit @@ -50,7 +48,15 @@ class Connection( connection?.disconnect() } - fun inTransaction(f: (Connection) -> CompletableFuture) = connect().inTransaction(f) + fun inTransaction(block: Connection.() -> A?): A? = connect().run { + sendQuery("BEGIN") + try { + block().apply { sendQuery("COMMIT") } + } catch (e: Throwable) { + sendQuery("ROLLBACK") + throw e + } + } /** * Select One [EntityI] with [List] of parameters diff --git a/src/main/kotlin/fr/postgresjson/migration/Function.kt b/src/main/kotlin/fr/postgresjson/migration/Function.kt index 05cca70..20a31dc 100644 --- a/src/main/kotlin/fr/postgresjson/migration/Function.kt +++ b/src/main/kotlin/fr/postgresjson/migration/Function.kt @@ -73,8 +73,8 @@ data class Function( connection.inTransaction { up() down() - it.sendQuery("ROLLBACK") - }.join() + sendQuery("ROLLBACK") + } return Status.OK } diff --git a/src/main/kotlin/fr/postgresjson/migration/MigrationScript.kt b/src/main/kotlin/fr/postgresjson/migration/MigrationScript.kt index 67cbc99..7092879 100644 --- a/src/main/kotlin/fr/postgresjson/migration/MigrationScript.kt +++ b/src/main/kotlin/fr/postgresjson/migration/MigrationScript.kt @@ -42,8 +42,8 @@ data class MigrationScript( connection.inTransaction { up() down() - it.sendQuery("ROLLBACK") - }.join() + sendQuery("ROLLBACK") + } return Migration.Status.OK } diff --git a/src/test/kotlin/fr/postgresjson/ConnectionTest.kt b/src/test/kotlin/fr/postgresjson/ConnectionTest.kt index 4bea302..a388552 100644 --- a/src/test/kotlin/fr/postgresjson/ConnectionTest.kt +++ b/src/test/kotlin/fr/postgresjson/ConnectionTest.kt @@ -360,4 +360,20 @@ class ConnectionTest : TestAbstract() { assertEquals("myName", rows[0].getString(0)) } } + + @Test + fun `select one in transaction`() { + connection.inTransaction { + selectOne( + "SELECT json_build_object('first', :first::json, 'second', :second::json)", + mapOf( + "first" to ParameterObject("one"), + "second" to ParameterObject("two") + ) + ).let { result -> + assertEquals("one", result!!.first.third) + assertEquals("two", result.second.third) + } + } + } }