summaryrefslogtreewikicommitdiff
path: root/core/src/db/Driver.kt
blob: c30e5c1bc9735cbdecc9aa1b2c82626018870c1d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package cat.freya.khs.db

import cat.freya.khs.Khs
import cat.freya.khs.config.DatabaseConfig
import cat.freya.khs.config.DatabaseType
import com.zaxxer.hikari.HikariConfig
import com.zaxxer.hikari.HikariDataSource
import javax.sql.DataSource

abstract class Driver {
    abstract val driverClass: String

    abstract fun jdbcUrl(): String

    abstract fun configure(hikari: HikariConfig)

    fun connect(): DataSource {
        // load driver for some reason
        Class.forName(driverClass)

        val cores = Runtime.getRuntime().availableProcessors()
        val hikari =
            HikariConfig().apply {
                jdbcUrl = jdbcUrl()
                driverClassName = driverClass
                maximumPoolSize = minOf(cores, 8)
                configure(this)
            }
        return HikariDataSource(hikari)
    }
}

class SqliteDriver(val path: String) : Driver() {
    override val driverClass = "org.sqlite.JDBC"

    override fun jdbcUrl(): String {
        return "jdbc:sqlite:$path"
    }

    override fun configure(hikari: HikariConfig) {
        // sqlite is single threaded
        hikari.maximumPoolSize = 1
    }
}

class MysqlDriver(val config: DatabaseConfig) : Driver() {
    override val driverClass = "com.mysql.cj.jdbc.Driver"

    override fun jdbcUrl(): String {
        val port = config.port ?: 3006u
        return "jdbc:mysql://${config.host}:${port}/${config.database}"
    }

    override fun configure(hikari: HikariConfig) {
        hikari.username = config.username
        hikari.password = config.password
    }
}

class PostgresDriver(val config: DatabaseConfig) : Driver() {
    override val driverClass = "org.postgresql.Driver"

    override fun jdbcUrl(): String {
        val port = config.port ?: 5432u
        return "jdbc:postgresql://${config.host}:${port}/${config.database}"
    }

    override fun configure(hikari: HikariConfig) {
        hikari.username = config.username
        hikari.password = config.password
    }
}

fun getDriver(plugin: Khs): Driver =
    when (plugin.config.database.type) {
        DatabaseType.SQLITE -> SqliteDriver(plugin.shim.sqliteDatabasePath)
        DatabaseType.MYSQL -> MysqlDriver(plugin.config.database)
        DatabaseType.POSTGRES -> PostgresDriver(plugin.config.database)
    }