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)),
        }
    }
}