Skip to content

Commit f465602

Browse files
committed
feat: h2 web
1 parent b3b2e30 commit f465602

File tree

4 files changed

+78
-2
lines changed

4 files changed

+78
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package xyz.cssxsh.mirai.hibernate
2+
3+
import kotlinx.coroutines.*
4+
import net.mamoe.mirai.console.events.*
5+
import net.mamoe.mirai.event.*
6+
import net.mamoe.mirai.utils.*
7+
import org.h2.jdbc.*
8+
import org.h2.server.web.*
9+
import org.h2.tools.*
10+
import org.hibernate.*
11+
import java.sql.*
12+
import kotlin.coroutines.*
13+
14+
public object MiraiH2 : SimpleListenerHost() {
15+
16+
override fun handleException(context: CoroutineContext, exception: Throwable) {
17+
when (exception) {
18+
is ExceptionInEventHandlerException -> {
19+
logger.warning({ "Exception in H2" }, exception.cause)
20+
}
21+
else -> {
22+
logger.warning({ "Exception in H2" }, exception)
23+
}
24+
}
25+
}
26+
27+
private val web = WebServer()
28+
29+
/**
30+
* 创建一个 H2 网络会话
31+
* @return URL
32+
* @exception SQLException
33+
*/
34+
public fun url(session: Session): String {
35+
return session.doReturningWork { wrapper ->
36+
val connection = wrapper.unwrap(JdbcConnection::class.java)
37+
web.addSession(connection)
38+
}
39+
}
40+
41+
@EventHandler
42+
internal fun ConsoleEvent.handle() {
43+
if (this !is StartupEvent) return
44+
web.init("-webPort", System.getProperty("h2.web.port", "0"))
45+
web.start()
46+
launch {
47+
web.listen()
48+
}
49+
50+
launch {
51+
while (web.isRunning(false).not()) {
52+
delay(timeMillis = 10_000)
53+
}
54+
val url = try {
55+
factory.fromSession { url(session = it) }
56+
} catch (_: SQLException) {
57+
return@launch
58+
}
59+
logger.info(message = "h2 web $url")
60+
Server.openBrowser(url)
61+
}
62+
}
63+
}

src/main/kotlin/xyz/cssxsh/mirai/hibernate/MiraiHibernatePlugin.kt

+2
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,13 @@ internal object MiraiHibernatePlugin : KotlinPlugin(
9494
}
9595
}
9696

97+
MiraiH2.registerTo(globalEventChannel())
9798
MiraiHibernateRecorder.registerTo(globalEventChannel())
9899
}
99100

100101
override fun onDisable() {
101102
MiraiHibernateRecorder.cancel()
103+
MiraiH2.cancel()
102104
factory.close()
103105
}
104106
}

src/test/java/xyz/cssxsh/mirai/test/MiraiHibernateDemo.java

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import net.mamoe.mirai.message.data.MessageChain;
77
import net.mamoe.mirai.message.data.MessageSource;
88
import org.hibernate.SessionFactory;
9+
import xyz.cssxsh.mirai.hibernate.MiraiH2;
910
import xyz.cssxsh.mirai.hibernate.MiraiHibernateConfiguration;
1011
import xyz.cssxsh.mirai.hibernate.MiraiHibernateRecorder;
1112
import xyz.cssxsh.mirai.hibernate.entry.MessageRecord;
@@ -116,6 +117,9 @@ public void onEnable() {
116117
// or
117118
record.toMessageChain();
118119
}
120+
121+
// 创建一个 网页会话,访问 h2 数据库
122+
var url = factory.fromSession(MiraiH2.INSTANCE::url);
119123
}
120124

121125
@Override

src/test/kotlin/xyz/cssxsh/mirai/test/MiraiHibernatePluginTest.kt

+9-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package xyz.cssxsh.mirai.test
22

33
import net.mamoe.mirai.console.plugin.jvm.*
44
import net.mamoe.mirai.event.*
5-
import org.hibernate.SessionFactory
5+
import org.hibernate.*
66
import xyz.cssxsh.mirai.hibernate.*
77

88
object MiraiHibernatePluginTest : KotlinPlugin(
@@ -19,7 +19,7 @@ object MiraiHibernatePluginTest : KotlinPlugin(
1919

2020
override fun onEnable() {
2121
factory = MiraiHibernateConfiguration(plugin = this).buildSessionFactory()
22-
val metadata = factory.openSession().use { session ->
22+
val metadata = factory.fromSession { session ->
2323
session.doReturningWork { connection -> connection.metaData }
2424
}
2525

@@ -50,6 +50,13 @@ object MiraiHibernatePluginTest : KotlinPlugin(
5050
}
5151
}
5252
}
53+
54+
// MiraiH2 的使用
55+
val url = factory.fromSession { session ->
56+
MiraiH2.url(session = session)
57+
}
58+
59+
println(url)
5360
}
5461

5562
override fun onDisable() {

0 commit comments

Comments
 (0)