use crate::install::script::ParsedScriptName;
use crate::install::version::Version;
use crate::util::init_lock;
use crate::PgmqError;
use sqlx::postgres::PgArguments;
use sqlx::query::Query;
use sqlx::{Acquire, FromRow, Postgres, Transaction};
#[derive(FromRow)]
pub struct AppliedMigration {
pub name: String,
pub version: Version,
}
impl AppliedMigration {
pub async fn create_table(txn: &mut Transaction<'static, Postgres>) -> Result<(), PgmqError> {
init_lock(txn).await?;
sqlx::query("CREATE SCHEMA IF NOT EXISTS pgmq;")
.execute(&mut **txn)
.await?;
sqlx::query(
"CREATE TABLE IF NOT EXISTS pgmq.__pgmq_migrations ( name TEXT PRIMARY KEY NOT NULL, version TEXT NOT NULL, run_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT clock_timestamp());",
)
.execute(&mut **txn)
.await?;
sqlx::query("LOCK TABLE pgmq.__pgmq_migrations IN ACCESS EXCLUSIVE MODE;")
.execute(&mut **txn)
.await?;
Ok(())
}
pub async fn fetch_all(
tx: &mut Transaction<'static, Postgres>,
) -> Result<Vec<AppliedMigration>, PgmqError> {
let applied_migrations = sqlx::query_as("SELECT name, version FROM pgmq.__pgmq_migrations")
.fetch_all(tx.acquire().await?)
.await?;
Ok(applied_migrations)
}
pub fn insert_script(
name: &'_ ParsedScriptName,
) -> Result<Query<'_, Postgres, PgArguments>, PgmqError> {
let query =
sqlx::query("INSERT INTO pgmq.__pgmq_migrations ( name, version ) VALUES ( $1, $2 );")
.bind(&name.original)
.bind(&name.to);
Ok(query)
}
}