test case and handle in-place migration correctly
This commit is contained in:
parent
ed0a2567d8
commit
ac82a838b8
@ -201,19 +201,23 @@ fn migrate_database(version: u32, db_path: PathBuf, mut migrations: MigrationMan
|
|||||||
// migrate old database to the new one
|
// migrate old database to the new one
|
||||||
let temp_path = migrations.execute(&db_path, version)?;
|
let temp_path = migrations.execute(&db_path, version)?;
|
||||||
|
|
||||||
// create backup
|
// completely in-place migration leads to the paths being equal.
|
||||||
fs::rename(&db_path, &backup_path)?;
|
// in that case, no need to shuffle directories.
|
||||||
|
if temp_path != db_path {
|
||||||
|
// create backup
|
||||||
|
fs::rename(&db_path, &backup_path)?;
|
||||||
|
|
||||||
// replace the old database with the new one
|
// replace the old database with the new one
|
||||||
if let Err(err) = fs::rename(&temp_path, &db_path) {
|
if let Err(err) = fs::rename(&temp_path, &db_path) {
|
||||||
// if something went wrong, bring back backup
|
// if something went wrong, bring back backup
|
||||||
fs::rename(&backup_path, &db_path)?;
|
fs::rename(&backup_path, &db_path)?;
|
||||||
return Err(err.into());
|
return Err(err.into());
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove backup
|
||||||
|
fs::remove_dir_all(&backup_path)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove backup
|
|
||||||
fs::remove_dir_all(&backup_path)?;
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,3 +226,24 @@ fn pre_columns() {
|
|||||||
// short of the one before it.
|
// short of the one before it.
|
||||||
manager.execute(&db_path, 0).unwrap();
|
manager.execute(&db_path, 0).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn change_columns() {
|
||||||
|
use kvdb::DatabaseConfig;
|
||||||
|
|
||||||
|
let mut manager = Manager::new(Config::default());
|
||||||
|
manager.add_migration(::migration::ChangeColumns {
|
||||||
|
pre_columns: None,
|
||||||
|
post_columns: Some(4),
|
||||||
|
version: 1,
|
||||||
|
}).unwrap();
|
||||||
|
|
||||||
|
let dir = RandomTempPath::create_dir();
|
||||||
|
let db_path = db_path(dir.as_path());
|
||||||
|
|
||||||
|
let new_path = manager.execute(&db_path, 0).unwrap();
|
||||||
|
|
||||||
|
let config = DatabaseConfig::with_columns(Some(4));
|
||||||
|
let db = Database::open(&config, new_path.to_str().unwrap()).unwrap();
|
||||||
|
assert_eq!(db.num_columns(), 4);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user