Mercurial > lbo > hg > leveldb-rs
changeset 113:0d848c6665f5
Implement simple get() method on TableReader
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Sat, 24 Dec 2016 15:56:40 +0000 |
parents | c0dbaae40771 |
children | 8944889f75bd |
files | src/table_reader.rs |
diffstat | 1 files changed, 33 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/table_reader.rs Sat Dec 24 14:22:42 2016 +0000 +++ b/src/table_reader.rs Sat Dec 24 15:56:40 2016 +0000 @@ -5,6 +5,7 @@ use options::{self, CompressionType, Options}; use table_builder::{self, Footer}; use types::{Comparator, LdbIterator}; +use key_types::InternalKey; use std::io::{self, Read, Seek, SeekFrom, Result}; use std::cmp::Ordering; @@ -159,6 +160,19 @@ }; iter } + + /// Retrieve value from table + pub fn get<'a>(&mut self, k: InternalKey<'a>) -> Option<Vec<u8>> { + let mut iter = self.iter(); + + iter.seek(k); + + if let Some((fkey, fval)) = iter.current() { + if fkey == k { Some(fval) } else { None } + } else { + None + } + } } /// This iterator is a "TwoLevelIterator"; it uses an index block in order to get an offset hint @@ -484,4 +498,23 @@ assert_eq!(iter.current(), Some(("abc".as_bytes().to_vec(), "def".as_bytes().to_vec()))); } + + #[test] + fn test_table_get() { + let (src, size) = build_table(); + + let mut table = Table::new(Cursor::new(&src as &[u8]), + size, + StandardComparator, + BloomPolicy::new(4), + Options::default()) + .unwrap(); + + assert!(table.get("aaa".as_bytes()).is_none()); + assert_eq!(table.get("abc".as_bytes()), Some("def".as_bytes().to_vec())); + assert!(table.get("abcd".as_bytes()).is_none()); + assert_eq!(table.get("bcd".as_bytes()), Some("asa".as_bytes().to_vec())); + assert_eq!(table.get("zzz".as_bytes()), Some("111".as_bytes().to_vec())); + assert!(table.get("zz1".as_bytes()).is_none()); + } }