@@ -844,6 +844,12 @@ impl InnerConnection {
844
844
return Ok ( Type :: Other ( ty. clone ( ) ) ) ;
845
845
}
846
846
847
+ let ty = try!( self . read_type ( oid) ) ;
848
+ self . unknown_types . insert ( oid, ty. clone ( ) ) ;
849
+ Ok ( Type :: Other ( ty) )
850
+ }
851
+
852
+ fn read_type ( & mut self , oid : Oid ) -> Result < Other > {
847
853
try!( self . raw_execute ( TYPEINFO_QUERY , "" , 0 , & [ Type :: Oid ] , & [ & oid] ) ) ;
848
854
let mut rows = VecDeque :: new ( ) ;
849
855
try!( self . read_rows ( & mut rows) ) ;
@@ -877,57 +883,63 @@ impl InnerConnection {
877
883
} ;
878
884
879
885
let kind = if type_ == b'e' as i8 {
880
- try!( self . raw_execute ( TYPEINFO_ENUM_QUERY , "" , 0 , & [ Type :: Oid ] , & [ & oid] ) ) ;
881
- let mut rows = VecDeque :: new ( ) ;
882
- try!( self . read_rows ( & mut rows) ) ;
883
-
884
- let ctx = SessionInfo :: new ( self ) ;
885
- let mut variants = vec ! [ ] ;
886
- for row in rows {
887
- variants. push ( try!( String :: from_sql ( & Type :: Name ,
888
- & mut & * * row[ 0 ] . as_ref ( ) . unwrap ( ) ,
889
- & ctx) ) ) ;
890
- }
891
-
892
- Kind :: Enum ( variants)
886
+ Kind :: Enum ( try!( self . read_enum_variants ( oid) ) )
893
887
} else if type_ == b'p' as i8 {
894
888
Kind :: Pseudo
895
889
} else if basetype != 0 {
896
890
Kind :: Domain ( try!( self . get_type ( basetype) ) )
897
891
} else if elem_oid != 0 {
898
892
Kind :: Array ( try!( self . get_type ( elem_oid) ) )
899
893
} else if relid != 0 {
900
- try!( self . raw_execute ( TYPEINFO_ARRAY_QUERY , "" , 0 , & [ Type :: Oid ] , & [ & relid] ) ) ;
901
- let mut rows = VecDeque :: new ( ) ;
902
- try!( self . read_rows ( & mut rows) ) ;
903
-
904
- let mut fields = vec ! [ ] ;
905
- for row in rows {
906
- let ( name, type_) = {
907
- let ctx = SessionInfo :: new ( self ) ;
908
- let name = try!( String :: from_sql ( & Type :: Name ,
909
- & mut & * * row[ 0 ] . as_ref ( ) . unwrap ( ) ,
910
- & ctx) ) ;
911
- let type_ = try!( Oid :: from_sql ( & Type :: Oid ,
912
- & mut & * * row[ 1 ] . as_ref ( ) . unwrap ( ) ,
913
- & ctx) ) ;
914
- ( name, type_)
915
- } ;
916
- let type_ = try!( self . get_type ( type_) ) ;
917
- fields. push ( Field :: new ( name, type_) ) ;
918
- }
919
-
920
- Kind :: Composite ( fields)
894
+ Kind :: Composite ( try!( self . read_composite_fields ( relid) ) )
921
895
} else {
922
896
match rngsubtype {
923
897
Some ( oid) => Kind :: Range ( try!( self . get_type ( oid) ) ) ,
924
898
None => Kind :: Simple ,
925
899
}
926
900
} ;
927
901
928
- let type_ = Other :: new ( name, oid, kind, schema) ;
929
- self . unknown_types . insert ( oid, type_. clone ( ) ) ;
930
- Ok ( Type :: Other ( type_) )
902
+ Ok ( Other :: new ( name, oid, kind, schema) )
903
+ }
904
+
905
+ fn read_enum_variants ( & mut self , oid : Oid ) -> Result < Vec < String > > {
906
+ try!( self . raw_execute ( TYPEINFO_ENUM_QUERY , "" , 0 , & [ Type :: Oid ] , & [ & oid] ) ) ;
907
+ let mut rows = VecDeque :: new ( ) ;
908
+ try!( self . read_rows ( & mut rows) ) ;
909
+
910
+ let ctx = SessionInfo :: new ( self ) ;
911
+ let mut variants = vec ! [ ] ;
912
+ for row in rows {
913
+ variants. push ( try!( String :: from_sql ( & Type :: Name ,
914
+ & mut & * * row[ 0 ] . as_ref ( ) . unwrap ( ) ,
915
+ & ctx) ) ) ;
916
+ }
917
+
918
+ Ok ( variants)
919
+ }
920
+
921
+ fn read_composite_fields ( & mut self , relid : Oid ) -> Result < Vec < Field > > {
922
+ try!( self . raw_execute ( TYPEINFO_ARRAY_QUERY , "" , 0 , & [ Type :: Oid ] , & [ & relid] ) ) ;
923
+ let mut rows = VecDeque :: new ( ) ;
924
+ try!( self . read_rows ( & mut rows) ) ;
925
+
926
+ let mut fields = vec ! [ ] ;
927
+ for row in rows {
928
+ let ( name, type_) = {
929
+ let ctx = SessionInfo :: new ( self ) ;
930
+ let name = try!( String :: from_sql ( & Type :: Name ,
931
+ & mut & * * row[ 0 ] . as_ref ( ) . unwrap ( ) ,
932
+ & ctx) ) ;
933
+ let type_ = try!( Oid :: from_sql ( & Type :: Oid ,
934
+ & mut & * * row[ 1 ] . as_ref ( ) . unwrap ( ) ,
935
+ & ctx) ) ;
936
+ ( name, type_)
937
+ } ;
938
+ let type_ = try!( self . get_type ( type_) ) ;
939
+ fields. push ( Field :: new ( name, type_) ) ;
940
+ }
941
+
942
+ Ok ( fields)
931
943
}
932
944
933
945
fn is_desynchronized ( & self ) -> bool {
0 commit comments