Skip to content

Commit 7a96fcf

Browse files
committed
Add Database versioning
1 parent 8f96c29 commit 7a96fcf

File tree

1 file changed

+51
-4
lines changed

1 file changed

+51
-4
lines changed
Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,70 @@
11
package org.javacs.kt.database
22

3-
import org.jetbrains.exposed.sql.Database
3+
import org.jetbrains.exposed.dao.IntEntity
4+
import org.jetbrains.exposed.dao.IntEntityClass
5+
import org.jetbrains.exposed.dao.id.EntityID
6+
import org.jetbrains.exposed.dao.id.IntIdTable
7+
import org.jetbrains.exposed.sql.*
8+
import org.jetbrains.exposed.sql.transactions.transaction
49
import java.nio.file.Files
510
import java.nio.file.Path
611

12+
private object DatabaseMetadata : IntIdTable() {
13+
var version = integer("version")
14+
}
15+
16+
class DatabaseMetadataEntity(id: EntityID<Int>) : IntEntity(id) {
17+
companion object : IntEntityClass<DatabaseMetadataEntity>(DatabaseMetadata)
18+
19+
var version by DatabaseMetadata.version
20+
}
21+
722
class DatabaseService {
823

24+
companion object {
25+
const val CURRENT_VERSION = 1
26+
const val DB_FILENAME = "kls_database.db"
27+
}
28+
929
var db: Database? = null
1030
private set
1131

1232
fun setup(storagePath: Path?) {
13-
val dbName = "kls_database"
33+
db = getDbFromFile(storagePath)
34+
35+
val currentVersion = transaction(db) {
36+
SchemaUtils.createMissingTablesAndColumns(DatabaseMetadata)
37+
38+
DatabaseMetadataEntity.all().firstOrNull()?.version
39+
}
1440

15-
db = storagePath?.let {
41+
if ((currentVersion ?: 0) < CURRENT_VERSION) {
42+
deleteDb(storagePath)
43+
44+
db = getDbFromFile(storagePath)
45+
46+
transaction(db) {
47+
SchemaUtils.createMissingTablesAndColumns(DatabaseMetadata)
48+
49+
DatabaseMetadata.deleteAll()
50+
DatabaseMetadata.insert { it[version] = CURRENT_VERSION }
51+
}
52+
}
53+
}
54+
55+
private fun getDbFromFile(storagePath: Path?): Database? {
56+
return storagePath?.let {
1657
if (Files.isDirectory(it)) {
17-
Database.connect("jdbc:sqlite:${Path.of(storagePath.toString(), dbName)}.db")
58+
Database.connect("jdbc:sqlite:${getDbFilePath(it)}")
1859
} else {
1960
null
2061
}
2162
}
2263
}
64+
65+
private fun deleteDb(storagePath: Path?) {
66+
storagePath?.let { Files.deleteIfExists(getDbFilePath(it)) }
67+
}
68+
69+
private fun getDbFilePath(storagePath: Path) = Path.of(storagePath.toString(), DB_FILENAME)
2370
}

0 commit comments

Comments
 (0)