commonware_storage/qmdb/current/ordered/
mod.rs1use crate::qmdb::{
12 any::{ordered::Update, ValueEncoding},
13 current::proof::OperationProof,
14};
15use commonware_cryptography::Digest;
16use commonware_utils::Array;
17
18pub mod db;
19pub mod fixed;
20#[cfg(any(test, feature = "test-traits"))]
21mod test_trait_impls;
22pub mod variable;
23
24#[cfg(test)]
25pub mod tests {
26 use crate::{
29 kv::{Deletable as _, Gettable as _, Updatable as _},
30 mmr::Location,
31 qmdb::{
32 any::states::{CleanAny, MutableAny as _, UnmerkleizedDurableAny as _},
33 current::BitmapPrunedBits,
34 store::{
35 batch_tests::{TestKey, TestValue},
36 LogStore,
37 },
38 },
39 };
40 use commonware_runtime::{
41 deterministic::{self, Context},
42 Metrics as _, Runner as _,
43 };
44 use core::future::Future;
45
46 pub fn test_build_small_close_reopen<C, F, Fut>(mut open_db: F)
51 where
52 C: CleanAny + BitmapPrunedBits,
53 C::Key: TestKey,
54 <C as LogStore>::Value: TestValue,
55 F: FnMut(Context, String) -> Fut,
56 Fut: Future<Output = C>,
57 {
58 let executor = deterministic::Runner::default();
59 executor.start(|context| async move {
60 let partition = "build_small".to_string();
61 let db: C = open_db(context.with_label("first"), partition.clone()).await;
62 assert_eq!(db.bounds().end, Location::new_unchecked(1));
63 assert_eq!(db.inactivity_floor_loc(), Location::new_unchecked(0));
64 assert_eq!(db.oldest_retained(), 0);
65 let root0 = db.root();
66 drop(db);
67 let db: C = open_db(context.with_label("second"), partition.clone()).await;
68 assert_eq!(db.bounds().end, Location::new_unchecked(1));
69 assert!(db.get_metadata().await.unwrap().is_none());
70 assert_eq!(db.root(), root0);
71
72 let k1: C::Key = TestKey::from_seed(0);
74 let v1: <C as LogStore>::Value = TestValue::from_seed(10);
75 let mut db = db.into_mutable();
76 assert!(db.create(k1, v1.clone()).await.unwrap());
77 assert_eq!(db.get(&k1).await.unwrap().unwrap(), v1);
78 let (db, _) = db.commit(None).await.unwrap();
79 let db: C = db.into_merkleized().await.unwrap();
80 assert_eq!(db.bounds().end, Location::new_unchecked(4)); assert!(db.get_metadata().await.unwrap().is_none());
82 let root1 = db.root();
83 assert_ne!(root1, root0);
84
85 drop(db);
86 let db: C = open_db(context.with_label("third"), partition.clone()).await;
87 assert_eq!(db.bounds().end, Location::new_unchecked(4));
88 assert_eq!(db.root(), root1);
89
90 let mut db = db.into_mutable();
92 assert!(!db.create(k1, v1.clone()).await.unwrap());
93
94 assert!(db.delete(k1).await.unwrap());
96
97 let metadata: <C as LogStore>::Value = TestValue::from_seed(1);
98 let (db, _) = db.commit(Some(metadata.clone())).await.unwrap();
99 let db: C = db.into_merkleized().await.unwrap();
100 assert_eq!(db.bounds().end, Location::new_unchecked(6)); assert_eq!(db.get_metadata().await.unwrap().unwrap(), metadata);
102 assert_eq!(db.inactivity_floor_loc(), Location::new_unchecked(5));
103 let root2 = db.root();
104
105 drop(db);
106 let db: C = open_db(context.with_label("fourth"), partition.clone()).await;
107 assert_eq!(db.bounds().end, Location::new_unchecked(6));
108 assert_eq!(db.get_metadata().await.unwrap().unwrap(), metadata);
109 assert_eq!(db.inactivity_floor_loc(), Location::new_unchecked(5));
110 assert_eq!(db.root(), root2);
111
112 let mut db = db.into_mutable();
114 assert!(!db.delete(k1).await.unwrap());
115 let (db, _) = db.commit(None).await.unwrap();
116 let db: C = db.into_merkleized().await.unwrap();
117 let root3 = db.root();
118 assert_ne!(root3, root2);
119
120 for i in 0..*db.bounds().end - 1 {
122 assert!(!db.get_bit(i));
123 }
124 assert!(db.get_bit(*db.bounds().end - 1));
125
126 let mut db = db.into_mutable();
128 db.update(k1, v1).await.unwrap();
129 let (db, _) = db.commit(None).await.unwrap();
130 let db: C = db.into_merkleized().await.unwrap();
131 assert_ne!(db.root(), root3);
132
133 db.destroy().await.unwrap();
134 });
135 }
136}
137
138#[derive(Clone, Eq, PartialEq, Debug)]
146pub enum ExclusionProof<K: Array, V: ValueEncoding, D: Digest, const N: usize> {
147 KeyValue(OperationProof<D, N>, Update<K, V>),
150
151 Commit(OperationProof<D, N>, Option<V::Value>),
156}