Documentation
use sea_orm::DatabaseConnection;
use sea_orm::{ConnectOptions, Database};
use std::sync::OnceLock;
use tracing::info;

static MYSQL: OnceLock<DatabaseConnection> = OnceLock::<DatabaseConnection>::new();

pub fn init_mysql(
    dburl: String,
    max_connections: u32,
    min_connections: u32,
    connect_timeout: u64,
    idle_timeout: u64,
    max_lifetime: u64,
    sqlx_logging: bool,
) -> &'static DatabaseConnection {
    MYSQL.get_or_init(|| {
        let mut opt = ConnectOptions::new(dburl.to_owned());
        opt.max_connections(max_connections)
            .min_connections(min_connections)
            .connect_timeout(std::time::Duration::from_secs(connect_timeout))
            .idle_timeout(std::time::Duration::from_secs(idle_timeout))
            .max_lifetime(std::time::Duration::from_secs(max_lifetime))
            .sqlx_logging(sqlx_logging);
        let conn = futures::executor::block_on(async { Database::connect(opt).await.unwrap() });
        info!("connect to mysql successfully");
        conn
    })
}

pub fn get_mysql() -> &'static DatabaseConnection {
    MYSQL.get().unwrap()
}