11use std:: io:: prelude:: * ;
2+ use std:: error;
23use byteorder:: { ReadBytesExt , WriteBytesExt , BigEndian } ;
34
4- use postgres:: { self , Error , Type , Kind , ToSql , FromSql , Oid } ;
5- use postgres:: types:: { IsNull } ;
5+ use postgres;
6+ use postgres:: error:: Error ;
7+ use postgres:: types:: { Type , Kind , ToSql , FromSql , Oid , IsNull , SessionInfo } ;
68
79use { Array , Dimension } ;
810
911impl < T > FromSql for Array < Option < T > > where T : FromSql {
10- fn from_sql < R : Read > ( ty : & Type , raw : & mut R ) -> postgres:: Result < Array < Option < T > > > {
12+ fn from_sql < R : Read > ( ty : & Type , raw : & mut R , info : & SessionInfo )
13+ -> postgres:: Result < Array < Option < T > > > {
1114 let element_type = match ty. kind ( ) {
1215 & Kind :: Array ( ref ty) => ty,
1316 _ => panic ! ( "unexpected type {:?}" , ty) ,
@@ -37,9 +40,11 @@ impl<T> FromSql for Array<Option<T>> where T: FromSql {
3740 elements. push ( None ) ;
3841 } else {
3942 let mut limit = raw. take ( len as u64 ) ;
40- elements. push ( Some ( try!( FromSql :: from_sql ( & element_type, & mut limit) ) ) ) ;
43+ elements. push ( Some ( try!( FromSql :: from_sql ( & element_type, & mut limit, info ) ) ) ) ;
4144 if limit. limit ( ) != 0 {
42- return Err ( Error :: BadResponse ) ;
45+ let err: Box < error:: Error +Sync +Send > =
46+ "from_sql call did not consume all data" . into ( ) ;
47+ return Err ( Error :: Conversion ( err) ) ;
4348 }
4449 }
4550 }
@@ -56,15 +61,16 @@ impl<T> FromSql for Array<Option<T>> where T: FromSql {
5661}
5762
5863impl < T > ToSql for Array < T > where T : ToSql {
59- fn to_sql < W : ?Sized +Write > ( & self , ty : & Type , mut w : & mut W ) -> postgres:: Result < IsNull > {
64+ fn to_sql < W : ?Sized +Write > ( & self , ty : & Type , mut w : & mut W , info : & SessionInfo )
65+ -> postgres:: Result < IsNull > {
6066 let element_type = match ty. kind ( ) {
6167 & Kind :: Array ( ref ty) => ty,
6268 _ => panic ! ( "unexpected type {:?}" , ty) ,
6369 } ;
6470
6571 try!( w. write_u32 :: < BigEndian > ( self . dimensions ( ) . len ( ) as u32 ) ) ;
6672 try!( w. write_i32 :: < BigEndian > ( 1 ) ) ;
67- try!( w. write_u32 :: < BigEndian > ( element_type. to_oid ( ) ) ) ;
73+ try!( w. write_u32 :: < BigEndian > ( element_type. oid ( ) ) ) ;
6874
6975 for info in self . dimensions ( ) {
7076 try!( w. write_u32 :: < BigEndian > ( info. len as u32 ) ) ;
@@ -73,7 +79,7 @@ impl<T> ToSql for Array<T> where T: ToSql {
7379
7480 let mut inner_buf = vec ! [ ] ;
7581 for v in self {
76- match try!( v. to_sql ( element_type, & mut inner_buf) ) {
82+ match try!( v. to_sql ( element_type, & mut inner_buf, info ) ) {
7783 IsNull :: Yes => try!( w. write_i32 :: < BigEndian > ( -1 ) ) ,
7884 IsNull :: No => {
7985 try!( w. write_i32 :: < BigEndian > ( inner_buf. len ( ) as i32 ) ) ;
@@ -100,7 +106,8 @@ impl<T> ToSql for Array<T> where T: ToSql {
100106mod test {
101107 use std:: fmt;
102108
103- use postgres:: { Connection , SslMode , FromSql , ToSql } ;
109+ use postgres:: { Connection , SslMode } ;
110+ use postgres:: types:: { FromSql , ToSql } ;
104111 use Array ;
105112
106113 fn test_type < T : PartialEq +FromSql +ToSql , S : fmt:: Display > ( sql_type : & str , checks : & [ ( T , S ) ] ) {
0 commit comments