mybatis_core/db/
bind_pg.rs

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