use itertools::Itertools;
use miette::Result;
use crate::data::tuple::Tuple;
use crate::data::value::ValidityTs;
use crate::decode_tuple_from_kv;
pub(crate) mod mem;
#[cfg(feature = "storage-rocksdb")]
pub(crate) mod rocks;
#[cfg(feature = "storage-sled")]
pub(crate) mod sled;
#[cfg(feature = "storage-sqlite")]
pub(crate) mod sqlite;
pub(crate) mod temp;
#[cfg(feature = "storage-tikv")]
pub(crate) mod tikv;
pub trait Storage<'s>: Send + Sync + Clone {
type Tx: StoreTx<'s>;
fn storage_kind(&self) -> &'static str;
fn transact(&'s self, write: bool) -> Result<Self::Tx>;
fn range_compact(&'s self, lower: &[u8], upper: &[u8]) -> Result<()>;
fn batch_put<'a>(
&'a self,
data: Box<dyn Iterator<Item = Result<(Vec<u8>, Vec<u8>)>> + 'a>,
) -> Result<()>;
}
pub trait StoreTx<'s>: Sync {
fn get(&self, key: &[u8], for_update: bool) -> Result<Option<Vec<u8>>>;
fn multi_get(&self, keys: &[Vec<u8>], for_update: bool) -> Result<Vec<Option<Vec<u8>>>> {
keys.iter().map(|k| self.get(k, for_update)).collect()
}
fn put(&mut self, key: &[u8], val: &[u8]) -> Result<()>;
fn supports_par_put(&self) -> bool;
fn par_put(&self, _key: &[u8], _val: &[u8]) -> Result<()> {
panic!("par_put is not supported")
}
fn del(&mut self, key: &[u8]) -> Result<()>;
fn par_del(&self, _key: &[u8]) -> Result<()> {
panic!("par_del is not supported")
}
fn del_range_from_persisted(&mut self, lower: &[u8], upper: &[u8]) -> Result<()>;
fn exists(&self, key: &[u8], for_update: bool) -> Result<bool>;
fn commit(&mut self) -> Result<()>;
fn range_scan_tuple<'a>(
&'a self,
lower: &[u8],
upper: &[u8],
) -> Box<dyn Iterator<Item = Result<Tuple>> + 'a>
where
's: 'a,
{
let it = self.range_scan(lower, upper);
Box::new(it.map_ok(|(k, v)| decode_tuple_from_kv(&k, &v, None)))
}
fn range_skip_scan_tuple<'a>(
&'a self,
lower: &[u8],
upper: &[u8],
valid_at: ValidityTs,
) -> Box<dyn Iterator<Item = Result<Tuple>> + 'a>;
fn range_scan<'a>(
&'a self,
lower: &[u8],
upper: &[u8],
) -> Box<dyn Iterator<Item = Result<(Vec<u8>, Vec<u8>)>> + 'a>
where
's: 'a;
fn range_count<'a>(&'a self, lower: &[u8], upper: &[u8]) -> Result<usize>
where
's: 'a;
fn total_scan<'a>(&'a self) -> Box<dyn Iterator<Item = Result<(Vec<u8>, Vec<u8>)>> + 'a>
where
's: 'a;
}