use async_trait::async_trait;
use chrono::{DateTime, Utc};
use crate::error::Result;
use crate::migration::Migration;
#[non_exhaustive]
#[derive(Debug)]
pub struct AppliedMigration {
pub version: u32,
pub file: String,
pub name: String,
pub checksum: String,
pub description: Option<String>,
pub batch: i32,
pub applied_at: DateTime<Utc>,
pub applied_by: String,
pub execution_ms: Option<i32>,
}
impl AppliedMigration {
#[allow(clippy::too_many_arguments)]
pub fn new(
version: u32,
file: String,
name: String,
checksum: String,
description: Option<String>,
batch: i32,
applied_at: DateTime<Utc>,
applied_by: String,
execution_ms: Option<i32>,
) -> Self {
Self {
version,
file,
name,
checksum,
description,
batch,
applied_at,
applied_by,
execution_ms,
}
}
}
pub trait LockGuard: Send + Sync {}
#[async_trait]
pub trait MigrationDriver: Send + Sync {
async fn acquire_lock(&self) -> Result<Box<dyn LockGuard>>;
async fn run_setup_sql(&self, name: &str, sql: &str) -> Result<()>;
async fn ensure_tracking_table(&self) -> Result<()>;
async fn applied(&self) -> Result<Vec<AppliedMigration>>;
async fn apply(&self, migration: &Migration, up_sql: &str, batch: i32) -> Result<()>;
async fn revert(&self, applied: &AppliedMigration, down_sql: &str) -> Result<()>;
}