Derive Type from pg_type.h and pg_range.h

This commit is contained in:
Steven Fackler
2016-02-21 13:19:40 -08:00
parent 501b79b46c
commit 9948bcda1e
8 changed files with 1124 additions and 438 deletions

View File

@@ -149,414 +149,7 @@ impl FieldNew for Field {
}
}
macro_rules! as_pat {
($p:pat) => ($p)
}
macro_rules! as_expr {
($e:expr) => ($e)
}
macro_rules! make_postgres_type {
($(#[$doc:meta] $oid:tt: $name:expr => $variant:ident: $kind:expr),+) => (
/// A Postgres type.
#[derive(PartialEq, Eq, Clone)]
pub enum Type {
$(
#[$doc]
$variant,
)+
/// An unknown type.
Other(Other),
}
impl fmt::Debug for Type {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
let s = match *self {
$(Type::$variant => stringify!($variant),)+
Type::Other(ref u) => return fmt::Debug::fmt(u, fmt),
};
fmt.write_str(s)
}
}
impl fmt::Display for Type {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
match self.schema() {
"public" | "pg_catalog" => {}
schema => try!(write!(fmt, "{}.", schema)),
}
fmt.write_str(self.name())
}
}
impl Type {
/// Returns the `Type` corresponding to the provided `Oid` if it
/// corresponds to a built-in type.
pub fn from_oid(oid: Oid) -> Option<Type> {
match oid {
$(as_pat!($oid) => Some(Type::$variant),)+
_ => None
}
}
/// Returns the OID of the `Type`.
pub fn oid(&self) -> Oid {
match *self {
$(Type::$variant => as_expr!($oid),)+
Type::Other(ref u) => u.oid(),
}
}
/// Returns the kind of this type.
pub fn kind(&self) -> &Kind {
match *self {
$(
Type::$variant => {
const V: &'static Kind = &$kind;
V
}
)+
Type::Other(ref u) => u.kind(),
}
}
/// Returns the schema of this type.
pub fn schema(&self) -> &str {
match *self {
Type::Other(ref u) => u.schema(),
_ => "pg_catalog",
}
}
/// Returns the name of this type.
pub fn name(&self) -> &str {
match *self {
$(
Type::$variant => $name,
)+
Type::Other(ref u) => u.name(),
}
}
}
)
}
// Values from pg_type.h
make_postgres_type! {
/// BOOL - boolean, 'true'/'false'
16: "bool" => Bool: Kind::Simple,
/// BYTEA - variable-length string, binary values escaped
17: "bytea" => Bytea: Kind::Simple,
/// "char" - single character
18: "char" => Char: Kind::Simple,
/// NAME - 63-byte type for storing system identifiers
19: "name" => Name: Kind::Simple,
/// INT8/BIGINT - ~18 digit integer, 8-byte storage
20: "int8" => Int8: Kind::Simple,
/// INT2/SMALLINT - -32 thousand to 32 thousand, 2-byte storage
21: "int2" => Int2: Kind::Simple,
/// INT2VECTOR - array of int2, used in system tables
22: "int2vector" => Int2Vector: Kind::Array(Type::Int2),
/// INT4/INT - -2 billion to 2 billion integer, 4-byte storage
23: "int4" => Int4: Kind::Simple,
/// REGPROC - registered procedure
24: "regproc" => Regproc: Kind::Simple,
/// TEXT - variable-length string, no limit specified
25: "text" => Text: Kind::Simple,
/// OID - object identifier(oid), maximum 4 billion
26: "oid" => Oid: Kind::Simple,
/// TID - (block, offset), physical location of tuple
27: "tid" => Tid: Kind::Simple,
/// XID - transaction id
28: "xid" => Xid: Kind::Simple,
/// CID - command identifier type, sequence in transaction id
29: "cid" => Cid: Kind::Simple,
/// OIDVECTOR - array of oids, used in system tables
30: "oidvector" => OidVector: Kind::Array(Type::Oid),
/// PG_TYPE
71: "pg_type" => PgType: Kind::Simple,
/// PG_ATTRIBUTE
75: "pg_attribute" => PgAttribute: Kind::Simple,
/// PG_PROC
81: "pg_proc" => PgProc: Kind::Simple,
/// PG_CLASS
83: "pg_class" => PgClass: Kind::Simple,
/// JSON
114: "json" => Json: Kind::Simple,
/// XML - XML content
142: "xml" => Xml: Kind::Simple,
/// XML[]
143: "_xml" => XmlArray: Kind::Array(Type::Xml),
/// PG_NODE_TREE - string representing an internal node tree
194: "pg_node_tree" => PgNodeTree: Kind::Simple,
/// JSON[]
199: "_json" => JsonArray: Kind::Array(Type::Json),
/// SMGR - storage manager
210: "smgr" => Smgr: Kind::Simple,
/// POINT - geometric point '(x, y)'
600: "point" => Point: Kind::Simple,
/// LSEG - geometric line segment '(pt1,pt2)'
601: "lseg" => Lseg: Kind::Simple,
/// PATH - geometric path '(pt1,...)'
602: "path" => Path: Kind::Simple,
/// BOX - geometric box '(lower left,upper right)'
603: "box" => Box: Kind::Simple,
/// POLYGON - geometric polygon '(pt1,...)'
604: "polygon" => Polygon: Kind::Simple,
/// LINE - geometric line
628: "line" => Line: Kind::Simple,
/// LINE[]
629: "_line" => LineArray: Kind::Array(Type::Line),
/// CIDR - network IP address/netmask, network address
650: "cidr" => Cidr: Kind::Simple,
/// CIDR[]
651: "_cidr" => CidrArray: Kind::Array(Type::Cidr),
/// FLOAT4/REAL - single-precision floating point number, 4-byte storage
700: "float4" => Float4: Kind::Simple,
/// FLOAT8/DOUBLE PRECISION - double-precision floating point number, 8-byte storage
701: "float8" => Float8: Kind::Simple,
/// ABSTIME - absolute, limited-range date and time (Unix system time)
702: "abstime" => Abstime: Kind::Simple,
/// RELTIME - relative, limited-range date and time (Unix delta time)
703: "reltime" => Reltime: Kind::Simple,
/// TINTERVAL - (abstime,abstime), time interval
704: "tinterval" => Tinterval: Kind::Simple,
/// UNKNOWN
705: "unknown" => Unknown: Kind::Simple,
/// CIRCLE - geometric circle '(center,radius)'
718: "circle" => Circle: Kind::Simple,
/// CIRCLE[]
719: "_circle" => CircleArray: Kind::Array(Type::Circle),
/// MONEY - monetary amounts, $d,ddd.cc
790: "money" => Money: Kind::Simple,
/// MONEY[]
791: "_money" => MoneyArray: Kind::Array(Type::Money),
/// MACADDR - XX:XX:XX:XX:XX:XX, MAC address
829: "macaddr" => Macaddr: Kind::Simple,
/// INET - IP address/netmask, host address, netmask optional
869: "inet" => Inet: Kind::Simple,
/// BOOL[]
1000: "_bool" => BoolArray: Kind::Array(Type::Bool),
/// BYTEA[]
1001: "_bytea" => ByteaArray: Kind::Array(Type::Bytea),
/// "char"[]
1002: "_char" => CharArray: Kind::Array(Type::Char),
/// NAME[]
1003: "_name" => NameArray: Kind::Array(Type::Name),
/// INT2[]
1005: "_int2" => Int2Array: Kind::Array(Type::Int2),
/// INT2VECTOR[]
1006: "_int2vector" => Int2VectorArray: Kind::Array(Type::Int2Vector),
/// INT4[]
1007: "_int4" => Int4Array: Kind::Array(Type::Int4),
/// REGPROC[]
1008: "_regproc" => RegprocArray: Kind::Array(Type::Regproc),
/// TEXT[]
1009: "_text" => TextArray: Kind::Array(Type::Text),
/// TID[]
1010: "_tid" => TidArray: Kind::Array(Type::Tid),
/// XID[]
1011: "_xid" => XidArray: Kind::Array(Type::Xid),
/// CID[]
1012: "_cid" => CidArray: Kind::Array(Type::Cid),
/// OIDVECTOR[]
1013: "_oidvector" => OidVectorArray: Kind::Array(Type::OidVector),
/// BPCHAR[]
1014: "_bpchar" => BpcharArray: Kind::Array(Type::Bpchar),
/// VARCHAR[]
1015: "_varchar" => VarcharArray: Kind::Array(Type::Varchar),
/// INT8[]
1016: "_int8" => Int8Array: Kind::Array(Type::Int8),
/// POINT[]
1017: "_point" => PointArray: Kind::Array(Type::Point),
/// LSEG[]
1018: "_lseg" => LsegArray: Kind::Array(Type::Lseg),
/// PATH[]
1019: "_path" => PathArray: Kind::Array(Type::Path),
/// BOX[]
1020: "_box" => BoxArray: Kind::Array(Type::Box),
/// FLOAT4[]
1021: "_float4" => Float4Array: Kind::Array(Type::Float4),
/// FLOAT8[]
1022: "_float8" => Float8Array: Kind::Array(Type::Float8),
/// ABSTIME[]
1023: "_abstime" => AbstimeArray: Kind::Array(Type::Abstime),
/// RELTIME[]
1024: "_reltime" => ReltimeArray: Kind::Array(Type::Reltime),
/// TINTERVAL[]
1025: "_tinterval" => TintervalArray: Kind::Array(Type::Tinterval),
/// POLYGON[]
1027: "_polygon" => PolygonArray: Kind::Array(Type::Polygon),
/// OID[]
1028: "_oid" => OidArray: Kind::Array(Type::Oid),
/// ACLITEM - access control list
1033: "aclitem" => Aclitem: Kind::Simple,
/// ACLITEM[]
1034: "_aclitem" => AclitemArray: Kind::Array(Type::Aclitem),
/// MACADDR[]
1040: "_macaddr" => MacaddrArray: Kind::Array(Type::Macaddr),
/// INET[]
1041: "_inet" => InetArray: Kind::Array(Type::Inet),
/// BPCHAR - char(length), blank-padded string, fixed storage length
1042: "bpchar" => Bpchar: Kind::Simple,
/// VARCHAR - varchar(length), non-blank-padded string, variable storage length
1043: "varchar" => Varchar: Kind::Simple,
/// DATE - date
1082: "date" => Date: Kind::Simple,
/// TIME - time of day
1083: "time" => Time: Kind::Simple,
/// TIMESTAMP - date and time
1114: "timestamp" => Timestamp: Kind::Simple,
/// TIMESTAMP[]
1115: "_timestamp" => TimestampArray: Kind::Array(Type::Timestamp),
/// DATE[]
1182: "_date" => DateArray: Kind::Array(Type::Date),
/// TIME[]
1183: "_time" => TimeArray: Kind::Array(Type::Time),
/// TIMESTAMPTZ - date and time with time zone
1184: "timestamptz" => TimestampTZ: Kind::Simple,
/// TIMESTAMPTZ[]
1185: "_timestamptz" => TimestampTZArray: Kind::Array(Type::TimestampTZ),
/// INTERVAL - @ &lt;number&gt; &lt;units&gt;, time interval
1186: "interval" => Interval: Kind::Simple,
/// INTERVAL[]
1187: "_interval" => IntervalArray: Kind::Array(Type::Interval),
/// NUMERIC[]
1231: "_numeric" => NumericArray: Kind::Array(Type::Numeric),
/// CSTRING[]
1263: "_cstring" => CstringArray: Kind::Array(Type::Cstring),
/// TIMETZ - time of day with time zone
1266: "timetz" => Timetz: Kind::Simple,
/// TIMETZ[]
1270: "_timetz" => TimetzArray: Kind::Array(Type::Timetz),
/// BIT - fixed-length bit string
1560: "bit" => Bit: Kind::Simple,
/// BIT[]
1561: "_bit" => BitArray: Kind::Array(Type::Bit),
/// VARBIT - variable-length bit string
1562: "varbit" => Varbit: Kind::Simple,
/// VARBIT[]
1563: "_varbit" => VarbitArray: Kind::Array(Type::Varbit),
/// NUMERIC - numeric(precision, decimal), arbitrary precision number
1700: "numeric" => Numeric: Kind::Simple,
/// REFCURSOR - reference to cursor (portal name)
1790: "refcursor" => Refcursor: Kind::Simple,
/// REFCURSOR[]
2201: "_refcursor" => RefcursorArray: Kind::Array(Type::Refcursor),
/// REGPROCEDURE - registered procedure (with args)
2202: "regprocedure" => Regprocedure: Kind::Simple,
/// REGOPER - registered operator
2203: "regoper" => Regoper: Kind::Simple,
/// REGOPERATOR - registered operator (with args)
2204: "regoperator" => Regoperator: Kind::Simple,
/// REGCLASS - registered class
2205: "regclass" => Regclass: Kind::Simple,
/// REGTYPE - registered type
2206: "regtype" => Regtype: Kind::Simple,
/// REGPROCEDURE[]
2207: "_regprocedure" => RegprocedureArray: Kind::Array(Type::Regprocedure),
/// REGOPER[]
2208: "_regoper" => RegoperArray: Kind::Array(Type::Regoper),
/// REGOPERATOR[]
2209: "_regoperator" => RegoperatorArray: Kind::Array(Type::Regoperator),
/// REGCLASS[]
2210: "_regclass" => RegclassArray: Kind::Array(Type::Regclass),
/// REGTYPE[]
2211: "_regtype" => RegtypeArray: Kind::Array(Type::Regtype),
/// RECORD
2249: "record" => Record: Kind::Pseudo,
/// CSTRING
2275: "cstring" => Cstring: Kind::Pseudo,
/// ANY
2276: "any" => Any: Kind::Pseudo,
/// ANYARRAY
2277: "anyarray" => AnyArray: Kind::Pseudo,
/// VOID
2278: "void" => Void: Kind::Pseudo,
/// TRIGGER
2279: "trigger" => Trigger: Kind::Pseudo,
/// LANGUAGE_HANDLER
2280: "language_handler" => LanguageHandler: Kind::Pseudo,
/// INTERNAL
2281: "internal" => Internal: Kind::Pseudo,
/// OPAQUE
2282: "opaque" => Opaque: Kind::Pseudo,
/// ANYELEMENT
2283: "anyelement" => Anyelement: Kind::Pseudo,
/// RECORD[]
2287: "_record" => RecordArray: Kind::Pseudo,
/// ANYNONARRAY
2776: "anynonarray" => Anynonarray: Kind::Pseudo,
/// TXID_SNAPSHOT[]
2949: "_txid_snapshot" => TxidSnapshotArray: Kind::Array(Type::TxidSnapshot),
/// UUID - UUID datatype
2950: "uuid" => Uuid: Kind::Simple,
/// TXID_SNAPSHOT - txid snapshot
2970: "txid_snapshot" => TxidSnapshot: Kind::Simple,
/// UUID[]
2951: "_uuid" => UuidArray: Kind::Array(Type::Uuid),
/// FDW_HANDLER
3115: "fdw_handler" => FdwHandler: Kind::Pseudo,
/// PG_LSN - PostgreSQL LSN datatype
3220: "pg_lsn" => PgLsn: Kind::Simple,
/// PG_LSN[]
3221: "_pg_lsn" => PgLsnArray: Kind::Array(Type::PgLsn),
/// ANYENUM
3500: "anyenum" => Anyenum: Kind::Pseudo,
/// TSVECTOR - text representation for text search
3614: "tsvector" => Tsvector: Kind::Simple,
/// TSQUERY - query representation for text search
3615: "tsquery" => Tsquery: Kind::Simple,
/// GTSVECTOR - GiST index internal text representation for text search
3642: "gtsvector" => Gtsvector: Kind::Simple,
/// TSVECTOR[]
3643: "_tsvector" => TsvectorArray: Kind::Array(Type::Tsvector),
/// GTSVECTOR[]
3644: "_gtsvector" => GtsvectorArray: Kind::Array(Type::Gtsvector),
/// TSQUERY[]
3645: "_tsquery" => TsqueryArray: Kind::Array(Type::Tsquery),
/// REGCONFIG - registered text search configuration
3734: "regconfig" => Regconfig: Kind::Simple,
/// REGCONFIG[]
3735: "_regconfig" => RegconfigArray: Kind::Array(Type::Regconfig),
/// REGDICTIONARY - registered text search dictionary
3769: "regdictionary" => Regdictionary: Kind::Simple,
/// REGDICTIONARY[]
3770: "_regdictionary" => RegdictionaryArray: Kind::Array(Type::Regdictionary),
/// JSONB
3802: "jsonb" => Jsonb: Kind::Simple,
/// ANYRANGE
3831: "anyrange" => Anyrange: Kind::Pseudo,
/// JSONB[]
3807: "_jsonb" => JsonbArray: Kind::Array(Type::Jsonb),
/// INT4RANGE - range of integers
3904: "int4range" => Int4Range: Kind::Range(Type::Int4),
/// INT4RANGE[]
3905: "_int4range" => Int4RangeArray: Kind::Array(Type::Int4Range),
/// NUMRANGE - range of numerics
3906: "numrange" => NumRange: Kind::Range(Type::Numeric),
/// NUMRANGE[]
3907: "_numrange" => NumRangeArray: Kind::Array(Type::NumRange),
/// TSRANGE - range of timestamps without time zone
3908: "tsrange" => TsRange: Kind::Range(Type::Timestamp),
/// TSRANGE[]
3909: "_tsrange" => TsRangeArray: Kind::Array(Type::TsRange),
/// TSTZRANGE - range of timestamps with time zone
3910: "tstzrange" => TstzRange: Kind::Range(Type::TimestampTZ),
/// TSTZRANGE[]
3911: "_tstzrange" => TstzRangeArray: Kind::Array(Type::TstzRange),
/// DATERANGE - range of dates
3912: "daterange" => DateRange: Kind::Range(Type::Date),
/// DATERANGE[]
3913: "_daterange" => DateRangeArray: Kind::Array(Type::DateRange),
/// INT8RANGE - range of bigints
3926: "int8range" => Int8Range: Kind::Range(Type::Int8),
/// INT8RANGE[]
3927: "_int8range" => Int8RangeArray: Kind::Array(Type::Int8Range),
/// EVENT_TRIGGER
3838: "event_trigger" => EventTrigger: Kind::Pseudo
}
include!(concat!(env!("OUT_DIR"), "/type.rs"));
/// Information about an unknown type.
#[derive(PartialEq, Eq, Clone)]