use super::{exec, sql, DIRECTION_DOWN, DIRECTION_UP};
use crate::database::migrations::{CustomMigrationError, MigrationDirection};
use crate::database::DatabaseConnection;
pub fn direction_label(direction: MigrationDirection) -> &'static str {
match direction {
MigrationDirection::Up => DIRECTION_UP,
MigrationDirection::Down => DIRECTION_DOWN,
}
}
pub async fn record(
connection: &DatabaseConnection,
migration_name: &str,
direction: MigrationDirection,
) -> Result<(), CustomMigrationError> {
let binds = [migration_name, direction_label(direction)];
if exec::execute(connection, sql::upsert(connection), &binds)
.await
.is_err()
{
exec::execute(connection, sql::plain_insert(connection), &binds).await?;
}
clear_opposite(connection, migration_name, direction).await
}
async fn clear_opposite(
connection: &DatabaseConnection,
migration_name: &str,
direction: MigrationDirection,
) -> Result<(), CustomMigrationError> {
let opposite = match direction {
MigrationDirection::Up => DIRECTION_DOWN,
MigrationDirection::Down => DIRECTION_UP,
};
exec::execute(
connection,
sql::delete_direction(connection),
&[migration_name, opposite],
)
.await
}