use std::sync::Arc;
use bytes::Bytes;
use slatedb::{ByteRangeBounds, DbIterator, DbReader, DbTransaction};
#[derive(Clone, Copy)]
pub(crate) enum ReadHandle<'a> {
Tx(&'a DbTransaction),
Reader(&'a DbReader),
}
impl ReadHandle<'_> {
pub(crate) async fn get<K: AsRef<[u8]> + Send>(
&self,
key: K,
) -> Result<Option<Bytes>, slatedb::Error> {
match self {
Self::Tx(tx) => tx.get(key).await,
Self::Reader(reader) => reader.get(key).await,
}
}
pub(crate) async fn scan_prefix<P, T>(
&self,
prefix: P,
subrange: T,
) -> Result<DbIterator, slatedb::Error>
where
P: AsRef<[u8]> + Send,
T: ByteRangeBounds + Send,
{
match self {
Self::Tx(tx) => tx.scan_prefix(prefix, subrange).await,
Self::Reader(reader) => reader.scan_prefix(prefix, subrange).await,
}
}
}
pub(crate) enum ReadSession {
Tx(DbTransaction),
Reader(Arc<DbReader>),
}
impl ReadSession {
pub(crate) fn handle(&self) -> ReadHandle<'_> {
match self {
Self::Tx(tx) => ReadHandle::Tx(tx),
Self::Reader(reader) => ReadHandle::Reader(reader),
}
}
pub(crate) fn finish(self) {
if let Self::Tx(tx) = self {
tx.rollback();
}
}
}