@@ -39,6 +39,7 @@ static CHARARRAYOID: Oid = 1002;
3939static INT2ARRAYOID : Oid = 1005 ;
4040static INT4ARRAYOID : Oid = 1007 ;
4141static TEXTARRAYOID : Oid = 1009 ;
42+ static BPCHARARRAYOID : Oid = 1014 ;
4243static INT8ARRAYOID : Oid = 1016 ;
4344static FLOAT4ARRAYOID : Oid = 1021 ;
4445static FLAOT8ARRAYOID : Oid = 1022 ;
@@ -65,9 +66,10 @@ static RANGE_LOWER_INCLUSIVE: i8 = 0b0000_0010;
6566static RANGE_EMPTY : i8 = 0b0000_0001 ;
6667
6768macro_rules! make_postgres_type(
68- ( $( $doc: attr $variant: ident => $oid: ident) ,+) => (
69+ ( $( $doc: attr $variant: ident => $oid: ident $ ( member $member : ident ) * ) ,+) => (
6970 /// A Postgres type
7071 #[ deriving( Eq ) ]
72+ #[ allow( missing_doc) ] // FIXME mozilla/rust#10853
7173 pub enum PostgresType {
7274 $(
7375 $doc
@@ -92,6 +94,23 @@ macro_rules! make_postgres_type(
9294 }
9395 }
9496
97+ #[ doc( hidden) ]
98+ pub fn to_oid( & self ) -> Oid {
99+ match * self {
100+ $( $variant => $oid, ) +
101+ PgUnknownType { oid, .. } => oid
102+ }
103+ }
104+
105+ fn member_type( & self ) -> PostgresType {
106+ match * self {
107+ $(
108+ $( $variant => $member, ) *
109+ ) +
110+ _ => unreachable!( )
111+ }
112+ }
113+
95114 /// Returns the wire format needed for the value of `self`.
96115 pub fn result_format( & self ) -> Format {
97116 match * self {
@@ -126,23 +145,25 @@ make_postgres_type!(
126145 #[ doc="FLOAT8/DOUBLE PRECISION" ]
127146 PgFloat8 => FLOAT8OID ,
128147 #[ doc="BOOL[]" ]
129- PgBoolArray => BOOLARRAYOID ,
148+ PgBoolArray => BOOLARRAYOID member PgBool ,
130149 #[ doc="BYTEA[]" ]
131- PgByteAArray => BYTEAARRAYOID ,
150+ PgByteAArray => BYTEAARRAYOID member PgByteA ,
132151 #[ doc="\" char\" []" ]
133- PgCharArray => CHARARRAYOID ,
152+ PgCharArray => CHARARRAYOID member PgChar ,
134153 #[ doc="INT2[]" ]
135- PgInt2Array => INT2ARRAYOID ,
154+ PgInt2Array => INT2ARRAYOID member PgInt2 ,
136155 #[ doc="INT4[]" ]
137- PgInt4Array => INT4ARRAYOID ,
156+ PgInt4Array => INT4ARRAYOID member PgInt4 ,
138157 #[ doc="TEXT[]" ]
139- PgTextArray => TEXTARRAYOID ,
158+ PgTextArray => TEXTARRAYOID member PgText ,
159+ #[ doc="CHAR(n)[]" ]
160+ PgCharNArray => BPCHARARRAYOID member PgCharN ,
140161 #[ doc="INT8[]" ]
141- PgInt8Array => INT8ARRAYOID ,
162+ PgInt8Array => INT8ARRAYOID member PgInt8 ,
142163 #[ doc="FLOAT4[]" ]
143- PgFloat4Array => FLOAT4ARRAYOID ,
164+ PgFloat4Array => FLOAT4ARRAYOID member PgFloat4 ,
144165 #[ doc="FLOAT8[]" ]
145- PgFloat8Array => FLAOT8ARRAYOID ,
166+ PgFloat8Array => FLAOT8ARRAYOID member PgFloat8 ,
146167 #[ doc="TIMESTAMP" ]
147168 PgTimestamp => TIMESTAMPOID ,
148169 #[ doc="TIMESTAMP WITH TIME ZONE" ]
@@ -377,7 +398,7 @@ from_array_impl!(PgByteAArray, ~[u8])
377398from_array_impl!( PgCharArray , i8 )
378399from_array_impl!( PgInt2Array , i16 )
379400from_array_impl!( PgInt4Array , i32 )
380- from_array_impl!( PgTextArray , ~str )
401+ from_array_impl!( PgTextArray | PgCharNArray , ~str )
381402from_array_impl!( PgInt8Array , i64 )
382403from_array_impl!( PgFloat4Array , f32 )
383404from_array_impl!( PgFloat8Array , f64 )
@@ -636,15 +657,15 @@ to_range_impl!(PgInt8Range, i64)
636657to_range_impl!(PgTsRange | PgTstzRange, Timespec)
637658
638659macro_rules! to_array_impl(
639- ($($oid:ident)|+, $base_oid:ident, $ t:ty) => (
660+ ($($oid:ident)|+, $t:ty) => (
640661 impl ToSql for ArrayBase<Option<$t>> {
641662 fn to_sql(&self, ty: &PostgresType) -> (Format, Option<~[u8]>) {
642663 check_types!($($oid)|+, ty)
643664 let mut buf = MemWriter::new();
644665
645666 buf.write_be_i32(self.dimension_info().len() as i32);
646667 buf.write_be_i32(1);
647- buf.write_be_i32($base_oid );
668+ buf.write_be_i32(ty.member_type().to_oid() );
648669
649670 for info in self.dimension_info().iter() {
650671 buf.write_be_i32(info.len as i32);
@@ -669,15 +690,15 @@ macro_rules! to_array_impl(
669690 )
670691)
671692
672- to_array_impl!(PgBoolArray, BOOLOID, bool)
673- to_array_impl!(PgByteAArray, BYTEAOID, ~[u8])
674- to_array_impl!(PgCharArray, CHAROID, i8)
675- to_array_impl!(PgInt2Array, INT2OID, i16)
676- to_array_impl!(PgInt4Array, INT4OID, i32)
677- to_array_impl!(PgTextArray, TEXTOID , ~str)
678- to_array_impl!(PgInt8Array, INT8OID, i64)
679- to_array_impl!(PgFloat4Array, FLOAT4OID, f32)
680- to_array_impl!(PgFloat8Array, FLOAT8OID, f64)
693+ to_array_impl!(PgBoolArray, bool)
694+ to_array_impl!(PgByteAArray, ~[u8])
695+ to_array_impl!(PgCharArray, i8)
696+ to_array_impl!(PgInt2Array, i16)
697+ to_array_impl!(PgInt4Array, i32)
698+ to_array_impl!(PgTextArray | PgCharNArray , ~str)
699+ to_array_impl!(PgInt8Array, i64)
700+ to_array_impl!(PgFloat4Array, f32)
701+ to_array_impl!(PgFloat8Array, f64)
681702
682703impl<'self> ToSql for HashMap<~str, Option<~str>> {
683704 fn to_sql(&self, ty: &PostgresType) -> (Format, Option<~[u8]>) {
0 commit comments