use diesel::{result::Error as DieselError, Connection as _}; use crate::db::backend::Connection; mod change; pub use change::*; pub struct Migration { pub id: usize, pub name: &'static str, pub prereqs: &'static [(&'static str, usize)], pub changes: &'static [DatabaseChange], } impl Migration { pub fn apply(&self, app_name: &str, connection: &Connection) { // TODO prevent double-applying connection .transaction::<_, DieselError, _>(|| { println!("{}:\tapplying {} (id {})", app_name, self.name, self.id); for change in self.changes { change.apply(app_name, connection); } Ok(()) }) .unwrap(); } }