use std::borrow::Borrow;
use redb::{
AccessGuard, Key, MultimapRange, MultimapTable, MultimapTableDefinition, MultimapValue, Range,
ReadOnlyMultimapTable, ReadOnlyTable, ReadTransaction, ReadableMultimapTable, ReadableTable,
Table, TableDefinition, Value, WriteTransaction,
};
use crate::error::StorageError;
#[derive(Clone, Copy)]
pub enum Txn<'a> {
Write(&'a WriteTransaction),
Read(&'a ReadTransaction),
}
impl<'a> Txn<'a> {
pub fn open_table<K: Key + 'static, V: Value + 'static>(
&self,
def: TableDefinition<K, V>,
) -> Result<TableHandle<'a, K, V>, StorageError> {
Ok(match self {
Txn::Write(w) => TableHandle::Write(w.open_table(def)?),
Txn::Read(r) => TableHandle::Read(r.open_table(def)?),
})
}
pub fn open_multimap_table<K: Key + 'static, V: Key + 'static>(
&self,
def: MultimapTableDefinition<K, V>,
) -> Result<MultimapTableHandle<'a, K, V>, StorageError> {
Ok(match self {
Txn::Write(w) => MultimapTableHandle::Write(w.open_multimap_table(def)?),
Txn::Read(r) => MultimapTableHandle::Read(r.open_multimap_table(def)?),
})
}
}
pub enum TableHandle<'a, K: Key + 'static, V: Value + 'static> {
Write(Table<'a, K, V>),
Read(ReadOnlyTable<K, V>),
}
impl<'a, K: Key + 'static, V: Value + 'static> TableHandle<'a, K, V> {
pub fn get<'k>(
&self,
key: impl Borrow<K::SelfType<'k>>,
) -> Result<Option<AccessGuard<'_, V>>, StorageError> {
Ok(match self {
TableHandle::Write(t) => t.get(key)?,
TableHandle::Read(t) => t.get(key)?,
})
}
pub fn iter(&self) -> Result<Range<'_, K, V>, StorageError> {
Ok(match self {
TableHandle::Write(t) => t.iter()?,
TableHandle::Read(t) => t.iter()?,
})
}
}
pub enum MultimapTableHandle<'a, K: Key + 'static, V: Key + 'static> {
Write(MultimapTable<'a, K, V>),
Read(ReadOnlyMultimapTable<K, V>),
}
impl<'a, K: Key + 'static, V: Key + 'static> MultimapTableHandle<'a, K, V> {
pub fn get<'k>(
&self,
key: impl Borrow<K::SelfType<'k>>,
) -> Result<MultimapValue<'_, V>, StorageError> {
Ok(match self {
MultimapTableHandle::Write(t) => t.get(key)?,
MultimapTableHandle::Read(t) => t.get(key)?,
})
}
#[allow(dead_code)] pub fn iter(&self) -> Result<MultimapRange<'_, K, V>, StorageError> {
Ok(match self {
MultimapTableHandle::Write(t) => t.iter()?,
MultimapTableHandle::Read(t) => t.iter()?,
})
}
}