use super::{dialect, exec, identity, DIRECTION_UP};
use crate::database::migrations::{CustomMigrationError, MigrationDirection};
use crate::database::DatabaseConnection;
async fn has_row(
connection: &DatabaseConnection,
migration_name: &str,
direction: &str,
) -> Result<bool, CustomMigrationError> {
let sql = dialect::pick(
connection,
"SELECT 1 FROM _rustyroad_migrations WHERE name = $1 AND direction = $2 LIMIT 1",
"SELECT 1 FROM _rustyroad_migrations WHERE name = ? AND direction = ? LIMIT 1",
);
exec::exists(connection, sql, &[migration_name, direction]).await
}
pub async fn is_applied(
connection: &DatabaseConnection,
migration_name: &str,
) -> Result<bool, CustomMigrationError> {
if has_row(connection, migration_name, DIRECTION_UP).await? {
return Ok(true);
}
if has_row(connection, migration_name, super::DIRECTION_DOWN).await? {
return Ok(false);
}
match identity::legacy_bare_name(migration_name) {
Some(bare) => has_row(connection, bare, DIRECTION_UP).await,
None => Ok(false),
}
}
pub async fn should_skip(
connection: &DatabaseConnection,
migration_name: &str,
direction: MigrationDirection,
) -> Result<bool, CustomMigrationError> {
let applied = is_applied(connection, migration_name).await?;
Ok(match direction {
MigrationDirection::Up => applied,
MigrationDirection::Down => !applied,
})
}