rustic merge operator
extern crate tempdir;
extern crate exonum_rocksdb;
use exonum_rocksdb::{Options, DB, MergeOperands};
use tempdir::TempDir;
fn concat_merge(_: &[u8],
existing_val: Option<&[u8]>,
operands: &mut MergeOperands)
-> Vec<u8> {
let mut result: Vec<u8> = Vec::with_capacity(operands.size_hint().0);
existing_val.map(|v| {
for e in v {
result.push(*e)
}
});
for op in operands {
for e in op {
result.push(*e)
}
}
result
}
fn main() {
let temp_dir = TempDir::new("rocksdb").unwrap();
let path = temp_dir.path();
let mut opts = Options::default();
opts.create_if_missing(true);
opts.set_merge_operator("test operator", concat_merge);
let db = DB::open(&opts, path).unwrap();
let _ = db.put(b"k1", b"a");
let _ = db.merge(b"k1", b"b");
let _ = db.merge(b"k1", b"c");
let _ = db.merge(b"k1", b"d");
let _ = db.merge(b"k1", b"efg");
let r = db.get(b"k1");
assert!(r.unwrap().unwrap().to_utf8().unwrap() == "abcdefg");
}