.expect("Usage: mtbl_dump <filename>");
let reader = mtbl::reader::from_file(fname);
for e in reader.iter() {
- println!("{:?}: {:?}", *e.key, *e.value);
+ println!("{:?}: {:?}", e.key(), e.value());
}
}
// println!("2: {:?} / {:?}", self.next, self.run);
while let Some(e) = self.iter.next() {
- if e.key == self.run[0].key {
+ if e.key() == self.run[0].key() {
self.run.push(e);
continue;
}
.collect(),
);
- let s = ts.dupsort_func(|a, b| a.value[0].cmp(&b.value[0]));
+ let s = ts.dupsort_func(|a, b| a.value()[0].cmp(&b.value()[0]));
assert_eq!(
Vec::from_iter((&s).iter()),
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Entry {
- pub key: Arc<Vec<u8>>,
- pub value: Arc<Vec<u8>>,
+ key: Arc<Vec<u8>>,
+ value: Arc<Vec<u8>>,
}
impl Entry {
Arc::make_mut(&mut self.key).clear();
Arc::make_mut(&mut self.value).clear();
}
+
+ pub fn key(&self) -> &[u8] {
+ self.key.as_slice()
+ }
+
+ pub fn key_mut(&mut self) -> &mut Vec<u8> {
+ Arc::make_mut(&mut self.key)
+ }
+
+ pub fn value(&self) -> &[u8] {
+ self.value.as_slice()
+ }
+
+ pub fn value_mut(&mut self) -> &mut Vec<u8> {
+ Arc::make_mut(&mut self.value)
+ }
}
type Item = Entry;
fn next(&mut self) -> Option<Self::Item> {
let item = self.iter.next()?;
- if item.key.starts_with(self.prefix.as_slice()) {
+ if item.key().starts_with(self.prefix.as_slice()) {
Some(item)
} else {
None
type Item = Entry;
fn next(&mut self) -> Option<Self::Item> {
let item = self.iter.next()?;
- if item.key.as_slice() <= self.end.as_slice() {
+ if item.key() <= self.end.as_slice() {
Some(item)
} else {
None
use crate::{Entry, Iter, Source};
-use std::sync::Arc;
pub struct MergeFunc<S: Source, F: Fn(&mut Vec<u8>, &Entry)> {
source: S,
fn next(&mut self) -> Option<Self::Item> {
let mut cur = self.prev.take().or_else(|| self.iter.next())?;
while let Some(e) = self.iter.next() {
- if e.key == cur.key {
- (self.merge_func)(Arc::make_mut(&mut cur.value), &e);
+ if e.key() == cur.key() {
+ (self.merge_func)(cur.value_mut(), &e);
} else {
self.prev.replace(e);
break;
);
let s = ts.merge_func(|v, e| {
- v[0] += e.value[0];
+ v[0] += e.value()[0];
});
assert_eq!(
impl<I: Iter> PartialEq for MergeEntry<I> {
fn eq(&self, other: &Self) -> bool {
- self.e.key == other.e.key
+ self.e.key() == other.e.key()
}
}
impl<I: Iter> Eq for MergeEntry<I> {}
impl<I: Iter> PartialOrd for MergeEntry<I> {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
- Some(other.e.key.cmp(&self.e.key))
+ Some(other.e.key().cmp(&self.e.key()))
}
}
impl<I: Iter> Ord for MergeEntry<I> {
fn cmp(&self, other: &Self) -> Ordering {
- other.e.key.cmp(&self.e.key)
+ other.e.key().cmp(&self.e.key())
}
}
if let Some(e) = next.it.next() {
next.e = e;
self.last_key.clear();
- self.last_key.extend(next.e.key.as_slice());
+ self.last_key.extend(next.e.key());
return Some(cur);
}
}
match self.heap.peek_mut() {
None => return,
Some(mut head) => {
- if head.e.key.as_slice() >= key {
+ if head.e.key() >= key {
self.last_key.clear();
- self.last_key.extend_from_slice(head.e.key.as_slice());
+ self.last_key.extend_from_slice(head.e.key());
return;
}
head.it.seek(key);
v.extend(tnum(i))
}
v.sort();
- let v2 = Vec::from_iter(s.iter().map(|e| e.key[0]));
+ let v2 = Vec::from_iter(s.iter().map(|e| e.key()[0]));
assert_eq!(v2, v);
}
use crate::{Entry, Iter, Result};
use integer_encoding::VarInt;
use std::mem::size_of;
-use std::sync::Arc;
#[derive(Debug)]
enum RestartType {
}
let data = self.block.data.as_ref();
- let entry = self.cur_ent.get_or_insert(Entry {
- key: Arc::new(Vec::new()),
- value: Arc::new(Vec::new()),
- });
+ let entry = self.cur_ent.get_or_insert(Entry::new([], []));
let (shared_key, len) = usize::decode_var(&data[idx..])?;
idx += len;
let (len_val, len) = usize::decode_var(&data[idx..])?;
idx += len;
- if shared_key > entry.key.len() {
+ if shared_key > entry.key().len() {
// return Err("shared_key too long".into());
return None;
}
- let key = Arc::make_mut(&mut entry.key);
+ let key = entry.key_mut();
key.truncate(shared_key);
key.extend_from_slice(get_bytes(&data[idx..], unshared_key).ok()?);
idx += unshared_key;
- let val = Arc::make_mut(&mut entry.value);
+ let val = entry.value_mut();
val.clear();
val.extend_from_slice(get_bytes(&data[idx..], len_val).ok()?);
idx += len_val;
match self.decode() {
None => break,
Some(e) => {
- if e.key.as_slice() >= key {
+ if e.key() >= key {
self.off = poff;
return;
}
let b = build_block(n, 1, 10);
let bi = b.into_iter();
assert_eq!(
- bi.map(|e| e.key).collect::<Vec<_>>(),
+ bi.map(|e| Vec::from(e.key())).collect::<Vec<_>>(),
build_ref(n, 1)
.into_iter()
- .map(|e| e.key)
+ .map(|e| Vec::from(e.key()))
.collect::<Vec<_>>()
);
}
let b = build_block(n, 10, 10);
let mut bi = b.into_iter();
bi.seek(&u32::to_be_bytes(40));
- assert_eq!(bi.next().unwrap().key.as_ref(), &u32::to_be_bytes(40));
+ assert_eq!(bi.next().unwrap().key(), &u32::to_be_bytes(40));
bi.seek(&u32::to_be_bytes(32));
- assert_eq!(bi.next().unwrap().key.as_ref(), &u32::to_be_bytes(40));
+ assert_eq!(bi.next().unwrap().key(), &u32::to_be_bytes(40));
}
}
self.index_iter
.next()
.and_then(|e| {
- self.next_offset = usize::decode_var(e.value.as_slice())?.0;
+ self.next_offset = usize::decode_var(e.value())?.0;
self.next_block().map(|_| {
self.data_iter.as_mut().unwrap().seek(key);
})
}
pub fn add(&mut self, e: Entry) {
- let esize = e.key.len() + e.value.len();
+ let esize = e.key().len() + e.value().len();
if esize + self.batch_size > self.max_size {
self.write_chunk();
}
let mut w = Writer::new(Vec::new());
self.batch
.get_mut()
- .sort_unstable_by(|a, b| a.key.cmp(&b.key));
+ .sort_unstable_by(|a, b| a.key().cmp(b.key()));
self.batch
.take()
.merge_func(&self.merge_func)
let mut right = self.vec.len() - 1;
while left < right {
let mid = (left + right + 1) / 2;
- if self.vec[mid].key.as_slice() < key {
+ if self.vec[mid].key() < key {
left = mid;
} else {
right = mid - 1;
impl<'a> Iter for TestIter<'a> {
fn seek(&mut self, key: &[u8]) {
self.off = 0;
- while self.off < self.source.0.len() && self.source.0[self.off].key.as_slice() < key {
+ while self.off < self.source.0.len() && self.source.0[self.off].key() < key {
self.off += 1;
}
}
let s = &test_source();
assert_eq!(
- Vec::from_iter(s.iter().map(|e| e.value[0])),
+ Vec::from_iter(s.iter().map(|e| e.value()[0])),
vec![0, 1, 2, 3, 4]
);
assert_eq!(
- Vec::from_iter(s.get(vec![0, 0, 1, 0].as_slice()).map(|e| e.value[0])),
+ Vec::from_iter(s.get(vec![0, 0, 1, 0].as_slice()).map(|e| e.value()[0])),
vec![2]
);
assert_eq!(
- Vec::from_iter(s.get_prefix(vec![0, 0].as_slice()).map(|e| e.value[0])),
+ Vec::from_iter(s.get_prefix(vec![0, 0].as_slice()).map(|e| e.value()[0])),
vec![0, 1, 2]
);
assert_eq!(
Vec::from_iter(
s.get_range(vec![0, 0, 0, 1].as_slice(), vec![0, 1, 0, 0].as_slice())
- .map(|e| e.value[0])
+ .map(|e| e.value()[0])
),
vec![1, 2, 3]
);
let bi = Block::new(DataSlice::new(bb.as_slice()))
.unwrap()
.into_iter();
- let vcmp = Vec::from_iter(
- bi.map(|e| (Vec::from(e.key.as_slice()), Vec::from(e.value.as_slice()))),
- );
+ let vcmp = Vec::from_iter(bi.map(|e| (Vec::from(e.key()), Vec::from(e.value()))));
assert_eq!(v, vcmp);
}
}
}
pub fn add(&mut self, e: Entry) -> Result<()> {
- let est = e.key.len() + e.value.len() + 15;
+ let est = e.key().len() + e.value().len() + 15;
if self.block.len() + est >= self.blocksize {
- bytesep(&mut self.last_key, e.key.as_slice());
+ bytesep(&mut self.last_key, e.key());
self.write_block()?;
}
- self.meta.add_entry(e.key.len(), e.value.len());
- self.block.add(e.key.as_slice(), e.value.as_slice());
+ self.meta.add_entry(e.key().len(), e.value().len());
+ self.block.add(e.key(), e.value());
self.last_key.clear();
- self.last_key.extend_from_slice(e.key.as_slice());
+ self.last_key.extend_from_slice(e.key());
Ok(())
}
rangei.collect::<Vec<_>>(),
reference
.into_iter()
- .filter(|e| e.key.as_slice() >= &u32::to_be_bytes(192)
- && e.key.as_slice() <= &u32::to_be_bytes(256))
+ .filter(|e| e.key() >= &u32::to_be_bytes(192) && e.key() <= &u32::to_be_bytes(256))
.collect::<Vec<_>>()
)
}