use_prelude!();
use collection::ScopedCollection;
use super::collection::document_id::DocumentId;
mod collection;
use marker::InvariantLifetime as TypeLevelId;
pub struct ScopedStore<'batch> {
txn: &'batch mut ffi_sdk::CWriteTransaction,
store: &'batch Store,
results: &'batch mut Vec<WriteTransactionResult>,
_txn_id: TypeLevelId<'batch>,
}
pub(super) fn with_batched_write<F>(
store: &Store, f: F,
) -> Result<Vec<WriteTransactionResult>, super::DittoError>
where
for<'batch> F: FnOnce(ScopedStore<'batch>) -> Action<'batch>,
{
use super::*;
let hint: Option<char_p::Ref<'_>> = None;
let mut txn = ffi_sdk::ditto_write_transaction(&*store.ditto, hint).ok()?;
let mut results = vec![];
let batch = ScopedStore {
txn: &mut *txn,
store, results: &mut results,
_txn_id: TypeLevelId::default(),
};
match f(batch).0 {
ActionKind::Commit => {
let status = ffi_sdk::ditto_write_transaction_commit(&*store.ditto, txn);
if status != 0 {
return Err(DittoError::from_ffi(ErrorKind::Internal));
}
}
ActionKind::Rollback => {
ffi_sdk::ditto_write_transaction_rollback(&*store.ditto, txn);
}
}
Ok(results)
}
pub struct Action<'batch>(ActionKind, TypeLevelId<'batch>);
enum ActionKind {
Commit,
Rollback,
}
impl<'batch> ScopedStore<'batch> {
pub fn commit_changes(self: ScopedStore<'batch>) -> Action<'batch> {
Action(ActionKind::Commit, TypeLevelId::default())
}
pub fn revert_changes(self: ScopedStore<'batch>) -> Action<'batch> {
Action(ActionKind::Rollback, TypeLevelId::default())
}
pub fn collection<'coll>(
self: &'coll mut ScopedStore<'batch>,
collection_name: &'_ str,
) -> ScopedCollection<'coll, 'batch> {
let c_name = char_p::new(collection_name);
ScopedCollection {
batch: self,
collection_name: c_name,
}
}
}
pub struct WriteTransactionResult {
pub collection_name: char_p::Box,
pub doc_id: DocumentId,
pub kind: DocChangeKind,
}
#[derive(Debug, PartialEq, Eq)]
pub enum DocChangeKind {
Inserted,
Removed,
Evicted,
Updated,
}