use crate::database::migrations::CustomMigrationError;
use crate::database::DatabaseConnection;
macro_rules! dispatch {
($connection:expr, $build:expr, $binds:expr, $finish:ident, $map:expr) => {{
macro_rules! run {
($pool:expr) => {{
let mut query = $build;
for bind in $binds {
query = query.bind(*bind);
}
query.$finish($pool.as_ref()).await.map($map)
}};
}
match $connection {
DatabaseConnection::Pg(pool) => run!(pool),
DatabaseConnection::MySql(pool) => run!(pool),
DatabaseConnection::Sqlite(pool) => run!(pool),
}
}};
}
pub(super) async fn execute(
connection: &DatabaseConnection,
sql: &str,
binds: &[&str],
) -> Result<(), CustomMigrationError> {
dispatch!(connection, sqlx::query(sql), binds, execute, |_| ())
.map_err(CustomMigrationError::SqlxError)
}
pub(super) async fn exists(
connection: &DatabaseConnection,
sql: &str,
binds: &[&str],
) -> Result<bool, CustomMigrationError> {
dispatch!(
connection,
sqlx::query_scalar::<_, i32>(sql),
binds,
fetch_optional,
|row: Option<i32>| row.is_some()
)
.map_err(CustomMigrationError::SqlxError)
}