use crate::error::QuickDbResult;
use crate::odm::manager_core::AsyncOdmManager;
use crate::odm::traits::OdmOperations;
use crate::types::*;
use std::collections::HashMap;
static ASYNC_ODM_MANAGER: once_cell::sync::Lazy<tokio::sync::RwLock<AsyncOdmManager>> =
once_cell::sync::Lazy::new(|| tokio::sync::RwLock::new(AsyncOdmManager::new()));
pub async fn get_odm_manager() -> tokio::sync::RwLockReadGuard<'static, AsyncOdmManager> {
ASYNC_ODM_MANAGER.read().await
}
pub async fn get_odm_manager_mut() -> tokio::sync::RwLockWriteGuard<'static, AsyncOdmManager> {
ASYNC_ODM_MANAGER.write().await
}
#[doc(hidden)]
pub async fn create(
collection: &str,
data: HashMap<String, DataValue>,
alias: Option<&str>,
) -> QuickDbResult<DataValue> {
crate::lock_global_operations();
let manager = get_odm_manager().await;
manager.create(collection, data, alias).await
}
#[doc(hidden)]
pub async fn find_by_id(
collection: &str,
id: &str,
alias: Option<&str>,
) -> QuickDbResult<Option<DataValue>> {
crate::lock_global_operations();
let manager = get_odm_manager().await;
manager.find_by_id(collection, id, alias).await
}
#[doc(hidden)]
pub async fn find_with_cache_control(
collection: &str,
conditions: Vec<QueryConditionWithConfig>,
options: Option<QueryOptions>,
alias: Option<&str>,
bypass_cache: bool,
) -> QuickDbResult<Vec<DataValue>> {
crate::lock_global_operations();
let manager = get_odm_manager().await;
manager.find_with_cache_control(collection, conditions, options, alias, bypass_cache).await
}
#[doc(hidden)]
pub async fn find(
collection: &str,
conditions: Vec<QueryConditionWithConfig>,
options: Option<QueryOptions>,
alias: Option<&str>,
) -> QuickDbResult<Vec<DataValue>> {
find_with_cache_control(collection, conditions, options, alias, false).await
}
#[doc(hidden)]
pub async fn find_with_groups_with_cache_control(
collection: &str,
condition_groups: Vec<QueryConditionGroupWithConfig>,
options: Option<QueryOptions>,
alias: Option<&str>,
bypass_cache: bool,
) -> QuickDbResult<Vec<DataValue>> {
crate::lock_global_operations();
let manager = get_odm_manager().await;
manager
.find_with_groups_with_cache_control_and_config(collection, condition_groups, options, alias, bypass_cache)
.await
}
#[doc(hidden)]
pub async fn find_with_groups(
collection: &str,
condition_groups: Vec<QueryConditionGroup>,
options: Option<QueryOptions>,
alias: Option<&str>,
) -> QuickDbResult<Vec<DataValue>> {
let condition_groups_with_config: Vec<QueryConditionGroupWithConfig> = condition_groups
.into_iter()
.map(|g| g.into())
.collect();
find_with_groups_with_cache_control(collection, condition_groups_with_config, options, alias, false).await
}
#[doc(hidden)]
pub async fn update(
collection: &str,
conditions: Vec<QueryConditionWithConfig>,
updates: HashMap<String, DataValue>,
alias: Option<&str>,
) -> QuickDbResult<u64> {
crate::lock_global_operations();
let manager = get_odm_manager().await;
manager.update(collection, conditions, updates, alias).await
}
#[doc(hidden)]
pub async fn update_by_id(
collection: &str,
id: &str,
updates: HashMap<String, DataValue>,
alias: Option<&str>,
) -> QuickDbResult<bool> {
crate::lock_global_operations();
let manager = get_odm_manager().await;
manager.update_by_id(collection, id, updates, alias).await
}
#[doc(hidden)]
pub async fn update_with_operations(
collection: &str,
conditions: Vec<QueryConditionWithConfig>,
operations: Vec<crate::types::UpdateOperation>,
alias: Option<&str>,
) -> QuickDbResult<u64> {
crate::lock_global_operations();
let manager = get_odm_manager().await;
manager
.update_with_operations(collection, conditions, operations, alias)
.await
}
#[doc(hidden)]
pub async fn delete(
collection: &str,
conditions: Vec<QueryConditionWithConfig>,
alias: Option<&str>,
) -> QuickDbResult<u64> {
crate::lock_global_operations();
let manager = get_odm_manager().await;
manager.delete(collection, conditions, alias).await
}
#[doc(hidden)]
pub async fn delete_by_id(collection: &str, id: &str, alias: Option<&str>) -> QuickDbResult<bool> {
crate::lock_global_operations();
let manager = get_odm_manager().await;
manager.delete_by_id(collection, id, alias).await
}
#[doc(hidden)]
pub async fn count(
collection: &str,
conditions: Vec<QueryConditionWithConfig>,
alias: Option<&str>,
) -> QuickDbResult<u64> {
crate::lock_global_operations();
let manager = get_odm_manager().await;
manager.count(collection, conditions, alias).await
}
#[doc(hidden)]
pub async fn count_with_groups(
collection: &str,
condition_groups: Vec<QueryConditionGroupWithConfig>,
alias: Option<&str>,
) -> QuickDbResult<u64> {
crate::lock_global_operations();
let manager = get_odm_manager().await;
manager.count_with_groups_with_config(collection, condition_groups, alias).await
}
pub async fn get_server_version(alias: Option<&str>) -> QuickDbResult<String> {
crate::lock_global_operations();
let manager = get_odm_manager().await;
manager.get_server_version(alias).await
}
pub async fn create_stored_procedure(
config: crate::stored_procedure::StoredProcedureConfig,
) -> QuickDbResult<crate::stored_procedure::StoredProcedureCreateResult> {
let manager = get_odm_manager().await;
manager.create_stored_procedure(config).await
}
pub async fn execute_stored_procedure(
procedure_name: &str,
database_alias: Option<&str>,
params: Option<std::collections::HashMap<String, crate::types::DataValue>>,
) -> QuickDbResult<crate::stored_procedure::StoredProcedureQueryResult> {
let manager = get_odm_manager().await;
manager
.execute_stored_procedure(procedure_name, database_alias, params)
.await
}