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);