Yassine Abou
08/30/2025, 12:18 PMYassine Abou
08/30/2025, 12:20 PM// DatabaseFactory.kt
object DatabaseFactory {
fun init() {
val database = Database.connect(hikari())
transaction(database) {
// Create tables if they don't exist
SchemaUtils.create(
UsersTable,
ChatsTable,
GeneratedImagesTable,
ChatMessagesTable
)
}
}
private fun hikari(): HikariDataSource {
val config = HikariConfig().apply {
driverClassName = "org.postgresql.Driver"
jdbcUrl = System.getenv("DATABASE_URL") ?: "jdbc:<postgresql://localhost:5432/your_db_name|postgresql://localhost:5432/your_db_name>"
username = System.getenv("DATABASE_USER") ?: "postgres"
password = System.getenv("DATABASE_PASSWORD") ?: "password"
maximumPoolSize = 3
isAutoCommit = false
transactionIsolation = "TRANSACTION_REPEATABLE_READ"
validate()
}
return HikariDataSource(config)
}
suspend fun <T> dbQuery(block: suspend () -> T): T =
newSuspendedTransaction(<http://Dispatchers.IO|Dispatchers.IO>) { block() }
}
After: My Attempt at an R2DBC Setup
// DatabaseFactory.kt
object DatabaseFactory {
private val database: R2dbcDatabase by lazy {
val r2dbcUrl = buildR2dbcUrl()
R2dbcDatabase.connect(
url = r2dbcUrl,
user = System.getenv("DATABASE_USER") ?: "postgres",
password = System.getenv("DATABASE_PASSWORD") ?: "password"
)
}
suspend fun init() {
// Schema creation in a suspended transaction
suspendTransaction(<http://Dispatchers.IO|Dispatchers.IO>, db = database) {
SchemaUtils.create(
UsersTable,
ChatsTable,
GeneratedImagesTable,
ChatMessagesTable
)
}
}
private fun buildR2dbcUrl(): String {
val jdbcUrl = System.getenv("DATABASE_URL") ?: "jdbc:<postgresql://localhost:5432/your_db_name|postgresql://localhost:5432/your_db_name>"
// Handle different JDBC URL formats
return if (jdbcUrl.startsWith("jdbc:postgresql://")) {
jdbcUrl.replace("jdbc:postgresql://", "r2dbc:postgresql://")
} else {
// Fallback to default R2DBC URL
"r2dbc:<postgresql://localhost:5432/your_db_name|postgresql://localhost:5432/your_db_name>"
}
}
suspend fun <T> dbQuery(block: suspend () -> T): T =
suspendTransaction(<http://Dispatchers.IO|Dispatchers.IO>, db = database) { block() }
}
Aleksei Tirman [JB]
09/01/2025, 8:05 AM