diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ModuleCreator.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ModuleCreator.kt index a4e08ca..8aef13f 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ModuleCreator.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ModuleCreator.kt @@ -8,9 +8,8 @@ import ru.landgrafhomyak.serdha.api.v0.dml.Select import ru.landgrafhomyak.serdha.api.v0.dml.SelectCreator import ru.landgrafhomyak.serdha.api.v0.dml.Update import ru.landgrafhomyak.serdha.api.v0.dml.UpdateCreator -import ru.landgrafhomyak.serdha.api.v0.runtime.Transaction -public interface ModuleCreator : Transaction { +public interface ModuleCreator { public interface CreateTable { public fun createTable(creator: TableCreator): TableUserExtension } diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ModuleTemplate.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ModuleTemplate.kt index 7327918..8a9f71b 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ModuleTemplate.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ModuleTemplate.kt @@ -1,5 +1,7 @@ package ru.landgrafhomyak.serdha.api.v0.ddl +import ru.landgrafhomyak.serdha.api.v0.runtime.Transaction + public interface ModuleTemplate { public interface Creator { public fun createTemplate( @@ -14,11 +16,17 @@ public interface ModuleTemplate { } public interface CreateModule { - public suspend fun createModule(rootNs: Namespace, creator: ModuleCreator): ModuleUserExtension + public fun createSchema(rootNs: Namespace, creator: ModuleCreator): ModuleUserExtension + + public suspend fun initData(ext: ModuleUserExtension, transaction: Transaction) {} } public interface UpgradeModule { - public suspend fun upgradeModule(oldModule: Module, rootNs: Namespace, updater: ModuleCreator): NewModuleUserExtension + public fun upgradeSchema(oldModule: Module, rootNs: Namespace, updater: ModuleCreator): NewModuleUserExtension + + public suspend fun upgradeData(ext: NewModuleUserExtension, transaction: Transaction) {} + + public fun postUpgradeCleanupSchema(ext: NewModuleUserExtension, updater: ModuleCreator) {} } public val versionKey: String diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/_CommonQueryMethods.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/_CommonQueryMethods.kt index daac7a9..06d11f9 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/_CommonQueryMethods.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/dml/_CommonQueryMethods.kt @@ -1,10 +1,12 @@ package ru.landgrafhomyak.serdha.api.v0.dml import ru.landgrafhomyak.serdha.api.v0.Expression +import ru.landgrafhomyak.serdha.api.v0.LowLevelApi import ru.landgrafhomyak.serdha.api.v0.ddl.Column import ru.landgrafhomyak.serdha.api.v0.ddl.ColumnType import ru.landgrafhomyak.serdha.api.v0.ddl.Table import ru.landgrafhomyak.serdha.api.v0.runtime.ParametersSetter +import ru.landgrafhomyak.serdha.api.v0.runtime._ParametersSetter @Suppress("ClassName") public interface _CommonQueryMethods { @@ -18,7 +20,39 @@ public interface _CommonQueryMethods { public operator fun > set(c: InputParam, value: Expression) } - public fun selectingQuery(q: CanBeSubquery, p: (SubqueryParametersSetter) -> Unit): SelectedTable + public fun selectQuery(q: CanBeSubquery, p: (SubqueryParametersSetter) -> Unit): SelectedTable + + public class SelectedInsert( + public val inserted: SelectedTable, + public val updated: SelectedTable + ) + + public fun selectInsert(q: Insert.InsertParams, p: (SubqueryParametersSetter) -> Unit): SelectedInsert + + @Suppress("FunctionName") + @LowLevelApi + public fun _selectInsert( + q: Insert.InsertFromQuery, + p: (SubqueryParametersSetter) -> Unit, + r: (_ParametersSetter._Multi, Nothing>) -> Unit + ): SelectedInsert + + @OptIn(LowLevelApi::class) + public fun selectInsertOne( + q: Insert.InsertFromQuery, + p: (SubqueryParametersSetter) -> Unit, + r: (ParametersSetter>) -> Unit + ): SelectedInsert = + this._selectInsert(q, p, r) + + @OptIn(LowLevelApi::class) + public fun selectInsertMulti( + q: Insert.InsertFromQuery, + p: (SubqueryParametersSetter) -> Unit, + data: Iterable, + r: (T, ParametersSetter>) -> Unit + ): SelectedInsert = + this._selectInsert(q, p) { rr -> for (e in data) r(e, rr) } public fun > param(name: String, type: DatabaseType): InputParam