diff --git a/server/src/main/kotlin/org/ccoin/config/DatabaseConfig.kt b/server/src/main/kotlin/org/ccoin/config/DatabaseConfig.kt index e69de29..b03e3dd 100644 --- a/server/src/main/kotlin/org/ccoin/config/DatabaseConfig.kt +++ b/server/src/main/kotlin/org/ccoin/config/DatabaseConfig.kt @@ -0,0 +1,77 @@ +package org.ccoin.config + +import com.zaxxer.hikari.HikariConfig +import com.zaxxer.hikari.HikariDataSource +import org.ccoin.database.Tables +import org.jetbrains.exposed.sql.Database +import org.jetbrains.exposed.sql.SchemaUtils +import org.jetbrains.exposed.sql.transactions.transaction +import org.slf4j.LoggerFactory + +object DatabaseConfig { + private val logger = LoggerFactory.getLogger(DatabaseConfig::class.java) + + fun init() { + logger.info("Initializing database connection...") + + val config = HikariConfig().apply { + driverClassName = "org.postgresql.Driver" + jdbcUrl = System.getenv("DATABASE_URL") ?: "jbdc:postgresql://localhost:5432/ccoin" + username = System.getenv("DATABASE_USER") ?: "ccoin" + password = System.getenv("DATABASE_PASSWORD") ?: "ccoin" + + // Connection pool settings + maximumPoolSize = (System.getenv("DATABASE_POOL_SIZE")?.toIntOrNull() ?: 20) + minimumIdle = 5 + connectionTimeout = 30000 + idleTimeout = 600000 + maxLifetime = 1800000 + + // Performance settings + isAutoCommit = false + transactionIsolation = "TRANSACTION_REPEATABLE_READ" + + // Connection validation + connectionTestQuery = "SELECT 1" + validationTimeout = 5000 + + // Pool name for monitoring + poolName = "CCoinPool" + } + + try { + val dataSource = HikariDataSource(config) + Database.connect(dataSource) + + logger.info("Database connection established successfully") + + // Create tables if they don't exist + createTables() + } catch(e: Exception) { + logger.error("Failed to initialize database connection", e) + throw e + } + } + + private fun createTables() { + logger.info("Creating database tables if they don't exist...") + + transaction { + SchemaUtils.create( + Tables.Wallets, + Tables.Transactions, + Tables.Blocks + ) + } + + logger.info("Database tables created/verified successfully") + } + + fun getConnectionInfo(): Map { + return mapOf( + "url" to (System.getenv("DATABASE_URL") ?: "jdbc:postgresql://localhost:5432/ccoin"), + "user" to (System.getenv("DATABASE_USER") ?: "ccoin_user"), + "poolSize" to (System.getenv("DATABASE_POOL_SIZE")?.toIntOrNull() ?: 20) + ) + } +}