1use crate::error::LunaOrmError;
2use crate::LunaOrmResult;
3
4use luna_orm_trait::*;
5
6use sqlx::any::AnyArguments;
7use sqlx::any::AnyQueryResult;
8use sqlx::any::AnyRow;
9use sqlx::AnyPool;
10
11pub trait SqlExecutor {
12 fn get_pool(&self) -> LunaOrmResult<&AnyPool> {
13 Err(LunaOrmError::NotImplement)
14 }
15
16 async fn fetch_one_plain<SE>(&mut self, stmt: &str) -> LunaOrmResult<SE>
17 where
18 SE: SelectedEntity + Send + Unpin,
19 {
20 let query = sqlx::query(stmt).try_map(|row: AnyRow| SE::from_any_row(row));
21 let result_opt: SE = query.fetch_one(self.get_pool()?).await?;
22 Ok(result_opt)
23 }
24
25 async fn fetch_one<SE>(&mut self, stmt: &str, args: AnyArguments<'_>) -> LunaOrmResult<SE>
26 where
27 SE: SelectedEntity + Send + Unpin,
28 {
29 let query = sqlx::query_with(stmt, args).try_map(|row: AnyRow| SE::from_any_row(row));
30 let result_opt: SE = query.fetch_one(self.get_pool()?).await?;
31 Ok(result_opt)
32 }
33
34 async fn fetch_optional_plain<SE>(&mut self, stmt: &str) -> LunaOrmResult<Option<SE>>
35 where
36 SE: SelectedEntity + Send + Unpin,
37 {
38 let query = sqlx::query(stmt).try_map(|row: AnyRow| SE::from_any_row(row));
39 let result_opt: Option<SE> = query.fetch_optional(self.get_pool()?).await?;
40 Ok(result_opt)
41 }
42 async fn fetch_optional<SE>(
43 &mut self,
44 stmt: &str,
45 args: AnyArguments<'_>,
46 ) -> LunaOrmResult<Option<SE>>
47 where
48 SE: SelectedEntity + Send + Unpin,
49 {
50 let query = sqlx::query_with(stmt, args).try_map(|row: AnyRow| SE::from_any_row(row));
51 let result_opt: Option<SE> = query.fetch_optional(self.get_pool()?).await?;
52 Ok(result_opt)
53 }
54
55 async fn fetch_all_plain<SE>(&mut self, stmt: &str) -> LunaOrmResult<Vec<SE>>
56 where
57 SE: SelectedEntity + Send + Unpin,
58 {
59 let query = sqlx::query(stmt).try_map(|row: AnyRow| SE::from_any_row(row));
60 let result_vec: Vec<SE> = query.fetch_all(self.get_pool()?).await?;
61 Ok(result_vec)
62 }
63
64 async fn fetch_all<SE>(&mut self, stmt: &str, args: AnyArguments<'_>) -> LunaOrmResult<Vec<SE>>
65 where
66 SE: SelectedEntity + Send + Unpin,
67 {
68 let query = sqlx::query_with(stmt, args).try_map(|row: AnyRow| SE::from_any_row(row));
69 let result_vec: Vec<SE> = query.fetch_all(self.get_pool()?).await?;
70 Ok(result_vec)
71 }
72
73 async fn execute(
74 &mut self,
75 stmt: &str,
76 args: AnyArguments<'_>,
77 ) -> LunaOrmResult<AnyQueryResult> {
78 Ok(sqlx::query_with(stmt, args)
79 .execute(self.get_pool()?)
80 .await?)
81 }
82
83 async fn execute_plain(&mut self, stmt: &str) -> LunaOrmResult<AnyQueryResult> {
84 Ok(sqlx::query(stmt).execute(self.get_pool()?).await?)
85 }
86}