mod alias_type_map;
mod cache_ops;
mod database_ops;
mod maintenance;
mod manager;
mod model_ops;
pub use alias_type_map::{get_database_type_by_alias, register_database_alias};
pub use manager::PoolManager;
use dashmap::DashMap;
use std::sync::Arc;
use tokio::sync::RwLock;
use crate::cache::{CacheManager, CacheStats};
use crate::error::{QuickDbError, QuickDbResult};
use crate::id_generator::{IdGenerator, MongoAutoIncrementGenerator};
use crate::model::ModelMeta;
use crate::pool::{ConnectionPool, PooledConnection};
use crate::types::id_types::IdStrategy;
use crate::types::{DatabaseConfig, IdType};
use once_cell::sync::Lazy;
pub static GLOBAL_POOL_MANAGER: Lazy<PoolManager> = Lazy::new(|| PoolManager::new());
pub(crate) fn get_global_pool_manager() -> &'static PoolManager {
&GLOBAL_POOL_MANAGER
}
pub async fn add_database(config: DatabaseConfig) -> QuickDbResult<()> {
if crate::is_global_operations_locked() {
panic!("全局操作已锁定,禁止添加数据库!系统已开始执行查询操作,不允许再添加数据库配置");
}
get_global_pool_manager().add_database(config).await
}
pub async fn get_connection(alias: Option<&str>) -> QuickDbResult<PooledConnection> {
crate::lock_global_operations();
get_global_pool_manager().get_connection(alias).await
}
pub async fn release_connection(connection: &PooledConnection) -> QuickDbResult<()> {
crate::lock_global_operations();
get_global_pool_manager()
.release_connection(connection)
.await
}
pub fn get_aliases() -> Vec<String> {
get_global_pool_manager().get_aliases()
}
pub async fn set_default_alias(alias: &str) -> QuickDbResult<()> {
get_global_pool_manager().set_default_alias(alias).await
}
pub async fn health_check() -> std::collections::HashMap<String, bool> {
crate::lock_global_operations();
get_global_pool_manager().health_check().await
}
pub async fn get_active_pools_status() -> std::collections::HashMap<String, serde_json::Value> {
crate::lock_global_operations();
get_global_pool_manager().get_active_pools_status().await
}
#[cfg(feature = "python-bindings")]
#[doc(hidden)]
pub fn get_connection_pools() -> Arc<DashMap<String, Arc<ConnectionPool>>> {
get_global_pool_manager().get_connection_pools()
}
pub fn register_model(model_meta: ModelMeta) -> QuickDbResult<()> {
get_global_pool_manager().register_model(model_meta)
}
#[deprecated(note = "使用 get_model(collection_name, alias) 替代")]
pub fn get_model(collection_name: &str) -> Option<ModelMeta> {
get_global_pool_manager().get_model(collection_name)
}
pub fn get_model_with_alias(collection_name: &str, alias: &str) -> Option<ModelMeta> {
get_global_pool_manager().get_model_with_alias(collection_name, alias)
}
pub fn has_model(collection_name: &str) -> bool {
get_global_pool_manager().has_model(collection_name)
}
pub async fn ensure_table_and_indexes(collection_name: &str, alias: &str) -> QuickDbResult<()> {
get_global_pool_manager()
.ensure_table_and_indexes(collection_name, alias)
.await
}
pub fn get_cache_manager(alias: &str) -> QuickDbResult<Arc<CacheManager>> {
get_global_pool_manager().get_cache_manager(alias)
}
pub async fn get_cache_stats(alias: &str) -> QuickDbResult<CacheStats> {
crate::lock_global_operations();
get_global_pool_manager().get_cache_stats(alias).await
}
pub async fn clear_cache(alias: &str) -> QuickDbResult<()> {
crate::lock_global_operations();
get_global_pool_manager().clear_cache(alias).await
}
pub async fn clear_all_caches() -> QuickDbResult<()> {
crate::lock_global_operations();
get_global_pool_manager().clear_all_caches().await
}
pub async fn clear_cache_by_pattern(alias: &str, pattern: &str) -> QuickDbResult<usize> {
crate::lock_global_operations();
let cache_manager = get_global_pool_manager().get_cache_manager(alias)?;
cache_manager
.clear_by_pattern(pattern)
.await
.map_err(|e| QuickDbError::CacheError {
message: e.to_string(),
})
}
pub async fn clear_records_cache_batch(
alias: &str,
table: &str,
ids: &[IdType],
) -> QuickDbResult<usize> {
crate::lock_global_operations();
let cache_manager = get_global_pool_manager().get_cache_manager(alias)?;
cache_manager
.clear_records_batch(table, ids)
.await
.map_err(|e| QuickDbError::CacheError {
message: e.to_string(),
})
}
pub async fn force_cleanup_expired_cache(alias: &str) -> QuickDbResult<usize> {
crate::lock_global_operations();
let cache_manager = get_global_pool_manager().get_cache_manager(alias)?;
cache_manager
.force_cleanup_expired()
.await
.map_err(|e| QuickDbError::CacheError {
message: e.to_string(),
})
}
pub async fn list_cache_keys(
alias: &str,
) -> QuickDbResult<std::collections::HashMap<String, Vec<String>>> {
crate::lock_global_operations();
let cache_manager = get_global_pool_manager().get_cache_manager(alias)?;
cache_manager
.list_cache_keys()
.await
.map_err(|e| QuickDbError::CacheError {
message: e.to_string(),
})
}
pub async fn list_table_cache_keys(alias: &str, table: &str) -> QuickDbResult<Vec<String>> {
crate::lock_global_operations();
let cache_manager = get_global_pool_manager().get_cache_manager(alias)?;
cache_manager
.list_table_cache_keys(table)
.await
.map_err(|e| QuickDbError::CacheError {
message: e.to_string(),
})
}
pub async fn clear_table_query_cache(alias: &str, table: &str) -> QuickDbResult<usize> {
crate::lock_global_operations();
let cache_manager = get_global_pool_manager().get_cache_manager(alias)?;
cache_manager
.clear_table_query_cache(table)
.await
.map_err(|e| QuickDbError::CacheError {
message: e.to_string(),
})
}
pub async fn clear_table_record_cache(alias: &str, table: &str) -> QuickDbResult<usize> {
crate::lock_global_operations();
let cache_manager = get_global_pool_manager().get_cache_manager(alias)?;
cache_manager
.clear_table_record_cache(table)
.await
.map_err(|e| QuickDbError::CacheError {
message: e.to_string(),
})
}
pub async fn clear_table_all_cache(alias: &str, table: &str) -> QuickDbResult<usize> {
crate::lock_global_operations();
let cache_manager = get_global_pool_manager().get_cache_manager(alias)?;
let record_count = cache_manager
.clear_table_record_cache(table)
.await
.map_err(|e| QuickDbError::CacheError {
message: e.to_string(),
})?;
let query_count = cache_manager
.clear_table_query_cache(table)
.await
.map_err(|e| QuickDbError::CacheError {
message: e.to_string(),
})?;
Ok(record_count + query_count)
}
pub async fn table_exists(alias: &str, table: &str) -> QuickDbResult<bool> {
let pool_manager = get_global_pool_manager();
if !pool_manager.pools.contains_key(alias) {
return Err(QuickDbError::AliasNotFound {
alias: alias.to_string(),
});
}
let pool = pool_manager
.pools
.get(alias)
.ok_or_else(|| QuickDbError::AliasNotFound {
alias: alias.to_string(),
})?;
pool.table_exists(table).await
}
pub async fn drop_table(alias: &str, table: &str) -> QuickDbResult<()> {
crate::lock_global_operations();
let pool_manager = get_global_pool_manager();
if !pool_manager.pools.contains_key(alias) {
return Err(QuickDbError::AliasNotFound {
alias: alias.to_string(),
});
}
let pool = pool_manager
.pools
.get(alias)
.ok_or_else(|| QuickDbError::AliasNotFound {
alias: alias.to_string(),
})?;
pool.drop_table(table).await
}
pub fn get_id_strategy(alias: &str) -> QuickDbResult<IdStrategy> {
get_global_pool_manager().get_id_strategy(alias)
}
pub async fn shutdown() -> QuickDbResult<()> {
get_global_pool_manager().shutdown().await
}