use crate::connection::{DatabaseBackend, DatabaseConnection};
use std::{fmt, sync::Arc};
use wae_types::WaeError;
#[derive(Debug, Clone)]
pub struct DatabaseRejection {
inner: WaeError,
}
impl DatabaseRejection {
fn new(error: WaeError) -> Self {
Self { inner: error }
}
pub fn into_inner(self) -> WaeError {
self.inner
}
}
impl fmt::Display for DatabaseRejection {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.inner.fmt(f)
}
}
impl std::error::Error for DatabaseRejection {}
#[derive(Clone)]
pub struct DatabaseConnectionExtractor {
connection: Arc<dyn DatabaseConnection + Send + Sync>,
}
impl fmt::Debug for DatabaseConnectionExtractor {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("DatabaseConnectionExtractor").field("backend", &self.connection.backend()).finish()
}
}
impl DatabaseConnectionExtractor {
pub fn new(connection: Arc<dyn DatabaseConnection + Send + Sync>) -> Self {
Self { connection }
}
pub fn from_request<B>(request: &http::Request<B>) -> Result<Self, DatabaseRejection> {
request
.extensions()
.get::<Arc<dyn DatabaseConnection + Send + Sync>>()
.cloned()
.map(|connection| DatabaseConnectionExtractor { connection })
.ok_or_else(|| DatabaseRejection::new(WaeError::internal("Database connection not found in request extensions")))
}
pub fn inner(&self) -> &(dyn DatabaseConnection + Send + Sync) {
&*self.connection
}
pub fn backend(&self) -> DatabaseBackend {
self.connection.backend()
}
pub async fn query(&self, sql: &str) -> crate::connection::DatabaseResult<crate::connection::DatabaseRows> {
self.connection.query(sql).await
}
pub async fn query_with(
&self,
sql: &str,
params: Vec<wae_types::Value>,
) -> crate::connection::DatabaseResult<crate::connection::DatabaseRows> {
self.connection.query_with(sql, params).await
}
pub async fn execute(&self, sql: &str) -> crate::connection::DatabaseResult<u64> {
self.connection.execute(sql).await
}
pub async fn execute_with(&self, sql: &str, params: Vec<wae_types::Value>) -> crate::connection::DatabaseResult<u64> {
self.connection.execute_with(sql, params).await
}
pub async fn prepare(&self, sql: &str) -> crate::connection::DatabaseResult<crate::connection::DatabaseStatement> {
self.connection.prepare(sql).await
}
pub async fn begin_transaction(&self) -> crate::connection::DatabaseResult<()> {
self.connection.begin_transaction().await
}
pub async fn commit(&self) -> crate::connection::DatabaseResult<()> {
self.connection.commit().await
}
pub async fn rollback(&self) -> crate::connection::DatabaseResult<()> {
self.connection.rollback().await
}
}
#[cfg(feature = "limbo")]
#[derive(Clone)]
pub struct LimboConnectionExtractor {
connection: Arc<crate::connection::LimboConnection>,
}
#[cfg(feature = "limbo")]
impl fmt::Debug for LimboConnectionExtractor {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("LimboConnectionExtractor").field("backend", &DatabaseBackend::Limbo).finish()
}
}
#[cfg(feature = "limbo")]
impl LimboConnectionExtractor {
pub fn new(connection: Arc<crate::connection::LimboConnection>) -> Self {
Self { connection }
}
pub fn from_request<B>(request: &http::Request<B>) -> Result<Self, DatabaseRejection> {
request
.extensions()
.get::<Arc<crate::connection::LimboConnection>>()
.cloned()
.map(|connection| LimboConnectionExtractor { connection })
.ok_or_else(|| DatabaseRejection::new(WaeError::internal("Limbo connection not found in request extensions")))
}
pub fn inner(&self) -> &crate::connection::LimboConnection {
&*self.connection
}
pub fn backend(&self) -> DatabaseBackend {
self.connection.backend()
}
pub async fn query(&self, sql: &str) -> crate::connection::DatabaseResult<crate::connection::DatabaseRows> {
self.connection.query(sql).await
}
pub async fn query_with(
&self,
sql: &str,
params: Vec<wae_types::Value>,
) -> crate::connection::DatabaseResult<crate::connection::DatabaseRows> {
self.connection.query_with(sql, params).await
}
pub async fn execute(&self, sql: &str) -> crate::connection::DatabaseResult<u64> {
self.connection.execute(sql).await
}
pub async fn execute_with(&self, sql: &str, params: Vec<wae_types::Value>) -> crate::connection::DatabaseResult<u64> {
self.connection.execute_with(sql, params).await
}
pub async fn prepare(&self, sql: &str) -> crate::connection::DatabaseResult<crate::connection::DatabaseStatement> {
self.connection.prepare(sql).await
}
pub async fn begin_transaction(&self) -> crate::connection::DatabaseResult<()> {
self.connection.begin_transaction().await
}
pub async fn commit(&self) -> crate::connection::DatabaseResult<()> {
self.connection.commit().await
}
pub async fn rollback(&self) -> crate::connection::DatabaseResult<()> {
self.connection.rollback().await
}
#[cfg(feature = "limbo")]
pub async fn query_with_limbo(
&self,
sql: &str,
params: Vec<limbo::Value>,
) -> crate::connection::DatabaseResult<crate::connection::DatabaseRows> {
self.connection.query_with_limbo(sql, params).await
}
#[cfg(feature = "limbo")]
pub async fn execute_with_limbo(&self, sql: &str, params: Vec<limbo::Value>) -> crate::connection::DatabaseResult<u64> {
self.connection.execute_with_limbo(sql, params).await
}
}
#[cfg(feature = "postgres")]
#[derive(Clone)]
pub struct PostgresConnectionExtractor {
connection: Arc<crate::connection::PostgresConnection>,
}
#[cfg(feature = "postgres")]
impl fmt::Debug for PostgresConnectionExtractor {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("PostgresConnectionExtractor").field("backend", &DatabaseBackend::Postgres).finish()
}
}
#[cfg(feature = "postgres")]
impl PostgresConnectionExtractor {
pub fn new(connection: Arc<crate::connection::PostgresConnection>) -> Self {
Self { connection }
}
pub fn from_request<B>(request: &http::Request<B>) -> Result<Self, DatabaseRejection> {
request
.extensions()
.get::<Arc<crate::connection::PostgresConnection>>()
.cloned()
.map(|connection| PostgresConnectionExtractor { connection })
.ok_or_else(|| DatabaseRejection::new(WaeError::internal("PostgreSQL connection not found in request extensions")))
}
pub fn inner(&self) -> &crate::connection::PostgresConnection {
&*self.connection
}
pub fn backend(&self) -> DatabaseBackend {
self.connection.backend()
}
pub async fn query(&self, sql: &str) -> crate::connection::DatabaseResult<crate::connection::DatabaseRows> {
self.connection.query(sql).await
}
pub async fn query_with(
&self,
sql: &str,
params: Vec<wae_types::Value>,
) -> crate::connection::DatabaseResult<crate::connection::DatabaseRows> {
self.connection.query_with(sql, params).await
}
pub async fn execute(&self, sql: &str) -> crate::connection::DatabaseResult<u64> {
self.connection.execute(sql).await
}
pub async fn execute_with(&self, sql: &str, params: Vec<wae_types::Value>) -> crate::connection::DatabaseResult<u64> {
self.connection.execute_with(sql, params).await
}
pub async fn prepare(&self, sql: &str) -> crate::connection::DatabaseResult<crate::connection::DatabaseStatement> {
self.connection.prepare(sql).await
}
pub async fn begin_transaction(&self) -> crate::connection::DatabaseResult<()> {
self.connection.begin_transaction().await
}
pub async fn commit(&self) -> crate::connection::DatabaseResult<()> {
self.connection.commit().await
}
pub async fn rollback(&self) -> crate::connection::DatabaseResult<()> {
self.connection.rollback().await
}
}
#[cfg(feature = "mysql")]
#[derive(Clone)]
pub struct MySqlConnectionExtractor {
connection: Arc<crate::connection::MySqlConnection>,
}
#[cfg(feature = "mysql")]
impl fmt::Debug for MySqlConnectionExtractor {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("MySqlConnectionExtractor").field("backend", &DatabaseBackend::MySql).finish()
}
}
#[cfg(feature = "mysql")]
impl MySqlConnectionExtractor {
pub fn new(connection: Arc<crate::connection::MySqlConnection>) -> Self {
Self { connection }
}
pub fn from_request<B>(request: &http::Request<B>) -> Result<Self, DatabaseRejection> {
request
.extensions()
.get::<Arc<crate::connection::MySqlConnection>>()
.cloned()
.map(|connection| MySqlConnectionExtractor { connection })
.ok_or_else(|| DatabaseRejection::new(WaeError::internal("MySQL connection not found in request extensions")))
}
pub fn inner(&self) -> &crate::connection::MySqlConnection {
&*self.connection
}
pub fn backend(&self) -> DatabaseBackend {
self.connection.backend()
}
pub async fn query(&self, sql: &str) -> crate::connection::DatabaseResult<crate::connection::DatabaseRows> {
self.connection.query(sql).await
}
pub async fn query_with(
&self,
sql: &str,
params: Vec<wae_types::Value>,
) -> crate::connection::DatabaseResult<crate::connection::DatabaseRows> {
self.connection.query_with(sql, params).await
}
pub async fn execute(&self, sql: &str) -> crate::connection::DatabaseResult<u64> {
self.connection.execute(sql).await
}
pub async fn execute_with(&self, sql: &str, params: Vec<wae_types::Value>) -> crate::connection::DatabaseResult<u64> {
self.connection.execute_with(sql, params).await
}
pub async fn prepare(&self, sql: &str) -> crate::connection::DatabaseResult<crate::connection::DatabaseStatement> {
self.connection.prepare(sql).await
}
pub async fn begin_transaction(&self) -> crate::connection::DatabaseResult<()> {
self.connection.begin_transaction().await
}
pub async fn commit(&self) -> crate::connection::DatabaseResult<()> {
self.connection.commit().await
}
pub async fn rollback(&self) -> crate::connection::DatabaseResult<()> {
self.connection.rollback().await
}
}