sea_orm/database/
sea_schema_shim.rs

1use crate::{
2    ConnectionTrait, DatabaseConnection, DatabaseTransaction, DbErr, QueryResult, QueryResultRow,
3    RuntimeErr, Statement,
4};
5use sea_query::SelectStatement;
6use sea_schema::sqlx_types::SqlxRow;
7use sqlx::Error as SqlxError;
8use std::sync::Arc;
9
10#[async_trait::async_trait]
11impl sea_schema::Connection for DatabaseConnection {
12    async fn query_all(&self, select: SelectStatement) -> Result<Vec<SqlxRow>, SqlxError> {
13        map_result(ConnectionTrait::query_all(self, &select).await)
14    }
15
16    async fn query_all_raw(&self, sql: String) -> Result<Vec<SqlxRow>, SqlxError> {
17        map_result(
18            ConnectionTrait::query_all_raw(
19                self,
20                Statement::from_string(self.get_database_backend(), sql),
21            )
22            .await,
23        )
24    }
25}
26
27#[async_trait::async_trait]
28impl sea_schema::Connection for DatabaseTransaction {
29    async fn query_all(&self, select: SelectStatement) -> Result<Vec<SqlxRow>, SqlxError> {
30        map_result(ConnectionTrait::query_all(self, &select).await)
31    }
32
33    async fn query_all_raw(&self, sql: String) -> Result<Vec<SqlxRow>, SqlxError> {
34        map_result(
35            ConnectionTrait::query_all_raw(
36                self,
37                Statement::from_string(self.get_database_backend(), sql),
38            )
39            .await,
40        )
41    }
42}
43
44#[async_trait::async_trait]
45impl sea_schema::Connection for crate::DatabaseExecutor<'_> {
46    async fn query_all(&self, select: SelectStatement) -> Result<Vec<SqlxRow>, SqlxError> {
47        match self {
48            crate::DatabaseExecutor::Connection(conn) => {
49                <DatabaseConnection as sea_schema::Connection>::query_all(conn, select).await
50            }
51            crate::DatabaseExecutor::Transaction(txn) => {
52                <DatabaseTransaction as sea_schema::Connection>::query_all(txn, select).await
53            }
54        }
55    }
56
57    async fn query_all_raw(&self, sql: String) -> Result<Vec<SqlxRow>, SqlxError> {
58        match self {
59            crate::DatabaseExecutor::Connection(conn) => {
60                <DatabaseConnection as sea_schema::Connection>::query_all_raw(conn, sql).await
61            }
62            crate::DatabaseExecutor::Transaction(txn) => {
63                <DatabaseTransaction as sea_schema::Connection>::query_all_raw(txn, sql).await
64            }
65        }
66    }
67}
68
69fn map_result(result: Result<Vec<QueryResult>, DbErr>) -> Result<Vec<SqlxRow>, SqlxError> {
70    match result {
71        Ok(rows) => Ok(rows
72            .into_iter()
73            .filter_map(|r| match r.row {
74                #[cfg(feature = "sqlx-mysql")]
75                QueryResultRow::SqlxMySql(r) => Some(SqlxRow::MySql(r)),
76                #[cfg(feature = "sqlx-postgres")]
77                QueryResultRow::SqlxPostgres(r) => Some(SqlxRow::Postgres(r)),
78                #[cfg(feature = "sqlx-sqlite")]
79                QueryResultRow::SqlxSqlite(r) => Some(SqlxRow::Sqlite(r)),
80                #[allow(unreachable_patterns)]
81                _ => None,
82            })
83            .collect()),
84        Err(err) => Err(match err {
85            DbErr::Conn(RuntimeErr::SqlxError(err)) => {
86                Arc::into_inner(err).expect("Should only have one owner")
87            }
88            DbErr::Exec(RuntimeErr::SqlxError(err)) => {
89                Arc::into_inner(err).expect("Should only have one owner")
90            }
91            DbErr::Query(RuntimeErr::SqlxError(err)) => {
92                Arc::into_inner(err).expect("Should only have one owner")
93            }
94            _ => SqlxError::AnyDriverError(Box::new(err)),
95        }),
96    }
97}