From f90fce937a196bb862ac02338ba00a95dac0b210 Mon Sep 17 00:00:00 2001
From: Andrew Golovashevich <landgrafhomyak@gmail.com>
Date: Tue, 15 Apr 2025 15:09:49 +0300
Subject: [PATCH] Adapting database types to interop with an underlying driver

---
 .../sql_skeleton_0/api/misc/DatabaseType.kt   | 86 +++++++++----------
 .../db/sql_skeleton_0/api/raw/DialectKey.kt   | 10 +++
 .../sql_skeleton_0/api/raw/DialectResolver.kt |  5 ++
 3 files changed, 55 insertions(+), 46 deletions(-)
 create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/db/sql_skeleton_0/api/raw/DialectKey.kt
 create mode 100644 src/commonMain/kotlin/ru/landgrafhomyak/db/sql_skeleton_0/api/raw/DialectResolver.kt

diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/db/sql_skeleton_0/api/misc/DatabaseType.kt b/src/commonMain/kotlin/ru/landgrafhomyak/db/sql_skeleton_0/api/misc/DatabaseType.kt
index 0a8f448..b10792b 100644
--- a/src/commonMain/kotlin/ru/landgrafhomyak/db/sql_skeleton_0/api/misc/DatabaseType.kt
+++ b/src/commonMain/kotlin/ru/landgrafhomyak/db/sql_skeleton_0/api/misc/DatabaseType.kt
@@ -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
 	}
 }
diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/db/sql_skeleton_0/api/raw/DialectKey.kt b/src/commonMain/kotlin/ru/landgrafhomyak/db/sql_skeleton_0/api/raw/DialectKey.kt
new file mode 100644
index 0000000..2c102bb
--- /dev/null
+++ b/src/commonMain/kotlin/ru/landgrafhomyak/db/sql_skeleton_0/api/raw/DialectKey.kt
@@ -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
+		> {
+}
\ No newline at end of file
diff --git a/src/commonMain/kotlin/ru/landgrafhomyak/db/sql_skeleton_0/api/raw/DialectResolver.kt b/src/commonMain/kotlin/ru/landgrafhomyak/db/sql_skeleton_0/api/raw/DialectResolver.kt
new file mode 100644
index 0000000..9d2d209
--- /dev/null
+++ b/src/commonMain/kotlin/ru/landgrafhomyak/db/sql_skeleton_0/api/raw/DialectResolver.kt
@@ -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?
+}
\ No newline at end of file