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
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()
}