Commit a7c90f5d authored by siddontang's avatar siddontang

Merge remote-tracking branch 'ngaut/master' into siddontang/delete-file-in-range

parents ca55143a 791fc15f
...@@ -68,19 +68,15 @@ impl<'a> From<&'a [u8]> for SeekKey<'a> { ...@@ -68,19 +68,15 @@ impl<'a> From<&'a [u8]> for SeekKey<'a> {
} }
impl<'a> DBIterator<'a> { impl<'a> DBIterator<'a> {
fn new(db: &'a DB, readopts: &ReadOptions, key: SeekKey) -> DBIterator<'a> { fn new(db: &'a DB, readopts: &ReadOptions) -> DBIterator<'a> {
unsafe { unsafe {
let iterator = rocksdb_ffi::rocksdb_create_iterator(db.inner, let iterator = rocksdb_ffi::rocksdb_create_iterator(db.inner,
readopts.inner); readopts.inner);
let mut rv = DBIterator { DBIterator {
db: db, db: db,
inner: iterator, inner: iterator,
}; }
rv.seek(key);
rv
} }
} }
...@@ -176,7 +172,7 @@ impl<'a> DBIterator<'a> { ...@@ -176,7 +172,7 @@ impl<'a> DBIterator<'a> {
pub type Kv = (Vec<u8>, Vec<u8>); pub type Kv = (Vec<u8>, Vec<u8>);
impl<'a> Iterator for DBIterator<'a> { impl<'b, 'a> Iterator for &'b mut DBIterator<'a> {
type Item = Kv; type Item = Kv;
fn next(&mut self) -> Option<Kv> { fn next(&mut self) -> Option<Kv> {
...@@ -206,10 +202,10 @@ impl<'a> Snapshot<'a> { ...@@ -206,10 +202,10 @@ impl<'a> Snapshot<'a> {
} }
} }
pub fn iter(&self, key: SeekKey) -> DBIterator { pub fn iter(&self) -> DBIterator {
let mut readopts = ReadOptions::new(); let mut readopts = ReadOptions::new();
readopts.set_snapshot(self); readopts.set_snapshot(self);
DBIterator::new(self.db, &readopts, key) DBIterator::new(self.db, &readopts)
} }
pub fn get(&self, key: &[u8]) -> Result<Option<DBVector>, String> { pub fn get(&self, key: &[u8]) -> Result<Option<DBVector>, String> {
...@@ -579,9 +575,9 @@ impl DB { ...@@ -579,9 +575,9 @@ impl DB {
self.cfs.get(name) self.cfs.get(name)
} }
pub fn iter(&self, key: SeekKey) -> DBIterator { pub fn iter(&self) -> DBIterator {
let opts = ReadOptions::new(); let opts = ReadOptions::new();
DBIterator::new(&self, &opts, key) DBIterator::new(&self, &opts)
} }
pub fn iter_cf(&self, pub fn iter_cf(&self,
...@@ -1127,8 +1123,9 @@ mod test { ...@@ -1127,8 +1123,9 @@ mod test {
db.put(b"k1", b"v1111").expect(""); db.put(b"k1", b"v1111").expect("");
db.put(b"k2", b"v2222").expect(""); db.put(b"k2", b"v2222").expect("");
db.put(b"k3", b"v3333").expect(""); db.put(b"k3", b"v3333").expect("");
let iter = db.iter(SeekKey::Start); let mut iter = db.iter();
for (k, v) in iter { iter.seek(SeekKey::Start);
for (k, v) in &mut iter {
println!("Hello {}: {}", println!("Hello {}: {}",
str::from_utf8(&*k).unwrap(), str::from_utf8(&*k).unwrap(),
str::from_utf8(&*v).unwrap()); str::from_utf8(&*v).unwrap());
......
use rocksdb::{DB, Writable, SeekKey, DBIterator, Kv}; use rocksdb::{DB, Writable, SeekKey, DBIterator, Kv};
use tempdir::TempDir; use tempdir::TempDir;
fn prev_collect<'a>(mut iter: DBIterator<'a>) -> Vec<Kv> { fn prev_collect<'a>(iter: &mut DBIterator<'a>) -> Vec<Kv> {
let mut buf = vec![]; let mut buf = vec![];
while iter.valid() { while iter.valid() {
buf.push(iter.kv().unwrap()); buf.push(iter.kv().unwrap());
...@@ -33,32 +33,35 @@ pub fn test_iterator() { ...@@ -33,32 +33,35 @@ 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 mut iter = db.iter(SeekKey::Start); let mut iter = db.iter();
iter.seek(SeekKey::Start);
assert_eq!(iter.collect::<Vec<_>>(), expected); assert_eq!(iter.collect::<Vec<_>>(), expected);
// Test that it's idempotent // Test that it's idempotent
iter = db.iter(SeekKey::Start); iter.seek(SeekKey::Start);
assert_eq!(iter.collect::<Vec<_>>(), expected); assert_eq!(iter.collect::<Vec<_>>(), expected);
// Test it in reverse a few times // Test it in reverse a few times
iter = db.iter(SeekKey::End); iter.seek(SeekKey::End);
let mut tmp_vec = prev_collect(iter); let mut tmp_vec = prev_collect(&mut iter);
tmp_vec.reverse(); tmp_vec.reverse();
assert_eq!(tmp_vec, expected); assert_eq!(tmp_vec, expected);
iter = db.iter(SeekKey::End); iter.seek(SeekKey::End);
let mut tmp_vec = prev_collect(iter); let mut tmp_vec = prev_collect(&mut iter);
tmp_vec.reverse(); tmp_vec.reverse();
assert_eq!(tmp_vec, expected); assert_eq!(tmp_vec, expected);
// Try it forward again // Try it forward again
iter = db.iter(SeekKey::Start); iter.seek(SeekKey::Start);
assert_eq!(iter.collect::<Vec<_>>(), expected); assert_eq!(iter.collect::<Vec<_>>(), expected);
iter = db.iter(SeekKey::Start); iter.seek(SeekKey::Start);
assert_eq!(iter.collect::<Vec<_>>(), expected); assert_eq!(iter.collect::<Vec<_>>(), expected);
let old_iterator = db.iter(SeekKey::Start); let mut old_iterator = db.iter();
old_iterator.seek(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()),
...@@ -67,20 +70,21 @@ pub fn test_iterator() { ...@@ -67,20 +70,21 @@ pub fn test_iterator() {
(k4.to_vec(), v4.to_vec())]; (k4.to_vec(), v4.to_vec())];
assert_eq!(old_iterator.collect::<Vec<_>>(), expected); assert_eq!(old_iterator.collect::<Vec<_>>(), expected);
iter = db.iter(SeekKey::Start); iter = db.iter();
iter.seek(SeekKey::Start);
assert_eq!(iter.collect::<Vec<_>>(), expected2); assert_eq!(iter.collect::<Vec<_>>(), expected2);
iter = db.iter(SeekKey::Key(k2)); iter.seek(SeekKey::Key(k2));
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!(iter.collect::<Vec<_>>(), expected); assert_eq!(iter.collect::<Vec<_>>(), expected);
iter = db.iter(SeekKey::Key(k2)); iter.seek(SeekKey::Key(k2));
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!(prev_collect(iter), expected); assert_eq!(prev_collect(&mut iter), expected);
iter = db.iter(SeekKey::Key(b"k0")); iter.seek(SeekKey::Key(b"k0"));
assert!(iter.valid()); assert!(iter.valid());
iter.seek(SeekKey::Key(b"k1")); iter.seek(SeekKey::Key(b"k1"));
assert!(iter.valid()); 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