|
|
|
@ -18,7 +18,7 @@ use rkv::{ |
|
|
|
|
Lmdb, |
|
|
|
|
SafeMode, |
|
|
|
|
}, |
|
|
|
|
migrator::Migrator, |
|
|
|
|
Migrator, |
|
|
|
|
Rkv, |
|
|
|
|
StoreOptions, |
|
|
|
|
Value, |
|
|
|
@ -35,6 +35,152 @@ macro_rules! populate_store { |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
fn test_simple_migrator_lmdb_to_safe() { |
|
|
|
|
let root = Builder::new().prefix("test_simple_migrator_lmdb_to_safe").tempdir().expect("tempdir"); |
|
|
|
|
fs::create_dir_all(root.path()).expect("dir created"); |
|
|
|
|
|
|
|
|
|
// Populate source environment and persist to disk.
|
|
|
|
|
{ |
|
|
|
|
let src_env = Rkv::new::<Lmdb>(root.path()).expect("new succeeded"); |
|
|
|
|
populate_store!(&src_env); |
|
|
|
|
src_env.sync(true).expect("synced"); |
|
|
|
|
} |
|
|
|
|
// Check if the files were written to disk.
|
|
|
|
|
{ |
|
|
|
|
let mut datamdb = root.path().to_path_buf(); |
|
|
|
|
let mut lockmdb = root.path().to_path_buf(); |
|
|
|
|
datamdb.push("data.mdb"); |
|
|
|
|
lockmdb.push("lock.mdb"); |
|
|
|
|
assert!(datamdb.exists()); |
|
|
|
|
assert!(lockmdb.exists()); |
|
|
|
|
} |
|
|
|
|
// Verify that database was written to disk.
|
|
|
|
|
{ |
|
|
|
|
let src_env = Rkv::new::<Lmdb>(root.path()).expect("new succeeded"); |
|
|
|
|
let store = src_env.open_single("store", StoreOptions::default()).expect("opened"); |
|
|
|
|
let reader = src_env.read().expect("reader"); |
|
|
|
|
assert_eq!(store.get(&reader, "foo").expect("read"), Some(Value::I64(1234))); |
|
|
|
|
assert_eq!(store.get(&reader, "bar").expect("read"), Some(Value::Bool(true))); |
|
|
|
|
assert_eq!(store.get(&reader, "baz").expect("read"), Some(Value::Str("héllo, yöu"))); |
|
|
|
|
} |
|
|
|
|
// Easy migrate.
|
|
|
|
|
{ |
|
|
|
|
let dst_env = Rkv::new::<SafeMode>(root.path()).expect("new succeeded"); |
|
|
|
|
Migrator::auto_migrate_lmdb_to_safe_mode(root.path(), |builder| builder, &dst_env).expect("migrated"); |
|
|
|
|
} |
|
|
|
|
// Verify that the database was indeed migrated.
|
|
|
|
|
{ |
|
|
|
|
let dst_env = Rkv::new::<SafeMode>(root.path()).expect("new succeeded"); |
|
|
|
|
let store = dst_env.open_single("store", StoreOptions::default()).expect("opened"); |
|
|
|
|
let reader = dst_env.read().expect("reader"); |
|
|
|
|
assert_eq!(store.get(&reader, "foo").expect("read"), Some(Value::I64(1234))); |
|
|
|
|
assert_eq!(store.get(&reader, "bar").expect("read"), Some(Value::Bool(true))); |
|
|
|
|
assert_eq!(store.get(&reader, "baz").expect("read"), Some(Value::Str("héllo, yöu"))); |
|
|
|
|
} |
|
|
|
|
// Check if the old files were deleted from disk.
|
|
|
|
|
{ |
|
|
|
|
let mut datamdb = root.path().to_path_buf(); |
|
|
|
|
let mut lockmdb = root.path().to_path_buf(); |
|
|
|
|
datamdb.push("data.mdb"); |
|
|
|
|
lockmdb.push("lock.mdb"); |
|
|
|
|
assert!(!datamdb.exists()); |
|
|
|
|
assert!(!lockmdb.exists()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
fn test_simple_migrator_safe_to_lmdb() { |
|
|
|
|
let root = Builder::new().prefix("test_simple_migrator_safe_to_lmdb").tempdir().expect("tempdir"); |
|
|
|
|
fs::create_dir_all(root.path()).expect("dir created"); |
|
|
|
|
|
|
|
|
|
// Populate source environment and persist to disk.
|
|
|
|
|
{ |
|
|
|
|
let src_env = Rkv::new::<SafeMode>(root.path()).expect("new succeeded"); |
|
|
|
|
populate_store!(&src_env); |
|
|
|
|
src_env.sync(true).expect("synced"); |
|
|
|
|
} |
|
|
|
|
// Check if the files were written to disk.
|
|
|
|
|
{ |
|
|
|
|
let mut safebin = root.path().to_path_buf(); |
|
|
|
|
safebin.push("data.safe.bin"); |
|
|
|
|
assert!(safebin.exists()); |
|
|
|
|
} |
|
|
|
|
// Verify that database was written to disk.
|
|
|
|
|
{ |
|
|
|
|
let src_env = Rkv::new::<SafeMode>(root.path()).expect("new succeeded"); |
|
|
|
|
let store = src_env.open_single("store", StoreOptions::default()).expect("opened"); |
|
|
|
|
let reader = src_env.read().expect("reader"); |
|
|
|
|
assert_eq!(store.get(&reader, "foo").expect("read"), Some(Value::I64(1234))); |
|
|
|
|
assert_eq!(store.get(&reader, "bar").expect("read"), Some(Value::Bool(true))); |
|
|
|
|
assert_eq!(store.get(&reader, "baz").expect("read"), Some(Value::Str("héllo, yöu"))); |
|
|
|
|
} |
|
|
|
|
// Easy migrate.
|
|
|
|
|
{ |
|
|
|
|
let dst_env = Rkv::new::<Lmdb>(root.path()).expect("new succeeded"); |
|
|
|
|
Migrator::auto_migrate_safe_mode_to_lmdb(root.path(), |builder| builder, &dst_env).expect("migrated"); |
|
|
|
|
} |
|
|
|
|
// Verify that the database was indeed migrated.
|
|
|
|
|
{ |
|
|
|
|
let dst_env = Rkv::new::<Lmdb>(root.path()).expect("new succeeded"); |
|
|
|
|
let store = dst_env.open_single("store", StoreOptions::default()).expect("opened"); |
|
|
|
|
let reader = dst_env.read().expect("reader"); |
|
|
|
|
assert_eq!(store.get(&reader, "foo").expect("read"), Some(Value::I64(1234))); |
|
|
|
|
assert_eq!(store.get(&reader, "bar").expect("read"), Some(Value::Bool(true))); |
|
|
|
|
assert_eq!(store.get(&reader, "baz").expect("read"), Some(Value::Str("héllo, yöu"))); |
|
|
|
|
} |
|
|
|
|
// Check if the old files were deleted from disk.
|
|
|
|
|
{ |
|
|
|
|
let mut safebin = root.path().to_path_buf(); |
|
|
|
|
safebin.push("data.safe.bin"); |
|
|
|
|
assert!(!safebin.exists()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
fn test_migrator_round_trip() { |
|
|
|
|
let root = Builder::new().prefix("test_simple_migrator_lmdb_to_safe").tempdir().expect("tempdir"); |
|
|
|
|
fs::create_dir_all(root.path()).expect("dir created"); |
|
|
|
|
|
|
|
|
|
// Populate source environment and persist to disk.
|
|
|
|
|
{ |
|
|
|
|
let src_env = Rkv::new::<Lmdb>(root.path()).expect("new succeeded"); |
|
|
|
|
populate_store!(&src_env); |
|
|
|
|
src_env.sync(true).expect("synced"); |
|
|
|
|
} |
|
|
|
|
// Easy migrate.
|
|
|
|
|
{ |
|
|
|
|
let dst_env = Rkv::new::<SafeMode>(root.path()).expect("new succeeded"); |
|
|
|
|
Migrator::auto_migrate_lmdb_to_safe_mode(root.path(), |builder| builder, &dst_env).expect("migrated"); |
|
|
|
|
} |
|
|
|
|
// Easy migrate back.
|
|
|
|
|
{ |
|
|
|
|
let dst_env = Rkv::new::<Lmdb>(root.path()).expect("new succeeded"); |
|
|
|
|
Migrator::auto_migrate_safe_mode_to_lmdb(root.path(), |builder| builder, &dst_env).expect("migrated"); |
|
|
|
|
} |
|
|
|
|
// Verify that the database was indeed migrated twice.
|
|
|
|
|
{ |
|
|
|
|
let dst_env = Rkv::new::<Lmdb>(root.path()).expect("new succeeded"); |
|
|
|
|
let store = dst_env.open_single("store", StoreOptions::default()).expect("opened"); |
|
|
|
|
let reader = dst_env.read().expect("reader"); |
|
|
|
|
assert_eq!(store.get(&reader, "foo").expect("read"), Some(Value::I64(1234))); |
|
|
|
|
assert_eq!(store.get(&reader, "bar").expect("read"), Some(Value::Bool(true))); |
|
|
|
|
assert_eq!(store.get(&reader, "baz").expect("read"), Some(Value::Str("héllo, yöu"))); |
|
|
|
|
} |
|
|
|
|
// Check if the right files are finally present on disk.
|
|
|
|
|
{ |
|
|
|
|
let mut datamdb = root.path().to_path_buf(); |
|
|
|
|
let mut lockmdb = root.path().to_path_buf(); |
|
|
|
|
let mut safebin = root.path().to_path_buf(); |
|
|
|
|
datamdb.push("data.mdb"); |
|
|
|
|
lockmdb.push("lock.mdb"); |
|
|
|
|
safebin.push("data.safe.bin"); |
|
|
|
|
assert!(datamdb.exists()); |
|
|
|
|
assert!(lockmdb.exists()); |
|
|
|
|
assert!(!safebin.exists()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[test] |
|
|
|
|
#[should_panic(expected = "new succeeded: EnvironmentDoesNotExistError")] |
|
|
|
|
fn test_migrator_lmdb_to_safe_0() { |
|
|
|
|