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 {
21            storage: database,
22        }
23    }
24   pub fn insert(&mut self, k: [u8; 32], t: u8, il: u32, b: Vec<u8>) {
25      let mut v: Vec<u8>;
26      v = [t].to_vec();
27      let il_bytes = il.to_le_bytes();
28      v.extend(il_bytes.to_vec()); // il_bytes are [u8;4] (4 bytes)
29      v.extend(&b);
30      self.storage.put(&k[..], &v[..]).unwrap();
31   }
32   pub fn get(&mut self, k: &[u8;32]) -> (u8, u32, Vec<u8>) {
33      if k.to_vec() == constants::EMPTYNODEVALUE.to_vec() {
34         return (0, 0, constants::EMPTYNODEVALUE.to_vec());
35      }
36      match self.storage.get(k) {
37         Some(x) => {
38            let t = x[0];
39            let il_bytes: [u8; 4] = [x[1], x[2], x[3], x[4]];
40            let il = u32::from_le_bytes(il_bytes);
41            let b = &x[5..];
42            (t, il, b.to_vec())
43         },
44         None => (constants::TYPENODEEMPTY, 0, constants::EMPTYNODEVALUE.to_vec()),
45      }
46   }
47}