diff --git a/src/lib.rs b/src/lib.rs index a90373bcd..a88d9bb56 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -21,6 +21,7 @@ pub mod system; pub mod tx; pub mod vm; pub mod vm_serial; +pub mod slabstore; pub use crate::bls_extensions::BlsStringConversion; pub use crate::error::{Error, Result}; diff --git a/src/slabstore.rs b/src/slabstore.rs new file mode 100644 index 000000000..af8e2458e --- /dev/null +++ b/src/slabstore.rs @@ -0,0 +1,100 @@ +use std::path::Path; +use std::sync::Arc; + +use crate::Result; +use crate::serial::{serialize, deserialize, Encodable, Decodable}; + +use rocksdb::{DB, Options, IteratorMode}; + +pub struct SlabStore { + db: DB, + opt: Options, + path: Arc +} + +impl SlabStore { + pub fn new(path: &Path) -> Result { + + let mut opt = Options::default(); + opt.create_if_missing(true); + + let db = DB::open(&opt, path)?; + + let path = Arc::from(path); + + Ok(SlabStore { + db, + opt, + path + }) + } + + + pub fn get(&self, key: Vec) -> Result>>{ + let value = self.db.get(key)?; + Ok(value) + } + + pub fn put(&self, value: Vec) -> Result<()>{ + let key = self.increase_index()?; + self.db.put(key, value)?; + Ok(()) + } + + + pub fn get_value_deserialized(&self, key: Vec) -> Result> { + let value = self.db.get(key)?; + match value { + Some(v) => { + let v = deserialize(&v)?; + Ok(Some(v)) + } + None => { + Ok(None) + } + } + } + + pub fn set_value(&self, value: T) -> Result<()> { + let key = self.increase_index()?; + let value = serialize(&value); + self.db.put(key, value)?; + Ok(()) + } + + pub fn get_last_index(&self) -> Result { + let last_index = self.db.iterator(IteratorMode::End).next(); + match last_index { + Some((index, _)) => { + Ok(deserialize(&index)?) + } + None => Ok(0) + } + } + + pub fn get_last_index_as_bytes(&self) -> Result> { + let last_index = self.db.iterator(IteratorMode::End).next(); + match last_index { + Some((index, _)) => { + Ok(index.to_vec()) + } + None => Ok(serialize::(&0)) + } + } + + fn increase_index(&self) -> Result> { + let mut key = self.get_last_index()?; + key += 1; + let key = serialize(&key); + Ok(key) + } + + + pub fn destroy(&self) -> Result<()> { + DB::destroy(&self.opt, self.path.clone())?; + Ok(()) + } + +} + +