1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
use debil::SQLValue; use failure::_core::marker::PhantomData; #[derive(Clone)] pub struct MySQLValue(pub mysql_async::Value); impl SQLValue<bool> for MySQLValue { fn column_type(_: PhantomData<bool>, size: i32) -> String { "bool".to_string() } fn serialize(val: bool) -> Self { MySQLValue(From::from(val)) } fn deserialize(self) -> bool { mysql_async::from_value(self.0) } } impl SQLValue<String> for MySQLValue { fn column_type(_: std::marker::PhantomData<String>, size: i32) -> String { if size > 0 { format!("varchar({})", size) } else { "text".to_string() } } fn serialize(val: String) -> MySQLValue { MySQLValue(From::from(val)) } fn deserialize(self) -> String { mysql_async::from_value(self.0) } } impl SQLValue<i32> for MySQLValue { fn column_type(_: std::marker::PhantomData<i32>, _: i32) -> String { "int".to_string() } fn serialize(val: i32) -> MySQLValue { MySQLValue(From::from(val)) } fn deserialize(self) -> i32 { mysql_async::from_value(self.0) } } impl SQLValue<u32> for MySQLValue { fn column_type(_: PhantomData<u32>, size: i32) -> String { "int unsigned".to_string() } fn serialize(val: u32) -> Self { MySQLValue(From::from(val)) } fn deserialize(self) -> u32 { mysql_async::from_value(self.0) } } impl SQLValue<i64> for MySQLValue { fn column_type(_: std::marker::PhantomData<i64>, _: i32) -> String { "bigint".to_string() } fn serialize(val: i64) -> MySQLValue { MySQLValue(From::from(val)) } fn deserialize(self) -> i64 { mysql_async::from_value(self.0) } } impl SQLValue<u64> for MySQLValue { fn column_type(_: PhantomData<u64>, size: i32) -> String { "bigint unsigned".to_string() } fn serialize(val: u64) -> Self { MySQLValue(From::from(val)) } fn deserialize(self) -> u64 { mysql_async::from_value(self.0) } } impl<V> SQLValue<Option<V>> for MySQLValue where MySQLValue: SQLValue<V>, { fn column_type(_: std::marker::PhantomData<Option<V>>, size: i32) -> String { <MySQLValue as SQLValue<V>>::column_type(std::marker::PhantomData::<V>, size) } fn serialize(val: Option<V>) -> MySQLValue { match val { None => MySQLValue(mysql_async::Value::NULL), Some(v) => SQLValue::serialize(v), } } fn deserialize(self) -> Option<V> { match self.0 { mysql_async::Value::NULL => None, _ => Some(SQLValue::deserialize(self)), } } }