From d6ea025861deb3ae68fcd9aa3ea6dad05e483797 Mon Sep 17 00:00:00 2001 From: Roman Zeyde Date: Fri, 18 May 2018 21:45:58 +0300 Subject: [PATCH] Add memory-based KV store implementation --- src/store.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/store.rs b/src/store.rs index b27313f..927af66 100644 --- a/src/store.rs +++ b/src/store.rs @@ -1,6 +1,9 @@ use bitcoin::blockdata::block::BlockHeader; use bitcoin::network::serialize::deserialize; use rocksdb; +use std::collections::BTreeMap; +use std::ops::Bound; +use std::sync::RwLock; use util::Bytes; @@ -100,3 +103,35 @@ impl Store for DBStore { self.db.write_opt(batch, &opts).unwrap(); } } + +pub struct MemStore { + map: RwLock>, +} + +impl Store for MemStore { + fn get(&self, key: &[u8]) -> Option { + self.map.read().unwrap().get(key).map(|v| v.to_vec()) + } + fn scan(&self, prefix: &[u8]) -> Vec { + let map = self.map.read().unwrap(); + let range = map.range((Bound::Included(prefix.to_vec()), Bound::Unbounded)); + let mut rows = Vec::new(); + for (key, value) in range { + if !key.starts_with(prefix) { + break; + } + rows.push(Row { + key: key.to_vec(), + value: value.to_vec(), + }); + } + rows + } + fn persist(&self, rows: Vec) { + let mut map = self.map.write().unwrap(); + for row in rows { + let (key, value) = row.into_pair(); + map.insert(key, value); + } + } +}