Skip to content

Commit

Permalink
feat: h2 web
Browse files Browse the repository at this point in the history
  • Loading branch information
cssxsh committed Sep 8, 2024
1 parent b3b2e30 commit f465602
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 2 deletions.
63 changes: 63 additions & 0 deletions src/main/kotlin/xyz/cssxsh/mirai/hibernate/MiraiH2.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package xyz.cssxsh.mirai.hibernate

import kotlinx.coroutines.*
import net.mamoe.mirai.console.events.*
import net.mamoe.mirai.event.*
import net.mamoe.mirai.utils.*
import org.h2.jdbc.*
import org.h2.server.web.*
import org.h2.tools.*
import org.hibernate.*
import java.sql.*
import kotlin.coroutines.*

public object MiraiH2 : SimpleListenerHost() {

override fun handleException(context: CoroutineContext, exception: Throwable) {
when (exception) {
is ExceptionInEventHandlerException -> {
logger.warning({ "Exception in H2" }, exception.cause)
}
else -> {
logger.warning({ "Exception in H2" }, exception)
}
}
}

private val web = WebServer()

/**
* 创建一个 H2 网络会话
* @return URL
* @exception SQLException
*/
public fun url(session: Session): String {
return session.doReturningWork { wrapper ->
val connection = wrapper.unwrap(JdbcConnection::class.java)
web.addSession(connection)
}
}

@EventHandler
internal fun ConsoleEvent.handle() {
if (this !is StartupEvent) return
web.init("-webPort", System.getProperty("h2.web.port", "0"))
web.start()
launch {
web.listen()
}

launch {
while (web.isRunning(false).not()) {
delay(timeMillis = 10_000)
}
val url = try {
factory.fromSession { url(session = it) }
} catch (_: SQLException) {
return@launch
}
logger.info(message = "h2 web $url")
Server.openBrowser(url)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -94,11 +94,13 @@ internal object MiraiHibernatePlugin : KotlinPlugin(
}
}

MiraiH2.registerTo(globalEventChannel())
MiraiHibernateRecorder.registerTo(globalEventChannel())
}

override fun onDisable() {
MiraiHibernateRecorder.cancel()
MiraiH2.cancel()
factory.close()
}
}
4 changes: 4 additions & 0 deletions src/test/java/xyz/cssxsh/mirai/test/MiraiHibernateDemo.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import net.mamoe.mirai.message.data.MessageChain;
import net.mamoe.mirai.message.data.MessageSource;
import org.hibernate.SessionFactory;
import xyz.cssxsh.mirai.hibernate.MiraiH2;
import xyz.cssxsh.mirai.hibernate.MiraiHibernateConfiguration;
import xyz.cssxsh.mirai.hibernate.MiraiHibernateRecorder;
import xyz.cssxsh.mirai.hibernate.entry.MessageRecord;
Expand Down Expand Up @@ -116,6 +117,9 @@ public void onEnable() {
// or
record.toMessageChain();
}

// 创建一个 网页会话,访问 h2 数据库
var url = factory.fromSession(MiraiH2.INSTANCE::url);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package xyz.cssxsh.mirai.test

import net.mamoe.mirai.console.plugin.jvm.*
import net.mamoe.mirai.event.*
import org.hibernate.SessionFactory
import org.hibernate.*
import xyz.cssxsh.mirai.hibernate.*

object MiraiHibernatePluginTest : KotlinPlugin(
Expand All @@ -19,7 +19,7 @@ object MiraiHibernatePluginTest : KotlinPlugin(

override fun onEnable() {
factory = MiraiHibernateConfiguration(plugin = this).buildSessionFactory()
val metadata = factory.openSession().use { session ->
val metadata = factory.fromSession { session ->
session.doReturningWork { connection -> connection.metaData }
}

Expand Down Expand Up @@ -50,6 +50,13 @@ object MiraiHibernatePluginTest : KotlinPlugin(
}
}
}

// MiraiH2 的使用
val url = factory.fromSession { session ->
MiraiH2.url(session = session)
}

println(url)
}

override fun onDisable() {
Expand Down

0 comments on commit f465602

Please sign in to comment.