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).await.map_err(|e| $crate::error_map::map_err(&e))?;
11            }
12            $crate::SqlPool::Postgres(pool) => {
13                let $q = sqlx::query($sql);
14                let $q = $body;
15                $q.execute(pool).await.map_err(|e| $crate::error_map::map_err(&e))?;
16            }
17        }
18        Ok::<(), boson_core::BosonError>(())
19    }};
20}
21
22#[macro_export]
23macro_rules! sql_fetch_optional_map {
24    ($backend:expr, $sql:expr, |$q:ident| $bind:expr, |$row:ident| $map:expr) => {{
25        match &$backend.pool {
26            $crate::SqlPool::Sqlite(pool) => {
27                let $q = sqlx::query($sql);
28                let $q = $bind;
29                match $q.fetch_optional(pool).await.map_err(|e| $crate::error_map::map_err(&e))? {
30                    Some($row) => Ok(Some($map?)),
31                    None => Ok(None),
32                }
33            }
34            $crate::SqlPool::Postgres(pool) => {
35                let $q = sqlx::query($sql);
36                let $q = $bind;
37                match $q.fetch_optional(pool).await.map_err(|e| $crate::error_map::map_err(&e))? {
38                    Some($row) => Ok(Some($map?)),
39                    None => Ok(None),
40                }
41            }
42        }
43    }};
44}
45
46#[macro_export]
47macro_rules! sql_fetch_one_map {
48    ($backend:expr, $sql:expr, |$q:ident| $bind:expr, |$row:ident| $map:expr) => {{
49        match &$backend.pool {
50            $crate::SqlPool::Sqlite(pool) => {
51                let $q = sqlx::query($sql);
52                let $q = $bind;
53                let $row = $q.fetch_one(pool).await.map_err(|e| $crate::error_map::map_err(&e))?;
54                $map
55            }
56            $crate::SqlPool::Postgres(pool) => {
57                let $q = sqlx::query($sql);
58                let $q = $bind;
59                let $row = $q.fetch_one(pool).await.map_err(|e| $crate::error_map::map_err(&e))?;
60                $map
61            }
62        }
63    }};
64}
65
66#[macro_export]
67macro_rules! sql_fetch_all_map {
68    ($backend:expr, $sql:expr, |$q:ident| $bind:expr, |$row:ident| $map:expr) => {{
69        match &$backend.pool {
70            $crate::SqlPool::Sqlite(pool) => {
71                let $q = sqlx::query($sql);
72                let $q = $bind;
73                let rows = $q.fetch_all(pool).await.map_err(|e| $crate::error_map::map_err(&e))?;
74                rows.iter().map(|$row| $map).collect::<boson_core::Result<Vec<_>>>()
75            }
76            $crate::SqlPool::Postgres(pool) => {
77                let $q = sqlx::query($sql);
78                let $q = $bind;
79                let rows = $q.fetch_all(pool).await.map_err(|e| $crate::error_map::map_err(&e))?;
80                rows.iter().map(|$row| $map).collect::<boson_core::Result<Vec<_>>>()
81            }
82        }
83    }};
84}
85
86#[macro_export]
87macro_rules! sql_fetch_optional {
88    ($backend:expr, $sql:expr, |$q:ident| $body:expr) => {{
89        match &$backend.pool {
90            $crate::SqlPool::Sqlite(pool) => {
91                let $q = sqlx::query($sql);
92                let $q = $body;
93                $q.fetch_optional(pool)
94                    .await
95                    .map_err(|e| $crate::error_map::map_err(&e))
96            }
97            $crate::SqlPool::Postgres(pool) => {
98                let $q = sqlx::query($sql);
99                let $q = $body;
100                $q.fetch_optional(pool)
101                    .await
102                    .map_err(|e| $crate::error_map::map_err(&e))
103            }
104        }
105    }};
106}
107
108#[macro_export]
109macro_rules! sql_fetch_one {
110    ($backend:expr, $sql:expr, |$q:ident| $body:expr) => {{
111        match &$backend.pool {
112            $crate::SqlPool::Sqlite(pool) => {
113                let $q = sqlx::query($sql);
114                let $q = $body;
115                $q.fetch_one(pool).await.map_err(|e| $crate::error_map::map_err(&e))
116            }
117            $crate::SqlPool::Postgres(pool) => {
118                let $q = sqlx::query($sql);
119                let $q = $body;
120                $q.fetch_one(pool).await.map_err(|e| $crate::error_map::map_err(&e))
121            }
122        }
123    }};
124}
125
126#[macro_export]
127macro_rules! sql_fetch_all {
128    ($backend:expr, $sql:expr, |$q:ident| $body:expr) => {{
129        match &$backend.pool {
130            $crate::SqlPool::Sqlite(pool) => {
131                let $q = sqlx::query($sql);
132                let $q = $body;
133                $q.fetch_all(pool).await.map_err(|e| $crate::error_map::map_err(&e))
134            }
135            $crate::SqlPool::Postgres(pool) => {
136                let $q = sqlx::query($sql);
137                let $q = $body;
138                $q.fetch_all(pool).await.map_err(|e| $crate::error_map::map_err(&e))
139            }
140        }
141    }};
142}