Skip to content

Commit 91bef8d

Browse files
committed
Split up get_type
1 parent 5b54a69 commit 91bef8d

File tree

1 file changed

+49
-37
lines changed

1 file changed

+49
-37
lines changed

src/lib.rs

Lines changed: 49 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,12 @@ impl InnerConnection {
844844
return Ok(Type::Other(ty.clone()));
845845
}
846846

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> {
847853
try!(self.raw_execute(TYPEINFO_QUERY, "", 0, &[Type::Oid], &[&oid]));
848854
let mut rows = VecDeque::new();
849855
try!(self.read_rows(&mut rows));
@@ -877,57 +883,63 @@ impl InnerConnection {
877883
};
878884

879885
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)))
893887
} else if type_ == b'p' as i8 {
894888
Kind::Pseudo
895889
} else if basetype != 0 {
896890
Kind::Domain(try!(self.get_type(basetype)))
897891
} else if elem_oid != 0 {
898892
Kind::Array(try!(self.get_type(elem_oid)))
899893
} 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)))
921895
} else {
922896
match rngsubtype {
923897
Some(oid) => Kind::Range(try!(self.get_type(oid))),
924898
None => Kind::Simple,
925899
}
926900
};
927901

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)
931943
}
932944

933945
fn is_desynchronized(&self) -> bool {

0 commit comments

Comments
 (0)