fuel_core/state/
data_source.rs1use 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}