blob: b9f7965c9a9e2ef7c67ef177fec4593c1ae23840 [file] [log] [blame]
use merklebtree::merklebtree::{MerkleBTree, Nodes};
use merklebtree::traits::CalculateHash;
use ring::digest;
use std::cmp::Ordering;
use std::collections::HashMap;
use std::fmt::Debug;
#[derive(Clone, Debug)]
pub struct search_result {
pub key: String,
pub version: i32,
pub existed: bool,
}
#[derive(Clone, Debug)]
pub struct key_version {
pub key: String,
pub version: i32,
}
impl PartialEq for key_version {
fn eq(&self, other: &Self) -> bool {
self.key == other.key
}
}
impl Eq for key_version {}
impl Ord for key_version {
fn cmp(&self, other: &Self) -> Ordering {
(self.key).cmp(&(other.key))
}
}
impl PartialOrd for key_version {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl CalculateHash for key_version {
fn calculate(&self) -> String {
let mut s1 = String::new();
s1.push_str(self.key.as_str());
s1.push_str("-");
s1.push_str(self.version.to_string().as_str());
let hash = digest::digest(&digest::SHA256, s1.as_ref());
let hex = hex::encode(hash);
hex
}
}
pub struct Merklebtree {
pub mbtree: MerkleBTree,
pub nodes: Nodes<key_version>,
}
pub fn new_mbtree() -> Merklebtree {
let mut nodes = Nodes {
nodes_map: Default::default(),
size: 0,
root_id: 0,
content_size: 0,
next_id: 0,
m: 0,
};
let mut tree = MerkleBTree::new_empty(5, &mut nodes);
nodes.m = tree.m;
Merklebtree {
mbtree: tree,
nodes,
}
}
impl Merklebtree {
pub fn search(&mut self, key: String) -> search_result {
let (value, found) = self.mbtree.get(
key_version {
key: key.clone(),
version: 0,
},
&mut self.nodes,
);
if found {
return search_result {
existed: true,
key: key,
version: value.version,
};
} else {
return search_result {
existed: false,
key: key,
version: -1,
};
}
}
pub fn delete(&mut self, key: String) {
self.mbtree.remove(
key_version {
key: key,
version: 0,
},
&mut self.nodes,
);
}
pub fn build_with_key_value(&mut self, kv: key_version) {
println!("kv:{:?}", kv);
self.mbtree.put(
key_version {
key: kv.key,
version: kv.version,
},
&mut self.nodes,
);
}
}