22use serialize:: json;
33use std:: collections:: HashMap ;
44use std:: io:: { ByRefReader , BufReader } ;
5+ use std:: io:: net:: ip:: IpAddr ;
56
67use self :: Type :: * ;
78use Result ;
@@ -325,6 +326,7 @@ const JSONOID: Oid = 114;
325326const JSONARRAYOID : Oid = 199 ;
326327const FLOAT4OID : Oid = 700 ;
327328const FLOAT8OID : Oid = 701 ;
329+ const INETOID : Oid = 869 ;
328330const BOOLARRAYOID : Oid = 1000 ;
329331const BYTEAARRAYOID : Oid = 1001 ;
330332const CHARARRAYOID : Oid = 1002 ;
@@ -433,6 +435,8 @@ make_postgres_type!(
433435 FLOAT4OID => Float4 ,
434436 #[ doc="FLOAT8/DOUBLE PRECISION" ]
435437 FLOAT8OID => Float8 ,
438+ #[ doc="INET" ]
439+ INETOID => Inet ,
436440 #[ doc="BOOL[]" ]
437441 BOOLARRAYOID => BoolArray member Bool ,
438442 #[ doc="BYTEA[]" ]
@@ -538,6 +542,29 @@ impl RawFromSql for json::Json {
538542 }
539543}
540544
545+ impl RawFromSql for IpAddr {
546+ fn raw_from_sql < R : Reader > ( raw : & mut R ) -> Result < IpAddr > {
547+ let family = try!( raw. read_u8 ( ) ) ;
548+ let _bits = try!( raw. read_u8 ( ) ) ;
549+ let _is_cidr = try!( raw. read_u8 ( ) ) ;
550+ let nb = try!( raw. read_u8 ( ) ) ;
551+ let mut buf = & * try!( raw. read_exact ( nb as uint ) ) ;
552+
553+ match family {
554+ 2 if nb == 4 => Ok ( IpAddr :: Ipv4Addr ( buf[ 0 ] , buf[ 1 ] , buf[ 2 ] , buf[ 3 ] ) ) ,
555+ 3 if nb == 16 => Ok ( IpAddr :: Ipv6Addr ( try!( buf. read_be_u16 ( ) ) ,
556+ try!( buf. read_be_u16 ( ) ) ,
557+ try!( buf. read_be_u16 ( ) ) ,
558+ try!( buf. read_be_u16 ( ) ) ,
559+ try!( buf. read_be_u16 ( ) ) ,
560+ try!( buf. read_be_u16 ( ) ) ,
561+ try!( buf. read_be_u16 ( ) ) ,
562+ try!( buf. read_be_u16 ( ) ) ) ) ,
563+ _ => Err ( Error :: BadData ) ,
564+ }
565+ }
566+ }
567+
541568from_raw_from_impl ! ( Bool , bool )
542569from_raw_from_impl ! ( ByteA , Vec <u8 >)
543570from_raw_from_impl ! ( Varchar | Text | CharN | Name , String )
@@ -548,6 +575,7 @@ from_raw_from_impl!(Int8, i64)
548575from_raw_from_impl ! ( Float4 , f32 )
549576from_raw_from_impl ! ( Float8 , f64 )
550577from_raw_from_impl ! ( Json , json:: Json )
578+ from_raw_from_impl ! ( Inet , IpAddr )
551579
552580from_raw_from_impl ! ( Int4Range , Range <i32 >)
553581from_raw_from_impl ! ( Int8Range , Range <i64 >)
@@ -668,10 +696,44 @@ impl RawToSql for json::Json {
668696 }
669697}
670698
699+ impl RawToSql for IpAddr {
700+ fn raw_to_sql < W : Writer > ( & self , raw : & mut W ) -> Result < ( ) > {
701+ match * self {
702+ IpAddr :: Ipv4Addr ( a, b, c, d) => {
703+ let buf = [ 2 , // family
704+ 32 , // bits
705+ 0 , // is_cidr
706+ 4 , // nb
707+ a, b, c, d // addr
708+ ] ;
709+ try!( raw. write ( & buf) ) ;
710+ }
711+ IpAddr :: Ipv6Addr ( a, b, c, d, e, f, g, h) => {
712+ let buf = [ 3 , // family
713+ 128 , // bits
714+ 0 , // is_cidr
715+ 16 , // nb
716+ ] ;
717+ try!( raw. write ( & buf) ) ;
718+ try!( raw. write_be_u16 ( a) ) ;
719+ try!( raw. write_be_u16 ( b) ) ;
720+ try!( raw. write_be_u16 ( c) ) ;
721+ try!( raw. write_be_u16 ( d) ) ;
722+ try!( raw. write_be_u16 ( e) ) ;
723+ try!( raw. write_be_u16 ( f) ) ;
724+ try!( raw. write_be_u16 ( g) ) ;
725+ try!( raw. write_be_u16 ( h) ) ;
726+ }
727+ }
728+ Ok ( ( ) )
729+ }
730+ }
731+
671732to_raw_to_impl ! ( Bool , bool )
672733to_raw_to_impl ! ( ByteA , Vec <u8 >)
673734to_raw_to_impl ! ( Varchar | Text | CharN | Name , String )
674735to_raw_to_impl ! ( Json , json:: Json )
736+ to_raw_to_impl ! ( Inet , IpAddr )
675737to_raw_to_impl ! ( Char , i8 )
676738to_raw_to_impl ! ( Int2 , i16 )
677739to_raw_to_impl ! ( Int4 , i32 )
0 commit comments