use crate::errors::{DbKind, Error, MigraResult, StdResult}; use crate::migration; /// Used to execute SQL. /// /// Is a super trait for managers. pub trait BatchExecute { /// Executes sql via original database client fn batch_execute(&mut self, sql: &str) -> StdResult<()>; } /// Used to manage transaction in the database connection. pub trait ManageTransaction: BatchExecute { /// Opens transaction in database connection. fn begin_transaction(&mut self) -> MigraResult<()> { self.batch_execute("BEGIN") .map_err(|err| Error::db(err, DbKind::OpenTransaction)) } /// Cancels (Rollbacks) transaction in database connection. fn rollback_transaction(&mut self) -> MigraResult<()> { self.batch_execute("ROLLBACK") .map_err(|err| Error::db(err, DbKind::RollbackTransaction)) } /// Apply (Commit) transaction in database connection. fn commit_transaction(&mut self) -> MigraResult<()> { self.batch_execute("COMMIT") .map_err(|err| Error::db(err, DbKind::CommitTransaction)) } } /// Used to manage migrations in the database connection. pub trait ManageMigrations: BatchExecute { /// Applies SQL. Similar to [`BatchExecute`], but returns migra [Error]. /// /// [BatchExecute]: managers::BatchExecute fn apply_sql(&mut self, sql: &str) -> MigraResult<()> { self.batch_execute(sql) .map_err(|err| Error::db(err, DbKind::ApplySql)) } /// Creates migration table. fn create_migrations_table(&mut self) -> MigraResult<()>; /// Inserts new migration to table. fn insert_migration(&mut self, name: &str) -> MigraResult; /// Deletes migration from table. fn delete_migration(&mut self, name: &str) -> MigraResult; /// Get applied migrations from table. fn get_applied_migrations(&mut self) -> MigraResult; /// Applies SQL to upgrade database schema and inserts new migration to table. /// /// **Note:** Must be run in a transaction otherwise if the migration causes any /// error the data in the database may be inconsistent. fn run_upgrade_migration(&mut self, name: &str, content: &str) -> MigraResult<()> { self.apply_sql(content)?; self.insert_migration(name)?; Ok(()) } /// Applies SQL to downgrade database schema and deletes migration from table. /// /// **Note:** Must be run in a transaction otherwise if the migration causes any /// error the data in the database may be inconsistent. fn run_downgrade_migration(&mut self, name: &str, content: &str) -> MigraResult<()> { self.apply_sql(content)?; self.delete_migration(name)?; Ok(()) } }