fuel_core/state/
generic_database.rs

1use fuel_core_storage::{
2    Error as StorageError,
3    Mappable,
4    MerkleRoot,
5    MerkleRootStorage,
6    PredicateStorageRequirements,
7    Result as StorageResult,
8    StorageAsRef,
9    StorageInspect,
10    StorageRead,
11    StorageSize,
12    iter::{
13        BoxedIter,
14        IterDirection,
15        IterableStore,
16    },
17    kv_store::{
18        KVItem,
19        KeyValueInspect,
20        Value,
21    },
22    structured_storage::StructuredStorage,
23    tables::BlobData,
24};
25use std::{
26    borrow::Cow,
27    fmt::Debug,
28};
29
30#[derive(Debug, Clone)]
31pub struct GenericDatabase<Storage, Metadata> {
32    storage: StructuredStorage<Storage>,
33    metadata: Option<Metadata>,
34}
35
36impl<Storage, Metadata> GenericDatabase<Storage, Metadata> {
37    pub fn inner_storage(&self) -> &Storage {
38        self.storage.as_ref()
39    }
40
41    pub fn metadata(&self) -> Option<&Metadata> {
42        self.metadata.as_ref()
43    }
44
45    pub fn from_storage_and_metadata(
46        storage: Storage,
47        metadata: Option<Metadata>,
48    ) -> Self {
49        Self {
50            storage: StructuredStorage::new(storage),
51            metadata,
52        }
53    }
54
55    pub fn into_inner(self) -> (Storage, Option<Metadata>) {
56        (self.storage.into_storage(), self.metadata)
57    }
58}
59
60impl<M, Storage, Metadata> StorageInspect<M> for GenericDatabase<Storage, Metadata>
61where
62    M: Mappable,
63    StructuredStorage<Storage>: StorageInspect<M, Error = StorageError>,
64{
65    type Error = StorageError;
66
67    fn get(&self, key: &M::Key) -> Result<Option<Cow<'_, M::OwnedValue>>, Self::Error> {
68        self.storage.storage::<M>().get(key)
69    }
70
71    fn contains_key(&self, key: &M::Key) -> Result<bool, Self::Error> {
72        self.storage.storage::<M>().contains_key(key)
73    }
74}
75
76impl<M, Storage, Metadata> StorageSize<M> for GenericDatabase<Storage, Metadata>
77where
78    M: Mappable,
79    StructuredStorage<Storage>: StorageSize<M, Error = StorageError>,
80{
81    fn size_of_value(&self, key: &M::Key) -> Result<Option<usize>, Self::Error> {
82        <_ as StorageSize<M>>::size_of_value(&self.storage, key)
83    }
84}
85
86impl<M, Storage, Metadata> StorageRead<M> for GenericDatabase<Storage, Metadata>
87where
88    M: Mappable,
89    StructuredStorage<Storage>: StorageRead<M, Error = StorageError>,
90{
91    fn read(
92        &self,
93        key: &M::Key,
94        offset: usize,
95        buf: &mut [u8],
96    ) -> Result<bool, Self::Error> {
97        self.storage.storage::<M>().read(key, offset, buf)
98    }
99
100    fn read_alloc(&self, key: &M::Key) -> Result<Option<Vec<u8>>, Self::Error> {
101        self.storage.storage::<M>().read_alloc(key)
102    }
103}
104
105impl<Key, M, Storage, Metadata> MerkleRootStorage<Key, M>
106    for GenericDatabase<Storage, Metadata>
107where
108    M: Mappable,
109    StructuredStorage<Storage>: MerkleRootStorage<Key, M, Error = StorageError>,
110{
111    fn root(&self, key: &Key) -> Result<MerkleRoot, Self::Error> {
112        self.storage.storage::<M>().root(key)
113    }
114}
115
116impl<Storage, Metadata> KeyValueInspect for GenericDatabase<Storage, Metadata>
117where
118    Storage: KeyValueInspect,
119{
120    type Column = Storage::Column;
121
122    fn exists(&self, key: &[u8], column: Self::Column) -> StorageResult<bool> {
123        self.storage.exists(key, column)
124    }
125
126    fn size_of_value(
127        &self,
128        key: &[u8],
129        column: Self::Column,
130    ) -> StorageResult<Option<usize>> {
131        KeyValueInspect::size_of_value(&self.storage, key, column)
132    }
133
134    fn get(&self, key: &[u8], column: Self::Column) -> StorageResult<Option<Value>> {
135        KeyValueInspect::get(&self.storage, key, column)
136    }
137
138    fn read(
139        &self,
140        key: &[u8],
141        column: Self::Column,
142        offset: usize,
143        buf: &mut [u8],
144    ) -> StorageResult<bool> {
145        KeyValueInspect::read(&self.storage, key, column, offset, buf)
146    }
147}
148
149impl<Storage, Metadata> IterableStore for GenericDatabase<Storage, Metadata>
150where
151    Storage: IterableStore,
152{
153    fn iter_store(
154        &self,
155        column: Self::Column,
156        prefix: Option<&[u8]>,
157        start: Option<&[u8]>,
158        direction: IterDirection,
159    ) -> BoxedIter<'_, KVItem> {
160        self.storage.iter_store(column, prefix, start, direction)
161    }
162
163    fn iter_store_keys(
164        &self,
165        column: Self::Column,
166        prefix: Option<&[u8]>,
167        start: Option<&[u8]>,
168        direction: IterDirection,
169    ) -> BoxedIter<'_, fuel_core_storage::kv_store::KeyItem> {
170        self.storage
171            .iter_store_keys(column, prefix, start, direction)
172    }
173}
174
175impl<Storage, Metadata> AsRef<Storage> for GenericDatabase<Storage, Metadata> {
176    fn as_ref(&self) -> &Storage {
177        self.storage.as_ref()
178    }
179}
180
181impl<Storage, Metadata> AsMut<Storage> for GenericDatabase<Storage, Metadata> {
182    fn as_mut(&mut self) -> &mut Storage {
183        self.storage.as_mut()
184    }
185}
186
187impl<Storage, Metadata> core::ops::Deref for GenericDatabase<Storage, Metadata> {
188    type Target = Storage;
189
190    fn deref(&self) -> &Self::Target {
191        self.as_ref()
192    }
193}
194
195impl<Storage, Metadata> core::ops::DerefMut for GenericDatabase<Storage, Metadata> {
196    fn deref_mut(&mut self) -> &mut Self::Target {
197        self.as_mut()
198    }
199}
200
201impl<Storage, Error, Metadata> PredicateStorageRequirements
202    for GenericDatabase<Storage, Metadata>
203where
204    Self: StorageRead<BlobData, Error = Error>,
205    Error: Debug,
206{
207    fn storage_error_to_string(error: Error) -> String {
208        format!("{:?}", error)
209    }
210}