use super::publish;
use crate::database::migrations::CustomMigrationError;
use crate::database::versions::{exec, history, query, record, stored_plan};
use crate::database::DatabaseConnection;
pub async fn complete(
connection: &DatabaseConnection,
schema: &str,
) -> Result<String, CustomMigrationError> {
history::ensure_table(connection).await?;
let Some(active) = query::active(connection).await? else {
return Err(super::conflict("no migration is in progress".to_string()));
};
if let Some(plan) = stored_plan::load(connection, &active).await? {
for statement in plan.completion_statements() {
exec::run(connection, &statement, &[]).await?;
}
}
if let Some(previous) = query::parent_of(connection, &active).await? {
publish::unpublish(connection, schema, &previous).await?;
}
record::complete(connection, &active).await?;
Ok(active)
}
pub async fn rollback(
connection: &DatabaseConnection,
schema: &str,
down_sql: &[String],
) -> Result<String, CustomMigrationError> {
history::ensure_table(connection).await?;
let Some(active) = query::active(connection).await? else {
return Err(super::conflict("no migration is in progress".to_string()));
};
publish::unpublish(connection, schema, &active).await?;
if let Some(plan) = stored_plan::load(connection, &active).await? {
for statement in plan.rollback_statements() {
let _ = exec::run(connection, &statement, &[]).await;
}
}
for statement in down_sql {
exec::run(connection, statement, &[]).await?;
}
record::discard(connection, &active).await?;
Ok(active)
}