[Editor] Use SQL file for project's database instead of *.mv.db and *.trace.db H2 files

This commit is contained in:
2023-10-27 13:52:51 +02:00
parent 3b62d7c06b
commit 8d27ed883b
5 changed files with 29 additions and 11 deletions

View File

@@ -16,7 +16,7 @@ class DatabaseController : Controller() {
private val databaseService: DatabaseService by di() private val databaseService: DatabaseService by di()
fun execute(statement: String, name: String, schema: SchemaTable? = null): Query? = try { fun execute(statement: String, name: String, schema: SchemaTable? = null): Query? = try {
databaseService.execute(statement, name, schema) databaseService.execute(statement, name, schema).also { databaseService.dump() }
} catch (e: SQLException) { } catch (e: SQLException) {
sqlErrorAlert(e) sqlErrorAlert(e)
null null
@@ -25,6 +25,7 @@ class DatabaseController : Controller() {
fun execute(op: Connection.() -> Unit): Boolean = databaseService.run { fun execute(op: Connection.() -> Unit): Boolean = databaseService.run {
try { try {
op(this) op(this)
databaseService.dump()
true true
} catch (e: SQLException) { } catch (e: SQLException) {
sqlErrorAlert(e) sqlErrorAlert(e)
@@ -40,6 +41,7 @@ class DatabaseController : Controller() {
.forEach(PreparedStatement::execute) .forEach(PreparedStatement::execute)
commit() commit()
databaseService.dump()
} }
private fun sqlErrorAlert(e: SQLException) = private fun sqlErrorAlert(e: SQLException) =

View File

@@ -11,4 +11,6 @@ interface DatabaseService {
fun <T> run(op: Connection.() -> T): T? fun <T> run(op: Connection.() -> T): T?
fun execute(statement: String, name: String, schema: SchemaTable? = null): Query? fun execute(statement: String, name: String, schema: SchemaTable? = null): Query?
fun dump()
} }

View File

@@ -7,6 +7,7 @@ import com.bartlomiejpluta.base.editor.database.model.data.Query
import com.bartlomiejpluta.base.editor.database.model.schema.SchemaDatabase import com.bartlomiejpluta.base.editor.database.model.schema.SchemaDatabase
import com.bartlomiejpluta.base.editor.database.model.schema.SchemaTable import com.bartlomiejpluta.base.editor.database.model.schema.SchemaTable
import com.bartlomiejpluta.base.editor.project.context.ProjectContext import com.bartlomiejpluta.base.editor.project.context.ProjectContext
import org.h2.tools.Script
import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
import tornadofx.observableListOf import tornadofx.observableListOf
@@ -80,4 +81,12 @@ class H2DatabaseService : DatabaseService {
return@run null return@run null
} }
override fun dump() {
projectContext.project?.databaseFile?.let { file ->
run {
Script.process(this, file.absolutePath, "", "")
}
}
}
} }

View File

@@ -2,16 +2,21 @@ package com.bartlomiejpluta.base.editor.database.source
import com.zaxxer.hikari.HikariConfig import com.zaxxer.hikari.HikariConfig
import com.zaxxer.hikari.HikariDataSource import com.zaxxer.hikari.HikariDataSource
import org.h2.tools.RunScript
import org.h2.tools.Script
import java.io.File import java.io.File
import java.sql.Connection import java.sql.Connection
class DataSource(dbFile: File) { class H2DBDataSource(dbFile: File) {
private val config = HikariConfig() private val config = HikariConfig()
private val source: HikariDataSource private val source: HikariDataSource
init { init {
config.jdbcUrl = "jdbc:h2:file:${dbFile.absolutePath.replace("\\", "/")}" config.jdbcUrl = "jdbc:h2:mem:data;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1"
source = HikariDataSource(config) source = HikariDataSource(config)
source.connection.use {
RunScript.execute(it, dbFile.reader())
}
} }
val connection: Connection val connection: Connection

View File

@@ -3,7 +3,7 @@ package com.bartlomiejpluta.base.editor.project.model
import com.bartlomiejpluta.base.editor.animation.asset.AnimationAsset import com.bartlomiejpluta.base.editor.animation.asset.AnimationAsset
import com.bartlomiejpluta.base.editor.audio.asset.SoundAsset import com.bartlomiejpluta.base.editor.audio.asset.SoundAsset
import com.bartlomiejpluta.base.editor.autotile.asset.AutoTileAsset import com.bartlomiejpluta.base.editor.autotile.asset.AutoTileAsset
import com.bartlomiejpluta.base.editor.database.source.DataSource import com.bartlomiejpluta.base.editor.database.source.H2DBDataSource
import com.bartlomiejpluta.base.editor.characterset.asset.CharacterSetAsset import com.bartlomiejpluta.base.editor.characterset.asset.CharacterSetAsset
import com.bartlomiejpluta.base.editor.file.model.FileSystemNode import com.bartlomiejpluta.base.editor.file.model.FileSystemNode
import com.bartlomiejpluta.base.editor.gui.font.asset.FontAsset import com.bartlomiejpluta.base.editor.gui.font.asset.FontAsset
@@ -128,7 +128,7 @@ class Project {
createObjectBinding({ File(buildOutDirectory, PROJECT_OUTPUT_JAR_FILE) }, buildOutDirectoryProperty) createObjectBinding({ File(buildOutDirectory, PROJECT_OUTPUT_JAR_FILE) }, buildOutDirectoryProperty)
val buildOutputJarFile by buildOutputJarFileProperty val buildOutputJarFile by buildOutputJarFileProperty
lateinit var database: DataSource lateinit var database: H2DBDataSource
init { init {
sourceDirectoryProperty.addListener { _, _, dir -> sourceDirectoryProperty.addListener { _, _, dir ->
@@ -155,7 +155,7 @@ class Project {
} }
fun init() { fun init() {
database = DataSource(databaseFile) database = H2DBDataSource(databaseFile)
mkdirs() mkdirs()
} }
@@ -180,7 +180,7 @@ class Project {
companion object { companion object {
const val PROJECT_FILE = "project.bep" const val PROJECT_FILE = "project.bep"
const val DATABASE_FILE = "data" const val DATABASE_FILE = "data.sql"
const val DATABASE_DUMP_FILE = "data.sql" const val DATABASE_DUMP_FILE = "data.sql"
const val PROJECT_OUTPUT_JAR_FILE = "game.jar" const val PROJECT_OUTPUT_JAR_FILE = "game.jar"