use crate::database::migrations::CustomMigrationError;
use crate::database::DatabaseConnection;
pub fn pick<'a>(
connection: &DatabaseConnection,
numbered: &'a str,
positional: &'a str,
) -> &'a str {
match connection {
DatabaseConnection::Pg(_) => numbered,
DatabaseConnection::MySql(_) | DatabaseConnection::Sqlite(_) => positional,
}
}
macro_rules! dispatch {
($connection:expr, $build:expr, $binds:expr, $finish:ident, $map:expr) => {{
macro_rules! go {
($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) => go!(pool),
DatabaseConnection::MySql(pool) => go!(pool),
DatabaseConnection::Sqlite(pool) => go!(pool),
}
}};
}
pub async fn run(
connection: &DatabaseConnection,
sql: &str,
binds: &[&str],
) -> Result<(), CustomMigrationError> {
dispatch!(connection, sqlx::query(sql), binds, execute, |_| ())
.map_err(CustomMigrationError::SqlxError)
}
pub async fn scalar(
connection: &DatabaseConnection,
sql: &str,
binds: &[&str],
) -> Result<Option<String>, CustomMigrationError> {
dispatch!(
connection,
sqlx::query_scalar::<_, String>(sql),
binds,
fetch_optional,
|row| row
)
.map_err(CustomMigrationError::SqlxError)
}