mybatis_core/db/
bind_pg.rs1use 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}