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}