merkletree-rs/src/db.rs
src/db.rsRaw
1extern crate rusty_leveldb;
2
3use self::rusty_leveldb::DB;
4
5use constants;
6
7pub struct Db {
8 storage: DB,
9}
10
11impl Db {
12 pub fn new(path: String, in_memory: bool) -> Db {
13 let opt: rusty_leveldb::Options;
14 if in_memory {
15 opt = rusty_leveldb::in_memory();
16 } else {
17 opt = Default::default();
18 }
19 let database = DB::open(path, opt).unwrap();
20 Db { storage: database }
21 }
22 pub fn insert(&mut self, k: [u8; 32], t: u8, il: u32, b: Vec<u8>) {
23 let mut v: Vec<u8>;
24 v = [t].to_vec();
25 let il_bytes = il.to_le_bytes();
26 v.extend(il_bytes.to_vec()); // il_bytes are [u8;4] (4 bytes)
27 v.extend(&b);
28 self.storage.put(&k[..], &v[..]).unwrap();
29 }
30 pub fn get(&mut self, k: &[u8; 32]) -> (u8, u32, Vec<u8>) {
31 if k.to_vec() == constants::EMPTYNODEVALUE.to_vec() {
32 return (0, 0, constants::EMPTYNODEVALUE.to_vec());
33 }
34 match self.storage.get(k) {
35 Some(x) => {
36 let t = x[0];
37 let il_bytes: [u8; 4] = [x[1], x[2], x[3], x[4]];
38 let il = u32::from_le_bytes(il_bytes);
39 let b = &x[5..];
40 (t, il, b.to_vec())
41 }
42 None => (
43 constants::TYPENODEEMPTY,
44 0,
45 constants::EMPTYNODEVALUE.to_vec(),
46 ),
47 }
48 }
49}