use sqlx::{mysql::{MySqlQueryResult, MySqlRow}, Acquire, Error, FromRow, QueryBuilder, MySql};
use crate::mysql::connection;
pub async fn execute<'a>(
mut builder: QueryBuilder<'a, MySql>,
) -> Result<MySqlQueryResult, Error>
{
#[cfg(debug_assertions)]
{
let sql = builder.sql();
dbg!(sql);
}
let pool = connection::get_db_pool()?;
builder.build().execute(&*pool).await
}
pub async fn execute_with_trans<'a>(
builders: Vec<QueryBuilder<'a, MySql>>,
) -> Result<Vec<MySqlQueryResult>, Error>
{
#[cfg(debug_assertions)]
{
for builder in builders.iter() {
let sql = builder.sql();
dbg!(sql);
}
}
let pool = connection::get_db_pool()?;
let mut conn = pool.acquire().await?;
let mut tx = conn.begin().await?;
let mut results = Vec::new();
for mut builder in builders {
match builder.build().execute(&mut *tx).await {
Ok(result) => {
results.push(result);
}
Err(e) => {
tx.rollback().await?;
return Err(e);
}
}
}
tx.commit().await?;
Ok(results)
}
pub async fn fetch_optional<'a, T>(
mut builder: QueryBuilder<'a, MySql>,
) -> Result<Option<T>, Error>
where
T: for<'r> FromRow<'r, MySqlRow> + Unpin + Send + 'a,
{
#[cfg(debug_assertions)]
{
let sql = builder.sql();
dbg!(sql);
}
let pool = connection::get_db_pool()?;
builder.build_query_as::<T>().fetch_optional(&*pool).await
}
pub async fn fetch_one<'a, T>(
mut builder: QueryBuilder<'a, MySql>,
) -> Result<T, Error>
where
T: for<'r> FromRow<'r, MySqlRow> + Unpin + Send + 'a,
{
#[cfg(debug_assertions)]
{
let sql = builder.sql();
dbg!(sql);
}
let pool = connection::get_db_pool()?;
builder.build_query_as::<T>().fetch_one(&*pool).await
}
pub async fn fetch_all<'a, T>(
mut builder: QueryBuilder<'a, MySql>,
) -> Result<Vec<T>, Error>
where
T: for<'r> FromRow<'r, MySqlRow> + Unpin + Send + 'a,
{
#[cfg(debug_assertions)]
{
let sql = builder.sql();
dbg!(sql);
}
let pool = connection::get_db_pool()?;
builder.build_query_as::<T>().fetch_all(&*pool).await
}
pub async fn fetch_scalar<'a>(
mut builder: QueryBuilder<'a, MySql>
) -> Result<i64, Error>
{
#[cfg(debug_assertions)]
{
let sql = builder.sql();
dbg!(sql);
}
let pool = connection::get_db_pool()?;
builder.build_query_scalar::<i64>().fetch_one(&*pool).await
}
pub async fn fetch_scalar_optional<'a>(
mut builder: QueryBuilder<'a, MySql>,
) -> Result<Option<i64>, Error>
{
#[cfg(debug_assertions)]
{
let sql = builder.sql();
dbg!(sql);
}
let pool = connection::get_db_pool()?;
builder.build_query_scalar::<i64>().fetch_optional(&*pool).await
}