tetsy_trie_db/
fatdbmut.rs1use tetsy_hash_db::{HashDB, Hasher, EMPTY_PREFIX};
16use super::{Result, DBValue, TrieDBMut, TrieMut, TrieLayout, TrieHash, CError};
17
18pub struct FatDBMut<'db, L>
23where
24 L: TrieLayout,
25{
26 raw: TrieDBMut<'db, L>,
27}
28
29impl<'db, L> FatDBMut<'db, L>
30where
31 L: TrieLayout,
32{
33 pub fn new(db: &'db mut dyn HashDB<L::Hash, DBValue>, root: &'db mut TrieHash<L>) -> Self {
37 FatDBMut { raw: TrieDBMut::new(db, root) }
38 }
39
40 pub fn from_existing(
44 db: &'db mut dyn HashDB<L::Hash, DBValue>,
45 root: &'db mut TrieHash<L>
46 ) -> Result<Self, TrieHash<L>, CError<L>> {
47 Ok(FatDBMut { raw: TrieDBMut::from_existing(db, root)? })
48 }
49
50 pub fn db(&self) -> &dyn HashDB<L::Hash, DBValue> {
52 self.raw.db()
53 }
54
55 pub fn db_mut(&mut self) -> &mut dyn HashDB<L::Hash, DBValue> {
57 self.raw.db_mut()
58 }
59}
60
61impl<'db, L> TrieMut<L> for FatDBMut<'db, L>
62where
63 L: TrieLayout,
64{
65 fn root(&mut self) -> &TrieHash<L> { self.raw.root() }
66
67 fn is_empty(&self) -> bool { self.raw.is_empty() }
68
69 fn contains(&self, key: &[u8]) -> Result<bool, TrieHash<L>, CError<L>> {
70 self.raw.contains(L::Hash::hash(key).as_ref())
71 }
72
73 fn get<'a, 'key>(&'a self, key: &'key [u8]) -> Result<Option<DBValue>, TrieHash<L>, CError<L>>
74 where 'a: 'key
75 {
76 self.raw.get(L::Hash::hash(key).as_ref())
77 }
78
79 fn insert(
80 &mut self,
81 key: &[u8],
82 value: &[u8],
83 ) -> Result<Option<DBValue>, TrieHash<L>, CError<L>> {
84 let hash = L::Hash::hash(key);
85 let out = self.raw.insert(hash.as_ref(), value)?;
86 let db = self.raw.db_mut();
87
88 if out.is_none() {
90 let aux_hash = L::Hash::hash(hash.as_ref());
91 db.emplace(aux_hash, EMPTY_PREFIX, key.to_vec());
92 }
93 Ok(out)
94 }
95
96 fn remove(&mut self, key: &[u8]) -> Result<Option<DBValue>, TrieHash<L>, CError<L>> {
97 let hash = L::Hash::hash(key);
98 let out = self.raw.remove(hash.as_ref())?;
99
100 if out.is_some() {
102 let aux_hash = L::Hash::hash(hash.as_ref());
103 self.raw.db_mut().remove(&aux_hash, EMPTY_PREFIX);
104 }
105
106 Ok(out)
107 }
108}