Adapting database types to interop with an underlying driver

This commit is contained in:
Andrew Golovashevich 2025-04-15 15:09:49 +03:00
parent 4bd4a1813b
commit f90fce937a
3 changed files with 55 additions and 46 deletions

View File

@ -1,66 +1,60 @@
package ru.landgrafhomyak.db.sql_skeleton_0.api.misc
import kotlin.jvm.JvmField
import kotlin.jvm.JvmName
import ru.landgrafhomyak.db.sql_skeleton_0.api.raw.DialectKey
import ru.landgrafhomyak.db.sql_skeleton_0.api.raw.DialectResolver
import ru.landgrafhomyak.db.sql_skeleton_0.api.table.RowId
import ru.landgrafhomyak.db.sql_skeleton_0.api.table.Table
@Suppress("ClassName", "RemoveRedundantQualifierName")
public interface DatabaseType<@Suppress("unused") RT> {
public interface DatabaseType<
RUNTIME_TYPE : Any?,
in DESCRIPTOR_SCOPE : Any,
out NATIVE_DESCRIPTOR : Any,
in GETTER_SCOPE : Any,
in SETTER_SCOPE : Any
> {
public enum class RowIdSize {
VERY_SMALL,
SMALL,
NORMAL
}
public fun _nativeDescriptor(scope: DESCRIPTOR_SCOPE): NATIVE_DESCRIPTOR
public fun _get(scope: GETTER_SCOPE, columnIndex: Int): RUNTIME_TYPE
public fun _set(scope: SETTER_SCOPE, paramIndex: Int, value: RUNTIME_TYPE)
public val nullable: DatabaseType<RUNTIME_TYPE?, DESCRIPTOR_SCOPE, NATIVE_DESCRIPTOR, GETTER_SCOPE, SETTER_SCOPE>
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("getName")
public val name: String
public abstract class _VirtualType<RT, wRT, wDT : DatabaseType<wRT>>(
@JvmField
public val wraps: wDT,
@JvmField
public val allowValuesCaching: Boolean = true
) : DatabaseType<RT> {
@Suppress("FunctionName")
public abstract fun _unwrap(w: wRT): RT
@Suppress("FunctionName")
public abstract fun _wrap(w: RT): wRT
@Suppress("FunctionName")
public abstract fun _equals(l: RT, r: RT): Boolean
@Suppress("FunctionName")
public abstract fun _compare(l: RT, r: RT): Int
}
public interface Nullable<RT : Any, @Suppress("unused") DT : DatabaseType<RT>> : DatabaseType<RT?>
public interface ROW_ID<ttUE : Any> : DatabaseType<RowId<ttUE>>
public interface BOOLEAN : DatabaseType<Boolean>
@OptIn(ExperimentalUnsignedTypes::class)
public interface BINARY_DATA : DatabaseType<UByteArray> {
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("getMaxSizeOrNull")
public val maxSizeOrNull: UInt?
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("isFixedSize")
public val isFixedSize: Boolean
}
public interface Provider {
public fun <tUE : Any> ROW_ID(table: Table<tUE, *>): DatabaseType.ROW_ID<tUE>
public interface DefaultTypes<
in DESCRIPTOR_SCOPE : Any,
out NATIVE_DESCRIPTOR : Any,
in GETTER_SCOPE : Any,
in SETTER_SCOPE : Any
> {
@Suppress("INAPPLICABLE_JVM_NAME", "PropertyName")
@get:JvmName("BOOLEAN")
public val BOOLEAN: BOOLEAN
public val BOOLEAN: DatabaseType<Boolean, DESCRIPTOR_SCOPE, NATIVE_DESCRIPTOR, GETTER_SCOPE, SETTER_SCOPE>
@OptIn(ExperimentalUnsignedTypes::class)
@Suppress("INAPPLICABLE_JVM_NAME", "PropertyName")
@get:JvmName("BINARY_DATA")
public val BINARY_DATA: BINARY_DATA
public val BINARY_DATA: DatabaseType<UByteArray, DESCRIPTOR_SCOPE, NATIVE_DESCRIPTOR, GETTER_SCOPE, SETTER_SCOPE>
public fun BINARY_DATA(size: UInt, isFixedSize: Boolean): BINARY_DATA
@OptIn(ExperimentalUnsignedTypes::class)
public fun BINARY_DATA(size: UInt, isFixedSize: Boolean): DatabaseType<UByteArray, DESCRIPTOR_SCOPE, NATIVE_DESCRIPTOR, GETTER_SCOPE, SETTER_SCOPE>
public fun <RT : Any, DT : DatabaseType<RT>> nullableOf(notNull: DT): Nullable<RT, DT>
public fun <RUNTIME_TYPE, DATABASE_TYPE : DatabaseType<RUNTIME_TYPE, @UnsafeVariance DESCRIPTOR_SCOPE, @UnsafeVariance NATIVE_DESCRIPTOR, @UnsafeVariance GETTER_SCOPE, @UnsafeVariance SETTER_SCOPE>> custom(
resolver: DialectResolver<
DialectKey<*, @UnsafeVariance DESCRIPTOR_SCOPE, @UnsafeVariance NATIVE_DESCRIPTOR, @UnsafeVariance GETTER_SCOPE, @UnsafeVariance SETTER_SCOPE>,
DATABASE_TYPE
>
): DATABASE_TYPE
}
}

View File

@ -0,0 +1,10 @@
package ru.landgrafhomyak.db.sql_skeleton_0.api.raw
public interface DialectKey<
RAW_STATEMENT,
TYPE_SCOPE,
TYPE_DESCRIPTOR ,
GETTER_SCOPE,
SETTER_SCOPE
> {
}

View File

@ -0,0 +1,5 @@
package ru.landgrafhomyak.db.sql_skeleton_0.api.raw
public interface DialectResolver<in K: DialectKey<*, *, *, *, *>, out R: Any> {
public fun resolveSqlDialect(key: K): R?
}