diff --git a/migra-cli/src/config.rs b/migra-cli/src/config.rs index 0e070c7..0b8ee30 100644 --- a/migra-cli/src/config.rs +++ b/migra-cli/src/config.rs @@ -133,6 +133,16 @@ impl Migration { Ok(()) } + + pub fn downgrade(&self, client: &mut Client) -> Result<(), Box> { + let content = fs::read_to_string(&self.downgrade_sql)?; + + database::apply_sql(client, &content)?; + + database::delete_migration_info(client, self.name())?; + + Ok(()) + } } impl Config { diff --git a/migra-cli/src/database.rs b/migra-cli/src/database.rs index 1df4f1d..ae64ccd 100644 --- a/migra-cli/src/database.rs +++ b/migra-cli/src/database.rs @@ -40,3 +40,7 @@ pub fn create_migration_table(client: &mut Client) -> Result<(), Error> { pub fn insert_migration_info(client: &mut Client, name: &str) -> Result { client.execute("INSERT INTO migrations (name) VALUES ($1)", &[&name]) } + +pub fn delete_migration_info(client: &mut Client, name: &str) -> Result { + client.execute("DELETE FROM migrations WHERE name = $1", &[&name]) +} diff --git a/migra-cli/src/main.rs b/migra-cli/src/main.rs index 375b93e..000764d 100644 --- a/migra-cli/src/main.rs +++ b/migra-cli/src/main.rs @@ -123,13 +123,25 @@ fn main() -> Result<(), Box> { .iter() .filter(|m| !applied_migrations.contains(m.name())) { - println!("{}", m.name()); + println!("upgrade {}...", m.name()); m.upgrade(&mut client)?; } } } Command::Downgrade => { - unimplemented!(); + let config = Config::read(opt.config)?; + + let mut client = database::connect(&config.database.connection)?; + + let applied_migrations = database::applied_migrations(&mut client)?; + let migrations = config.migrations()?; + + if let Some(first_applied_migration) = applied_migrations.first() { + if let Some(migration) = migrations.iter().find(|m| m.name() == first_applied_migration) { + println!("downgrade {}...", migration.name()); + migration.downgrade(&mut client)?; + } + } } }