Skip to content

Commit ca09671

Browse files
authored
Merge pull request #504 from daplf/database-versioning
Add Database versioning
2 parents 8f96c29 + c91e7f5 commit ca09671

File tree

1 file changed

+57
-3
lines changed

1 file changed

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

3+
import org.javacs.kt.LOG
4+
import org.jetbrains.exposed.dao.IntEntity
5+
import org.jetbrains.exposed.dao.IntEntityClass
6+
import org.jetbrains.exposed.dao.id.EntityID
7+
import org.jetbrains.exposed.dao.id.IntIdTable
38
import org.jetbrains.exposed.sql.Database
9+
import org.jetbrains.exposed.sql.SchemaUtils
10+
import org.jetbrains.exposed.sql.deleteAll
11+
import org.jetbrains.exposed.sql.insert
12+
import org.jetbrains.exposed.sql.transactions.transaction
413
import java.nio.file.Files
514
import java.nio.file.Path
615

16+
private object DatabaseMetadata : IntIdTable() {
17+
var version = integer("version")
18+
}
19+
20+
class DatabaseMetadataEntity(id: EntityID<Int>) : IntEntity(id) {
21+
companion object : IntEntityClass<DatabaseMetadataEntity>(DatabaseMetadata)
22+
23+
var version by DatabaseMetadata.version
24+
}
25+
726
class DatabaseService {
827

28+
companion object {
29+
const val LATEST_VERSION = 1
30+
const val DB_FILENAME = "kls_database.db"
31+
}
32+
933
var db: Database? = null
1034
private set
1135

1236
fun setup(storagePath: Path?) {
13-
val dbName = "kls_database"
37+
db = getDbFromFile(storagePath)
38+
39+
val currentVersion = transaction(db) {
40+
SchemaUtils.createMissingTablesAndColumns(DatabaseMetadata)
41+
42+
DatabaseMetadataEntity.all().firstOrNull()?.version ?: 0
43+
}
1444

15-
db = storagePath?.let {
45+
if (currentVersion < LATEST_VERSION) {
46+
LOG.info("Database has outdated version $currentVersion < $LATEST_VERSION and will be rebuilt...")
47+
48+
deleteDb(storagePath)
49+
db = getDbFromFile(storagePath)
50+
51+
transaction(db) {
52+
SchemaUtils.createMissingTablesAndColumns(DatabaseMetadata)
53+
54+
DatabaseMetadata.deleteAll()
55+
DatabaseMetadata.insert { it[version] = LATEST_VERSION }
56+
}
57+
} else {
58+
LOG.info("Database has latest version $currentVersion and will be used as-is")
59+
}
60+
}
61+
62+
private fun getDbFromFile(storagePath: Path?): Database? {
63+
return storagePath?.let {
1664
if (Files.isDirectory(it)) {
17-
Database.connect("jdbc:sqlite:${Path.of(storagePath.toString(), dbName)}.db")
65+
Database.connect("jdbc:sqlite:${getDbFilePath(it)}")
1866
} else {
1967
null
2068
}
2169
}
2270
}
71+
72+
private fun deleteDb(storagePath: Path?) {
73+
storagePath?.let { Files.deleteIfExists(getDbFilePath(it)) }
74+
}
75+
76+
private fun getDbFilePath(storagePath: Path) = Path.of(storagePath.toString(), DB_FILENAME)
2377
}

0 commit comments

Comments
 (0)