diff options
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/options/StorageOptions.kt')
-rw-r--r-- | src/main/kotlin/io/dico/parcels2/options/StorageOptions.kt | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/options/StorageOptions.kt b/src/main/kotlin/io/dico/parcels2/options/StorageOptions.kt new file mode 100644 index 0000000..639be9d --- /dev/null +++ b/src/main/kotlin/io/dico/parcels2/options/StorageOptions.kt @@ -0,0 +1,45 @@ +package io.dico.parcels2.options + +import com.zaxxer.hikari.HikariDataSource +import io.dico.parcels2.logger +import io.dico.parcels2.storage.Storage +import io.dico.parcels2.storage.StorageWithCoroutineBacking +import io.dico.parcels2.storage.exposed.ExposedBacking +import io.dico.parcels2.storage.getHikariConfig + +object StorageOptionsFactories : PolymorphicOptionsFactories<Storage>("dialect", StorageOptions::class, ConnectionStorageFactory()) + +class StorageOptions(dialect: String, options: Any) : SimplePolymorphicOptions<Storage>(dialect, options, StorageOptionsFactories) + +private class ConnectionStorageFactory : PolymorphicOptionsFactory<Storage> { + override val optionsClass = DataConnectionOptions::class + override val supportedKeys: List<String> = listOf("postgresql", "mariadb") + + override fun newInstance(key: String, options: Any, vararg extra: Any?): Storage { + val hikariConfig = getHikariConfig(key, options as DataConnectionOptions) + val dataSourceFactory = suspend { HikariDataSource(hikariConfig) } + return StorageWithCoroutineBacking(ExposedBacking(dataSourceFactory)) + } +} + +data class DataConnectionOptions(val address: String = "localhost", + val database: String = "parcels", + val username: String = "root", + val password: String = "", + val poolSize: Int = 4) { + + fun splitAddressAndPort(defaultPort: Int = 3306): Pair<String, Int>? { + val idx = address.indexOf(":").takeUnless { it == -1 } ?: return Pair(address, defaultPort) + + val addressName = address.substring(0, idx).takeUnless { it.isBlank() } ?: return null.also { + logger.error("(Invalidly) blank address in data storage options") + } + + val port = address.substring(idx + 1).toIntOrNull() ?: return null.also { + logger.error("Invalid port number in data storage options: $it, using $defaultPort as default") + } + + return Pair(addressName, port) + } + +}
\ No newline at end of file |