use metaldb::{access::CopyAccessExt, DBOptions, Database, RocksDB};
use tempfile::TempDir;
#[test]
fn checkpoints() {
let src_temp_dir = TempDir::new().unwrap();
let dst_temp_dir = TempDir::new().unwrap();
let src_path = src_temp_dir.path().join("src");
let dst_path = dst_temp_dir.path().join("dst");
let db = RocksDB::open(&*src_path, &DBOptions::default()).unwrap();
{
let fork = db.fork();
fork.get_entry("first").set(vec![1_u8; 1024]);
db.merge_sync(fork.into_patch()).unwrap();
}
{
db.create_checkpoint(&*dst_path).unwrap();
}
{
let fork = db.fork();
fork.get_entry("second").set(vec![2_u8; 1024]);
db.merge_sync(fork.into_patch()).unwrap();
}
drop(db);
{
let checkpoint = RocksDB::open(&*dst_path, &DBOptions::default()).unwrap();
let fork = checkpoint.fork();
assert_eq!(fork.get_entry("first").get(), Some(vec![1_u8; 1024]));
assert_eq!(fork.get_entry("second").get(), None::<Vec<u8>>);
fork.get_entry("third").set(vec![3_u8; 1024]);
checkpoint.merge_sync(fork.into_patch()).unwrap();
}
{
let db = RocksDB::open(&*src_path, &DBOptions::default()).unwrap();
let fork = db.fork();
assert_eq!(fork.get_entry("first").get(), Some(vec![1_u8; 1024]));
assert_eq!(fork.get_entry("second").get(), Some(vec![2_u8; 1024]));
assert_eq!(fork.get_entry("third").get(), None::<Vec<u8>>);
}
drop(src_temp_dir);
{
let checkpoint = RocksDB::open(&*dst_path, &DBOptions::default()).unwrap();
let fork = checkpoint.fork();
assert_eq!(fork.get_entry("first").get(), Some(vec![1_u8; 1024]));
assert_eq!(fork.get_entry("second").get(), None::<Vec<u8>>);
fork.get_entry("third").set(vec![3_u8; 1024]);
checkpoint.merge_sync(fork.into_patch()).unwrap();
}
}