use drizzle_core::error::Result;
use drizzle_migrations::{MigrateOutcome, Migration, Tracking};
use super::{Conn, execute_request, initialize_session, query_request};
use crate::builder::mysql::migration::{Effect, Session, Step};
pub(super) struct Runner<'a> {
connection: &'a mut Conn,
session: Session,
}
impl<'a> Runner<'a> {
pub(super) fn new(
connection: &'a mut Conn,
migrations: &[Migration],
tracking: Tracking,
) -> Self {
Self {
connection,
session: Session::new(migrations, tracking),
}
}
pub(super) async fn run(mut self) -> Result<MigrateOutcome> {
let mut step = self.session.start();
loop {
let effect = match step {
Step::Run(effect) => effect,
Step::Done(result) => return result,
};
let result = match effect {
Effect::Initialize => initialize_session(self.connection)
.await
.map(|()| Vec::new()),
Effect::Execute(sql) => execute_request(self.connection, &sql, &[])
.await
.map(|_| Vec::new()),
Effect::Query(sql) => query_request(self.connection, &sql, &[]).await,
};
step = self.session.resume(result);
}
}
}