|
1 | 1 | package org.javacs.kt.database
|
2 | 2 |
|
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 |
4 | 9 | import java.nio.file.Files
|
5 | 10 | import java.nio.file.Path
|
6 | 11 |
|
| 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 | + |
7 | 22 | class DatabaseService {
|
8 | 23 |
|
| 24 | + companion object { |
| 25 | + const val CURRENT_VERSION = 1 |
| 26 | + const val DB_FILENAME = "kls_database.db" |
| 27 | + } |
| 28 | + |
9 | 29 | var db: Database? = null
|
10 | 30 | private set
|
11 | 31 |
|
12 | 32 | 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 | + } |
14 | 40 |
|
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 { |
16 | 57 | if (Files.isDirectory(it)) {
|
17 |
| - Database.connect("jdbc:sqlite:${Path.of(storagePath.toString(), dbName)}.db") |
| 58 | + Database.connect("jdbc:sqlite:${getDbFilePath(it)}") |
18 | 59 | } else {
|
19 | 60 | null
|
20 | 61 | }
|
21 | 62 | }
|
22 | 63 | }
|
| 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) |
23 | 70 | }
|
0 commit comments