fuel_core/state/
data_source.rs

1use crate::{
2    database::database_description::DatabaseDescription,
3    state::TransactableStorage,
4};
5use fuel_core_storage::{
6    Result as StorageResult,
7    iter::{
8        BoxedIter,
9        IterDirection,
10        IterableStore,
11    },
12    kv_store::{
13        KVItem,
14        KeyValueInspect,
15        Value,
16    },
17};
18use std::sync::Arc;
19
20#[allow(type_alias_bounds)]
21pub type DataSourceType<Description>
22where
23    Description: DatabaseDescription,
24= Arc<dyn TransactableStorage<Description::Height, Column = Description::Column>>;
25
26#[derive(Debug, Clone)]
27pub struct DataSource<Description, Stage>
28where
29    Description: DatabaseDescription,
30{
31    pub(crate) data: DataSourceType<Description>,
32    pub(crate) stage: Stage,
33}
34
35impl<Description, Stage> DataSource<Description, Stage>
36where
37    Description: DatabaseDescription,
38{
39    pub fn new(data: DataSourceType<Description>, stage: Stage) -> Self {
40        Self { data, stage }
41    }
42}
43
44impl<Description, Stage> KeyValueInspect for DataSource<Description, Stage>
45where
46    Description: DatabaseDescription,
47{
48    type Column = Description::Column;
49
50    fn exists(&self, key: &[u8], column: Self::Column) -> StorageResult<bool> {
51        self.data.exists(key, column)
52    }
53
54    fn size_of_value(
55        &self,
56        key: &[u8],
57        column: Self::Column,
58    ) -> StorageResult<Option<usize>> {
59        self.data.size_of_value(key, column)
60    }
61
62    fn get(&self, key: &[u8], column: Self::Column) -> StorageResult<Option<Value>> {
63        self.data.get(key, column)
64    }
65
66    fn read(
67        &self,
68        key: &[u8],
69        column: Self::Column,
70        offset: usize,
71        buf: &mut [u8],
72    ) -> StorageResult<bool> {
73        self.data.read(key, column, offset, buf)
74    }
75}
76
77impl<Description, Stage> IterableStore for DataSource<Description, Stage>
78where
79    Description: DatabaseDescription,
80{
81    fn iter_store(
82        &self,
83        column: Self::Column,
84        prefix: Option<&[u8]>,
85        start: Option<&[u8]>,
86        direction: IterDirection,
87    ) -> BoxedIter<'_, KVItem> {
88        self.data.iter_store(column, prefix, start, direction)
89    }
90
91    fn iter_store_keys(
92        &self,
93        column: Self::Column,
94        prefix: Option<&[u8]>,
95        start: Option<&[u8]>,
96        direction: IterDirection,
97    ) -> BoxedIter<'_, fuel_core_storage::kv_store::KeyItem> {
98        self.data.iter_store_keys(column, prefix, start, direction)
99    }
100}