use std::sync::{Arc, OnceLock};
use std::time::Duration;
use sea_orm::{ConnectOptions, Database, DatabaseConnection};
use serde::{Deserialize, Serialize};
use crate::log::log;
use crate::log::log::LogConfig;
pub static DATABASE: OnceLock<Arc<DatabaseConnection>> = OnceLock::new();
pub static REDIS_ASYNC_POOL: OnceLock<Arc<deadpool_redis::Pool>> = OnceLock::new();
#[derive(Deserialize, Serialize, Debug)]
pub struct DatasourceConfig {
pub url: String,
pub max_connections:u32,
pub min_connections:u32,
pub connect_timeout: u64,
pub idle_timeout: u64,
pub max_lifetime: u64,
}
#[derive(Deserialize, Serialize, Debug)]
pub struct RedisConfig {
pub url: String,
pub max_size: u32,
pub min_idle: u32,
}
pub fn redis_conn(config: &RedisConfig) {
let cfg = deadpool_redis::Config::from_url(config.url.clone());
let async_pool = cfg.builder().expect("创建 Redis 异步连接池构建器失败")
.max_size(config.max_size as usize)
.build()
.expect("创建异步 Redis 连接池失败");
REDIS_ASYNC_POOL.get_or_init(move || Arc::new(async_pool));
}
pub async fn db_conn(db: &DatasourceConfig, log: &LogConfig) {
let mut opt = ConnectOptions::new(db.url.clone());
opt.max_connections(db.max_connections)
.min_connections(db.min_connections)
.connect_timeout(Duration::from_secs(db.connect_timeout))
.idle_timeout(Duration::from_secs(db.idle_timeout))
.max_lifetime(Duration::from_secs(db.max_lifetime))
.sqlx_logging(log.debug)
.sqlx_logging_level(log::log_orm_level(log.level.as_str()));
let db_connect: DatabaseConnection = Database::connect(opt).await.expect("Failed to connect to the database");
DATABASE.set(Arc::new(db_connect)).expect("设置数据库连接全局变量失败");
}