mybatis_drive/db/
bind_pg.rs

1use 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}