54 lines
1.3 KiB
Rust
54 lines
1.3 KiB
Rust
|
use crate::database::Database;
|
||
|
use crate::error::Result;
|
||
|
use crate::migration::migration_2::PosAndNetherMigration;
|
||
|
use geoffrey_models::models::db_metadata::DBMetadata;
|
||
|
|
||
|
mod migration_2;
|
||
|
|
||
|
trait Migration {
|
||
|
fn up(db: &Database) -> Result<()>;
|
||
|
fn down(db: &Database) -> Result<()>;
|
||
|
fn version() -> u64;
|
||
|
}
|
||
|
|
||
|
fn upgrade(db: &Database, current_version: u64, target_version: u64) -> Result<()> {
|
||
|
for ver in current_version+1..=target_version {
|
||
|
match ver {
|
||
|
2 => PosAndNetherMigration::up(db)?,
|
||
|
_ => ()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Ok(())
|
||
|
}
|
||
|
|
||
|
fn downgrade(db: &Database, current_version: u64, target_version: u64) -> Result<()> {
|
||
|
for ver in (target_version..current_version).rev() {
|
||
|
match ver {
|
||
|
2 => PosAndNetherMigration::up(db)?,
|
||
|
_ => ()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Ok(())
|
||
|
}
|
||
|
|
||
|
pub fn do_migration(db: &Database, target_version: u64) -> Result<()> {
|
||
|
let current_version = db.version().unwrap_or(0);
|
||
|
|
||
|
if target_version > current_version {
|
||
|
upgrade(db, current_version, target_version)?;
|
||
|
}
|
||
|
else if target_version < current_version {
|
||
|
downgrade(db, current_version, target_version)?;
|
||
|
}
|
||
|
|
||
|
let metadata = DBMetadata {
|
||
|
version: target_version,
|
||
|
};
|
||
|
|
||
|
db.insert(metadata)?;
|
||
|
|
||
|
Ok(())
|
||
|
}
|