From c6172bfd7800fae41fd0723e7564f0866f2564dc Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Sun, 24 Nov 2024 19:40:46 +0300 Subject: [PATCH] Modules, namespaces and top-level interfaces --- build.gradle.kts | 2 +- settings.gradle.kts | 2 +- .../serdha/api/v0/ddl/Module.kt | 7 +++ .../serdha/api/v0/ddl/ModuleModifyingRound.kt | 52 +++++++++++++++++++ .../serdha/api/v0/ddl/ModuleTemplate.kt | 10 ++++ .../serdha/api/v0/ddl/Namespace.kt | 10 ++++ .../api/v0/runtime/{ResultSet.kt => Row.kt} | 2 +- .../{Database.kt => SynchronizedDatabase.kt} | 3 +- .../serdha/api/v0/runtime/Synchronizer.kt | 19 ------- .../api/v0/runtime/UnsynchronizedDatabase.kt | 12 +++++ .../serdha/api/v0/runtime/_ResultSet.kt | 2 +- .../api/v0/runtime/transaction_methods.kt | 35 ++++++++----- src/jvmMain/java/Test.java | 27 ---------- 13 files changed, 120 insertions(+), 63 deletions(-) create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Module.kt create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ModuleModifyingRound.kt create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ModuleTemplate.kt create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Namespace.kt rename src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/{ResultSet.kt => Row.kt} (95%) rename src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/{Database.kt => SynchronizedDatabase.kt} (70%) delete mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/Synchronizer.kt create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/UnsynchronizedDatabase.kt delete mode 100644 src/jvmMain/java/Test.java diff --git a/build.gradle.kts b/build.gradle.kts index fd779ca..982f303 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,7 +19,7 @@ buildscript { } group = "ru.landgrafhomyak.serdha" -version = "v1.0" +version = "v0.1" repositories { mavenCentral() diff --git a/settings.gradle.kts b/settings.gradle.kts index c0518d0..5d31846 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,5 @@ plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" } -rootProject.name = "serdha-api" +rootProject.name = "serdha-api-v0" 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 new file mode 100644 index 0000000..07164c6 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Module.kt @@ -0,0 +1,7 @@ +package ru.landgrafhomyak.serdha.api.v0.ddl + +public interface Module { + public val wrapper: W + + public val versionKey: String +} \ 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 new file mode 100644 index 0000000..4d4bccb --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ModuleModifyingRound.kt @@ -0,0 +1,52 @@ +package ru.landgrafhomyak.serdha.api.v0.ddl + +import ru.landgrafhomyak.serdha.api.v0.dml.Insert +import ru.landgrafhomyak.serdha.api.v0.dml.InsertCreator +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 + +public interface ModuleModifyingRound { + public fun createTable( + namespace: Namespace, + name: String, + initializer: (TableCreator) -> TableUserWrapper + ): Table + + public fun updateTable( + oldTable: Table, + initializer: (TableUpdater) -> TableNewUserWrapper + ): Table + + public fun renameTable( + table: Table, + newName: String + ): Table + + public fun renameTable( + table: Table, + newNamespace: Namespace, + newName: String + ): Table + + public fun updateAndRenameTable( + table: Table, + newName: String, + initializer: (TableUpdater) -> TableNewUserWrapper + ): Table + + public fun updateAndRenameTable( + table: Table, + newNamespace: Namespace, + newName: String, + initializer: (TableUpdater) -> TableNewUserWrapper + ): 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 substituteModule(rootNs: Namespace, template: ModuleTemplate): Module + public fun upgradeModule(oldModule: Module<*>, rootNs: Namespace, template: ModuleTemplate): Module +} \ No newline at end of file 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 new file mode 100644 index 0000000..cba1ba6 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/ModuleTemplate.kt @@ -0,0 +1,10 @@ +package ru.landgrafhomyak.serdha.api.v0.ddl + +public interface ModuleTemplate { + public fun modify( + newVersionKey: String, + updater: (oldModule: ModuleTemplate, rootNs: Namespace, updater: ModuleModifyingRound) -> NW + ): ModuleTemplate + + public val versionKey: String +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Namespace.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Namespace.kt new file mode 100644 index 0000000..af5011f --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/ddl/Namespace.kt @@ -0,0 +1,10 @@ +package ru.landgrafhomyak.serdha.api.v0.ddl + +public interface Namespace { + @Suppress("SpellCheckingInspection") + public fun subnamespace(name: String): Namespace + + public val name: String + + public val path: List +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/ResultSet.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/Row.kt similarity index 95% rename from src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/ResultSet.kt rename to src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/Row.kt index d02007a..c6ac5fe 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/ResultSet.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/Row.kt @@ -2,7 +2,7 @@ package ru.landgrafhomyak.serdha.api.v0.runtime import ru.landgrafhomyak.serdha.api.v0.ddl.Column -public interface ResultSet { +public interface Row { public operator fun get(c: Column): RuntimeType public operator fun get(c: Column): Byte = this.get(c) diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/Database.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/SynchronizedDatabase.kt similarity index 70% rename from src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/Database.kt rename to src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/SynchronizedDatabase.kt index 852051a..98e71a7 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/Database.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/SynchronizedDatabase.kt @@ -1,8 +1,9 @@ package ru.landgrafhomyak.serdha.api.v0.runtime import ru.landgrafhomyak.serdha.api.v0.LowLevelApi +import ru.landgrafhomyak.serdha.api.v0.ddl.Module -public interface Database { +public interface SynchronizedDatabase : Module { @Suppress("FunctionName") @LowLevelApi public suspend fun _startTransaction(): Transaction diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/Synchronizer.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/Synchronizer.kt deleted file mode 100644 index 8fd5b06..0000000 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/Synchronizer.kt +++ /dev/null @@ -1,19 +0,0 @@ -package ru.landgrafhomyak.serdha.api.v0.runtime - -import ru.landgrafhomyak.serdha.api.v0.ddl.Table -import ru.landgrafhomyak.serdha.api.v0.ddl.TableCreator -import ru.landgrafhomyak.serdha.api.v0.ddl.TableUpdater -import ru.landgrafhomyak.serdha.api.v0.dml.Insert -import ru.landgrafhomyak.serdha.api.v0.dml.InsertCreator -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 - -public interface Synchronizer { - public fun createTable(initializer: (TableCreator) -> TableUserWrapper): Table - public fun updateTable(oldTable: Table, initializer: (TableUpdater) -> TableNewUserWrapper): 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 -} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/UnsynchronizedDatabase.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/UnsynchronizedDatabase.kt new file mode 100644 index 0000000..ac86127 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/UnsynchronizedDatabase.kt @@ -0,0 +1,12 @@ +package ru.landgrafhomyak.serdha.api.v0.runtime + +import ru.landgrafhomyak.serdha.api.v0.ddl.ModuleModifyingRound +import ru.landgrafhomyak.serdha.api.v0.ddl.ModuleTemplate +import ru.landgrafhomyak.serdha.api.v0.ddl.Namespace + +@Suppress("SpellCheckingInspection") +public interface UnsynchronizedDatabase { + public fun createModule(initialVersionKey: String, content: (rootNs: Namespace, updater: ModuleModifyingRound) -> W): ModuleTemplate + + public suspend fun synchronize(conent: ModuleTemplate): SynchronizedDatabase +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/_ResultSet.kt b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/_ResultSet.kt index 2becc7d..7328dd3 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/_ResultSet.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/serdha/api/v0/runtime/_ResultSet.kt @@ -4,7 +4,7 @@ import ru.landgrafhomyak.serdha.api.v0.LowLevelApi @Suppress("ClassName") @LowLevelApi -public interface _ResultSet : ResultSet { +public interface _ResultSet : Row { @Suppress("FunctionName") @LowLevelApi public suspend fun _next(): Boolean 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 5c47cd2..d62f3be 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 @@ -90,7 +90,7 @@ internal suspend inline fun _wrapWithLambdasSingleOrNull( queryGetter: () -> _ParametersSetter?>, parameters: (ParametersSetter) -> Unit, hasReturning: Boolean, - returning: (ResultSet) -> R, + returning: (Row) -> R, queryWithoutErrorMessage: String ): R? { contract { @@ -123,7 +123,7 @@ internal suspend inline fun _wrapWithLambdasIterate( queryGetter: () -> _ParametersSetter?>, parameters: (ParametersSetter) -> Unit, hasReturning: Boolean, - returning: (ResultSet) -> Unit, + returning: (Row) -> Unit, queryWithoutErrorMessage: String ) { contract { @@ -143,7 +143,7 @@ internal suspend inline fun _wrapWithLambdasMap( queryGetter: () -> _ParametersSetter?>, parameters: (ParametersSetter) -> Unit, hasReturning: Boolean, - returning: (ResultSet) -> R, + returning: (Row) -> R, queryWithoutErrorMessage: String ): List { contract { @@ -170,7 +170,7 @@ internal suspend inline fun _wrapWithLambdasMap( public suspend inline fun Transaction.selectSingleOrNull( compiledQuery: Select, parameters: (ParametersSetter) -> Unit = {}, - rowsConsumer: (ResultSet) -> R + rowsConsumer: (Row) -> R ): R? { contract { callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) @@ -190,7 +190,7 @@ public suspend inline fun Transaction.selectSingleOr public suspend inline fun Transaction.selectThenIterate( compiledQuery: Select, parameters: (ParametersSetter) -> Unit, - rowsConsumer: (ResultSet) -> Unit + rowsConsumer: (Row) -> Unit ) { contract { callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) @@ -210,7 +210,7 @@ public suspend inline fun Transaction.selectThenIterate public suspend inline fun Transaction.selectThenMap( compiledQuery: Select, parameters: (ParametersSetter) -> Unit, - rowsConsumer: (ResultSet) -> R + rowsConsumer: (Row) -> R ): List { contract { callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) @@ -249,7 +249,7 @@ public suspend inline fun Transaction.insert( public suspend inline fun Transaction.insertReturningSingleOrNull( compiledQuery: Insert, parameters: (ParametersSetter) -> Unit = {}, - rowsConsumer: (ResultSet) -> R + rowsConsumer: (Row) -> R ): R? { contract { callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) @@ -269,7 +269,7 @@ public suspend inline fun Transaction.insertReturnin public suspend inline fun Transaction.insertReturningIterate( compiledQuery: Insert, parameters: (ParametersSetter) -> Unit, - rowsConsumer: (ResultSet) -> Unit + rowsConsumer: (Row) -> Unit ) { contract { callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) @@ -289,7 +289,7 @@ public suspend inline fun Transaction.insertReturningIt public suspend inline fun Transaction.insertReturningMap( compiledQuery: Insert, parameters: (ParametersSetter) -> Unit, - rowsConsumer: (ResultSet) -> R + rowsConsumer: (Row) -> R ): List { contract { callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) @@ -327,7 +327,7 @@ public suspend inline fun Transaction.update( public suspend inline fun Transaction.updateReturningSingleOrNull( compiledQuery: Update, parameters: (ParametersSetter) -> Unit = {}, - rowsConsumer: (ResultSet) -> R + rowsConsumer: (Row) -> R ): R? { contract { callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) @@ -347,7 +347,7 @@ public suspend inline fun Transaction.updateReturnin public suspend inline fun Transaction.updateReturningIterate( compiledQuery: Update, parameters: (ParametersSetter) -> Unit, - rowsConsumer: (ResultSet) -> Unit + rowsConsumer: (Row) -> Unit ) { contract { callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) @@ -367,7 +367,7 @@ public suspend inline fun Transaction.updateReturningIt public suspend inline fun Transaction.updateReturningMap( compiledQuery: Update, parameters: (ParametersSetter) -> Unit, - rowsConsumer: (ResultSet) -> R + rowsConsumer: (Row) -> R ): List { contract { callsInPlace(parameters, InvocationKind.EXACTLY_ONCE) @@ -383,3 +383,14 @@ public suspend inline fun Transaction.updateReturnin ) } +@OptIn(LowLevelApi::class) +public suspend fun SynchronizedDatabase<*>.transaction(body: (Transaction) -> R):R { + contract { + callsInPlace(body, InvocationKind.EXACTLY_ONCE) + } + + val tr = this._startTransaction() + _safeAutoClose(onAbort = { tr.rollback(); tr._assertTransactionFinishedAndReleaseResources() }, onSuccess = { tr._assertTransactionFinishedAndReleaseResources() }) { + return@transaction body(tr) + } +} \ No newline at end of file diff --git a/src/jvmMain/java/Test.java b/src/jvmMain/java/Test.java deleted file mode 100644 index 084dda7..0000000 --- a/src/jvmMain/java/Test.java +++ /dev/null @@ -1,27 +0,0 @@ -import org.jetbrains.annotations.NotNull; -import ru.landgrafhomyak.serdha.api.v0.Column; -import ru.landgrafhomyak.serdha.api.v0.ColumnType; -import ru.landgrafhomyak.serdha.api.v0.ForeignKey; -import ru.landgrafhomyak.serdha.api.v0.Index; -import ru.landgrafhomyak.serdha.api.v0.Table; -import ru.landgrafhomyak.serdha.api.v0.TableCreator; - -public class Test implements TableCreator { - @NotNull - @Override - public Column column(@NotNull String name, @NotNull ColumnType type) { - return null; - } - - @NotNull - @Override - public Index index(@NotNull String name, @NotNull Column[] columns) { - return null; - } - - @NotNull - @Override - public ForeignKey foreignKey(@NotNull Column fromColumn, @NotNull Table toTable, @NotNull Column toColumn, @NotNull ForeignKey.OnUpdateAction onUpdate, @NotNull ForeignKey.OnDeleteAction onDelete) { - this.foreignKey(null, null, null); - } -}