Commit ed089679 authored by Jay's avatar Jay

refactor iterator (#12)

parent 1f605a95
...@@ -27,7 +27,6 @@ pub mod comparator; ...@@ -27,7 +27,6 @@ pub mod comparator;
pub use librocksdb_sys::{DBCompactionStyle, DBComparator, DBCompressionType, pub use librocksdb_sys::{DBCompactionStyle, DBComparator, DBCompressionType,
new_bloom_filter, self as rocksdb_ffi}; new_bloom_filter, self as rocksdb_ffi};
pub use rocksdb::{DB, DBIterator, DBVector, Direction, IteratorMode, Kv, pub use rocksdb::{DB, DBIterator, DBVector, Kv, SeekKey, Writable, WriteBatch};
Writable, WriteBatch};
pub use rocksdb_options::{BlockBasedOptions, Options, WriteOptions}; pub use rocksdb_options::{BlockBasedOptions, Options, WriteOptions};
pub use merge_operator::MergeOperands; pub use merge_operator::MergeOperands;
...@@ -129,13 +129,13 @@ fn main() { ...@@ -129,13 +129,13 @@ fn main() {
db.merge(b"k1", b"efg"); db.merge(b"k1", b"efg");
db.merge(b"k1", b"h"); db.merge(b"k1", b"h");
db.get(b"k1") db.get(b"k1")
.map(|value| { .map(|value| {
match value.to_utf8() { match value.to_utf8() {
Some(v) => (), Some(v) => (),
None => panic!("value corrupted"), None => panic!("value corrupted"),
} }
}) })
.or_else(|e| panic!("error retrieving value: {}", e)); .or_else(|e| panic!("error retrieving value: {}", e));
db.delete(b"k1"); db.delete(b"k1");
} }
} }
......
This diff is collapsed.
...@@ -60,9 +60,8 @@ impl Drop for WriteOptions { ...@@ -60,9 +60,8 @@ impl Drop for WriteOptions {
impl Default for BlockBasedOptions { impl Default for BlockBasedOptions {
fn default() -> BlockBasedOptions { fn default() -> BlockBasedOptions {
let block_opts = unsafe { let block_opts =
rocksdb_ffi::rocksdb_block_based_options_create() unsafe { rocksdb_ffi::rocksdb_block_based_options_create() };
};
let rocksdb_ffi::DBBlockBasedTableOptions(opt_ptr) = block_opts; let rocksdb_ffi::DBBlockBasedTableOptions(opt_ptr) = block_opts;
if opt_ptr.is_null() { if opt_ptr.is_null() {
panic!("Could not create rocksdb block based options".to_string()); panic!("Could not create rocksdb block based options".to_string());
......
use rocksdb::{DB, Direction, IteratorMode, Writable, Kv}; use rocksdb::{DB, Writable, SeekKey, DBIterator, Kv};
use tempdir::TempDir; use tempdir::TempDir;
fn collect<'a, T: Iterator<Item=Kv<'a>>>(iter: T) -> Vec<(Vec<u8>, Vec<u8>)> { fn prev_collect<'a>(mut iter: DBIterator<'a>) -> Vec<Kv> {
iter.map(|(k, v)| (k.to_vec(), v.to_vec())).collect() let mut buf = vec![];
while iter.valid() {
buf.push(iter.kv().unwrap());
iter.prev();
}
buf
} }
#[test] #[test]
...@@ -28,96 +33,79 @@ pub fn test_iterator() { ...@@ -28,96 +33,79 @@ pub fn test_iterator() {
(k2.to_vec(), v2.to_vec()), (k2.to_vec(), v2.to_vec()),
(k3.to_vec(), v3.to_vec())]; (k3.to_vec(), v3.to_vec())];
let iterator1 = db.iterator(IteratorMode::Start); let mut iter = db.iter(SeekKey::Start);
assert_eq!(collect(iterator1), expected); assert_eq!(iter.collect::<Vec<_>>(), expected);
// Test that it's idempotent // Test that it's idempotent
let iterator1 = db.iterator(IteratorMode::Start); iter = db.iter(SeekKey::Start);
assert_eq!(collect(iterator1), expected); assert_eq!(iter.collect::<Vec<_>>(), expected);
let iterator1 = db.iterator(IteratorMode::Start);
assert_eq!(collect(iterator1), expected);
let iterator1 = db.iterator(IteratorMode::Start);
assert_eq!(collect(iterator1), expected);
// Test it in reverse a few times // Test it in reverse a few times
let iterator1 = db.iterator(IteratorMode::End); iter = db.iter(SeekKey::End);
let mut tmp_vec = collect(iterator1); let mut tmp_vec = prev_collect(iter);
tmp_vec.reverse(); tmp_vec.reverse();
assert_eq!(tmp_vec, expected); assert_eq!(tmp_vec, expected);
let iterator1 = db.iterator(IteratorMode::End); iter = db.iter(SeekKey::End);
let mut tmp_vec = collect(iterator1); let mut tmp_vec = prev_collect(iter);
tmp_vec.reverse();
assert_eq!(tmp_vec, expected);
let iterator1 = db.iterator(IteratorMode::End);
let mut tmp_vec = collect(iterator1);
tmp_vec.reverse();
assert_eq!(tmp_vec, expected);
let iterator1 = db.iterator(IteratorMode::End);
let mut tmp_vec = collect(iterator1);
tmp_vec.reverse();
assert_eq!(tmp_vec, expected);
let iterator1 = db.iterator(IteratorMode::End);
let mut tmp_vec = collect(iterator1);
tmp_vec.reverse(); tmp_vec.reverse();
assert_eq!(tmp_vec, expected); assert_eq!(tmp_vec, expected);
// Try it forward again // Try it forward again
let iterator1 = db.iterator(IteratorMode::Start); iter = db.iter(SeekKey::Start);
assert_eq!(collect(iterator1), expected); assert_eq!(iter.collect::<Vec<_>>(), expected);
let iterator1 = db.iterator(IteratorMode::Start); iter = db.iter(SeekKey::Start);
assert_eq!(collect(iterator1), expected); assert_eq!(iter.collect::<Vec<_>>(), expected);
let old_iterator = db.iterator(IteratorMode::Start); let old_iterator = db.iter(SeekKey::Start);
let p = db.put(&*k4, &*v4); let p = db.put(&*k4, &*v4);
assert!(p.is_ok()); assert!(p.is_ok());
let expected2 = vec![(k1.to_vec(), v1.to_vec()), let expected2 = vec![(k1.to_vec(), v1.to_vec()),
(k2.to_vec(), v2.to_vec()), (k2.to_vec(), v2.to_vec()),
(k3.to_vec(), v3.to_vec()), (k3.to_vec(), v3.to_vec()),
(k4.to_vec(), v4.to_vec())]; (k4.to_vec(), v4.to_vec())];
assert_eq!(collect(old_iterator), expected); assert_eq!(old_iterator.collect::<Vec<_>>(), expected);
let iterator1 = db.iterator(IteratorMode::Start); iter = db.iter(SeekKey::Start);
assert_eq!(collect(iterator1), expected2); assert_eq!(iter.collect::<Vec<_>>(), expected2);
let iterator1 = db.iterator(IteratorMode::From(b"k2", iter = db.iter(SeekKey::Key(k2));
Direction::Forward));
let expected = vec![(k2.to_vec(), v2.to_vec()), let expected = vec![(k2.to_vec(), v2.to_vec()),
(k3.to_vec(), v3.to_vec()), (k3.to_vec(), v3.to_vec()),
(k4.to_vec(), v4.to_vec())]; (k4.to_vec(), v4.to_vec())];
assert_eq!(collect(iterator1), expected); assert_eq!(iter.collect::<Vec<_>>(), expected);
let iterator1 = db.iterator(IteratorMode::From(b"k2", iter = db.iter(SeekKey::Key(k2));
Direction::Reverse));
let expected = vec![(k2.to_vec(), v2.to_vec()), (k1.to_vec(), v1.to_vec())]; let expected = vec![(k2.to_vec(), v2.to_vec()), (k1.to_vec(), v1.to_vec())];
assert_eq!(collect(iterator1), expected); assert_eq!(prev_collect(iter), expected);
let iterator1 = db.iterator(IteratorMode::From(b"k0", Direction::Forward)); iter = db.iter(SeekKey::Key(b"k0"));
assert!(iterator1.valid()); assert!(iter.valid());
let iterator2 = db.iterator(IteratorMode::From(b"k1", Direction::Forward)); iter.seek(SeekKey::Key(b"k1"));
assert!(iterator2.valid()); assert!(iter.valid());
let iterator3 = db.iterator(IteratorMode::From(b"k11", Direction::Forward)); iter.seek(SeekKey::Key(b"k11"));
assert!(iterator3.valid()); assert!(iter.valid());
let iterator4 = db.iterator(IteratorMode::From(b"k5", Direction::Forward)); iter.seek(SeekKey::Key(b"k5"));
assert!(!iterator4.valid()); assert!(!iter.valid());
let iterator5 = db.iterator(IteratorMode::From(b"k0", Direction::Reverse)); iter.seek(SeekKey::Key(b"k0"));
assert!(iterator5.valid()); assert!(iter.valid());
let iterator6 = db.iterator(IteratorMode::From(b"k1", Direction::Reverse)); iter.seek(SeekKey::Key(b"k1"));
assert!(iterator6.valid()); assert!(iter.valid());
let iterator7 = db.iterator(IteratorMode::From(b"k11", Direction::Reverse)); iter.seek(SeekKey::Key(b"k11"));
assert!(iterator7.valid()); assert!(iter.valid());
let iterator8 = db.iterator(IteratorMode::From(b"k5", Direction::Reverse)); iter.seek(SeekKey::Key(b"k5"));
assert!(!iterator8.valid()); assert!(!iter.valid());
let mut iterator1 = db.iterator(IteratorMode::From(b"k4", Direction::Forward)); iter.seek(SeekKey::Key(b"k4"));
iterator1.next(); assert!(iter.valid());
assert!(iterator1.valid()); iter.prev();
iterator1.next(); assert!(iter.valid());
assert!(!iterator1.valid()); iter.next();
assert!(iter.valid());
iter.next();
assert!(!iter.valid());
// Once iterator is invalid, it can't be reverted.
iter.prev();
assert!(!iter.valid());
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment