use_prelude!();
#[doc(hidden)]
pub mod document;
pub use self::document::{DittoDocument, DittoMutDocument};
#[doc(hidden)]
pub mod document_id;
pub use self::document_id::DocumentId;
#[doc(hidden)]
pub mod pending_cursor_operation;
pub use self::pending_cursor_operation::PendingCursorOperation;
#[doc(hidden)]
pub mod pending_id_specific_operation;
pub use self::pending_id_specific_operation::PendingIdSpecificOperation;
#[doc(hidden)]
pub mod type_traits;
pub use self::type_traits::MutableValue;
use crate::{
ditto::WeakDittoHandleWrapper,
error::{DittoError, ErrorKind},
store::attachment::{
DittoAttachment, DittoAttachmentFetchEvent, DittoAttachmentFetcher, DittoAttachmentToken,
FetcherVersion,
},
};
#[derive(Clone, Debug)]
pub struct Collection {
pub(crate) ditto: WeakDittoHandleWrapper,
pub(crate) collection_name: char_p::Box,
}
impl Collection {
pub(crate) fn new(ditto: WeakDittoHandleWrapper, collection_name: String) -> Self {
let collection_name = char_p::new(collection_name.as_str());
Self {
ditto,
collection_name,
}
}
pub fn name(&self) -> &str {
self.collection_name.as_ref().to_str()
}
pub fn find_all(&self) -> PendingCursorOperation<'_> {
self.find("true")
}
pub fn find(&self, query: &'_ str) -> PendingCursorOperation<'_> {
#[allow(deprecated)]
PendingCursorOperation::<'_>::new(
self.ditto.clone(),
self.collection_name.to_owned(),
query,
None,
)
}
pub fn find_with_args<V: ::serde::Serialize, C: Borrow<V>>(
&self,
query: &'_ str,
query_args: C,
) -> PendingCursorOperation<'_> {
#[allow(deprecated)]
PendingCursorOperation::<'_>::new(
self.ditto.clone(),
self.collection_name.to_owned(),
query,
Some(serde_cbor::to_vec(query_args.borrow()).unwrap()),
)
}
pub fn find_by_id(&self, doc_id: impl Into<DocumentId>) -> PendingIdSpecificOperation {
PendingIdSpecificOperation {
ditto: self.ditto.clone(),
collection_name: self.collection_name.to_owned(),
doc_id: doc_id.into(),
}
}
}
impl From<&DocumentId> for DocumentId {
fn from(doc: &DocumentId) -> Self {
doc.clone()
}
}
impl Collection {
pub fn upsert<V: ::serde::Serialize, C: Borrow<V>>(
&self,
content: C,
) -> Result<DocumentId, DittoError> {
self.insert_cbor(
::serde_cbor::to_vec(content.borrow()).unwrap().as_slice(),
WriteStrategy::Merge,
None,
)
}
pub fn upsert_with_strategy<V: ::serde::Serialize, C: Borrow<V>>(
&self,
content: C,
write_strategy: WriteStrategy,
) -> Result<DocumentId, DittoError> {
self.insert_cbor(
::serde_cbor::to_vec(content.borrow()).unwrap().as_slice(),
write_strategy,
None,
)
}
pub(crate) fn insert_cbor(
&self,
cbor: &'_ [u8],
write_strategy: WriteStrategy,
write_txn: Option<&'_ mut ffi_sdk::CWriteTransaction>,
) -> Result<DocumentId, DittoError> {
let ditto = self
.ditto
.upgrade()
.ok_or(crate::error::ErrorKind::ReleasedDittoInstance)?;
let write_strategy_rs = write_strategy.as_write_strategy_rs();
let hint: Option<char_p::Ref<'_>> = None;
let id = {
ffi_sdk::ditto_collection_insert_value(
&*ditto,
self.collection_name.as_ref(),
cbor.into(),
write_strategy_rs,
hint,
write_txn,
)
}
.ok_or(ErrorKind::InvalidInput)?;
Ok(id.to::<Box<[u8]>>().into())
}
#[doc(hidden)]
#[deprecated = "Use `ditto.store().new_attachment()` instead"]
pub fn new_attachment<P: AsRef<Path>>(
&self,
filepath: P,
metadata: HashMap<String, String>,
) -> Result<DittoAttachment, DittoError> {
let ditto = &self
.ditto
.upgrade()
.ok_or(crate::error::ErrorKind::ReleasedDittoInstance)?;
DittoAttachment::from_file_and_metadata(&filepath, metadata, ditto)
}
#[doc(hidden)]
#[deprecated = "Use `ditto.store().fetch_attachment()` instead"]
pub fn fetch_attachment<'a>(
&self,
attachment_token: DittoAttachmentToken,
on_fetch_event: impl 'a + Send + Sync + Fn(DittoAttachmentFetchEvent),
) -> Result<DittoAttachmentFetcher<'a, FetcherVersion::V1>, DittoError> {
let ditto = self
.ditto
.upgrade()
.ok_or(crate::error::ErrorKind::ReleasedDittoInstance)?;
DittoAttachmentFetcher::new(attachment_token, None, &ditto, move |ev, _| {
on_fetch_event(ev)
})
}
}