1use std::str::FromStr;
2use mysql_async::{prelude::Queryable, Params};
3use crate::mysql::con_value::ValueConv;
4
5pub trait OrmMySqlTrait {
6 async fn query<C>(
7 comm: &mut C,
8 where_sql: &str,
9 limit: Option<usize>,
10 ) -> common_uu::IResult<Vec<Self>>
11 where
12 Self: Sized,
13 C: mysql_async::prelude::Queryable + Send + Sync;
14
15 async fn query_first<C>(comm: &mut C, where_sql: &str) -> common_uu::IResult<Option<Self>>
16 where
17 Self: Sized,
18 C: mysql_async::prelude::Queryable + Send + Sync;
19
20 async fn insert<C>(self, comm: &mut C) -> common_uu::IResult<i64>
21 where
22 Self: Sized,
23 C: mysql_async::prelude::Queryable + Send + Sync;
24
25 fn insert_sql() -> String
26 where
27 Self: Sized;
28
29 async fn update<C>(self, comm: &mut C) -> common_uu::IResult<i64>
30 where
31 Self: Sized,
32 C: mysql_async::prelude::Queryable + Send + Sync;
33
34 async fn delete<C>(&self, comm: &mut C) -> common_uu::IResult<i64>
35 where
36 Self: Sized,
37 C: mysql_async::prelude::Queryable + Send + Sync;
38
39 async fn delete_where<C>(comm: &mut C, where_sql: &str) -> common_uu::IResult<i64>
40 where
41 Self: Sized,
42 C: mysql_async::prelude::Queryable + Send + Sync;
43
44 fn delete_sql() -> String
45 where
46 Self: Sized;
47
48 fn where_id(&self) -> impl Into<mysql_async::Value>
49 where
50 Self: Sized;
51}
52
53pub trait OrmMySqlTraitConn<
54 T: OrmMySqlTrait + Send + Sync + Into<Params>,
55 C: mysql_async::prelude::Queryable + Send + Sync,
56> where
57 Self: Queryable + Sized + Send + Sync,
58{
59 async fn insert_arr(&mut self, arr: Vec<T>) -> common_uu::IResult<i64> {
60 if arr.is_empty() {
61 return Ok(0);
62 }
63 let sql = T::insert_sql();
64 let len = arr.len();
65 self.exec_batch(sql, arr).await?;
66 Ok(len as i64)
67 }
68 async fn delete_arr(&mut self, arr: Vec<T>) -> common_uu::IResult<i64> {
69 if arr.is_empty() {
70 return Ok(0);
71 }
72 let sql = T::delete_sql();
73 let params: Vec<(mysql_async::Value,)> = arr
74 .iter()
75 .map(|x| (x.where_id().into(),))
76 .collect::<Vec<_>>();
77 self.exec_batch(sql, params).await?;
78 Ok(arr.len() as i64)
79 }
80}
81
82impl<T: OrmMySqlTrait + Send + Sync + Into<Params>> OrmMySqlTraitConn<T, Self>
83 for mysql_async::Conn
84{
85}
86
87impl<'a, T: OrmMySqlTrait + Send + Sync + Clone + Into<Params>> OrmMySqlTraitConn<T, Self>
88 for mysql_async::Transaction<'a>
89{
90}
91
92pub mod con_value {
93 use std::str::FromStr;
94
95 pub trait ValueConv<T> {
96 fn conv(&self) -> common_uu::IResult<T>;
97 }
98
99 #[cfg(feature = "chrono")]
100 impl ValueConv<chrono::NaiveTime> for mysql_async::Value {
101 fn conv(&self) -> common_uu::IResult<chrono::NaiveTime> {
102 let v = match self.clone() {
103 mysql_async::Value::Bytes(bytes) => {
104 let s = String::from_utf8(bytes)?;
105 let v = chrono::NaiveTime::parse_from_str(&s, "%H:%M:%S")?;
106 v
107 }
108 mysql_async::Value::Time(_is_negative, days, hours, minutes, seconds, micro) => {
109 let mut v = chrono::NaiveTime::from_hms(0, 0, 0);
110 v = v + chrono::Duration::days(days as i64);
111 v = v + chrono::Duration::hours(hours as i64);
112 v = v + chrono::Duration::minutes(minutes as i64);
113 v = v + chrono::Duration::seconds(seconds as i64);
114 v = v + chrono::Duration::microseconds(micro as i64);
115 v
119 }
120 _ => {
121 return Err("mysql_async::Value::Time")?;
122 }
123 };
124 Ok(v)
125 }
126 }
127 #[cfg(feature = "chrono")]
128 impl ValueConv<Option<chrono::NaiveTime>> for mysql_async::Value {
129 fn conv(&self) -> common_uu::IResult<Option<chrono::NaiveTime>> {
130 let v = match self.clone() {
131 mysql_async::Value::NULL => return Ok(None),
132 other => other.conv(),
133 }?;
134 Ok(Some(v))
135 }
136 }
137
138 #[cfg(feature = "chrono")]
139 impl ValueConv<chrono::NaiveDateTime> for mysql_async::Value {
140 fn conv(&self) -> common_uu::IResult<chrono::NaiveDateTime> {
141 let v = match self.clone() {
142 mysql_async::Value::Bytes(bytes) => {
143 let s = String::from_utf8(bytes)?;
144 chrono::NaiveDateTime::parse_from_str(&s, "%Y-%m-%d %H:%M:%S")
145 }
146 mysql_async::Value::Date(year, month, day, hour, minutes, seconds, micro) => {
147 chrono::NaiveDateTime::parse_from_str(
148 &format!("{year}-{month}-{day} {hour}:{minutes}:{seconds}.{micro:0>6}"),
149 "%Y-%m-%d %H:%M:%S.f6",
150 )
151 }
152 _ => {
153 return Err("mysql_async::Value::Date")?;
154 }
155 }?;
156 Ok(v)
157 }
158 }
159
160 #[cfg(feature = "chrono")]
161 impl ValueConv<Option<chrono::NaiveDateTime>> for mysql_async::Value {
162 fn conv(&self) -> common_uu::IResult<Option<chrono::NaiveDateTime>> {
163 let v = match self.clone() {
164 mysql_async::Value::NULL => return Ok(None),
165 other => other.conv(),
166 }?;
167 Ok(Some(v))
168 }
169 }
170
171 #[cfg(feature = "chrono")]
172 impl ValueConv<chrono::NaiveDate> for mysql_async::Value {
173 fn conv(&self) -> common_uu::IResult<chrono::NaiveDate> {
174 let v = match self.clone() {
175 mysql_async::Value::Bytes(bytes) => {
176 let s = String::from_utf8(bytes)?;
177 chrono::NaiveDate::parse_from_str(&s, "%Y-%m-%d")
178 }
179 mysql_async::Value::Date(year, month, day, hour, minutes, seconds, micro) => {
180 chrono::NaiveDate::parse_from_str(&format!("{year}-{month}-{day}"), "%Y-%m-%d")
181 }
182 mysql_async::Value::Time(_is_negative, days, hours, minutes, seconds, micro) => {
183 let mut v = chrono::NaiveDate::from_ymd(1970, 1, 1);
184 v = v + chrono::Duration::days(days as i64);
185 Ok(v)
186 }
187 _ => {
188 return Err("mysql_async deser tos chrono::NaiveDate")?;
189 }
190 }?;
191 Ok(v)
192 }
193 }
194 #[cfg(feature = "chrono")]
195 impl ValueConv<Option<chrono::NaiveDate>> for mysql_async::Value {
196 fn conv(&self) -> common_uu::IResult<Option<chrono::NaiveDate>> {
197 let v = match self.clone() {
198 mysql_async::Value::NULL => return Ok(None),
199 other => other.conv(),
200 }?;
201 Ok(Some(v))
202 }
203 }
204
205 #[cfg(feature = "chrono")]
206 impl ValueConv<chrono::DateTime<chrono::Local>> for mysql_async::Value {
207 fn conv(&self) -> common_uu::IResult<chrono::DateTime<chrono::Local>> {
208 let v = match self.clone() {
209 mysql_async::Value::Int(timestament) => {
210 use chrono::TimeZone;
211 let dt = chrono::Local.timestamp(timestament as i64, 0);
212 dt
213 }
214 mysql_async::Value::UInt(timestament) => {
215 use chrono::TimeZone;
216 let dt = chrono::Local.timestamp(timestament as i64, 0);
217 dt
218 }
219 mysql_async::Value::Time(_is_negative, days, hours, minutes, seconds, micro) => {
220 let mut v = chrono::NaiveTime::from_hms(0, 0, 0);
221 v = v + chrono::Duration::days(days as i64);
222 v = v + chrono::Duration::hours(hours as i64);
223 v = v + chrono::Duration::minutes(minutes as i64);
224 v = v + chrono::Duration::seconds(seconds as i64);
225 v = v + chrono::Duration::microseconds(micro as i64);
226 chrono::Local::now().date().and_time(v).unwrap_or_default()
230 }
231 mysql_async::Value::Date(year, month, day, hour, minutes, seconds, micro) => {
232 use chrono::TimeZone;
233 let dt = chrono::Local
234 .ymd(year as i32, month as u32, day as u32)
235 .and_hms_micro(hour as u32, minutes as u32, seconds as u32, micro as u32);
236 dt
237 }
238 other => Err(format!("ValueConv Error: {:?}", other))?,
239 };
240 Ok(v)
241 }
242 }
243
244 #[cfg(feature = "chrono")]
245 impl ValueConv<Option<chrono::DateTime<chrono::Local>>> for mysql_async::Value {
246 fn conv(&self) -> common_uu::IResult<Option<chrono::DateTime<chrono::Local>>> {
247 let v = match self.clone() {
248 mysql_async::Value::NULL => {
249 return Ok(None);
250 }
251 other => other.conv()?,
252 };
253 Ok(v)
254 }
255 }
256
257 #[cfg(feature = "chrono")]
258 impl ValueConv<Option<chrono::DateTime<chrono::Utc>>> for mysql_async::Value {
259 fn conv(&self) -> common_uu::IResult<Option<chrono::DateTime<chrono::Utc>>> {
260 let v = match self.clone() {
261 mysql_async::Value::NULL => {
262 return Ok(None);
263 }
264 other => other.conv()?,
265 };
266 Ok(v)
267 }
268 }
269
270 #[cfg(feature = "rust_decimal")]
271 impl ValueConv<Option<rust_decimal::Decimal>> for mysql_async::Value {
272 fn conv(&self) -> common_uu::IResult<Option<rust_decimal::Decimal>> {
273 use rust_decimal::prelude::*;
274 let v = match self.clone() {
275 mysql_async::Value::NULL => None,
276 mysql_async::Value::Bytes(v) => {
277 Some(rust_decimal::Decimal::from_str(&(String::from_utf8(v)?))?)
278 }
279 mysql_async::Value::Int(v) => rust_decimal::Decimal::from_i64(v),
280 mysql_async::Value::UInt(v) => Decimal::from_i64(v as i64),
281 mysql_async::Value::Float(v) => Decimal::from_f32(v),
282 mysql_async::Value::Double(v) => Decimal::from_f64(v),
283 other => Err(format!("ValueConv Error: {:?}", other))?,
284 };
285 Ok(v)
286 }
287 }
288
289 #[cfg(feature = "rust_decimal")]
290 impl ValueConv<rust_decimal::Decimal> for mysql_async::Value {
291 fn conv(&self) -> common_uu::IResult<rust_decimal::Decimal> {
292 use rust_decimal::prelude::*;
293 let v = match self.clone() {
294 mysql_async::Value::NULL => None,
295 mysql_async::Value::Bytes(v) => {
296 Some(rust_decimal::Decimal::from_str(&(String::from_utf8(v)?))?)
297 }
298 mysql_async::Value::Int(v) => rust_decimal::Decimal::from_i64(v),
299 mysql_async::Value::UInt(v) => Decimal::from_i64(v as i64),
300 mysql_async::Value::Float(v) => Decimal::from_f32(v),
301 mysql_async::Value::Double(v) => Decimal::from_f64(v),
302 other => Err(format!("ValueConv Error: {:?}", other))?,
303 };
304 Ok(v.unwrap_or_else(|| rust_decimal::Decimal::ZERO))
305 }
306 }
307
308 #[cfg(feature = "bigdecimal")]
309 impl ValueConv<Option<bigdecimal::BigDecimal>> for mysql_async::Value {
310 fn conv(&self) -> common_uu::IResult<Option<bigdecimal::BigDecimal>> {
311 use bigdecimal::BigDecimal as Decimal;
312 use bigdecimal::FromPrimitive;
313 let v = match self.clone() {
314 mysql_async::Value::NULL => None,
315 mysql_async::Value::Bytes(v) => Some(Decimal::from_str(&(String::from_utf8(v)?))?),
316 mysql_async::Value::Int(v) => Decimal::from_i64(v),
317 mysql_async::Value::UInt(v) => Decimal::from_i64(v as i64),
318 mysql_async::Value::Float(v) => Decimal::from_f32(v),
319 mysql_async::Value::Double(v) => Decimal::from_f64(v),
320 other => Err(format!("ValueConv Error: {:?}", other))?,
321 };
322 Ok(v)
323 }
324 }
325
326 #[cfg(feature = "bigdecimal")]
327 impl ValueConv<bigdecimal::BigDecimal> for mysql_async::Value {
328 fn conv(&self) -> common_uu::IResult<bigdecimal::BigDecimal> {
329 use bigdecimal::BigDecimal as Decimal;
330 use bigdecimal::FromPrimitive;
331 let v = match self.clone() {
332 mysql_async::Value::NULL => None,
333 mysql_async::Value::Bytes(v) => Some(Decimal::from_str(&(String::from_utf8(v)?))?),
334 mysql_async::Value::Int(v) => Decimal::from_i64(v),
335 mysql_async::Value::UInt(v) => Decimal::from_i64(v as i64),
336 mysql_async::Value::Float(v) => Decimal::from_f32(v),
337 mysql_async::Value::Double(v) => Decimal::from_f64(v),
338 other => Err(format!("ValueConv Error: {:?}", other))?,
339 };
340 Ok(v.unwrap_or_else(|| Decimal::default()))
341 }
342 }
343
344 impl ValueConv<f64> for mysql_async::Value {
345 fn conv(&self) -> common_uu::IResult<f64> {
346 let v = match self.clone() {
347 mysql_async::Value::NULL => 0.0,
348 mysql_async::Value::Bytes(v) => String::from_utf8(v)?.parse()?,
349 mysql_async::Value::Int(v) => v as f64,
350 mysql_async::Value::UInt(v) => v as f64,
351 mysql_async::Value::Float(v) => v as f64,
352 mysql_async::Value::Double(v) => v,
353 other => Err(format!("ValueConv Error: {:?}", other))?,
354 };
355 Ok(v)
356 }
357 }
358 impl ValueConv<Option<f64>> for mysql_async::Value {
359 fn conv(&self) -> common_uu::IResult<Option<f64>> {
360 let v = match self.clone() {
361 mysql_async::Value::NULL => None,
362 mysql_async::Value::Bytes(v) => Some(String::from_utf8(v)?.parse()?),
363 mysql_async::Value::Int(v) => Some(v as f64),
364 mysql_async::Value::UInt(v) => Some(v as f64),
365 mysql_async::Value::Float(v) => Some(v as f64),
366 mysql_async::Value::Double(v) => Some(v),
367 other => Err(format!("ValueConv Error: {:?}", other))?,
368 };
369 Ok(v)
370 }
371 }
372
373 impl ValueConv<f32> for mysql_async::Value {
374 fn conv(&self) -> common_uu::IResult<f32> {
375 let v = match self.clone() {
376 mysql_async::Value::NULL => 0.0,
377 mysql_async::Value::Bytes(v) => String::from_utf8(v)?.parse()?,
378 mysql_async::Value::Int(v) => v as f32,
379 mysql_async::Value::UInt(v) => v as f32,
380 mysql_async::Value::Float(v) => v,
381 mysql_async::Value::Double(v) => v as f32,
382 other => Err(format!("ValueConv Error: {:?}", other))?,
383 };
384 Ok(v)
385 }
386 }
387 impl ValueConv<Option<f32>> for mysql_async::Value {
388 fn conv(&self) -> common_uu::IResult<Option<f32>> {
389 let v = match self.clone() {
390 mysql_async::Value::NULL => None,
391 mysql_async::Value::Bytes(v) => Some(String::from_utf8(v)?.parse()?),
392 mysql_async::Value::Int(v) => Some(v as f32),
393 mysql_async::Value::UInt(v) => Some(v as f32),
394 mysql_async::Value::Float(v) => Some(v),
395 mysql_async::Value::Double(v) => Some(v as f32),
396 other => Err(format!("ValueConv Error: {:?}", other))?,
397 };
398 Ok(v)
399 }
400 }
401
402 impl ValueConv<isize> for mysql_async::Value {
403 fn conv(&self) -> common_uu::IResult<isize> {
404 let v = match self.clone() {
405 mysql_async::Value::NULL => 0,
406 mysql_async::Value::Bytes(v) => String::from_utf8(v)?.parse()?,
407 mysql_async::Value::Int(v) => v as isize,
408 mysql_async::Value::UInt(v) => v as isize,
409 mysql_async::Value::Float(v) => v as isize,
410 mysql_async::Value::Double(v) => v as isize,
411 other => Err(format!("ValueConv Error: {:?}", other))?,
412 };
413 Ok(v)
414 }
415 }
416 impl ValueConv<Option<isize>> for mysql_async::Value {
417 fn conv(&self) -> common_uu::IResult<Option<isize>> {
418 let v = match self.clone() {
419 mysql_async::Value::NULL => None,
420 mysql_async::Value::Bytes(v) => Some(String::from_utf8(v)?.parse()?),
421 mysql_async::Value::Int(v) => Some(v as isize),
422 mysql_async::Value::UInt(v) => Some(v as isize),
423 mysql_async::Value::Float(v) => Some(v as isize),
424 mysql_async::Value::Double(v) => Some(v as isize),
425 other => Err(format!("ValueConv Error: {:?}", other))?,
426 };
427 Ok(v)
428 }
429 }
430
431 impl ValueConv<u64> for mysql_async::Value {
432 fn conv(&self) -> common_uu::IResult<u64> {
433 let v = match self.clone() {
434 mysql_async::Value::NULL => 0,
435 mysql_async::Value::Bytes(v) => String::from_utf8(v)?.parse()?,
436 mysql_async::Value::Int(v) => v as u64,
437 mysql_async::Value::UInt(v) => v as u64,
438 mysql_async::Value::Float(v) => v as u64,
439 mysql_async::Value::Double(v) => v as u64,
440 other => Err(format!("ValueConv Error: {:?}", other))?,
441 };
442 Ok(v)
443 }
444 }
445 impl ValueConv<Option<u64>> for mysql_async::Value {
446 fn conv(&self) -> common_uu::IResult<Option<u64>> {
447 let v = match self.clone() {
448 mysql_async::Value::NULL => None,
449 mysql_async::Value::Bytes(v) => Some(String::from_utf8(v)?.parse()?),
450 mysql_async::Value::Int(v) => Some(v as u64),
451 mysql_async::Value::UInt(v) => Some(v as u64),
452 mysql_async::Value::Float(v) => Some(v as u64),
453 mysql_async::Value::Double(v) => Some(v as u64),
454 other => Err(format!("ValueConv Error: {:?}", other))?,
455 };
456 Ok(v)
457 }
458 }
459
460 impl ValueConv<u32> for mysql_async::Value {
461 fn conv(&self) -> common_uu::IResult<u32> {
462 let v = match self.clone() {
463 mysql_async::Value::NULL => 0,
464 mysql_async::Value::Bytes(v) => String::from_utf8(v)?.parse()?,
465 mysql_async::Value::Int(v) => v as u32,
466 mysql_async::Value::UInt(v) => v as u32,
467 mysql_async::Value::Float(v) => v as u32,
468 mysql_async::Value::Double(v) => v as u32,
469 other => Err(format!("ValueConv Error: {:?}", other))?,
470 };
471 Ok(v)
472 }
473 }
474 impl ValueConv<Option<u32>> for mysql_async::Value {
475 fn conv(&self) -> common_uu::IResult<Option<u32>> {
476 let v = match self.clone() {
477 mysql_async::Value::NULL => None,
478 mysql_async::Value::Bytes(v) => Some(String::from_utf8(v)?.parse()?),
479 mysql_async::Value::Int(v) => Some(v as u32),
480 mysql_async::Value::UInt(v) => Some(v as u32),
481 mysql_async::Value::Float(v) => Some(v as u32),
482 mysql_async::Value::Double(v) => Some(v as u32),
483 other => Err(format!("ValueConv Error: {:?}", other))?,
484 };
485 Ok(v)
486 }
487 }
488
489 impl ValueConv<usize> for mysql_async::Value {
490 fn conv(&self) -> common_uu::IResult<usize> {
491 let v = match self.clone() {
492 mysql_async::Value::NULL => 0,
493 mysql_async::Value::Bytes(v) => String::from_utf8(v)?.parse()?,
494 mysql_async::Value::Int(v) => v as usize,
495 mysql_async::Value::UInt(v) => v as usize,
496 mysql_async::Value::Float(v) => v as usize,
497 mysql_async::Value::Double(v) => v as usize,
498 other => Err(format!("ValueConv Error: {:?}", other))?,
499 };
500 Ok(v)
501 }
502 }
503 impl ValueConv<Option<usize>> for mysql_async::Value {
504 fn conv(&self) -> common_uu::IResult<Option<usize>> {
505 let v = match self.clone() {
506 mysql_async::Value::NULL => None,
507 mysql_async::Value::Bytes(v) => Some(String::from_utf8(v)?.parse()?),
508 mysql_async::Value::Int(v) => Some(v as usize),
509 mysql_async::Value::UInt(v) => Some(v as usize),
510 mysql_async::Value::Float(v) => Some(v as usize),
511 mysql_async::Value::Double(v) => Some(v as usize),
512 other => Err(format!("ValueConv Error: {:?}", other))?,
513 };
514 Ok(v)
515 }
516 }
517
518 impl ValueConv<u8> for mysql_async::Value {
519 fn conv(&self) -> common_uu::IResult<u8> {
520 let v = match self.clone() {
521 mysql_async::Value::NULL => 0,
522 mysql_async::Value::Bytes(v) => String::from_utf8(v)?.parse()?,
523 mysql_async::Value::Int(v) => v as u8,
524 mysql_async::Value::UInt(v) => v as u8,
525 mysql_async::Value::Float(v) => v as u8,
526 mysql_async::Value::Double(v) => v as u8,
527 other => Err(format!("ValueConv Error: {:?}", other))?,
528 };
529 Ok(v)
530 }
531 }
532
533 impl ValueConv<Option<u8>> for mysql_async::Value {
534 fn conv(&self) -> common_uu::IResult<Option<u8>> {
535 let v = match self.clone() {
536 mysql_async::Value::NULL => None,
537 mysql_async::Value::Bytes(v) => Some(String::from_utf8(v)?.parse()?),
538 mysql_async::Value::Int(v) => Some(v as u8),
539 mysql_async::Value::UInt(v) => Some(v as u8),
540 mysql_async::Value::Float(v) => Some(v as u8),
541 mysql_async::Value::Double(v) => Some(v as u8),
542 other => Err(format!("ValueConv Error: {:?}", other))?,
543 };
544 Ok(v)
545 }
546 }
547
548 impl ValueConv<i32> for mysql_async::Value {
549 fn conv(&self) -> common_uu::IResult<i32> {
550 let v = match self.clone() {
551 mysql_async::Value::NULL => 0,
552 mysql_async::Value::Bytes(v) => String::from_utf8(v)?.parse()?,
553 mysql_async::Value::Int(v) => v as i32,
554 mysql_async::Value::UInt(v) => v as i32,
555 mysql_async::Value::Float(v) => v as i32,
556 mysql_async::Value::Double(v) => v as i32,
557 other => Err(format!("ValueConv Error: {:?}", other))?,
558 };
559 Ok(v)
560 }
561 }
562
563 impl ValueConv<Option<i32>> for mysql_async::Value {
564 fn conv(&self) -> common_uu::IResult<Option<i32>> {
565 let v = match self.clone() {
566 mysql_async::Value::NULL => None,
567 mysql_async::Value::Bytes(v) => Some(String::from_utf8(v)?.parse()?),
568 mysql_async::Value::Int(v) => Some(v as i32),
569 mysql_async::Value::UInt(v) => Some(v as i32),
570 mysql_async::Value::Float(v) => Some(v as i32),
571 mysql_async::Value::Double(v) => Some(v as i32),
572 other => Err(format!("ValueConv Error: {:?}", other))?,
573 };
574 Ok(v)
575 }
576 }
577
578 impl ValueConv<i64> for mysql_async::Value {
579 fn conv(&self) -> common_uu::IResult<i64> {
580 let v = match self.clone() {
581 mysql_async::Value::NULL => 0,
582 mysql_async::Value::Bytes(v) => String::from_utf8(v)?.parse()?,
583 mysql_async::Value::Int(v) => v,
584 mysql_async::Value::UInt(v) => v as i64,
585 mysql_async::Value::Float(v) => v as i64,
586 mysql_async::Value::Double(v) => v as i64,
587 other => Err(format!("ValueConv Error: {:?}", other))?,
588 };
589 Ok(v)
590 }
591 }
592 impl ValueConv<Option<i64>> for mysql_async::Value {
593 fn conv(&self) -> common_uu::IResult<Option<i64>> {
594 let v = match self.clone() {
595 mysql_async::Value::NULL => None,
596 mysql_async::Value::Bytes(v) => Some(String::from_utf8(v)?.parse()?),
597 mysql_async::Value::Int(v) => Some(v),
598 mysql_async::Value::UInt(v) => Some(v as i64),
599 mysql_async::Value::Float(v) => Some(v as i64),
600 mysql_async::Value::Double(v) => Some(v as i64),
601 other => Err(format!("ValueConv Error: {:?}", other))?,
602 };
603 Ok(v)
604 }
605 }
606
607 impl ValueConv<String> for mysql_async::Value {
608 fn conv(&self) -> common_uu::IResult<String> {
609 let v = match self.clone() {
610 mysql_async::Value::NULL => "".into(),
611 mysql_async::Value::Bytes(v) => String::from_utf8(v)?,
612 mysql_async::Value::Int(v) => v.to_string(),
613 mysql_async::Value::UInt(v) => v.to_string(),
614 mysql_async::Value::Float(v) => v.to_string(),
615 mysql_async::Value::Double(v) => v.to_string(),
616 other => format!("{:?}", other),
617 };
618 Ok(v)
619 }
620 }
621
622 impl ValueConv<Option<String>> for mysql_async::Value {
623 fn conv(&self) -> common_uu::IResult<Option<String>> {
624 let v = match self.clone() {
625 mysql_async::Value::NULL => return Ok(None),
626 mysql_async::Value::Bytes(v) => String::from_utf8(v)?,
627 mysql_async::Value::Int(v) => v.to_string(),
628 mysql_async::Value::UInt(v) => v.to_string(),
629 mysql_async::Value::Float(v) => v.to_string(),
630 mysql_async::Value::Double(v) => v.to_string(),
631 other => format!("{:?}", other),
632 };
633 Ok(Some(v))
634 }
635 }
636}