subgraph/data_sources/sql/services/find_one/
mod.rs1use 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}