1- @file:Import(" org.jetbrains.exposed:exposed-core:0.59.0" , mavenDepends = true )
2- @file:Import(" org.jetbrains.exposed:exposed-dao:0.59.0" , mavenDepends = true )
3- @file:Import(" org.jetbrains.exposed:exposed-java-time:0.59.0" , mavenDepends = true )
4- @file:Import(" org.jetbrains.exposed:exposed-jdbc:0.59.0" , mavenDepends = true )
5-
6- package coreLibrary
7-
1+ package coreLib.db
2+
3+ import cf.wayzer.scriptAgent.ScriptRegistry
4+ import cf.wayzer.scriptAgent.define.SAExperimentalApi
5+ import cf.wayzer.scriptAgent.define.Script
6+ import cf.wayzer.scriptAgent.util.DSLBuilder
7+ import cf.wayzer.scriptAgent.util.Services
8+ import coreLibrary.lib.getOrNull
89import org.jetbrains.exposed.dao.id.EntityID
910import org.jetbrains.exposed.dao.id.IdTable
1011import org.jetbrains.exposed.sql.*
@@ -13,14 +14,17 @@ import org.jetbrains.exposed.sql.javatime.timestamp
1314import org.jetbrains.exposed.sql.transactions.TransactionManager
1415import org.jetbrains.exposed.sql.transactions.transaction
1516import java.time.Instant
16- import java.util.logging.Level
1717import kotlin.system.measureTimeMillis
1818
19+ @OptIn(SAExperimentalApi ::class )
20+ object DBApi {
21+ val db = Services .get<Database >()
22+
23+ private var Script .registeredTable: List <Table >? by DSLBuilder .dataKey()
1924
20- @Suppress(" unused" , " MemberVisibilityCanBePrivate" )
21- object DB : ServiceRegistry<Database>() {
2225 object TableVersion : IdTable<String>(" TableVersion" ) {
2326 // can't use `text` as h2db don't support for primaryKey
27+
2428 override val id: Column <EntityID <String >> = varchar(" table" , 64 ).entityId()
2529 override val primaryKey: PrimaryKey = PrimaryKey (id) // h2database#2191
2630
@@ -65,9 +69,6 @@ object DB : ServiceRegistry<Database>() {
6569 }
6670 }
6771
68- private val key = DataKeyWithDefault (" DB_registeredTable" ) { mutableSetOf<Table >() }
69- private val Script .registeredTable by key
70-
7172 interface WithUpgrade {
7273 val version: Int
7374
@@ -80,24 +81,24 @@ object DB : ServiceRegistry<Database>() {
8081 /* *
8182 * 为模块注册表格
8283 * 注册时不一定立刻运行
83- * 会等[DB ]初始化后统一注册
84+ * 会等[db ]初始化后统一注册
8485 * 如果DB有版本变化,请实现[WithUpgrade],未实现默认版本号1
8586 */
86- @Synchronized
87- @ScriptDsl
88- fun Script.registerTable (vararg t : Table ) {
89- registeredTable.addAll(t)
90- if (provided)
91- transaction {
87+ context(script: Script )
88+ fun registerTable (vararg t : Table ) {
89+ script.registeredTable = script.registeredTable.orEmpty() + t
90+ db.getOrNull()?.let {
91+ transaction(it) {
9292 withDataBaseLock { initTable(t.asIterable()) }
9393 }
94+ }
9495 }
9596
9697 @Synchronized
97- internal fun initDB (db : Database ) {
98+ fun initDB (db : Database ) {
9899 TransactionManager .defaultDatabase = db
99- val allTable = ScriptRegistry .allScripts { it.inst?.dslExists(key) == true }
100- .flatMapTo(mutableSetOf ()) { it.inst!! .registeredTable }
100+ val allTable = ScriptRegistry .allScripts { it.inst != null }
101+ .flatMapTo(mutableSetOf ()) { it.inst? .registeredTable.orEmpty() }
101102
102103 transaction {
103104 withDataBaseLock {
@@ -114,12 +115,4 @@ object DB : ServiceRegistry<Database>() {
114115 }
115116 exposedLogger.info(" Finish check upgrade for ${tables.size} tables, costs $time ms" )
116117 }
117- }
118-
119- DB .subscribe(this ) {
120- try {
121- DB .initDB(it)
122- } catch (e: Exception ) {
123- logger.log(Level .SEVERE , " Error when initDB" , e)
124- }
125118}
0 commit comments