subgraph/data_sources/sql/services/create_one/
mod.rs1use bson::doc;
2use log::{debug, error};
3
4use crate::{
5 configuration::subgraph::{
6 data_sources::sql::DialectEnum, entities::ServiceEntityConfig, SubGraphConfig,
7 },
8 data_sources::sql::{PoolEnum, SqlDataSource, SqlQuery},
9 sql_value::SqlValue,
10};
11
12use super::{ResponseRow, Services};
13
14impl Services {
15 pub async fn create_one(
16 entity: &ServiceEntityConfig,
17 pool_enum: &PoolEnum,
18 sql_query: &SqlQuery,
19 dialect: DialectEnum,
20 subgraph_config: &SubGraphConfig,
21 ) -> Result<Option<ResponseRow>, async_graphql::Error> {
22 debug!("Executing Create One Query: {:?}", sql_query);
23
24 match pool_enum {
25 PoolEnum::MySql(pool) => {
26 let mut query = sqlx::query(&sql_query.query);
27
28 for value in &sql_query.values {
29 match value {
30 SqlValue::String(v) | SqlValue::ObjectID(v) => {
31 query = query.bind(v);
32 }
33 SqlValue::Int(v) => {
34 query = query.bind(v);
35 }
36 SqlValue::Bool(v) => {
37 query = query.bind(v);
38 }
39 SqlValue::StringList(values) | SqlValue::ObjectIDList(values) => {
40 for string in values {
41 query = query.bind(string)
42 }
43 }
44 SqlValue::IntList(values) => {
45 for int in values {
46 query = query.bind(int)
47 }
48 }
49 SqlValue::BoolList(values) => {
50 for bool in values {
51 query = query.bind(bool)
52 }
53 }
54 SqlValue::UUID(v) => {
55 query = query.bind(v);
56 }
57 SqlValue::UUIDList(values) => {
58 for uuid in values {
59 query = query.bind(uuid)
60 }
61 }
62 SqlValue::DateTime(v) => {
63 query = query.bind(v);
64 }
65 SqlValue::DateTimeList(values) => {
66 for datetime in values {
67 query = query.bind(datetime)
68 }
69 }
70 }
71 }
72
73 let last_inserted_id = query.execute(pool).await?.last_insert_id();
74
75 let input_document = doc! {
76 "query": {
77 "id": last_inserted_id as i32,
78 }
79 };
80
81 let (find_one_query, ..) = SqlDataSource::create_find_one_query(
82 entity,
83 &sql_query.table,
84 &dialect,
85 &input_document,
86 subgraph_config,
87 None,
88 )?;
89
90 let result = sqlx::query(&find_one_query)
91 .bind(last_inserted_id)
92 .fetch_one(pool)
93 .await?;
94
95 Ok(Some(ResponseRow::MySql(result)))
96 }
97 PoolEnum::Postgres(pool) => {
98 let mut query = sqlx::query(&sql_query.query);
99
100 for value in &sql_query.values {
101 match value {
102 SqlValue::String(v) | SqlValue::ObjectID(v) => {
103 query = query.bind(v);
104 }
105 SqlValue::Int(v) => {
106 query = query.bind(v);
107 }
108 SqlValue::Bool(v) => {
109 query = query.bind(v);
110 }
111 SqlValue::StringList(values) | SqlValue::ObjectIDList(values) => {
112 for string in values {
113 query = query.bind(string)
114 }
115 }
116 SqlValue::IntList(values) => {
117 for int in values {
118 query = query.bind(int)
119 }
120 }
121 SqlValue::BoolList(values) => {
122 for bool in values {
123 query = query.bind(bool)
124 }
125 }
126 SqlValue::UUID(v) => {
127 query = query.bind(v);
128 }
129 SqlValue::UUIDList(values) => {
130 for uuid in values {
131 query = query.bind(uuid)
132 }
133 }
134 SqlValue::DateTime(v) => {
135 query = query.bind(v);
136 }
137 SqlValue::DateTimeList(values) => {
138 for datetime in values {
139 query = query.bind(datetime)
140 }
141 }
142 }
143 }
144
145 let result = query.fetch_one(pool).await?;
146
147 Ok(Some(ResponseRow::Postgres(result)))
148 }
149 PoolEnum::SqLite(pool) => {
150 let mut query = sqlx::query(&sql_query.query);
151
152 for value in &sql_query.values {
153 match value {
154 SqlValue::String(v) | SqlValue::ObjectID(v) => {
155 query = query.bind(v);
156 }
157 SqlValue::Int(v) => {
158 query = query.bind(v);
159 }
160 SqlValue::Bool(v) => {
161 query = query.bind(v);
162 }
163 SqlValue::StringList(values) | SqlValue::ObjectIDList(values) => {
164 for string in values {
165 query = query.bind(string)
166 }
167 }
168 SqlValue::IntList(values) => {
169 for int in values {
170 query = query.bind(int)
171 }
172 }
173 SqlValue::BoolList(values) => {
174 for bool in values {
175 query = query.bind(bool)
176 }
177 }
178 SqlValue::UUID(v) => {
179 query = query.bind(v);
180 }
181 SqlValue::UUIDList(values) => {
182 for uuid in values {
183 query = query.bind(uuid)
184 }
185 }
186 SqlValue::DateTime(v) => {
187 query = query.bind(v);
188 }
189 SqlValue::DateTimeList(values) => {
190 for datetime in values {
191 query = query.bind(datetime)
192 }
193 }
194 }
195 }
196
197 let last_inserted_rowid = query
198 .execute(pool)
199 .await
200 .map_err(|e| {
201 error!("Error executing sqlite create statement: {}", e);
202 e
203 })?
204 .last_insert_rowid();
205
206 let input_document = doc! {
207 "query": {
208 "id": last_inserted_rowid as i32,
209 }
210 };
211
212 let (find_one_query, ..) = SqlDataSource::create_find_one_query(
213 entity,
214 &sql_query.table,
215 &dialect,
216 &input_document,
217 subgraph_config,
218 None,
219 )?;
220
221 let result = sqlx::query(&find_one_query)
222 .bind(last_inserted_rowid)
223 .fetch_one(pool)
224 .await
225 .map_err(|e| {
226 error!("Error refetching result: {}", e);
227 e
228 })?;
229
230 Ok(Some(ResponseRow::SqLite(result)))
231 }
232 }
233 }
234}