From ba11a41dc92d50a8646d30e66e7f9a9897f5f1dd Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Mon, 12 May 2025 10:14:21 +0300 Subject: [PATCH] Errors for schema synchronization and some additional errors for schema definition --- .../errors/SchemaSynchronizationException.kt | 12 ++++ .../definition/UnboundParameterException.kt | 38 ++++++++++++ .../definition/UnknownVersionException.kt | 61 +++++++++++++++++++ .../SchemaExecutionException.kt | 16 +++++ .../SchemaMismatchException.kt | 16 +++++ .../db/skeleton1/api/module/Module.kt | 16 ++--- 6 files changed, 151 insertions(+), 8 deletions(-) create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/SchemaSynchronizationException.kt create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/definition/UnboundParameterException.kt create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/definition/UnknownVersionException.kt create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/synchronization/SchemaExecutionException.kt create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/synchronization/SchemaMismatchException.kt diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/SchemaSynchronizationException.kt b/src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/SchemaSynchronizationException.kt new file mode 100644 index 0000000..e2e0c4a --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/SchemaSynchronizationException.kt @@ -0,0 +1,12 @@ +package ru.landgrafhomyak.db.skeleton1.api.errors + +import ru.landgrafhomyak.db.skeleton1.api.DebugApi + +@DebugApi +public abstract class SchemaSynchronizationException : RuntimeException { + public constructor() : super() + public constructor(message: String) : super(message) + public constructor(message: String, cause: Throwable) : super(message, cause) + public constructor(cause: Throwable) : super(cause) + public constructor(message: String?, cause: Throwable?, @Suppress("unused", "LocalVariableName") _marker: Unit) : super(message, cause) +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/definition/UnboundParameterException.kt b/src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/definition/UnboundParameterException.kt new file mode 100644 index 0000000..d3cab92 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/definition/UnboundParameterException.kt @@ -0,0 +1,38 @@ +package ru.landgrafhomyak.db.skeleton1.api.errors.definition + +import kotlin.jvm.JvmStatic +import kotlinx.coroutines.CopyableThrowable +import kotlinx.coroutines.ExperimentalCoroutinesApi +import ru.landgrafhomyak.db.skeleton1.api.DebugApi +import ru.landgrafhomyak.db.skeleton1.api.DriverMetainfo +import ru.landgrafhomyak.db.skeleton1.api.errors.SchemaDefinitionException + +@DebugApi +public abstract class UnboundParameterException : SchemaDefinitionException { + public val constructor: Any + + public constructor(constructor: Any) : super() { + this.constructor = constructor + } + + public constructor(constructor: Any, customMessage: String) : super(customMessage) { + this.constructor = constructor + } + + public constructor(constructor: Any, customMessage: String, cause: Throwable) : super(customMessage, cause) { + this.constructor = constructor + } + + public constructor(constructor: Any, cause: Throwable) : super(cause) { + this.constructor = constructor + } + + public constructor( + constructor: Any, + message: String?, cause: Throwable?, + @Suppress("unused", "LocalVariableName") _marker: Unit + ) : super(message, cause, _marker) { + this.constructor = constructor + } + +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/definition/UnknownVersionException.kt b/src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/definition/UnknownVersionException.kt new file mode 100644 index 0000000..f689a85 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/definition/UnknownVersionException.kt @@ -0,0 +1,61 @@ +package ru.landgrafhomyak.db.skeleton1.api.errors.definition + +import kotlin.jvm.JvmStatic +import kotlinx.coroutines.CopyableThrowable +import kotlinx.coroutines.ExperimentalCoroutinesApi +import ru.landgrafhomyak.db.skeleton1.api.DebugApi +import ru.landgrafhomyak.db.skeleton1.api.errors.SchemaDefinitionException +import ru.landgrafhomyak.db.skeleton1.api.module.Module + +@DebugApi +@OptIn(ExperimentalCoroutinesApi::class) +public class UnknownVersionException : SchemaDefinitionException, CopyableThrowable { + public val template: Module.Template<*> + public val version: String + + public constructor(template: Module.Template<*>, version: String) : super(formatMessage(template, version)) { + this.template = template + this.version = version + } + + public constructor(template: Module.Template<*>, version: String, customMessage: String) : super(customMessage) { + this.template = template + this.version = version + } + + public constructor(template: Module.Template<*>, version: String, customMessage: String, cause: Throwable) : super(customMessage, cause) { + this.template = template + this.version = version + } + + public constructor(template: Module.Template<*>, version: String, cause: Throwable) : super(formatMessage(template, version), cause) { + this.template = template + this.version = version + } + + public constructor( + template: Module.Template<*>, version: String, + message: String?, cause: Throwable?, + @Suppress("unused", "LocalVariableName") _marker: Unit + ) : super(message, cause, _marker) { + this.template = template + this.version = version + } + + override fun createCopy(): UnknownVersionException? { + return UnknownVersionException( + template = this.template, + version = this.version, + message = this.message, + cause = this.cause, + _marker = Unit + ) + } + + public companion object { + @JvmStatic + public fun formatMessage( + template: Module.Template<*>, version: String + ): String = "Template $template doesn't knows version '${version}'" + } +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/synchronization/SchemaExecutionException.kt b/src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/synchronization/SchemaExecutionException.kt new file mode 100644 index 0000000..bda7a08 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/synchronization/SchemaExecutionException.kt @@ -0,0 +1,16 @@ +package ru.landgrafhomyak.db.skeleton1.api.errors.synchronization + +import kotlin.RuntimeException +import ru.landgrafhomyak.db.skeleton1.api.DebugApi +import ru.landgrafhomyak.db.skeleton1.api.errors.SchemaDefinitionException +import ru.landgrafhomyak.db.skeleton1.api.errors.SchemaSynchronizationException +import ru.landgrafhomyak.db.skeleton1.api.module.Module + +@DebugApi +public abstract class SchemaExecutionException : SchemaSynchronizationException { + public constructor() : super() + public constructor(message: String) : super(message) + public constructor(message: String, cause: Throwable) : super(message, cause) + public constructor(cause: Throwable) : super(cause) + public constructor(message: String?, cause: Throwable?, @Suppress("unused", "LocalVariableName") _marker: Unit) : super(message, cause, _marker) +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/synchronization/SchemaMismatchException.kt b/src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/synchronization/SchemaMismatchException.kt new file mode 100644 index 0000000..ef86001 --- /dev/null +++ b/src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/errors/synchronization/SchemaMismatchException.kt @@ -0,0 +1,16 @@ +package ru.landgrafhomyak.db.skeleton1.api.errors.synchronization + +import kotlin.RuntimeException +import ru.landgrafhomyak.db.skeleton1.api.DebugApi +import ru.landgrafhomyak.db.skeleton1.api.errors.SchemaDefinitionException +import ru.landgrafhomyak.db.skeleton1.api.errors.SchemaSynchronizationException +import ru.landgrafhomyak.db.skeleton1.api.module.Module + +@DebugApi +public abstract class SchemaMismatchException : SchemaSynchronizationException { + public constructor() : super() + public constructor(message: String) : super(message) + public constructor(message: String, cause: Throwable) : super(message, cause) + public constructor(cause: Throwable) : super(cause) + public constructor(message: String?, cause: Throwable?, @Suppress("unused", "LocalVariableName") _marker: Unit) : super(message, cause, _marker) +} \ No newline at end of file diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/module/Module.kt b/src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/module/Module.kt index 1ddd908..5f1bd51 100644 --- a/src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/module/Module.kt +++ b/src/commonMain/kotlin/ru/landgrafhomyak/db/skeleton1/api/module/Module.kt @@ -22,31 +22,31 @@ public interface Module { @get:JvmName("getParent") public val parent: Module<*, IK>? - public interface Constructor { + public interface Constructor { @Suppress("INAPPLICABLE_JVM_NAME") @get:JvmName("versionKey") public val versionKey: String - public fun createSchema(context: ModuleConstructorScope): mUE + public fun createSchema(context: ModuleConstructorScope): mUE - public suspend fun initData(ext: mUE, compiler: QueriesCompiler, transaction: Transaction) {} + public suspend fun initData(ext: mUE, compiler: QueriesCompiler, transaction: Transaction) {} } - public interface Upgrade { + public interface Upgrade { @Suppress("INAPPLICABLE_JVM_NAME") @get:JvmName("versionKey") public val versionKey: String - public fun upgradeSchema(context: ModuleUpgradeScope): nmUE + public fun upgradeSchema(context: ModuleUpgradeScope): nmUE - public suspend fun upgradeData(ext: nmUE, compiler: QueriesCompiler, transaction: Transaction) {} + public suspend fun upgradeData(ext: nmUE, compiler: QueriesCompiler, transaction: Transaction) {} } public interface Template<@Suppress("unused") mUE : Any> { @LowLevelApi - public fun getConstructor(): Constructor<*, RUNTIME_KEY> + public fun getConstructor(): Constructor<*, IK> @LowLevelApi - public fun getUpgrade(version: String): Upgrade<*, *, RUNTIME_KEY>? + public fun getUpgrade(version: String): Upgrade<*, *, IK>? } } \ No newline at end of file