sea_orm/database/
sea_schema_shim.rs1use 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 crate::DatabaseExecutor::OwnedTransaction(txn) => {
55 <DatabaseTransaction as sea_schema::Connection>::query_all(txn, select).await
56 }
57 }
58 }
59
60 async fn query_all_raw(&self, sql: String) -> Result<Vec<SqlxRow>, SqlxError> {
61 match self {
62 crate::DatabaseExecutor::Connection(conn) => {
63 <DatabaseConnection as sea_schema::Connection>::query_all_raw(conn, sql).await
64 }
65 crate::DatabaseExecutor::Transaction(txn) => {
66 <DatabaseTransaction as sea_schema::Connection>::query_all_raw(txn, sql).await
67 }
68 crate::DatabaseExecutor::OwnedTransaction(txn) => {
69 <DatabaseTransaction as sea_schema::Connection>::query_all_raw(txn, sql).await
70 }
71 }
72 }
73}
74
75fn map_result(result: Result<Vec<QueryResult>, DbErr>) -> Result<Vec<SqlxRow>, SqlxError> {
76 match result {
77 Ok(rows) => Ok(rows
78 .into_iter()
79 .filter_map(|r| match r.row {
80 #[cfg(feature = "sqlx-mysql")]
81 QueryResultRow::SqlxMySql(r) => Some(SqlxRow::MySql(r)),
82 #[cfg(feature = "sqlx-postgres")]
83 QueryResultRow::SqlxPostgres(r) => Some(SqlxRow::Postgres(r)),
84 #[cfg(feature = "sqlx-sqlite")]
85 QueryResultRow::SqlxSqlite(r) => Some(SqlxRow::Sqlite(r)),
86 #[allow(unreachable_patterns)]
87 _ => None,
88 })
89 .collect()),
90 Err(err) => Err(match err {
91 DbErr::Conn(RuntimeErr::SqlxError(err)) => {
92 Arc::into_inner(err).expect("Should only have one owner")
93 }
94 DbErr::Exec(RuntimeErr::SqlxError(err)) => {
95 Arc::into_inner(err).expect("Should only have one owner")
96 }
97 DbErr::Query(RuntimeErr::SqlxError(err)) => {
98 Arc::into_inner(err).expect("Should only have one owner")
99 }
100 _ => SqlxError::AnyDriverError(Box::new(err)),
101 }),
102 }
103}