subgraph/data_sources/sql/services/find_one/
mod.rs

1use log::{debug, error, trace, warn};
2
3use crate::{
4    data_sources::sql::{PoolEnum, SqlQuery},
5    sql_value::SqlValue,
6};
7
8use super::{ResponseRow, Services};
9
10impl Services {
11    pub async fn find_one(
12        pool_enum: &PoolEnum,
13        sql_query: &SqlQuery,
14    ) -> Result<Option<ResponseRow>, async_graphql::Error> {
15        debug!("Executing Find One Query: {:?}", sql_query);
16        match pool_enum {
17            PoolEnum::MySql(pool) => {
18                debug!("Executing MYSQL Query");
19                let mut query = sqlx::query(&sql_query.query);
20
21                for value in &sql_query.where_values {
22                    match value {
23                        SqlValue::String(v) | SqlValue::ObjectID(v) => {
24                            query = query.bind(v);
25                        }
26                        SqlValue::Int(v) => {
27                            query = query.bind(v);
28                        }
29                        SqlValue::Bool(v) => {
30                            query = query.bind(v);
31                        }
32                        SqlValue::StringList(values) | SqlValue::ObjectIDList(values) => {
33                            for string in values {
34                                query = query.bind(string)
35                            }
36                        }
37                        SqlValue::IntList(values) => {
38                            for int in values {
39                                query = query.bind(int)
40                            }
41                        }
42                        SqlValue::BoolList(values) => {
43                            for bool in values {
44                                query = query.bind(bool)
45                            }
46                        }
47                        SqlValue::UUID(v) => {
48                            query = query.bind(v);
49                        }
50                        SqlValue::UUIDList(values) => {
51                            for uuid in values {
52                                query = query.bind(uuid)
53                            }
54                        }
55                        SqlValue::DateTime(v) => {
56                            query = query.bind(v);
57                        }
58                        SqlValue::DateTimeList(values) => {
59                            for datetime in values {
60                                query = query.bind(datetime)
61                            }
62                        }
63                    }
64                }
65
66                let row = query.fetch_optional(pool).await?;
67
68                debug!("DB Row: {:?}", row);
69
70                if row.is_none() {
71                    return Ok(None);
72                }
73
74                Ok(Some(ResponseRow::MySql(row.unwrap())))
75            }
76            PoolEnum::Postgres(pool) => {
77                debug!("Executing POSTGRES Query");
78                let mut query = sqlx::query(&sql_query.query);
79
80                for value in &sql_query.where_values {
81                    match value {
82                        SqlValue::String(v) | SqlValue::ObjectID(v) => {
83                            query = query.bind(v);
84                        }
85                        SqlValue::Int(v) => {
86                            query = query.bind(v);
87                        }
88                        SqlValue::Bool(v) => {
89                            query = query.bind(v);
90                        }
91                        SqlValue::StringList(values) | SqlValue::ObjectIDList(values) => {
92                            for string in values {
93                                query = query.bind(string)
94                            }
95                        }
96                        SqlValue::IntList(values) => {
97                            for int in values {
98                                query = query.bind(int)
99                            }
100                        }
101                        SqlValue::BoolList(values) => {
102                            for bool in values {
103                                query = query.bind(bool)
104                            }
105                        }
106                        SqlValue::UUID(v) => {
107                            query = query.bind(v);
108                        }
109                        SqlValue::UUIDList(values) => {
110                            for uuid in values {
111                                query = query.bind(uuid)
112                            }
113                        }
114                        SqlValue::DateTime(v) => {
115                            query = query.bind(v);
116                        }
117                        SqlValue::DateTimeList(values) => {
118                            for datetime in values {
119                                query = query.bind(datetime)
120                            }
121                        }
122                    }
123                }
124
125                let row = query.fetch_optional(pool).await?;
126
127                if row.is_none() {
128                    return Ok(None);
129                }
130
131                Ok(Some(ResponseRow::Postgres(row.unwrap())))
132            }
133            PoolEnum::SqLite(pool) => {
134                debug!("Executing SQLITE Query: {:?}", sql_query.query);
135                let mut query = sqlx::query(&sql_query.query);
136
137                for value in &sql_query.where_values {
138                    match value {
139                        SqlValue::String(v) | SqlValue::ObjectID(v) => {
140                            query = query.bind(v);
141                        }
142                        SqlValue::Int(v) => {
143                            query = query.bind(v);
144                        }
145                        SqlValue::Bool(v) => {
146                            query = query.bind(v);
147                        }
148                        SqlValue::StringList(values) | SqlValue::ObjectIDList(values) => {
149                            for string in values {
150                                query = query.bind(string)
151                            }
152                        }
153                        SqlValue::IntList(values) => {
154                            for int in values {
155                                query = query.bind(int)
156                            }
157                        }
158                        SqlValue::BoolList(values) => {
159                            for bool in values {
160                                query = query.bind(bool)
161                            }
162                        }
163                        SqlValue::UUID(v) => {
164                            query = query.bind(v);
165                        }
166                        SqlValue::UUIDList(values) => {
167                            for uuid in values {
168                                query = query.bind(uuid)
169                            }
170                        }
171                        SqlValue::DateTime(v) => {
172                            query = query.bind(v);
173                        }
174                        SqlValue::DateTimeList(values) => {
175                            for datetime in values {
176                                query = query.bind(datetime)
177                            }
178                        }
179                    }
180                }
181
182                let row = query.fetch_optional(pool).await.map_err(|e| {
183                    error!("Sqlite Find One Error: {:?}", e);
184                    async_graphql::Error::new(format!("Error finding one"))
185                })?;
186
187                if row.is_none() {
188                    warn!("No row found: {:?}", sql_query);
189                    return Ok(None);
190                }
191                trace!("Row Found: {:?}", row.is_some());
192                Ok(Some(ResponseRow::SqLite(row.unwrap())))
193            }
194        }
195    }
196}