1use std::borrow::Borrow;
2
3use redb::{
4 AccessGuard, Key, MultimapRange, MultimapTable, MultimapTableDefinition, MultimapValue, Range,
5 ReadOnlyMultimapTable, ReadOnlyTable, ReadTransaction, ReadableMultimapTable, ReadableTable,
6 ReadableTableMetadata, Table, TableDefinition, Value, WriteTransaction,
7};
8
9use crate::error::StorageError;
10
11#[derive(Clone, Copy)]
23pub enum Txn<'a> {
24 Write(&'a WriteTransaction),
25 Read(&'a ReadTransaction),
26}
27
28impl<'a> Txn<'a> {
29 pub fn open_table<K: Key + 'static, V: Value + 'static>(
30 &self,
31 def: TableDefinition<K, V>,
32 ) -> Result<TableHandle<'a, K, V>, StorageError> {
33 Ok(match self {
34 Txn::Write(w) => TableHandle::Write(w.open_table(def)?),
35 Txn::Read(r) => TableHandle::Read(r.open_table(def)?),
36 })
37 }
38
39 pub fn open_multimap_table<K: Key + 'static, V: Key + 'static>(
40 &self,
41 def: MultimapTableDefinition<K, V>,
42 ) -> Result<MultimapTableHandle<'a, K, V>, StorageError> {
43 Ok(match self {
44 Txn::Write(w) => MultimapTableHandle::Write(w.open_multimap_table(def)?),
45 Txn::Read(r) => MultimapTableHandle::Read(r.open_multimap_table(def)?),
46 })
47 }
48}
49
50pub enum TableHandle<'a, K: Key + 'static, V: Value + 'static> {
57 Write(Table<'a, K, V>),
58 Read(ReadOnlyTable<K, V>),
59}
60
61impl<'a, K: Key + 'static, V: Value + 'static> TableHandle<'a, K, V> {
62 pub fn get<'k>(
63 &self,
64 key: impl Borrow<K::SelfType<'k>>,
65 ) -> Result<Option<AccessGuard<'_, V>>, StorageError> {
66 Ok(match self {
67 TableHandle::Write(t) => t.get(key)?,
68 TableHandle::Read(t) => t.get(key)?,
69 })
70 }
71
72 pub fn iter(&self) -> Result<Range<'_, K, V>, StorageError> {
73 Ok(match self {
74 TableHandle::Write(t) => t.iter()?,
75 TableHandle::Read(t) => t.iter()?,
76 })
77 }
78
79 #[allow(clippy::len_without_is_empty)]
87 pub fn len(&self) -> Result<u64, StorageError> {
88 Ok(match self {
89 TableHandle::Write(t) => t.len()?,
90 TableHandle::Read(t) => t.len()?,
91 })
92 }
93
94 pub fn range<'k, KR: Borrow<K::SelfType<'k>> + 'k>(
100 &self,
101 range: impl std::ops::RangeBounds<KR> + 'k,
102 ) -> Result<Range<'_, K, V>, StorageError> {
103 Ok(match self {
104 TableHandle::Write(t) => t.range(range)?,
105 TableHandle::Read(t) => t.range(range)?,
106 })
107 }
108}
109
110pub enum MultimapTableHandle<'a, K: Key + 'static, V: Key + 'static> {
111 Write(MultimapTable<'a, K, V>),
112 Read(ReadOnlyMultimapTable<K, V>),
113}
114
115impl<'a, K: Key + 'static, V: Key + 'static> MultimapTableHandle<'a, K, V> {
116 pub fn get<'k>(
117 &self,
118 key: impl Borrow<K::SelfType<'k>>,
119 ) -> Result<MultimapValue<'_, V>, StorageError> {
120 Ok(match self {
121 MultimapTableHandle::Write(t) => t.get(key)?,
122 MultimapTableHandle::Read(t) => t.get(key)?,
123 })
124 }
125
126 #[allow(dead_code)] pub fn iter(&self) -> Result<MultimapRange<'_, K, V>, StorageError> {
128 Ok(match self {
129 MultimapTableHandle::Write(t) => t.iter()?,
130 MultimapTableHandle::Read(t) => t.iter()?,
131 })
132 }
133
134 pub fn range<'k, KR: Borrow<K::SelfType<'k>> + 'k>(
139 &self,
140 range: impl std::ops::RangeBounds<KR> + 'k,
141 ) -> Result<MultimapRange<'_, K, V>, StorageError> {
142 Ok(match self {
143 MultimapTableHandle::Write(t) => t.range(range)?,
144 MultimapTableHandle::Read(t) => t.range(range)?,
145 })
146 }
147}