use crate::any::{AnyConnection, AnyPool};
#[cfg(feature = "mysql")]
mod mysql {
use sqlx::Executor;
use sqlx::Row;
use sqlx::SqlSafeStr;
use sqlx::Statement;
pub(super) async fn try_setup(con: &mut sqlx::mysql::MySqlConnection) -> anyhow::Result<()> {
let version = con
.prepare(include_str!("version/mysql/version.sql").into_sql_str())
.await?;
version.query().execute(&mut *con).await?;
Ok(())
}
pub(super) async fn get_or_set_version(
con: &mut sqlx::mysql::MySqlConnection,
name: &str,
) -> anyhow::Result<i64> {
let get_version = con
.prepare(include_str!("version/mysql/get_version.sql").into_sql_str())
.await?;
let set_version = con
.prepare(include_str!("version/mysql/set_version.sql").into_sql_str())
.await?;
let name = name.to_string();
if let Some(row) = get_version
.query()
.bind(&name)
.fetch_optional(&mut *con)
.await?
{
anyhow::Ok(row.try_get("version")?)
} else {
set_version
.query()
.bind(&name)
.bind(0)
.bind(0)
.execute(&mut *con)
.await?;
anyhow::Ok(0)
}
}
pub(super) async fn set_version(
con: &mut sqlx::mysql::MySqlConnection,
name: &str,
version: i64,
) -> anyhow::Result<()> {
let set_version = con
.prepare(include_str!("version/mysql/set_version.sql").into_sql_str())
.await?;
Ok(set_version
.query()
.bind(name)
.bind(version)
.bind(version)
.execute(&mut *con)
.await
.map(|_| ())?)
}
pub(super) async fn delete(con: &mut sqlx::mysql::MySqlConnection) -> anyhow::Result<()> {
let version = con
.prepare(include_str!("version/mysql/delete/version.sql").into_sql_str())
.await?;
let version = version.query().execute(&mut *con).await;
version?;
Ok(())
}
}
#[cfg(feature = "sqlite")]
mod sqlite {
use sqlx::Executor;
use sqlx::Row;
use sqlx::SqlSafeStr;
use sqlx::Statement;
pub(super) async fn try_setup(con: &mut sqlx::sqlite::SqliteConnection) -> anyhow::Result<()> {
let version = con
.prepare(include_str!("version/sqlite/version.sql").into_sql_str())
.await?;
version.query().execute(&mut *con).await?;
Ok(())
}
pub(super) async fn get_or_set_version(
con: &mut sqlx::sqlite::SqliteConnection,
name: &str,
) -> anyhow::Result<i64> {
let get_version = con
.prepare(include_str!("version/sqlite/get_version.sql").into_sql_str())
.await?;
let set_version = con
.prepare(include_str!("version/sqlite/set_version.sql").into_sql_str())
.await?;
let name = name.to_string();
if let Some(row) = get_version
.query()
.bind(&name)
.fetch_optional(&mut *con)
.await?
{
anyhow::Ok(row.try_get("version")?)
} else {
set_version
.query()
.bind(&name)
.bind(0)
.bind(0)
.execute(&mut *con)
.await?;
anyhow::Ok(0)
}
}
pub(super) async fn set_version(
con: &mut sqlx::sqlite::SqliteConnection,
name: &str,
version: i64,
) -> anyhow::Result<()> {
let set_version = con
.prepare(include_str!("version/sqlite/set_version.sql").into_sql_str())
.await?;
Ok(set_version
.query()
.bind(name)
.bind(version)
.bind(version)
.execute(&mut *con)
.await
.map(|_| ())?)
}
pub(super) async fn delete(con: &mut sqlx::sqlite::SqliteConnection) -> anyhow::Result<()> {
let version = con
.prepare(include_str!("version/sqlite/delete/version.sql").into_sql_str())
.await?;
let version = version.query().execute(&mut *con).await;
version?;
Ok(())
}
}
pub async fn get_version(con: &mut AnyConnection<'_>, name: &str) -> anyhow::Result<i64> {
match con {
#[cfg(feature = "mysql")]
AnyConnection::MySql(con) => {
mysql::try_setup(con).await?;
mysql::get_or_set_version(con, name).await
}
#[cfg(feature = "sqlite")]
AnyConnection::Sqlite(con) => {
sqlite::try_setup(con).await?;
sqlite::get_or_set_version(con, name).await
}
}
}
pub async fn set_version(
con: &mut AnyConnection<'_>,
name: &str,
version: i64,
) -> anyhow::Result<()> {
match con {
#[cfg(feature = "mysql")]
AnyConnection::MySql(con) => mysql::set_version(con, name, version).await,
#[cfg(feature = "sqlite")]
AnyConnection::Sqlite(con) => sqlite::set_version(con, name, version).await,
}
}
pub async fn delete(pool: &AnyPool) -> anyhow::Result<()> {
let mut con = pool.acquire().await?;
let con = con.acquire().await?;
match con {
#[cfg(feature = "mysql")]
AnyConnection::MySql(con) => mysql::delete(con).await,
#[cfg(feature = "sqlite")]
AnyConnection::Sqlite(con) => sqlite::delete(con).await,
}
}