reth_db/static_file/
cursor.rs1use super::mask::{ColumnSelectorOne, ColumnSelectorThree, ColumnSelectorTwo};
2use alloy_primitives::B256;
3use derive_more::{Deref, DerefMut};
4use reth_db_api::table::Decompress;
5use reth_nippy_jar::{DataReader, NippyJar, NippyJarCursor};
6use reth_primitives::static_file::SegmentHeader;
7use reth_storage_errors::provider::{ProviderError, ProviderResult};
8use std::sync::Arc;
9
10#[derive(Debug, Deref, DerefMut)]
12pub struct StaticFileCursor<'a>(NippyJarCursor<'a, SegmentHeader>);
13
14type ColumnResult<T> = ProviderResult<Option<T>>;
16
17impl<'a> StaticFileCursor<'a> {
18 pub fn new(jar: &'a NippyJar<SegmentHeader>, reader: Arc<DataReader>) -> ProviderResult<Self> {
20 Ok(Self(
21 NippyJarCursor::with_reader(jar, reader)
22 .map_err(|err| ProviderError::NippyJar(err.to_string()))?,
23 ))
24 }
25
26 pub fn number(&self) -> Option<u64> {
29 self.jar().user_header().start().map(|start| self.row_index() + start)
30 }
31
32 pub fn get(
34 &mut self,
35 key_or_num: KeyOrNumber<'_>,
36 mask: usize,
37 ) -> ProviderResult<Option<Vec<&'_ [u8]>>> {
38 if self.jar().rows() == 0 {
39 return Ok(None)
40 }
41
42 let row = match key_or_num {
43 KeyOrNumber::Key(_) => unimplemented!(),
44 KeyOrNumber::Number(n) => match self.jar().user_header().start() {
45 Some(offset) => {
46 if offset > n {
47 return Ok(None)
48 }
49 self.row_by_number_with_cols((n - offset) as usize, mask)
50 }
51 None => Ok(None),
52 },
53 }
54 .map_or(None, |v| v);
55
56 Ok(row)
57 }
58
59 pub fn get_one<M: ColumnSelectorOne>(
61 &mut self,
62 key_or_num: KeyOrNumber<'_>,
63 ) -> ColumnResult<M::FIRST> {
64 let row = self.get(key_or_num, M::MASK)?;
65
66 match row {
67 Some(row) => Ok(Some(M::FIRST::decompress(row[0])?)),
68 None => Ok(None),
69 }
70 }
71
72 pub fn get_two<M: ColumnSelectorTwo>(
74 &mut self,
75 key_or_num: KeyOrNumber<'_>,
76 ) -> ColumnResult<(M::FIRST, M::SECOND)> {
77 let row = self.get(key_or_num, M::MASK)?;
78
79 match row {
80 Some(row) => Ok(Some((M::FIRST::decompress(row[0])?, M::SECOND::decompress(row[1])?))),
81 None => Ok(None),
82 }
83 }
84
85 pub fn get_three<M: ColumnSelectorThree>(
87 &mut self,
88 key_or_num: KeyOrNumber<'_>,
89 ) -> ColumnResult<(M::FIRST, M::SECOND, M::THIRD)> {
90 let row = self.get(key_or_num, M::MASK)?;
91
92 match row {
93 Some(row) => Ok(Some((
94 M::FIRST::decompress(row[0])?,
95 M::SECOND::decompress(row[1])?,
96 M::THIRD::decompress(row[2])?,
97 ))),
98 None => Ok(None),
99 }
100 }
101}
102
103#[derive(Debug)]
105pub enum KeyOrNumber<'a> {
106 Key(&'a [u8]),
108 Number(u64),
110}
111
112impl<'a> From<&'a B256> for KeyOrNumber<'a> {
113 fn from(value: &'a B256) -> Self {
114 KeyOrNumber::Key(value.as_slice())
115 }
116}
117
118impl From<u64> for KeyOrNumber<'_> {
119 fn from(value: u64) -> Self {
120 KeyOrNumber::Number(value)
121 }
122}