11use std:: io:: prelude:: * ;
2- use postgres:: { self , Type , Kind , ToSql , FromSql } ;
3- use postgres:: types:: IsNull ;
2+ use std:: error;
3+ use postgres;
4+ use postgres:: types:: { Type , Kind , ToSql , FromSql , IsNull , SessionInfo } ;
5+ use postgres:: error:: Error ;
46use byteorder:: { ReadBytesExt , WriteBytesExt , BigEndian } ;
57
68use { Range , RangeBound , BoundType , BoundSided , Normalizable } ;
@@ -12,7 +14,8 @@ const RANGE_LOWER_INCLUSIVE: i8 = 0b0000_0010;
1214const RANGE_EMPTY : i8 = 0b0000_0001 ;
1315
1416impl < T > FromSql for Range < T > where T : PartialOrd +Normalizable +FromSql {
15- fn from_sql < R : Read > ( ty : & Type , rdr : & mut R ) -> postgres:: Result < Range < T > > {
17+ fn from_sql < R : Read > ( ty : & Type , rdr : & mut R , info : & SessionInfo )
18+ -> postgres:: Result < Range < T > > {
1619 let element_type = match ty. kind ( ) {
1720 & Kind :: Range ( ref ty) => ty,
1821 _ => panic ! ( "unexpected type {:?}" , ty)
@@ -24,7 +27,8 @@ impl<T> FromSql for Range<T> where T: PartialOrd+Normalizable+FromSql {
2427 return Ok ( Range :: empty ( ) ) ;
2528 }
2629
27- fn make_bound < S , T , R > ( ty : & Type , rdr : & mut R , tag : i8 , bound_flag : i8 , inclusive_flag : i8 )
30+ fn make_bound < S , T , R > ( ty : & Type , rdr : & mut R , info : & SessionInfo ,
31+ tag : i8 , bound_flag : i8 , inclusive_flag : i8 )
2832 -> postgres:: Result < Option < RangeBound < S , T > > >
2933 where S : BoundSided , T : PartialOrd +Normalizable +FromSql , R : Read {
3034 match tag & bound_flag {
@@ -35,18 +39,22 @@ impl<T> FromSql for Range<T> where T: PartialOrd+Normalizable+FromSql {
3539 } ;
3640 let len = try!( rdr. read_i32 :: < BigEndian > ( ) ) as u64 ;
3741 let mut limit = rdr. take ( len) ;
38- let bound = try!( FromSql :: from_sql ( ty, & mut limit) ) ;
42+ let bound = try!( FromSql :: from_sql ( ty, & mut limit, info ) ) ;
3943 if limit. limit ( ) != 0 {
40- return Err ( postgres:: Error :: BadResponse ) ;
44+ let err: Box < error:: Error +Sync +Send > =
45+ "from_sql call did not consume all data" . into ( ) ;
46+ return Err ( Error :: Conversion ( err) ) ;
4147 }
4248 Ok ( Some ( RangeBound :: new ( bound, type_) ) )
4349 }
4450 _ => Ok ( None )
4551 }
4652 }
4753
48- let lower = try!( make_bound ( element_type, rdr, t, RANGE_LOWER_UNBOUNDED , RANGE_LOWER_INCLUSIVE ) ) ;
49- let upper = try!( make_bound ( element_type, rdr, t, RANGE_UPPER_UNBOUNDED , RANGE_UPPER_INCLUSIVE ) ) ;
54+ let lower = try!( make_bound ( element_type, rdr, info, t,
55+ RANGE_LOWER_UNBOUNDED , RANGE_LOWER_INCLUSIVE ) ) ;
56+ let upper = try!( make_bound ( element_type, rdr, info, t,
57+ RANGE_UPPER_UNBOUNDED , RANGE_UPPER_INCLUSIVE ) ) ;
5058 Ok ( Range :: new ( lower, upper) )
5159 }
5260
@@ -59,7 +67,8 @@ impl<T> FromSql for Range<T> where T: PartialOrd+Normalizable+FromSql {
5967}
6068
6169impl < T > ToSql for Range < T > where T : PartialOrd +Normalizable +ToSql {
62- fn to_sql < W : ?Sized +Write > ( & self , ty : & Type , mut buf : & mut W ) -> postgres:: Result < IsNull > {
70+ fn to_sql < W : ?Sized +Write > ( & self , ty : & Type , mut buf : & mut W , info : & SessionInfo )
71+ -> postgres:: Result < IsNull > {
6372 let element_type = match ty. kind ( ) {
6473 & Kind :: Range ( ref ty) => ty,
6574 _ => panic ! ( "unexpected type {:?}" , ty)
@@ -83,19 +92,20 @@ impl<T> ToSql for Range<T> where T: PartialOrd+Normalizable+ToSql {
8392
8493 try!( buf. write_i8 ( tag) ) ;
8594
86- fn write_value < S , T , W : ?Sized > ( ty : & Type , mut buf : & mut W , v : Option < & RangeBound < S , T > > ) -> postgres:: Result < ( ) >
95+ fn write_value < S , T , W : ?Sized > ( ty : & Type , mut buf : & mut W , info : & SessionInfo ,
96+ v : Option < & RangeBound < S , T > > ) -> postgres:: Result < ( ) >
8797 where S : BoundSided , T : ToSql , W : Write {
8898 if let Some ( bound) = v {
8999 let mut inner_buf = vec ! [ ] ;
90- try!( bound. value . to_sql ( ty, & mut inner_buf) ) ;
100+ try!( bound. value . to_sql ( ty, & mut inner_buf, info ) ) ;
91101 try!( buf. write_u32 :: < BigEndian > ( inner_buf. len ( ) as u32 ) ) ;
92102 try!( buf. write_all ( & * inner_buf) ) ;
93103 }
94104 Ok ( ( ) )
95105 }
96106
97- try!( write_value ( & element_type, buf, self . lower ( ) ) ) ;
98- try!( write_value ( & element_type, buf, self . upper ( ) ) ) ;
107+ try!( write_value ( & element_type, buf, info , self . lower ( ) ) ) ;
108+ try!( write_value ( & element_type, buf, info , self . upper ( ) ) ) ;
99109
100110 Ok ( IsNull :: No )
101111 }
@@ -114,7 +124,8 @@ impl<T> ToSql for Range<T> where T: PartialOrd+Normalizable+ToSql {
114124mod test {
115125 use std:: fmt;
116126
117- use postgres:: { Connection , FromSql , ToSql , SslMode } ;
127+ use postgres:: { Connection , SslMode } ;
128+ use postgres:: types:: { FromSql , ToSql } ;
118129 use time:: { self , Timespec } ;
119130
120131 macro_rules! test_range {
0 commit comments