Skip to content

Commit 9c731cd

Browse files
committed
Support CHAR(n)[]
1 parent cee8e00 commit 9c731cd

3 files changed

Lines changed: 50 additions & 23 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ types. The driver currently supports the following conversions:
280280
</tr>
281281
<tr>
282282
<td>types::array::ArrayBase&lt;Option&lt;~str&gt;&gt;</td>
283-
<td>TEXT[], TEXT[][], ...</td>
283+
<td>TEXT[], CHAR(n)[], TEXT[][], ...</td>
284284
</tr>
285285
<tr>
286286
<td>types::array::ArrayBase&lt;Option&lt;i64&gt;&gt;</td>

test.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,12 @@ fn test_textarray_params() {
464464
test_array_params!("TEXT", ~"hello", "hello", ~"world", "world", ~"!", "!");
465465
}
466466
467+
#[test]
468+
fn test_charnarray_params() {
469+
test_array_params!("CHAR(5)", ~"hello", "hello", ~"world", "world",
470+
~"! ", "!");
471+
}
472+
467473
#[test]
468474
fn test_int8array_params() {
469475
test_array_params!("INT8", 0i64, "0", 1i64, "1", 2i64, "2");

types/mod.rs

Lines changed: 43 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ static CHARARRAYOID: Oid = 1002;
3939
static INT2ARRAYOID: Oid = 1005;
4040
static INT4ARRAYOID: Oid = 1007;
4141
static TEXTARRAYOID: Oid = 1009;
42+
static BPCHARARRAYOID: Oid = 1014;
4243
static INT8ARRAYOID: Oid = 1016;
4344
static FLOAT4ARRAYOID: Oid = 1021;
4445
static FLAOT8ARRAYOID: Oid = 1022;
@@ -65,9 +66,10 @@ static RANGE_LOWER_INCLUSIVE: i8 = 0b0000_0010;
6566
static RANGE_EMPTY: i8 = 0b0000_0001;
6667

6768
macro_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])
377398
from_array_impl!(PgCharArray, i8)
378399
from_array_impl!(PgInt2Array, i16)
379400
from_array_impl!(PgInt4Array, i32)
380-
from_array_impl!(PgTextArray, ~str)
401+
from_array_impl!(PgTextArray | PgCharNArray, ~str)
381402
from_array_impl!(PgInt8Array, i64)
382403
from_array_impl!(PgFloat4Array, f32)
383404
from_array_impl!(PgFloat8Array, f64)
@@ -636,15 +657,15 @@ to_range_impl!(PgInt8Range, i64)
636657
to_range_impl!(PgTsRange | PgTstzRange, Timespec)
637658
638659
macro_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
682703
impl<'self> ToSql for HashMap<~str, Option<~str>> {
683704
fn to_sql(&self, ty: &PostgresType) -> (Format, Option<~[u8]>) {

0 commit comments

Comments
 (0)