|
1 | 1 | package org.javacs.kt.database
|
2 | 2 |
|
| 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 |
3 | 8 | 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 |
4 | 13 | import java.nio.file.Files
|
5 | 14 | import java.nio.file.Path
|
6 | 15 |
|
| 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 | + |
7 | 26 | class DatabaseService {
|
8 | 27 |
|
| 28 | + companion object { |
| 29 | + const val LATEST_VERSION = 1 |
| 30 | + const val DB_FILENAME = "kls_database.db" |
| 31 | + } |
| 32 | + |
9 | 33 | var db: Database? = null
|
10 | 34 | private set
|
11 | 35 |
|
12 | 36 | 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 | + } |
14 | 44 |
|
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 { |
16 | 64 | if (Files.isDirectory(it)) {
|
17 |
| - Database.connect("jdbc:sqlite:${Path.of(storagePath.toString(), dbName)}.db") |
| 65 | + Database.connect("jdbc:sqlite:${getDbFilePath(it)}") |
18 | 66 | } else {
|
19 | 67 | null
|
20 | 68 | }
|
21 | 69 | }
|
22 | 70 | }
|
| 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) |
23 | 77 | }
|
0 commit comments