use crate::db::{DbConnConfig, DbError};
use log::debug;
use robotech_macros::log_call;
use sea_orm::{ConnectOptions, Database, DbConn};
use std::sync::{Arc, RwLock};
static DB_CONN: RwLock<Option<Arc<DbConn>>> = RwLock::new(None);
pub fn get_db_conn() -> Result<Arc<DbConn>, DbError> {
let read_lock = DB_CONN.read().map_err(|_| DbError::GetDbConn())?;
read_lock.clone().ok_or(DbError::GetDbConn())
}
pub fn set_db_conn(value: DbConn) -> Result<(), DbError> {
let mut write_lock = DB_CONN.write().map_err(|_| DbError::SetDbConn())?;
*write_lock = Some(Arc::new(value));
Ok(())
}
#[log_call]
pub async fn init_db_conn(db_conn_config: DbConnConfig) -> Result<(), DbError> {
debug!("init database...");
if db_conn_config.url.is_empty() {
Err(DbError::Config(
"db.url (database connection string) item has not been configured yet".to_string(),
))?;
}
let mut opt = ConnectOptions::new(db_conn_config.url);
opt.sqlx_logging_level(db_conn_config.log_level);
let connection = Database::connect(opt).await.map_err(DbError::Connect)?;
set_db_conn(connection)
}