mycommon-utils 0.2.1

Common utilities library for database operations, Redis caching and system utilities
Documentation
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,
}

/// 初始化 Redis 连接池(同步和异步)
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("设置数据库连接全局变量失败");
}