use futures::TryStreamExt;
use sqlx::postgres::{PgPool, PgRow};
use sqlx::Either;
use crate::SqlResult;
pub async fn execute_raw_sql(
pool: &PgPool,
sql: &str,
) -> anyhow::Result<Vec<SqlResult>> {
let mut stream = sqlx::raw_sql(sql).fetch_many(pool);
let mut results: Vec<SqlResult> = Vec::new();
let mut current_rows: Vec<PgRow> = Vec::new();
while let Some(item) = stream.try_next().await? {
match item {
Either::Left(result) => {
if !current_rows.is_empty() {
let (data, columns) = crate::to_json::postgres::to_json(
std::mem::take(&mut current_rows),
)?;
results.push(SqlResult::Query { data, columns });
} else {
results.push(SqlResult::Execute {
rows_affected: result.rows_affected(),
});
}
}
Either::Right(row) => {
current_rows.push(row);
}
}
}
if !current_rows.is_empty() {
let (data, columns) = crate::to_json::postgres::to_json(current_rows)?;
results.push(SqlResult::Query { data, columns });
}
Ok(results)
}