mybatis_drive/db/
bind_pg.rs1use std::str::FromStr;
2use rbson::Bson;
3use rbson::spec::BinarySubtype;
4use sqlx_core::query::Query;
5use crate::error::Error;
6use crate::types::{DateNative, DateTimeUtc, DateUtc, Decimal, TimeNative, TimestampZ, TimeUtc};
7use std::time::SystemTime;
8use bigdecimal_::BigDecimal;
9use sqlx_core::postgres::{Postgres, PgArguments};
10use crate::types::DateTimeNative;
11use crate::Uuid;
12
13#[inline]
14pub fn bind(t: Bson, mut q: Query<Postgres, PgArguments>) -> crate::Result<Query<Postgres, PgArguments>> {
15 match t {
16 Bson::String(s) => {
17 if s.starts_with("TimestampZ(") {
18 let data: TimestampZ = rbson::from_bson(Bson::String(s))?;
19 q = q.bind(data.inner);
20 return Ok(q);
21 }
22 if s.starts_with("DateTimeUtc(") {
23 let data: DateTimeUtc = rbson::from_bson(Bson::String(s))?;
24 q = q.bind(data.inner);
25 return Ok(q);
26 }
27 if s.starts_with("DateTimeNative(") {
28 let data: DateTimeNative = rbson::from_bson(Bson::String(s))?;
29 q = q.bind(data.inner);
30 return Ok(q);
31 }
32 if s.starts_with("DateNative(") {
33 let data: DateNative = rbson::from_bson(Bson::String(s))?;
34 q = q.bind(data.inner);
35 return Ok(q);
36 }
37 if s.starts_with("DateUtc(") {
38 let data: DateUtc = rbson::from_bson(Bson::String(s))?;
39 q = q.bind(data.inner);
40 return Ok(q);
41 }
42 if s.starts_with("TimeUtc(") {
43 let data: TimeUtc = rbson::from_bson(Bson::String(s))?;
44 q = q.bind(data.inner);
45 return Ok(q);
46 }
47 if s.starts_with("TimeNative(") {
48 let data: TimeNative = rbson::from_bson(Bson::String(s))?;
49 q = q.bind(data.inner);
50 return Ok(q);
51 }
52 if s.starts_with("Decimal(") {
53 let data: Decimal = rbson::from_bson(Bson::String(s))?;
54 q = q.bind(data.inner.to_string());
55 return Ok(q);
56 }
57 if s.starts_with("Uuid(") {
58 let data: Uuid = rbson::from_bson(Bson::String(s))?;
59 q = q.bind(data.inner);
60 return Ok(q);
61 }
62 q = q.bind(Some(s));
63 }
64 Bson::Null => {
65 q = q.bind(Option::<String>::None);
66 }
67 Bson::Int32(n) => {
68 q = q.bind(n);
69 }
70 Bson::Int64(n) => {
71 q = q.bind(n);
72 }
73 Bson::UInt32(n) => {
74 q = q.bind(n);
75 }
76 Bson::UInt64(n) => {
77 q = q.bind(n as i64);
78 }
79 Bson::Double(n) => {
80 q = q.bind(n);
81 }
82 Bson::Boolean(b) => {
83 q = q.bind(b);
84 }
85 Bson::Decimal128(d) => {
86 q = q.bind(BigDecimal::from_str(&d.to_string()).unwrap_or_default());
87 }
88 Bson::Binary(d) => {
89 match d.subtype {
90 BinarySubtype::Generic => {
91 q = q.bind(d.bytes);
92 }
93 BinarySubtype::Uuid => {
94 q = q.bind(crate::types::Uuid::from(d).inner);
95 }
96 BinarySubtype::UserDefined(type_id) => {
97 match type_id {
98 crate::types::BINARY_SUBTYPE_JSON => {
99 q = q.bind(serde_json::from_slice::<serde_json::Value>(&d.bytes).unwrap_or_default());
100 }
101 _ => {
102 return Err(Error::from("un supported bind type!"));
103 }
104 }
105 }
106 _ => {
107 return Err(Error::from("un supported bind type!"));
108 }
109 }
110 }
111 Bson::DateTime(d) => {
112 q = q.bind(DateTimeNative::from(d).inner);
113 }
114 Bson::Timestamp(d) => {
115 let systime = SystemTime::from(crate::types::Timestamp::from(d).inner);
116 let primitive_date_time = time::PrimitiveDateTime::from(systime);
117 q = q.bind(primitive_date_time);
118 }
119 Bson::ObjectId(d) => {
120 q = q.bind(d.to_string());
121 }
122 Bson::Array(arr) => {
123 let mut arr_str = vec![];
124 let mut arr_i32 = vec![];
125 let mut arr_i64 = vec![];
126 let mut arr_double = vec![];
127 let mut arr_bool = vec![];
128 let mut arr_decimal = vec![];
129 let mut arr_bytes = vec![];
130 let mut arr_uuid = vec![];
131 let mut arr_json = vec![];
132 let mut arr_timestampz = vec![];
133 let mut arr_datetime_utc = vec![];
134 let mut arr_datetime_native = vec![];
135 let mut arr_datenative = vec![];
136 let mut arr_dateutc = vec![];
137 let mut arr_timeutc = vec![];
138 let mut arr_timenative = vec![];
139 for x in arr {
140 match x {
141 Bson::String(s) => {
142 if s.starts_with("TimestampZ(") {
143 let data: TimestampZ = rbson::from_bson(Bson::String(s))?;
144 arr_timestampz.push(data.inner);
145 continue;
146 }
147 if s.starts_with("DateTimeUtc(") {
148 let data: DateTimeUtc = rbson::from_bson(Bson::String(s))?;
149 arr_datetime_utc.push(data.inner);
150 continue;
151 }
152 if s.starts_with("DateTimeNative(") {
153 let data: DateTimeNative = rbson::from_bson(Bson::String(s))?;
154 arr_datetime_native.push(data.inner);
155 continue;
156 }
157 if s.starts_with("DateNative(") {
158 let data: DateNative = rbson::from_bson(Bson::String(s))?;
159 arr_datenative.push(data.inner);
160 continue;
161 }
162 if s.starts_with("DateUtc(") {
163 let data: DateUtc = rbson::from_bson(Bson::String(s))?;
164 arr_dateutc.push(data.inner);
165 continue;
166 }
167 if s.starts_with("TimeUtc(") {
168 let data: TimeUtc = rbson::from_bson(Bson::String(s))?;
169 arr_timeutc.push(data.inner);
170 continue;
171 }
172 if s.starts_with("TimeNative(") {
173 let data: TimeNative = rbson::from_bson(Bson::String(s))?;
174 arr_timenative.push(data.inner);
175 continue;
176 }
177 if s.starts_with("Decimal(") {
178 let data: Decimal = rbson::from_bson(Bson::String(s))?;
179 arr_decimal.push(data.inner);
180 continue;
181 }
182 if s.starts_with("Uuid(") {
183 let data: Uuid = rbson::from_bson(Bson::String(s))?;
184 arr_uuid.push(data.inner);
185 continue;
186 }
187 arr_str.push(s);
188 }
189 Bson::Null => {
190 return crate::Result::Err(crate::Error::from("unsupported type!"));
191 }
192 Bson::Int32(n) => {
193 arr_i32.push(n);
194 }
195 Bson::Int64(n) => {
196 arr_i64.push(n);
197 }
198 Bson::Double(n) => {
199 arr_double.push(n);
200 }
201 Bson::Boolean(b) => {
202 arr_bool.push(b);
203 }
204 Bson::Decimal128(d) => {
205 arr_decimal.push(BigDecimal::from_str(&d.to_string()).unwrap_or_default());
206 }
207 Bson::Binary(d) => {
208 match d.subtype {
209 BinarySubtype::Generic => {
210 arr_bytes.push(d.bytes);
211 }
212 BinarySubtype::Uuid => {
213 arr_uuid.push(crate::types::Uuid::from(d).inner);
214 }
215 BinarySubtype::UserDefined(type_id) => {
216 match type_id {
217 crate::types::BINARY_SUBTYPE_JSON => {
218 arr_json.push(serde_json::from_slice::<serde_json::Value>(&d.bytes).unwrap_or_default());
219 }
220 _ => {
221 return Err(Error::from("un supported bind type!"));
222 }
223 }
224 }
225 _ => {
226 return Err(Error::from("un supported bind type!"));
227 }
228 }
229 }
230 Bson::DateTime(d) => {
231 q = q.bind(DateTimeNative::from(d).inner);
232 }
233 Bson::Timestamp(d) => {
234 let systime = SystemTime::from(crate::types::Timestamp::from(d).inner);
235 let primitive_date_time = time::PrimitiveDateTime::from(systime);
236 q = q.bind(primitive_date_time);
237 }
238 Bson::ObjectId(d) => {
239 q = q.bind(d.to_string());
240 }
241 _ => {
242 return crate::Result::Err(crate::Error::from("unsupported type!"));
243 }
244 }
245 }
246 if !arr_str.is_empty() {
247 q = q.bind(arr_str);
248 }
249 if !arr_i32.is_empty() {
250 q = q.bind(arr_i32);
251 }
252 if !arr_i64.is_empty() {
253 q = q.bind(arr_i64);
254 }
255 if !arr_double.is_empty() {
256 q = q.bind(arr_double);
257 }
258 if !arr_decimal.is_empty() {
259 q = q.bind(arr_decimal);
260 }
261 if !arr_bytes.is_empty() {
262 q = q.bind(arr_bytes);
263 }
264 if !arr_uuid.is_empty() {
265 q = q.bind(arr_uuid);
266 }
267 if !arr_json.is_empty() {
268 q = q.bind(arr_json);
269 }
270 if !arr_timestampz.is_empty() {
271 q = q.bind(arr_timestampz);
272 }
273 if !arr_datetime_utc.is_empty() {
274 q = q.bind(arr_datetime_utc);
275 }
276 if !arr_datetime_native.is_empty() {
277 q = q.bind(arr_datetime_native);
278 }
279 if !arr_datenative.is_empty() {
280 q = q.bind(arr_datenative);
281 }
282 if !arr_dateutc.is_empty() {
283 q = q.bind(arr_dateutc);
284 }
285 if !arr_timeutc.is_empty() {
286 q = q.bind(arr_timeutc);
287 }
288 if !arr_timenative.is_empty() {
289 q = q.bind(arr_timenative);
290 }
291 }
292 _ => {
293 return crate::Result::Err(crate::Error::from("unsupported type!"));
294 }
295 }
296 return Ok(q);
297}