luna_orm/
sql_executor.rs

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}