grovedb_merk/test_utils/
temp_merk.rs1#[cfg(feature = "minimal")]
32use std::ops::{Deref, DerefMut};
33
34use grovedb_path::SubtreePath;
35use grovedb_storage::StorageBatch;
36#[cfg(feature = "minimal")]
37use grovedb_storage::{
38 rocksdb_storage::{test_utils::TempStorage, PrefixedRocksDbStorageContext},
39 Storage,
40};
41use grovedb_version::version::GroveVersion;
42
43use crate::tree::kv::ValueDefinedCostType;
44#[cfg(feature = "minimal")]
45use crate::Merk;
46
47#[cfg(feature = "minimal")]
48pub struct TempMerk {
50 storage: &'static TempStorage,
51 batch: &'static StorageBatch,
52 merk: Merk<PrefixedRocksDbStorageContext<'static>>,
53}
54
55#[cfg(feature = "minimal")]
56impl TempMerk {
57 pub fn new(grove_version: &GroveVersion) -> Self {
60 let storage = Box::leak(Box::new(TempStorage::new()));
61 let batch = Box::leak(Box::new(StorageBatch::new()));
62
63 let context = storage
64 .get_storage_context(SubtreePath::empty(), Some(batch))
65 .unwrap();
66
67 let merk = Merk::open_base(
68 context,
69 false,
70 None::<fn(&[u8], &GroveVersion) -> Option<ValueDefinedCostType>>,
71 grove_version,
72 )
73 .unwrap()
74 .unwrap();
75 TempMerk {
76 storage,
77 merk,
78 batch,
79 }
80 }
81
82 pub fn commit(&mut self, grove_version: &GroveVersion) {
84 let batch = unsafe { Box::from_raw(self.batch as *const _ as *mut StorageBatch) };
85 self.storage
86 .commit_multi_context_batch(*batch, None)
87 .unwrap()
88 .expect("unable to commit batch");
89 self.batch = Box::leak(Box::new(StorageBatch::new()));
90 let context = self
91 .storage
92 .get_storage_context(SubtreePath::empty(), Some(self.batch))
93 .unwrap();
94 self.merk = Merk::open_base(
95 context,
96 false,
97 None::<fn(&[u8], &GroveVersion) -> Option<ValueDefinedCostType>>,
98 grove_version,
99 )
100 .unwrap()
101 .unwrap();
102 }
103}
104
105#[cfg(feature = "minimal")]
106impl Drop for TempMerk {
107 fn drop(&mut self) {
108 unsafe {
109 let batch = Box::from_raw(self.batch as *const _ as *mut StorageBatch);
110 let _ = self.storage.commit_multi_context_batch(*batch, None);
111 drop(Box::from_raw(self.storage as *const _ as *mut TempStorage));
112 }
113 }
114}
115
116#[cfg(feature = "minimal")]
117impl Default for TempMerk {
118 fn default() -> Self {
119 Self::new(GroveVersion::latest())
120 }
121}
122
123#[cfg(feature = "minimal")]
124impl Deref for TempMerk {
125 type Target = Merk<PrefixedRocksDbStorageContext<'static>>;
126
127 fn deref(&self) -> &Merk<PrefixedRocksDbStorageContext<'static>> {
128 &self.merk
129 }
130}
131
132#[cfg(feature = "minimal")]
133impl DerefMut for TempMerk {
134 fn deref_mut(&mut self) -> &mut Merk<PrefixedRocksDbStorageContext<'static>> {
135 &mut self.merk
136 }
137}