Now different module versions can be merged, compiler must check the equivalence of merged modules

This commit is contained in:
Andrew Golovashevich 2025-02-02 03:02:25 +03:00
parent 5e4e2bdf4a
commit bb25b2be72
5 changed files with 32 additions and 24 deletions

View File

@ -32,7 +32,7 @@ xomrk {
warningsAsErrors() warningsAsErrors()
optInContracts() optInContracts()
setCompatibilityWithKotlin(KotlinVersion.KOTLIN_1_7) setCompatibilityWithKotlin(KotlinVersion.KOTLIN_1_7)
configureAllCompilersOptions { freeCompilerArgs.add("-Xjvm-default=all-compatibility") } configureAllCompilersOptions { freeCompilerArgs.add("-Xjvm-default=all") }
jvmToolchain(8) jvmToolchain(8)
defineAllMultiplatformTargets() defineAllMultiplatformTargets()

View File

@ -10,7 +10,7 @@ import ru.landgrafhomyak.db.serdha0.api.table.TableConstructor
* Scope methods for creating new [module template][ModuleTemplate]. * Scope methods for creating new [module template][ModuleTemplate].
* *
* @see ModuleTemplate.CreateModuleTemplatesScope.createTemplate * @see ModuleTemplate.CreateModuleTemplatesScope.createTemplate
* @see ModuleTemplate.ModuleCreator.createSchema * @see ModuleTemplate.ModuleConstructor.createSchema
*/ */
public interface CreateModuleScope { public interface CreateModuleScope {
public val rootNs: Namespace public val rootNs: Namespace

View File

@ -2,33 +2,41 @@ package ru.landgrafhomyak.db.serdha0.api.module
import ru.landgrafhomyak.db.serdha0.api.runtime.Transaction import ru.landgrafhomyak.db.serdha0.api.runtime.Transaction
public interface ModuleTemplate<@Suppress("unused") ModuleUserExtension : Any> { public interface ModuleTemplate<@Suppress("unused") mUE : Any> {
public interface Provider<UserExtension : Any> { public interface VersionsInitializer<UE : Any> {
public fun createModuleTemplates(scope: CreateModuleTemplatesScope): UserExtension public fun createModuleTemplates(context: Scope): UE
public interface Scope {
public fun <nmUE : Any> createTemplate(
versionKey: String,
constructor: ModuleConstructor<nmUE>,
): ModuleTemplate<nmUE>
public fun <omUE : Any, nmUE : Any> upgradeTemplate(
versionKey: String,
oldModule: ModuleTemplate<omUE>,
upgrade: ModuleUpgrade<omUE, nmUE>,
): ModuleTemplate<nmUE>
public fun <omUE : Any, nmUE : Any> upgradeTemplateAndMerge(
oldModule: ModuleTemplate<omUE>,
upgrade: ModuleUpgrade<omUE, nmUE>,
mergePoint: ModuleTemplate<nmUE>
): ModuleTemplate<nmUE>
}
} }
public interface CreateModuleTemplatesScope { public interface ModuleConstructor<mUE : Any> {
public fun <NewModuleUserExtension : Any> createTemplate( public fun createSchema(context: CreateModuleScope): mUE
versionKey: String,
creator: ModuleCreator<NewModuleUserExtension>,
): ModuleTemplate<NewModuleUserExtension>
public fun <OldModuleUserExtension : Any, NewModuleUserExtension : Any> upgradeTemplate( public suspend fun initData(ext: mUE, transaction: Transaction) {}
versionKey: String,
upgrade: ModuleUpgrade<OldModuleUserExtension, NewModuleUserExtension>,
): ModuleTemplate<NewModuleUserExtension>
} }
public interface ModuleCreator<ModuleUserExtension : Any> { public interface ModuleUpgrade<omUE : Any, nmUE : Any> {
public fun createSchema(context: CreateModuleScope): ModuleUserExtension
public suspend fun initData(ext: ModuleUserExtension, transaction: Transaction) {} public fun upgradeSchema(context: UpgradeModuleScope<omUE>): nmUE
}
public interface ModuleUpgrade<OldModuleUserExtension : Any, NewModuleUserExtension : Any> { public suspend fun upgradeData(ext: nmUE, transaction: Transaction) {}
public fun upgradeSchema(context: UpgradeModuleScope<OldModuleUserExtension>): NewModuleUserExtension
public suspend fun upgradeData(ext: NewModuleUserExtension, transaction: Transaction) {}
} }
public val versionKey: String public val versionKey: String

View File

@ -4,7 +4,7 @@ import ru.landgrafhomyak.db.serdha0.api.module.ModuleTemplate
@Suppress("SpellCheckingInspection") @Suppress("SpellCheckingInspection")
public interface UnsynchronizedDatabase { public interface UnsynchronizedDatabase {
public fun <UserExtension : Any> addModuleTemplates(creator: ModuleTemplate.Provider<UserExtension>): UserExtension public fun <UserExtension : Any> addModuleTemplates(creator: ModuleTemplate.VersionsInitializer<UserExtension>): UserExtension
public suspend fun <ModuleUserExtension : Any> synchronize(conent: ModuleTemplate<ModuleUserExtension>): SynchronizedDatabase<ModuleUserExtension> public suspend fun <ModuleUserExtension : Any> synchronize(conent: ModuleTemplate<ModuleUserExtension>): SynchronizedDatabase<ModuleUserExtension>
} }

View File

@ -27,6 +27,6 @@ public interface Index<OwnerTableUserExtension : Any> {
* Columns that are indexed by this index. For debugging. * Columns that are indexed by this index. For debugging.
*/ */
@Suppress("INAPPLICABLE_JVM_NAME") @Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("table") @get:JvmName("columns")
public val columns: List<Column<*, *, OwnerTableUserExtension>> public val columns: List<Column<*, *, OwnerTableUserExtension>>
} }