@@ -124,7 +124,7 @@ const TYPEINFO_COMPOSITE_QUERY: &'static str = "__typeinfo_composite";
124
124
/// A type alias of the result returned by many methods.
125
125
pub type Result < T > = result:: Result < T , Error > ;
126
126
127
- /// Trait for types that can handle Postgres notice messages
127
+ /// A trait implemented by types that can handle Postgres notice messages.
128
128
///
129
129
/// It is implemented for all `Send + FnMut(DbError)` closures.
130
130
pub trait HandleNotice : Send {
@@ -681,29 +681,23 @@ impl InnerConnection {
681
681
try!( self . read_rows ( & mut rows) ) ;
682
682
let row = rows. pop_front ( ) . unwrap ( ) ;
683
683
684
+ let get_raw = |i| row. get ( i) . and_then ( |r| r. as_ref ( ) . map ( |r| & * * r) ) ;
685
+
684
686
let ( name, type_, elem_oid, rngsubtype, basetype, schema, relid) = {
685
687
let ctx = SessionInfo :: new ( & self . parameters ) ;
686
- let name = try!( String :: from_sql ( & Type :: Name , row [ 0 ] . as_ref ( ) . unwrap ( ) , & ctx)
688
+ let name = try!( String :: from_sql_nullable ( & Type :: Name , get_raw ( 0 ) , & ctx)
687
689
. map_err ( Error :: Conversion ) ) ;
688
- let type_ = try!( i8:: from_sql ( & Type :: Char , row [ 1 ] . as_ref ( ) . unwrap ( ) , & ctx)
690
+ let type_ = try!( i8:: from_sql_nullable ( & Type :: Char , get_raw ( 1 ) , & ctx)
689
691
. map_err ( Error :: Conversion ) ) ;
690
- let elem_oid = try!( Oid :: from_sql ( & Type :: Oid , row [ 2 ] . as_ref ( ) . unwrap ( ) , & ctx)
692
+ let elem_oid = try!( Oid :: from_sql_nullable ( & Type :: Oid , get_raw ( 2 ) , & ctx)
691
693
. map_err ( Error :: Conversion ) ) ;
692
- let rngsubtype = match row[ 3 ] {
693
- Some ( ref data) => {
694
- try!( Option :: < Oid > :: from_sql ( & Type :: Oid , data, & ctx)
695
- . map_err ( Error :: Conversion ) )
696
- }
697
- None => {
698
- try!( Option :: < Oid > :: from_sql_null ( & Type :: Oid , & ctx) . map_err ( Error :: Conversion ) )
699
- }
700
- } ;
701
- let basetype = try!( Oid :: from_sql ( & Type :: Oid , row[ 4 ] . as_ref ( ) . unwrap ( ) , & ctx)
694
+ let rngsubtype = try!( Option :: < Oid > :: from_sql_nullable ( & Type :: Oid , get_raw ( 3 ) , & ctx)
702
695
. map_err ( Error :: Conversion ) ) ;
703
- let schema =
704
- try!( String :: from_sql ( & Type :: Name , row[ 5 ] . as_ref ( ) . unwrap ( ) , & ctx)
705
- . map_err ( Error :: Conversion ) ) ;
706
- let relid = try!( Oid :: from_sql ( & Type :: Oid , row[ 6 ] . as_ref ( ) . unwrap ( ) , & ctx)
696
+ let basetype = try!( Oid :: from_sql_nullable ( & Type :: Oid , get_raw ( 4 ) , & ctx)
697
+ . map_err ( Error :: Conversion ) ) ;
698
+ let schema = try!( String :: from_sql_nullable ( & Type :: Name , get_raw ( 5 ) , & ctx)
699
+ . map_err ( Error :: Conversion ) ) ;
700
+ let relid = try!( Oid :: from_sql_nullable ( & Type :: Oid , get_raw ( 6 ) , & ctx)
707
701
. map_err ( Error :: Conversion ) ) ;
708
702
( name, type_, elem_oid, rngsubtype, basetype, schema, relid)
709
703
} ;
@@ -763,7 +757,8 @@ impl InnerConnection {
763
757
let ctx = SessionInfo :: new ( & self . parameters ) ;
764
758
let mut variants = vec ! [ ] ;
765
759
for row in rows {
766
- variants. push ( try!( String :: from_sql ( & Type :: Name , row[ 0 ] . as_ref ( ) . unwrap ( ) , & ctx)
760
+ let raw = row. get ( 0 ) . and_then ( |r| r. as_ref ( ) . map ( |r| & * * r) ) ;
761
+ variants. push ( try!( String :: from_sql_nullable ( & Type :: Name , raw, & ctx)
767
762
. map_err ( Error :: Conversion ) ) ) ;
768
763
}
769
764
@@ -796,11 +791,11 @@ impl InnerConnection {
796
791
let mut fields = vec ! [ ] ;
797
792
for row in rows {
798
793
let ( name, type_) = {
794
+ let get_raw = |i| row. get ( i) . and_then ( |r| r. as_ref ( ) . map ( |r| & * * r) ) ;
799
795
let ctx = SessionInfo :: new ( & self . parameters ) ;
800
- let name =
801
- try!( String :: from_sql ( & Type :: Name , row[ 0 ] . as_ref ( ) . unwrap ( ) , & ctx)
802
- . map_err ( Error :: Conversion ) ) ;
803
- let type_ = try!( Oid :: from_sql ( & Type :: Oid , row[ 1 ] . as_ref ( ) . unwrap ( ) , & ctx)
796
+ let name = try!( String :: from_sql_nullable ( & Type :: Name , get_raw ( 0 ) , & ctx)
797
+ . map_err ( Error :: Conversion ) ) ;
798
+ let type_ = try!( Oid :: from_sql_nullable ( & Type :: Oid , get_raw ( 1 ) , & ctx)
804
799
. map_err ( Error :: Conversion ) ) ;
805
800
( name, type_)
806
801
} ;
0 commit comments