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
use std::io::prelude::*; use std::error::Error; use pg::Pg; use pg::data_types::PgNumeric; use types::{self, ToSql, IsNull, FromSql}; primitive_impls!(Numeric -> (PgNumeric, pg: (1700, 1231))); impl FromSql<types::Bool, Pg> for bool { fn from_sql(bytes: Option<&[u8]>) -> Result<Self, Box<Error+Send+Sync>> { match bytes { Some(bytes) => Ok(bytes[0] != 0), None => Ok(false), } } } impl ToSql<types::Bool, Pg> for bool { fn to_sql<W: Write>(&self, out: &mut W) -> Result<IsNull, Box<Error+Send+Sync>> { let write_result = if *self { out.write_all(&[1]) } else { out.write_all(&[0]) }; write_result .map(|_| IsNull::No) .map_err(|e| Box::new(e) as Box<Error+Send+Sync>) } } #[test] fn bool_to_sql() { let mut bytes = vec![]; ToSql::<types::Bool, Pg>::to_sql(&true, &mut bytes).unwrap(); ToSql::<types::Bool, Pg>::to_sql(&false, &mut bytes).unwrap(); assert_eq!(bytes, vec![1u8, 0u8]); } #[test] fn bool_from_sql_treats_null_as_false() { let result = <bool as FromSql<types::Bool, Pg>>::from_sql(None).unwrap(); assert!(!result); }