#[cfg(test)]
use crate::db::{DataStore, IndexStore};
use crate::{
db::{DbSession, PersistedRow, WriteBatchResponse, data::UpdatePatch, executor::MutationMode},
error::InternalError,
traits::{CanisterKind, EntityValue},
};
impl<C: CanisterKind> DbSession<C> {
pub fn insert<E>(&self, entity: E) -> Result<E, InternalError>
where
E: PersistedRow<Canister = C> + EntityValue,
{
self.execute_save_entity(|save| save.insert(entity))
}
pub fn insert_many_atomic<E>(
&self,
entities: impl IntoIterator<Item = E>,
) -> Result<WriteBatchResponse<E>, InternalError>
where
E: PersistedRow<Canister = C> + EntityValue,
{
self.execute_save_batch(|save| save.insert_many_atomic(entities))
}
pub fn insert_many_non_atomic<E>(
&self,
entities: impl IntoIterator<Item = E>,
) -> Result<WriteBatchResponse<E>, InternalError>
where
E: PersistedRow<Canister = C> + EntityValue,
{
self.execute_save_batch(|save| save.insert_many_non_atomic(entities))
}
pub fn replace<E>(&self, entity: E) -> Result<E, InternalError>
where
E: PersistedRow<Canister = C> + EntityValue,
{
self.execute_save_entity(|save| save.replace(entity))
}
pub fn mutate_structural<E>(
&self,
key: E::Key,
patch: UpdatePatch,
mode: MutationMode,
) -> Result<E, InternalError>
where
E: PersistedRow<Canister = C> + EntityValue,
{
self.execute_save_entity(|save| save.apply_structural_mutation(mode, key, patch))
}
#[allow(dead_code)]
pub(in crate::db) fn replace_structural<E>(
&self,
key: E::Key,
patch: UpdatePatch,
) -> Result<E, InternalError>
where
E: PersistedRow<Canister = C> + EntityValue,
{
self.mutate_structural(key, patch, MutationMode::Replace)
}
pub fn replace_many_atomic<E>(
&self,
entities: impl IntoIterator<Item = E>,
) -> Result<WriteBatchResponse<E>, InternalError>
where
E: PersistedRow<Canister = C> + EntityValue,
{
self.execute_save_batch(|save| save.replace_many_atomic(entities))
}
pub fn replace_many_non_atomic<E>(
&self,
entities: impl IntoIterator<Item = E>,
) -> Result<WriteBatchResponse<E>, InternalError>
where
E: PersistedRow<Canister = C> + EntityValue,
{
self.execute_save_batch(|save| save.replace_many_non_atomic(entities))
}
pub fn update<E>(&self, entity: E) -> Result<E, InternalError>
where
E: PersistedRow<Canister = C> + EntityValue,
{
self.execute_save_entity(|save| save.update(entity))
}
#[allow(dead_code)]
pub(in crate::db) fn insert_structural<E>(
&self,
key: E::Key,
patch: UpdatePatch,
) -> Result<E, InternalError>
where
E: PersistedRow<Canister = C> + EntityValue,
{
self.mutate_structural(key, patch, MutationMode::Insert)
}
#[allow(dead_code)]
pub(in crate::db) fn update_structural<E>(
&self,
key: E::Key,
patch: UpdatePatch,
) -> Result<E, InternalError>
where
E: PersistedRow<Canister = C> + EntityValue,
{
self.mutate_structural(key, patch, MutationMode::Update)
}
pub fn update_many_atomic<E>(
&self,
entities: impl IntoIterator<Item = E>,
) -> Result<WriteBatchResponse<E>, InternalError>
where
E: PersistedRow<Canister = C> + EntityValue,
{
self.execute_save_batch(|save| save.update_many_atomic(entities))
}
pub fn update_many_non_atomic<E>(
&self,
entities: impl IntoIterator<Item = E>,
) -> Result<WriteBatchResponse<E>, InternalError>
where
E: PersistedRow<Canister = C> + EntityValue,
{
self.execute_save_batch(|save| save.update_many_non_atomic(entities))
}
#[cfg(test)]
#[doc(hidden)]
pub fn clear_stores_for_tests(&self) {
self.db.with_store_registry(|reg| {
for (_, store) in reg.iter() {
store.with_data_mut(DataStore::clear);
store.with_index_mut(IndexStore::clear);
}
});
}
}