diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/Expression.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/Expression.kt index 3e1e962..3338173 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/Expression.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/Expression.kt @@ -2,4 +2,9 @@ package ru.landgrafhomyak.serdha.api.v0 import ru.landgrafhomyak.serdha.api.v0.ddl.ColumnType -public interface Expression, OwnerBuilderUserWrapper : Any> \ No newline at end of file +public interface Expression, OwnerBuilderUserWrapper : Any> { + public class Equals, OwnerBuilderUserWrapper : Any>( + public val left: Expression, + public val right: Expression, + ) : Expression +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Module.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Module.kt index 07164c6..969c1ab 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Module.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Module.kt @@ -1,7 +1,11 @@ package ru.landgrafhomyak.serdha.api.v0.ddl +import ru.landgrafhomyak.serdha.api.v0.runtime.SynchronizedDatabase + public interface Module { public val wrapper: W public val versionKey: String + + public val ownerDatabase: SynchronizedDatabase<*> } \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ModuleModifyingRound.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ModuleModifyingRound.kt index 4d4bccb..fd49760 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ModuleModifyingRound.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ModuleModifyingRound.kt @@ -1,5 +1,7 @@ package ru.landgrafhomyak.serdha.api.v0.ddl +import ru.landgrafhomyak.serdha.api.v0.dml.Delete +import ru.landgrafhomyak.serdha.api.v0.dml.DeleteCreator import ru.landgrafhomyak.serdha.api.v0.dml.Insert import ru.landgrafhomyak.serdha.api.v0.dml.InsertCreator import ru.landgrafhomyak.serdha.api.v0.dml.Select @@ -8,15 +10,19 @@ import ru.landgrafhomyak.serdha.api.v0.dml.Update import ru.landgrafhomyak.serdha.api.v0.dml.UpdateCreator public interface ModuleModifyingRound { - public fun createTable( - namespace: Namespace, - name: String, - initializer: (TableCreator) -> TableUserWrapper - ): Table + public fun interface CreateTable { + public fun createTable(creator: TableCreator): TableUserWrapper + } + + public fun createTable(namespace: Namespace, name: String, initializer: CreateTable): Table + + public fun interface UpdateTable { + public fun updateTable(oldTable: Table, updater: TableUpdater): TableNewUserWrapper + } public fun updateTable( oldTable: Table, - initializer: (TableUpdater) -> TableNewUserWrapper + initializer: UpdateTable ): Table public fun renameTable( @@ -33,19 +39,39 @@ public interface ModuleModifyingRound { public fun updateAndRenameTable( table: Table, newName: String, - initializer: (TableUpdater) -> TableNewUserWrapper + initializer: UpdateTable ): Table public fun updateAndRenameTable( table: Table, newNamespace: Namespace, newName: String, - initializer: (TableUpdater) -> TableNewUserWrapper + initializer: UpdateTable ): Table - public fun createSelect(initializer: (SelectCreator) -> QueryUserWrapper): Select - public fun createInsert(table: Table, initializer: (InsertCreator) -> QueryUserWrapper): Insert - public fun createUpdate(table: Table, initializer: (UpdateCreator) -> QueryUserWrapper): Update + public fun interface CreateSelect { + public fun createSelect(creator: SelectCreator): QueryUserWrapper + } + + public fun createSelect(initializer: CreateSelect): Select + + public fun interface CreateInsert { + public fun createInsert(table: Table, creator: InsertCreator): QueryUserWrapper + } + + public fun createInsert(table: Table, initializer: CreateInsert): Insert + + public fun interface CreateUpdate { + public fun createUpdate(table: Table, creator: UpdateCreator): QueryUserWrapper + } + + public fun createUpdate(table: Table, initializer: CreateUpdate): Update + + public fun interface CreateDelete { + public fun createDelete(table: Table, creator: DeleteCreator): QueryUserWrapper + } + + public fun createDelete(table: Table, initializer: CreateDelete): Delete public fun substituteModule(rootNs: Namespace, template: ModuleTemplate): Module public fun upgradeModule(oldModule: Module<*>, rootNs: Namespace, template: ModuleTemplate): Module diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/TableCreator.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/TableCreator.kt index 55a282e..6183c48 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/TableCreator.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/TableCreator.kt @@ -25,9 +25,15 @@ public interface TableCreator { public fun > nullableColumn(name: String, type: DatabaseType): Column public fun index(name: String, vararg columns: Column<*, *, TableUserWrapper>): Index + + // todo not-null column uniqueness public fun unique(name: String, distinctNulls: Boolean, vararg columns: Column<*, *, TableUserWrapper>): UniqueConstraint public fun check(name: String, constraint: Expression): CheckConstraint + public fun rowIdColumn(): Column, ColumnType>, TableUserWrapper> + + public fun rowIdUniqueConstraint(): UniqueConstraint + public fun > foreignKey( fromColumn: Column<*, ColumnType1, TableUserWrapper>, toTable: Table, diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/Delete.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/Delete.kt new file mode 100644 index 0000000..0c76949 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/Delete.kt @@ -0,0 +1,5 @@ +package ru.landgrafhomyak.serdha.api.v0.dml + +public interface Delete { + public val userWrapper: QueryUserWrapper +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/DeleteCreator.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/DeleteCreator.kt new file mode 100644 index 0000000..d88b943 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/DeleteCreator.kt @@ -0,0 +1,16 @@ +package ru.landgrafhomyak.serdha.api.v0.dml + +import ru.landgrafhomyak.serdha.api.v0.Expression +import ru.landgrafhomyak.serdha.api.v0.ddl.Column +import ru.landgrafhomyak.serdha.api.v0.ddl.ColumnType +import ru.landgrafhomyak.serdha.api.v0.ddl.Table + +public interface DeleteCreator { + public fun > selectColumn(column: Column): SelectedColumn + + public fun > param(name: String, type: DatabaseType): InputParam + + public fun where(expression: Expression) + + public fun > returning(e: Expression): Column +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InsertCreator.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InsertCreator.kt index d628f7c..98248fb 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InsertCreator.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/InsertCreator.kt @@ -6,7 +6,7 @@ import ru.landgrafhomyak.serdha.api.v0.ddl.ColumnType import ru.landgrafhomyak.serdha.api.v0.ddl.UniqueConstraint public interface InsertCreator { - public fun > insert(c: Column): InputParam + public fun > insertTo(c: Column): InputParam public fun > selectColumn(c: Column): SelectedColumn diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectCreator.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectCreator.kt index b9fa2ca..48c3562 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectCreator.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectCreator.kt @@ -8,6 +8,7 @@ import ru.landgrafhomyak.serdha.api.v0.ddl.Table public interface SelectCreator { public fun selectTable(t: Table): SelectedTable public fun selectQuery(t: Select): SelectedTable + public fun where(expression: Expression) // default false @@ -18,4 +19,6 @@ public interface SelectCreator { public fun orderBy(vararg columns: Column<*, *, QueryUserWrapper>) public fun groupBy(vararg columns: Column<*, *, QueryUserWrapper>) + + public fun > param(name: String, type: DatabaseType): InputParam } \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectedColumn.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectedColumn.kt index e016a62..95ee139 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectedColumn.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/SelectedColumn.kt @@ -3,6 +3,6 @@ package ru.landgrafhomyak.serdha.api.v0.dml import ru.landgrafhomyak.serdha.api.v0.Expression import ru.landgrafhomyak.serdha.api.v0.ddl.ColumnType -public interface SelectedColumn, OwnerTypeUserWrapper : Any, QueryUserWrapper : Any> : Expression { +public interface SelectedColumn, OwnerTableUserWrapper : Any, QueryUserWrapper : Any> : Expression { } \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/UpdateCreator.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/UpdateCreator.kt index f092705..5336635 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/UpdateCreator.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/UpdateCreator.kt @@ -3,9 +3,11 @@ package ru.landgrafhomyak.serdha.api.v0.dml import ru.landgrafhomyak.serdha.api.v0.Expression import ru.landgrafhomyak.serdha.api.v0.ddl.Column import ru.landgrafhomyak.serdha.api.v0.ddl.ColumnType +import ru.landgrafhomyak.serdha.api.v0.ddl.Table public interface UpdateCreator { - public fun > selectColumn(c: Column): SelectedColumn + public fun selectTable(t: Table): SelectedTable + public fun selectQuery(t: Select): SelectedTable public fun > updateColumn(c: Column, e: Expression) diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/ParametersSetter.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/ParametersSetter.kt index d947366..c815f76 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/ParametersSetter.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/ParametersSetter.kt @@ -1,18 +1,19 @@ package ru.landgrafhomyak.serdha.api.v0.runtime import ru.landgrafhomyak.serdha.api.v0.ddl.Column +import ru.landgrafhomyak.serdha.api.v0.dml.InputParam public interface ParametersSetter { - public operator fun set(c: Column, value: RuntimeType) + public operator fun set(c: InputParam, value: RuntimeType) - public operator fun set(c: Column, value: Byte): Unit = this.set(c, value) - public operator fun set(c: Column, value: UByte): Unit = this.set(c, value) - public operator fun set(c: Column, value: Short): Unit = this.set(c, value) - public operator fun set(c: Column, value: UShort): Unit = this.set(c, value) - public operator fun set(c: Column, value: Int): Unit = this.set(c, value) - public operator fun set(c: Column, value: UInt): Unit = this.set(c, value) - public operator fun set(c: Column, value: Long): Unit = this.set(c, value) - public operator fun set(c: Column, value: ULong): Unit = this.set(c, value) - public operator fun set(c: Column, value: Char): Unit = this.set(c, value) - public operator fun set(c: Column, value: Boolean): Unit = this.set(c, value) + public operator fun set(c: InputParam, value: Byte): Unit = this.set(c, value) + public operator fun set(c: InputParam, value: UByte): Unit = this.set(c, value) + public operator fun set(c: InputParam, value: Short): Unit = this.set(c, value) + public operator fun set(c: InputParam, value: UShort): Unit = this.set(c, value) + public operator fun set(c: InputParam, value: Int): Unit = this.set(c, value) + public operator fun set(c: InputParam, value: UInt): Unit = this.set(c, value) + public operator fun set(c: InputParam, value: Long): Unit = this.set(c, value) + public operator fun set(c: InputParam, value: ULong): Unit = this.set(c, value) + public operator fun set(c: InputParam, value: Char): Unit = this.set(c, value) + public operator fun set(c: InputParam, value: Boolean): Unit = this.set(c, value) } \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/SynchronizedDatabase.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/SynchronizedDatabase.kt index 98e71a7..f2da287 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/SynchronizedDatabase.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/SynchronizedDatabase.kt @@ -2,12 +2,38 @@ package ru.landgrafhomyak.serdha.api.v0.runtime import ru.landgrafhomyak.serdha.api.v0.LowLevelApi import ru.landgrafhomyak.serdha.api.v0.ddl.Module +import ru.landgrafhomyak.serdha.api.v0.dml.Delete +import ru.landgrafhomyak.serdha.api.v0.dml.Insert +import ru.landgrafhomyak.serdha.api.v0.dml.Select +import ru.landgrafhomyak.serdha.api.v0.dml.Update public interface SynchronizedDatabase : Module { @Suppress("FunctionName") @LowLevelApi public suspend fun _startTransaction(): Transaction + @Suppress("FunctionName") + @LowLevelApi + public suspend fun _startAutoTransactedSelect(query: Select): _ParametersSetter> + + @Suppress("FunctionName") + @LowLevelApi + public suspend fun _startAutoTransactedInsert(query: Insert): _ParametersSetter?> + + @Suppress("FunctionName") + @LowLevelApi + public suspend fun _startAutoTransactedUpdate(query: Update): _ParametersSetter?> + + @Suppress("FunctionName") + @LowLevelApi + public suspend fun _startAutoTransactedDelete(query: Delete): _ParametersSetter?> + + public interface AtomicScript { + public suspend fun executeTransaction(transaction: Transaction, context: C, args: A): R + } + + public suspend fun transaction(script: AtomicScript, context: C, args: A): R + @Suppress("FunctionName") @LowLevelApi public suspend fun _close() diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/Transaction.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/Transaction.kt index 07250cf..d76e4f3 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/Transaction.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/Transaction.kt @@ -1,6 +1,7 @@ package ru.landgrafhomyak.serdha.api.v0.runtime import ru.landgrafhomyak.serdha.api.v0.LowLevelApi +import ru.landgrafhomyak.serdha.api.v0.dml.Delete import ru.landgrafhomyak.serdha.api.v0.dml.Insert import ru.landgrafhomyak.serdha.api.v0.dml.Select import ru.landgrafhomyak.serdha.api.v0.dml.Update @@ -18,6 +19,10 @@ public interface Transaction { @LowLevelApi public fun _update(compiledQuery: Update): _ParametersSetter?> + @Suppress("FunctionName") + @LowLevelApi + public fun _delete(compiledQuery: Delete): _ParametersSetter?> + public suspend fun rollback() public suspend fun commit() diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/transaction_methods.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/transaction_methods.kt index d62f3be..cd8843e 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/transaction_methods.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/transaction_methods.kt @@ -6,6 +6,7 @@ import kotlin.contracts.InvocationKind import kotlin.contracts.contract import kotlin.jvm.JvmName import ru.landgrafhomyak.serdha.api.v0.LowLevelApi +import ru.landgrafhomyak.serdha.api.v0.dml.Delete import ru.landgrafhomyak.serdha.api.v0.dml.Insert import ru.landgrafhomyak.serdha.api.v0.dml.Select import ru.landgrafhomyak.serdha.api.v0.dml.Update @@ -166,6 +167,26 @@ internal suspend inline fun _wrapWithLambdasMap( } +@OptIn(LowLevelApi::class) +public suspend inline fun SynchronizedDatabase<*>.autoTransactedSelectSingleOrNull( + compiledQuery: Select, + parameters: (ParametersSetter) -> Unit = {}, + rowsConsumer: (Row) -> R +): R? { + contract { + callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) + callsInPlace(rowsConsumer, InvocationKind.AT_MOST_ONCE) + } + return _wrapWithLambdasSingleOrNull( + compiledQuery = compiledQuery, + queryGetter = { this._startAutoTransactedSelect(compiledQuery) }, + parameters = parameters, + hasReturning = true, + returning = rowsConsumer, + "" + ) +} + @OptIn(LowLevelApi::class) public suspend inline fun Transaction.selectSingleOrNull( compiledQuery: Select, @@ -186,6 +207,7 @@ public suspend inline fun Transaction.selectSingleOr ) } + @OptIn(LowLevelApi::class) public suspend inline fun Transaction.selectThenIterate( compiledQuery: Select, @@ -206,6 +228,26 @@ public suspend inline fun Transaction.selectThenIterate ) } +@OptIn(LowLevelApi::class) +public suspend inline fun SynchronizedDatabase<*>.autoTransactedSelectThenIterate( + compiledQuery: Select, + parameters: (ParametersSetter) -> Unit, + rowsConsumer: (Row) -> Unit +) { + contract { + callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) + callsInPlace(rowsConsumer, InvocationKind.UNKNOWN) + } + _wrapWithLambdasIterate( + compiledQuery = compiledQuery, + queryGetter = { this._startAutoTransactedSelect(compiledQuery) }, + parameters = parameters, + hasReturning = true, + returning = rowsConsumer, + "" + ) +} + @OptIn(LowLevelApi::class) public suspend inline fun Transaction.selectThenMap( compiledQuery: Select, @@ -227,6 +269,27 @@ public suspend inline fun Transaction.selectThenMap( } +@OptIn(LowLevelApi::class) +public suspend inline fun SynchronizedDatabase<*>.autoTransactedSelectThenMap( + compiledQuery: Select, + parameters: (ParametersSetter) -> Unit, + rowsConsumer: (Row) -> R +): List { + contract { + callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) + callsInPlace(rowsConsumer, InvocationKind.UNKNOWN) + } + return _wrapWithLambdasMap( + compiledQuery = compiledQuery, + queryGetter = { this._startAutoTransactedSelect(compiledQuery) }, + parameters = parameters, + hasReturning = true, + returning = rowsConsumer, + "" + ) +} + + @OptIn(LowLevelApi::class) public suspend inline fun Transaction.insert( compiledQuery: Insert, @@ -245,6 +308,24 @@ public suspend inline fun Transaction.insert( ) } +@OptIn(LowLevelApi::class) +public suspend inline fun SynchronizedDatabase<*>.autoTransactedInsert( + compiledQuery: Insert, + parameters: (ParametersSetter) -> Unit = {}, +) { + contract { + callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) + } + _wrapWithLambdas( + compiledQuery = compiledQuery, + queryGetter = { this._startAutoTransactedInsert(compiledQuery) }, + parameters = parameters, + hasReturning = false, + returning = {}, + "" + ) +} + @OptIn(LowLevelApi::class) public suspend inline fun Transaction.insertReturningSingleOrNull( compiledQuery: Insert, @@ -265,6 +346,26 @@ public suspend inline fun Transaction.insertReturnin ) } +@OptIn(LowLevelApi::class) +public suspend inline fun SynchronizedDatabase<*>.autoTransactedInsertReturningSingleOrNull( + compiledQuery: Insert, + parameters: (ParametersSetter) -> Unit = {}, + rowsConsumer: (Row) -> R +): R? { + contract { + callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) + callsInPlace(rowsConsumer, InvocationKind.AT_MOST_ONCE) + } + return _wrapWithLambdasSingleOrNull( + compiledQuery = compiledQuery, + queryGetter = { this._startAutoTransactedInsert(compiledQuery) }, + parameters = parameters, + hasReturning = true, + returning = rowsConsumer, + "" + ) +} + @OptIn(LowLevelApi::class) public suspend inline fun Transaction.insertReturningIterate( compiledQuery: Insert, @@ -285,6 +386,26 @@ public suspend inline fun Transaction.insertReturningIt ) } +@OptIn(LowLevelApi::class) +public suspend inline fun SynchronizedDatabase<*>.autoTransactedInsertReturningIterate( + compiledQuery: Insert, + parameters: (ParametersSetter) -> Unit, + rowsConsumer: (Row) -> Unit +) { + contract { + callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) + callsInPlace(rowsConsumer, InvocationKind.UNKNOWN) + } + _wrapWithLambdasIterate( + compiledQuery = compiledQuery, + queryGetter = { this._startAutoTransactedInsert(compiledQuery) }, + parameters = parameters, + hasReturning = true, + returning = rowsConsumer, + "" + ) +} + @OptIn(LowLevelApi::class) public suspend inline fun Transaction.insertReturningMap( compiledQuery: Insert, @@ -305,6 +426,26 @@ public suspend inline fun Transaction.insertReturnin ) } +@OptIn(LowLevelApi::class) +public suspend inline fun SynchronizedDatabase<*>.autoTransactedInsertReturningMap( + compiledQuery: Insert, + parameters: (ParametersSetter) -> Unit, + rowsConsumer: (Row) -> R +): List { + contract { + callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) + callsInPlace(rowsConsumer, InvocationKind.UNKNOWN) + } + return _wrapWithLambdasMap( + compiledQuery = compiledQuery, + queryGetter = { this._startAutoTransactedInsert(compiledQuery) }, + parameters = parameters, + hasReturning = true, + returning = rowsConsumer, + "" + ) +} + @OptIn(LowLevelApi::class) public suspend inline fun Transaction.update( compiledQuery: Update, @@ -323,6 +464,24 @@ public suspend inline fun Transaction.update( ) } +@OptIn(LowLevelApi::class) +public suspend inline fun SynchronizedDatabase<*>.autoTransactedUpdate( + compiledQuery: Update, + parameters: (ParametersSetter) -> Unit = {}, +) { + contract { + callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) + } + _wrapWithLambdas( + compiledQuery = compiledQuery, + queryGetter = { this._startAutoTransactedUpdate(compiledQuery) }, + parameters = parameters, + hasReturning = false, + returning = {}, + "" + ) +} + @OptIn(LowLevelApi::class) public suspend inline fun Transaction.updateReturningSingleOrNull( compiledQuery: Update, @@ -343,6 +502,27 @@ public suspend inline fun Transaction.updateReturnin ) } + +@OptIn(LowLevelApi::class) +public suspend inline fun SynchronizedDatabase<*>.autoTransactedUpdateReturningSingleOrNull( + compiledQuery: Update, + parameters: (ParametersSetter) -> Unit = {}, + rowsConsumer: (Row) -> R +): R? { + contract { + callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) + callsInPlace(rowsConsumer, InvocationKind.AT_MOST_ONCE) + } + return _wrapWithLambdasSingleOrNull( + compiledQuery = compiledQuery, + queryGetter = { this._startAutoTransactedUpdate(compiledQuery) }, + parameters = parameters, + hasReturning = true, + returning = rowsConsumer, + "" + ) +} + @OptIn(LowLevelApi::class) public suspend inline fun Transaction.updateReturningIterate( compiledQuery: Update, @@ -363,6 +543,26 @@ public suspend inline fun Transaction.updateReturningIt ) } +@OptIn(LowLevelApi::class) +public suspend inline fun SynchronizedDatabase<*>.autoTransactedUpdateReturningIterate( + compiledQuery: Update, + parameters: (ParametersSetter) -> Unit, + rowsConsumer: (Row) -> Unit +) { + contract { + callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) + callsInPlace(rowsConsumer, InvocationKind.UNKNOWN) + } + _wrapWithLambdasIterate( + compiledQuery = compiledQuery, + queryGetter = { this._startAutoTransactedUpdate(compiledQuery) }, + parameters = parameters, + hasReturning = true, + returning = rowsConsumer, + "" + ) +} + @OptIn(LowLevelApi::class) public suspend inline fun Transaction.updateReturningMap( compiledQuery: Update, @@ -384,7 +584,184 @@ public suspend inline fun Transaction.updateReturnin } @OptIn(LowLevelApi::class) -public suspend fun SynchronizedDatabase<*>.transaction(body: (Transaction) -> R):R { +public suspend inline fun SynchronizedDatabase<*>.autoTransactedUpdateReturningMap( + compiledQuery: Update, + parameters: (ParametersSetter) -> Unit, + rowsConsumer: (Row) -> R +): List { + contract { + callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) + callsInPlace(rowsConsumer, InvocationKind.UNKNOWN) + } + return _wrapWithLambdasMap( + compiledQuery = compiledQuery, + queryGetter = { this._startAutoTransactedUpdate(compiledQuery) }, + parameters = parameters, + hasReturning = true, + returning = rowsConsumer, + "" + ) +} + +@OptIn(LowLevelApi::class) +public suspend inline fun Transaction.delete( + compiledQuery: Delete, + parameters: (ParametersSetter) -> Unit = {}, +) { + contract { + callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) + } + _wrapWithLambdas( + compiledQuery = compiledQuery, + queryGetter = { this._delete(compiledQuery) }, + parameters = parameters, + hasReturning = false, + returning = {}, + "" + ) +} + +@OptIn(LowLevelApi::class) +public suspend inline fun SynchronizedDatabase<*>.autoTransactedDelete( + compiledQuery: Delete, + parameters: (ParametersSetter) -> Unit = {}, +) { + contract { + callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) + } + _wrapWithLambdas( + compiledQuery = compiledQuery, + queryGetter = { this._startAutoTransactedDelete(compiledQuery) }, + parameters = parameters, + hasReturning = false, + returning = {}, + "" + ) +} + +@OptIn(LowLevelApi::class) +public suspend inline fun Transaction.deleteReturningSingleOrNull( + compiledQuery: Delete, + parameters: (ParametersSetter) -> Unit = {}, + rowsConsumer: (Row) -> R +): R? { + contract { + callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) + callsInPlace(rowsConsumer, InvocationKind.AT_MOST_ONCE) + } + return _wrapWithLambdasSingleOrNull( + compiledQuery = compiledQuery, + queryGetter = { this._delete(compiledQuery) }, + parameters = parameters, + hasReturning = true, + returning = rowsConsumer, + "" + ) +} + + +@OptIn(LowLevelApi::class) +public suspend inline fun SynchronizedDatabase<*>.autoTransactedDeleteReturningSingleOrNull( + compiledQuery: Delete, + parameters: (ParametersSetter) -> Unit = {}, + rowsConsumer: (Row) -> R +): R? { + contract { + callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) + callsInPlace(rowsConsumer, InvocationKind.AT_MOST_ONCE) + } + return _wrapWithLambdasSingleOrNull( + compiledQuery = compiledQuery, + queryGetter = { this._startAutoTransactedDelete(compiledQuery) }, + parameters = parameters, + hasReturning = true, + returning = rowsConsumer, + "" + ) +} + +@OptIn(LowLevelApi::class) +public suspend inline fun Transaction.deleteReturningIterate( + compiledQuery: Delete, + parameters: (ParametersSetter) -> Unit, + rowsConsumer: (Row) -> Unit +) { + contract { + callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) + callsInPlace(rowsConsumer, InvocationKind.UNKNOWN) + } + _wrapWithLambdasIterate( + compiledQuery = compiledQuery, + queryGetter = { this._delete(compiledQuery) }, + parameters = parameters, + hasReturning = true, + returning = rowsConsumer, + "" + ) +} + +@OptIn(LowLevelApi::class) +public suspend inline fun SynchronizedDatabase<*>.autoTransactedDeleteReturningIterate( + compiledQuery: Delete, + parameters: (ParametersSetter) -> Unit, + rowsConsumer: (Row) -> Unit +) { + contract { + callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) + callsInPlace(rowsConsumer, InvocationKind.UNKNOWN) + } + _wrapWithLambdasIterate( + compiledQuery = compiledQuery, + queryGetter = { this._startAutoTransactedDelete(compiledQuery) }, + parameters = parameters, + hasReturning = true, + returning = rowsConsumer, + "" + ) +} + +@OptIn(LowLevelApi::class) +public suspend inline fun Transaction.deleteReturningMap( + compiledQuery: Delete, + parameters: (ParametersSetter) -> Unit, + rowsConsumer: (Row) -> R +): List { + contract { + callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) + callsInPlace(rowsConsumer, InvocationKind.UNKNOWN) + } + return _wrapWithLambdasMap( + compiledQuery = compiledQuery, + queryGetter = { this._delete(compiledQuery) }, + parameters = parameters, + hasReturning = true, + returning = rowsConsumer, + "" + ) +} + +@OptIn(LowLevelApi::class) +public suspend inline fun SynchronizedDatabase<*>.autoTransactedDeleteReturningMap( + compiledQuery: Delete, + parameters: (ParametersSetter) -> Unit, + rowsConsumer: (Row) -> R +): List { + contract { + callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) + callsInPlace(rowsConsumer, InvocationKind.UNKNOWN) + } + return _wrapWithLambdasMap( + compiledQuery = compiledQuery, + queryGetter = { this._startAutoTransactedDelete(compiledQuery) }, + parameters = parameters, + hasReturning = true, + returning = rowsConsumer, + "" + ) +} + +@OptIn(LowLevelApi::class) +public suspend fun SynchronizedDatabase<*>.transaction(body: (Transaction) -> R): R { contract { callsInPlace(body, InvocationKind.EXACTLY_ONCE) }