use crate::errors::Result;
use crate::operation::Operation;
use std::collections::HashMap;
use uuid::Uuid;
#[cfg(test)]
mod test;
mod config;
mod inmemory;
pub(crate) mod sqlite;
pub use config::{AccessMode, StorageConfig};
#[doc(hidden)]
pub use crate::Operation as ReplicaOp;
pub type TaskMap = HashMap<String, String>;
#[cfg(test)]
pub(crate) fn taskmap_with(mut properties: Vec<(String, String)>) -> TaskMap {
let mut rv = TaskMap::new();
for (p, v) in properties.drain(..) {
rv.insert(p, v);
}
rv
}
use crate::server::VersionId;
const DEFAULT_BASE_VERSION: Uuid = crate::server::NIL_VERSION_ID;
pub trait StorageTxn {
fn get_task(&mut self, uuid: Uuid) -> Result<Option<TaskMap>>;
fn get_pending_tasks(&mut self) -> Result<Vec<(Uuid, TaskMap)>>;
fn create_task(&mut self, uuid: Uuid) -> Result<bool>;
fn set_task(&mut self, uuid: Uuid, task: TaskMap) -> Result<()>;
fn delete_task(&mut self, uuid: Uuid) -> Result<bool>;
fn all_tasks(&mut self) -> Result<Vec<(Uuid, TaskMap)>>;
fn all_task_uuids(&mut self) -> Result<Vec<Uuid>>;
fn base_version(&mut self) -> Result<VersionId>;
fn set_base_version(&mut self, version: VersionId) -> Result<()>;
fn get_task_operations(&mut self, uuid: Uuid) -> Result<Vec<Operation>>;
fn unsynced_operations(&mut self) -> Result<Vec<Operation>>;
fn num_unsynced_operations(&mut self) -> Result<usize>;
fn add_operation(&mut self, op: Operation) -> Result<()>;
fn remove_operation(&mut self, op: Operation) -> Result<()>;
fn sync_complete(&mut self) -> Result<()>;
fn get_working_set(&mut self) -> Result<Vec<Option<Uuid>>>;
fn add_to_working_set(&mut self, uuid: Uuid) -> Result<usize>;
fn set_working_set_item(&mut self, index: usize, uuid: Option<Uuid>) -> Result<()>;
fn clear_working_set(&mut self) -> Result<()>;
#[allow(clippy::wrong_self_convention)] fn is_empty(&mut self) -> Result<bool> {
let mut empty = true;
empty = empty && self.all_tasks()?.is_empty();
empty = empty && self.get_working_set()? == vec![None];
empty = empty && self.base_version()? == Uuid::nil();
empty = empty && self.unsynced_operations()?.is_empty();
Ok(empty)
}
fn commit(&mut self) -> Result<()>;
}
pub trait Storage {
fn txn<'a>(&'a mut self) -> Result<Box<dyn StorageTxn + 'a>>;
}