Make RawFromSql less sketchy

This commit is contained in:
Steven Fackler 2014-02-15 13:44:48 -08:00
parent 20c400afff
commit adec4dd5ed

View File

@ -250,13 +250,13 @@ pub trait FromSql {
#[doc(hidden)] #[doc(hidden)]
trait RawFromSql { trait RawFromSql {
fn raw_from_sql<R: Reader>(len: uint, raw: &mut R) -> Self; fn raw_from_sql<R: Reader>(raw: &mut R) -> Self;
} }
macro_rules! raw_from_impl( macro_rules! raw_from_impl(
($t:ty, $f:ident) => ( ($t:ty, $f:ident) => (
impl RawFromSql for $t { impl RawFromSql for $t {
fn raw_from_sql<R: Reader>(_len: uint, raw: &mut R) -> $t { fn raw_from_sql<R: Reader>(raw: &mut R) -> $t {
or_fail!(raw.$f()) or_fail!(raw.$f())
} }
} }
@ -264,20 +264,20 @@ macro_rules! raw_from_impl(
) )
impl RawFromSql for bool { impl RawFromSql for bool {
fn raw_from_sql<R: Reader>(_len: uint, raw: &mut R) -> bool { fn raw_from_sql<R: Reader>(raw: &mut R) -> bool {
(or_fail!(raw.read_u8())) != 0 (or_fail!(raw.read_u8())) != 0
} }
} }
impl RawFromSql for ~[u8] { impl RawFromSql for ~[u8] {
fn raw_from_sql<R: Reader>(len: uint, raw: &mut R) -> ~[u8] { fn raw_from_sql<R: Reader>(raw: &mut R) -> ~[u8] {
or_fail!(raw.read_bytes(len)) or_fail!(raw.read_to_end())
} }
} }
impl RawFromSql for ~str { impl RawFromSql for ~str {
fn raw_from_sql<R: Reader>(len: uint, raw: &mut R) -> ~str { fn raw_from_sql<R: Reader>(raw: &mut R) -> ~str {
str::from_utf8_owned(or_fail!(raw.read_bytes(len))).unwrap() str::from_utf8_owned(or_fail!(raw.read_to_end())).unwrap()
} }
} }
@ -289,7 +289,7 @@ raw_from_impl!(f32, read_be_f32)
raw_from_impl!(f64, read_be_f64) raw_from_impl!(f64, read_be_f64)
impl RawFromSql for Timespec { impl RawFromSql for Timespec {
fn raw_from_sql<R: Reader>(_len: uint, raw: &mut R) -> Timespec { fn raw_from_sql<R: Reader>(raw: &mut R) -> Timespec {
let t = or_fail!(raw.read_be_i64()); let t = or_fail!(raw.read_be_i64());
let mut sec = t / USEC_PER_SEC + TIME_SEC_CONVERSION; let mut sec = t / USEC_PER_SEC + TIME_SEC_CONVERSION;
let mut usec = t % USEC_PER_SEC; let mut usec = t % USEC_PER_SEC;
@ -304,15 +304,15 @@ impl RawFromSql for Timespec {
} }
impl RawFromSql for Uuid { impl RawFromSql for Uuid {
fn raw_from_sql<R: Reader>(len: uint, raw: &mut R) -> Uuid { fn raw_from_sql<R: Reader>(raw: &mut R) -> Uuid {
Uuid::from_bytes(or_fail!(raw.read_bytes(len))).unwrap() Uuid::from_bytes(or_fail!(raw.read_to_end())).unwrap()
} }
} }
macro_rules! from_range_impl( macro_rules! from_range_impl(
($($oid:ident)|+, $t:ty) => ( ($($oid:ident)|+, $t:ty) => (
impl RawFromSql for Range<$t> { impl RawFromSql for Range<$t> {
fn raw_from_sql<R: Reader>(_len: uint, rdr: &mut R) -> Range<$t> { fn raw_from_sql<R: Reader>(rdr: &mut R) -> Range<$t> {
let t = or_fail!(rdr.read_i8()); let t = or_fail!(rdr.read_i8());
if t & RANGE_EMPTY != 0 { if t & RANGE_EMPTY != 0 {
@ -325,8 +325,10 @@ macro_rules! from_range_impl(
_ => Inclusive _ => Inclusive
}; };
let len = or_fail!(rdr.read_be_i32()) as uint; let len = or_fail!(rdr.read_be_i32()) as uint;
let mut limit = LimitReader::new(rdr.by_ref(), len);
Some(RangeBound::new( Some(RangeBound::new(
RawFromSql::raw_from_sql(len, rdr), type_)) RawFromSql::raw_from_sql(&mut limit), type_))
// TODO assert limit is used up
} }
_ => None _ => None
}; };
@ -337,8 +339,10 @@ macro_rules! from_range_impl(
_ => Inclusive _ => Inclusive
}; };
let len = or_fail!(rdr.read_be_i32()) as uint; let len = or_fail!(rdr.read_be_i32()) as uint;
let mut limit = LimitReader::new(rdr.by_ref(), len);
Some(RangeBound::new( Some(RangeBound::new(
RawFromSql::raw_from_sql(len, rdr), type_)) RawFromSql::raw_from_sql(&mut limit), type_))
// TODO assert limit is used up
} }
_ => None _ => None
}; };
@ -355,9 +359,8 @@ from_range_impl!(PgInt8Range, i64)
from_range_impl!(PgTsRange | PgTstzRange, Timespec) from_range_impl!(PgTsRange | PgTstzRange, Timespec)
impl RawFromSql for Json { impl RawFromSql for Json {
fn raw_from_sql<R: Reader>(len: uint, raw: &mut R) -> Json { fn raw_from_sql<R: Reader>(raw: &mut R) -> Json {
let mut reader = LimitReader::new(raw.by_ref(), len); json::from_reader(raw as &mut Reader).unwrap()
json::from_reader(&mut reader as &mut Reader).unwrap()
} }
} }
@ -384,7 +387,7 @@ macro_rules! from_raw_from_impl(
($($expected:pat)|+, $t:ty) => ( ($($expected:pat)|+, $t:ty) => (
from_map_impl!($($expected)|+, $t, |buf| { from_map_impl!($($expected)|+, $t, |buf| {
let mut reader = BufReader::new(buf.as_slice()); let mut reader = BufReader::new(buf.as_slice());
RawFromSql::raw_from_sql(buf.len(), &mut reader) RawFromSql::raw_from_sql(&mut reader)
}) })
) )
) )
@ -430,8 +433,9 @@ macro_rules! from_array_impl(
if len < 0 { if len < 0 {
elements.push(None); elements.push(None);
} else { } else {
elements.push(Some(RawFromSql::raw_from_sql(len as uint, let mut limit = LimitReader::new(rdr.by_ref(), len as uint);
&mut rdr))); elements.push(Some(RawFromSql::raw_from_sql(&mut limit)));
// TODO assert the reader's at the end
} }
} }