Mercurial > lbo > hg > leveldb-rs
changeset 319:29dd4509365f
db_impl: Implement get*() methods
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Fri, 29 Sep 2017 19:43:22 +0200 |
parents | 113abed37a57 |
children | ac996598254b |
files | src/db_impl.rs |
diffstat | 1 files changed, 51 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/db_impl.rs Fri Sep 29 19:43:06 2017 +0200 +++ b/src/db_impl.rs Fri Sep 29 19:43:22 2017 +0200 @@ -9,7 +9,7 @@ use filter::{BoxedFilterPolicy, InternalFilterPolicy}; use infolog::Logger; use log::{LogReader, LogWriter}; -use key_types::{parse_internal_key, InternalKey, ValueType}; +use key_types::{parse_internal_key, InternalKey, LookupKey, ValueType}; use memtable::MemTable; use options::Options; use snapshot::{Snapshot, SnapshotList}; @@ -371,6 +371,56 @@ } impl DB { + // READ // + + fn get_internal(&mut self, seq: SequenceNumber, key: &[u8]) -> Result<Option<Vec<u8>>> { + let current = self.vset.current(); + let mut current = current.borrow_mut(); + + let lkey = LookupKey::new(key, seq); + + if let Some(v) = self.mem.get(&lkey) { + return Ok(Some(v)); + } + if let Some(imm) = self.imm.as_ref() { + if let Some(v) = imm.get(&lkey) { + return Ok(Some(v)); + } + } + if let Ok(Some((v, st))) = current.get(lkey.internal_key()) { + if current.update_stats(st) { + if let Err(e) = self.maybe_do_compaction() { + log!(self.opt.log, "error while doing compaction in get: {}", e); + } + } + return Ok(Some(v)); + } + Ok(None) + } + + /// get_at reads the value for a given key at or before snapshot. It returns Ok(None) if the + /// entry wasn't found, and Err(_) if an error occurred. + pub fn get_at(&mut self, snapshot: &Snapshot, key: &[u8]) -> Result<Option<Vec<u8>>> { + if let Some(seq) = self.snaps.sequence_at(snapshot) { + self.get_internal(seq, key) + } else { + err(StatusCode::InvalidArgument, + "get_at: snapshot does not exist") + } + } + + /// get is a simplified version of get_at(), translating errors to None. + pub fn get(&mut self, key: &[u8]) -> Option<Vec<u8>> { + let seq = self.vset.last_seq; + if let Ok(v) = self.get_internal(seq, key) { + v + } else { + None + } + } +} + +impl DB { // STATISTICS // fn add_stats(&mut self, level: usize, cs: CompactionStats) { assert!(level < NUM_LEVELS);