use crate::data::db::DbDriver;
use crate::data::DataError;
pub async fn sqlx_driver(url: &str, max_connections: u32) -> Result<DbDriver, DataError> {
sqlx::any::install_default_drivers();
let pool = sqlx::any::AnyPoolOptions::new()
.max_connections(max_connections)
.connect(url)
.await
.map_err(|e| DataError::connection(format!("sqlx connect failed: {e}")))?;
Ok(DbDriver::Sqlx(pool))
}
impl crate::data::db::OwnedDbConn {
pub async fn execute(&mut self, sql: &str) -> Result<u64, DataError> {
match self {
crate::data::db::OwnedDbConn::Sqlx(conn) => {
use sqlx::Executor;
conn.execute(sql)
.await
.map(|r| r.rows_affected())
.map_err(|e| DataError::query(e.to_string()))
}
#[allow(unreachable_patterns)]
_ => Err(DataError::config("execute(): not a SQLx connection")),
}
}
pub async fn execute_bind(&mut self, sql: &str, binds: &[&str]) -> Result<u64, DataError> {
match self {
crate::data::db::OwnedDbConn::Sqlx(conn) => {
let mut q = sqlx::query(sql);
for b in binds {
q = q.bind(*b);
}
q.execute(&mut **conn)
.await
.map(|r| r.rows_affected())
.map_err(|e| DataError::query(e.to_string()))
}
#[allow(unreachable_patterns)]
_ => Err(DataError::config("execute_bind(): not a SQLx connection")),
}
}
pub async fn fetch_one_i64(&mut self, sql: &str) -> Result<i64, DataError> {
self.fetch_one_i64_bind(sql, &[]).await
}
pub async fn fetch_one_i64_bind(
&mut self,
sql: &str,
binds: &[&str],
) -> Result<i64, DataError> {
match self {
crate::data::db::OwnedDbConn::Sqlx(conn) => {
let mut q = sqlx::query_scalar::<_, i64>(sql);
for b in binds {
q = q.bind(*b);
}
q.fetch_one(&mut **conn)
.await
.map_err(|e| DataError::query(e.to_string()))
}
#[allow(unreachable_patterns)]
_ => Err(DataError::config("fetch_one_i64(): not a SQLx connection")),
}
}
pub async fn fetch_one_string(
&mut self,
sql: &str,
binds: &[&str],
) -> Result<String, DataError> {
match self {
crate::data::db::OwnedDbConn::Sqlx(conn) => {
let mut q = sqlx::query_scalar::<_, String>(sql);
for b in binds {
q = q.bind(*b);
}
q.fetch_one(&mut **conn)
.await
.map_err(|e| DataError::query(e.to_string()))
}
#[allow(unreachable_patterns)]
_ => Err(DataError::config(
"fetch_one_string(): not a SQLx connection",
)),
}
}
}
impl crate::data::tx::ArclyTransaction {
pub async fn execute_bind(&mut self, sql: &str, binds: &[&str]) -> Result<u64, DataError> {
match self {
crate::data::tx::ArclyTransaction::Sqlx(tx) => {
let mut q = sqlx::query(sql);
for b in binds {
q = q.bind(*b);
}
q.execute(&mut **tx)
.await
.map(|r| r.rows_affected())
.map_err(|e| DataError::query(e.to_string()))
}
#[allow(unreachable_patterns)]
_ => Err(DataError::config("execute_bind(): not a SQLx transaction")),
}
}
pub async fn fetch_one_i64(&mut self, sql: &str) -> Result<i64, DataError> {
match self {
crate::data::tx::ArclyTransaction::Sqlx(tx) => sqlx::query_scalar::<_, i64>(sql)
.fetch_one(&mut **tx)
.await
.map_err(|e| DataError::query(e.to_string())),
#[allow(unreachable_patterns)]
_ => Err(DataError::config("fetch_one_i64(): not a SQLx transaction")),
}
}
}