use std::{sync::OnceLock, time::Duration};
use sqlx::{postgres::PgPoolOptions, Pool, Postgres};
static POOL: OnceLock<Pool<Postgres>> = OnceLock::new();
const EVERSAL: &str = "eversal";
pub async fn initialize() -> Result<(), sqlx::Error> {
log::info!("Setting up database pool...");
let db_user = std::env::var("DATABASE_USER").unwrap_or(EVERSAL.to_string());
let db_password = std::env::var("DATABASE_PASSWORD").expect("DATABASE_PASSWORD must be set");
let db_host: String = std::env::var("DATABASE_HOST").expect("DATABASE_HOST must be set");
let db_port = std::env::var("DATABASE_PORT").unwrap_or("5432".to_string());
let db_name = std::env::var("DATABASE_NAME").unwrap_or(EVERSAL.to_string());
let pool = PgPoolOptions::new()
.max_connections(5)
.acquire_timeout(Duration::from_secs(30))
.connect(&format!(
"postgres://{}:{}@{}:{}/{}",
db_user, db_password, db_host, db_port, db_name
))
.await?;
match POOL.set(pool) {
Ok(_) => {}
Err(_) => {
log::warn!("Database pool already initialized");
}
}
log::info!("Database pool initialized");
Ok(())
}
pub fn pool() -> &'static Pool<Postgres> {
POOL.get().unwrap()
}