Skip to main content

chronon_backend_sql_common/
macros.rs

1//! Internal SQL query helpers for dialect-aware pool dispatch.
2//!
3//! **Audience:** internal — used by [`SqlSchedulerStore`](crate::SqlSchedulerStore) modules.
4
5/// Execute a parameterized SQL statement on the store pool.
6#[macro_export]
7macro_rules! sql_execute {
8    ($store:expr, $sql:expr, |$q:ident| $body:expr) => {{
9        match &$store.pool {
10            $crate::SqlPool::Sqlite(pool) => {
11                let $q = sqlx::query($sql);
12                let $q = $body;
13                $q.execute(pool).await.map_err(|e| $crate::error_map::map_err(&e))?;
14            }
15            $crate::SqlPool::Postgres(pool) => {
16                let $q = sqlx::query($sql);
17                let $q = $body;
18                $q.execute(pool).await.map_err(|e| $crate::error_map::map_err(&e))?;
19            }
20        }
21        Ok::<(), chronon_core::error::ChrononError>(())
22    }};
23}
24
25/// Fetch zero or one row and map it through a closure.
26#[macro_export]
27macro_rules! sql_fetch_optional_map {
28    ($store:expr, $sql:expr, |$q:ident| $bind:expr, |$row:ident| $map:expr) => {{
29        match &$store.pool {
30            $crate::SqlPool::Sqlite(pool) => {
31                let $q = sqlx::query($sql);
32                let $q = $bind;
33                match $q.fetch_optional(pool).await.map_err(|e| $crate::error_map::map_err(&e))? {
34                    Some($row) => Ok(Some($map?)),
35                    None => Ok(None),
36                }
37            }
38            $crate::SqlPool::Postgres(pool) => {
39                let $q = sqlx::query($sql);
40                let $q = $bind;
41                match $q.fetch_optional(pool).await.map_err(|e| $crate::error_map::map_err(&e))? {
42                    Some($row) => Ok(Some($map?)),
43                    None => Ok(None),
44                }
45            }
46        }
47    }};
48}
49
50/// Fetch exactly one row and map it through a closure.
51#[macro_export]
52macro_rules! sql_fetch_one_map {
53    ($store:expr, $sql:expr, |$q:ident| $bind:expr, |$row:ident| $map:expr) => {{
54        match &$store.pool {
55            $crate::SqlPool::Sqlite(pool) => {
56                let $q = sqlx::query($sql);
57                let $q = $bind;
58                let $row = $q.fetch_one(pool).await.map_err(|e| $crate::error_map::map_err(&e))?;
59                $map
60            }
61            $crate::SqlPool::Postgres(pool) => {
62                let $q = sqlx::query($sql);
63                let $q = $bind;
64                let $row = $q.fetch_one(pool).await.map_err(|e| $crate::error_map::map_err(&e))?;
65                $map
66            }
67        }
68    }};
69}
70
71/// Fetch all rows and map each through a closure.
72#[macro_export]
73macro_rules! sql_fetch_all_map {
74    ($store:expr, $sql:expr, |$q:ident| $bind:expr, |$row:ident| $map:expr) => {{
75        match &$store.pool {
76            $crate::SqlPool::Sqlite(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::<chronon_core::Result<Vec<_>>>()
81            }
82            $crate::SqlPool::Postgres(pool) => {
83                let $q = sqlx::query($sql);
84                let $q = $bind;
85                let rows = $q.fetch_all(pool).await.map_err(|e| $crate::error_map::map_err(&e))?;
86                rows.iter().map(|$row| $map).collect::<chronon_core::Result<Vec<_>>>()
87            }
88        }
89    }};
90}