arnaucube
arnaucube/merkletree-rsPublic Self-hosted repository
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}