Skip to main content

boson_backend_sql_common/
macros.rs

1#![allow(missing_docs)]
2
3#[macro_export]
4macro_rules! sql_execute {
5    ($backend:expr, $sql:expr, |$q:ident| $body:expr) => {{
6        match &$backend.pool {
7            $crate::SqlPool::Sqlite(pool) => {
8                let $q = sqlx::query($sql);
9                let $q = $body;
10                $q.execute(pool)
11                    .await
12                    .map_err(|e| $crate::error_map::map_err(&e))?;
13            }
14            $crate::SqlPool::Postgres(pool) => {
15                let $q = sqlx::query($sql);
16                let $q = $body;
17                $q.execute(pool)
18                    .await
19                    .map_err(|e| $crate::error_map::map_err(&e))?;
20            }
21        }
22        Ok::<(), boson_core::BosonError>(())
23    }};
24}
25
26#[macro_export]
27macro_rules! sql_fetch_optional_map {
28    ($backend:expr, $sql:expr, |$q:ident| $bind:expr, |$row:ident| $map:expr) => {{
29        match &$backend.pool {
30            $crate::SqlPool::Sqlite(pool) => {
31                let $q = sqlx::query($sql);
32                let $q = $bind;
33                match $q
34                    .fetch_optional(pool)
35                    .await
36                    .map_err(|e| $crate::error_map::map_err(&e))?
37                {
38                    Some($row) => Ok(Some($map?)),
39                    None => Ok(None),
40                }
41            }
42            $crate::SqlPool::Postgres(pool) => {
43                let $q = sqlx::query($sql);
44                let $q = $bind;
45                match $q
46                    .fetch_optional(pool)
47                    .await
48                    .map_err(|e| $crate::error_map::map_err(&e))?
49                {
50                    Some($row) => Ok(Some($map?)),
51                    None => Ok(None),
52                }
53            }
54        }
55    }};
56}
57
58#[macro_export]
59macro_rules! sql_fetch_one_map {
60    ($backend:expr, $sql:expr, |$q:ident| $bind:expr, |$row:ident| $map:expr) => {{
61        match &$backend.pool {
62            $crate::SqlPool::Sqlite(pool) => {
63                let $q = sqlx::query($sql);
64                let $q = $bind;
65                let $row = $q
66                    .fetch_one(pool)
67                    .await
68                    .map_err(|e| $crate::error_map::map_err(&e))?;
69                $map
70            }
71            $crate::SqlPool::Postgres(pool) => {
72                let $q = sqlx::query($sql);
73                let $q = $bind;
74                let $row = $q
75                    .fetch_one(pool)
76                    .await
77                    .map_err(|e| $crate::error_map::map_err(&e))?;
78                $map
79            }
80        }
81    }};
82}
83
84#[macro_export]
85macro_rules! sql_fetch_all_map {
86    ($backend:expr, $sql:expr, |$q:ident| $bind:expr, |$row:ident| $map:expr) => {{
87        match &$backend.pool {
88            $crate::SqlPool::Sqlite(pool) => {
89                let $q = sqlx::query($sql);
90                let $q = $bind;
91                let rows = $q
92                    .fetch_all(pool)
93                    .await
94                    .map_err(|e| $crate::error_map::map_err(&e))?;
95                rows.iter()
96                    .map(|$row| $map)
97                    .collect::<boson_core::Result<Vec<_>>>()
98            }
99            $crate::SqlPool::Postgres(pool) => {
100                let $q = sqlx::query($sql);
101                let $q = $bind;
102                let rows = $q
103                    .fetch_all(pool)
104                    .await
105                    .map_err(|e| $crate::error_map::map_err(&e))?;
106                rows.iter()
107                    .map(|$row| $map)
108                    .collect::<boson_core::Result<Vec<_>>>()
109            }
110        }
111    }};
112}
113
114#[macro_export]
115macro_rules! sql_fetch_optional {
116    ($backend:expr, $sql:expr, |$q:ident| $body:expr) => {{
117        match &$backend.pool {
118            $crate::SqlPool::Sqlite(pool) => {
119                let $q = sqlx::query($sql);
120                let $q = $body;
121                $q.fetch_optional(pool)
122                    .await
123                    .map_err(|e| $crate::error_map::map_err(&e))
124            }
125            $crate::SqlPool::Postgres(pool) => {
126                let $q = sqlx::query($sql);
127                let $q = $body;
128                $q.fetch_optional(pool)
129                    .await
130                    .map_err(|e| $crate::error_map::map_err(&e))
131            }
132        }
133    }};
134}
135
136#[macro_export]
137macro_rules! sql_fetch_one {
138    ($backend:expr, $sql:expr, |$q:ident| $body:expr) => {{
139        match &$backend.pool {
140            $crate::SqlPool::Sqlite(pool) => {
141                let $q = sqlx::query($sql);
142                let $q = $body;
143                $q.fetch_one(pool)
144                    .await
145                    .map_err(|e| $crate::error_map::map_err(&e))
146            }
147            $crate::SqlPool::Postgres(pool) => {
148                let $q = sqlx::query($sql);
149                let $q = $body;
150                $q.fetch_one(pool)
151                    .await
152                    .map_err(|e| $crate::error_map::map_err(&e))
153            }
154        }
155    }};
156}
157
158#[macro_export]
159macro_rules! sql_fetch_all {
160    ($backend:expr, $sql:expr, |$q:ident| $body:expr) => {{
161        match &$backend.pool {
162            $crate::SqlPool::Sqlite(pool) => {
163                let $q = sqlx::query($sql);
164                let $q = $body;
165                $q.fetch_all(pool)
166                    .await
167                    .map_err(|e| $crate::error_map::map_err(&e))
168            }
169            $crate::SqlPool::Postgres(pool) => {
170                let $q = sqlx::query($sql);
171                let $q = $body;
172                $q.fetch_all(pool)
173                    .await
174                    .map_err(|e| $crate::error_map::map_err(&e))
175            }
176        }
177    }};
178}