11use fallible_iterator:: FallibleIterator ;
2- use postgres_shared:: types:: { Type , Kind , ToSql , FromSql , IsNull } ;
3- use postgres_protocol:: types;
42use postgres_protocol;
3+ use postgres_protocol:: types;
4+ use postgres_shared:: to_sql_checked;
5+ use postgres_shared:: types:: { FromSql , IsNull , Kind , ToSql , Type } ;
56use std:: error:: Error ;
67
7- use { Array , Dimension } ;
8+ use crate :: { Array , Dimension } ;
89
910impl < T > FromSql for Array < T >
1011where
1112 T : FromSql ,
1213{
13- fn from_sql ( ty : & Type , raw : & [ u8 ] ) -> Result < Array < T > , Box < Error + Sync + Send > > {
14+ fn from_sql ( ty : & Type , raw : & [ u8 ] ) -> Result < Array < T > , Box < dyn Error + Sync + Send > > {
1415 let element_type = match * ty. kind ( ) {
1516 Kind :: Array ( ref ty) => ty,
1617 _ => unreachable ! ( ) ,
1718 } ;
1819
19- let array = try!( types:: array_from_sql ( raw) ) ;
20-
21- let dimensions = try!(
22- array
23- . dimensions ( )
24- . map ( |d| {
25- Dimension {
26- len : d. len ,
27- lower_bound : d. lower_bound ,
28- }
29- } )
30- . collect ( )
31- ) ;
20+ let array = types:: array_from_sql ( raw) ?;
3221
33- let elements = try!(
34- array
35- . values ( )
36- . and_then ( |v| FromSql :: from_sql_nullable ( element_type, v) )
37- . collect ( )
38- ) ;
22+ let dimensions = array
23+ . dimensions ( )
24+ . map ( |d| Dimension {
25+ len : d. len ,
26+ lower_bound : d. lower_bound ,
27+ } )
28+ . collect ( ) ?;
29+
30+ let elements = array
31+ . values ( )
32+ . and_then ( |v| FromSql :: from_sql_nullable ( element_type, v) )
33+ . collect ( ) ?;
3934
4035 Ok ( Array :: from_parts ( elements, dimensions) )
4136 }
@@ -52,21 +47,19 @@ impl<T> ToSql for Array<T>
5247where
5348 T : ToSql ,
5449{
55- fn to_sql ( & self , ty : & Type , w : & mut Vec < u8 > ) -> Result < IsNull , Box < Error + Sync + Send > > {
50+ fn to_sql ( & self , ty : & Type , w : & mut Vec < u8 > ) -> Result < IsNull , Box < dyn Error + Sync + Send > > {
5651 let element_type = match ty. kind ( ) {
5752 & Kind :: Array ( ref ty) => ty,
5853 _ => unreachable ! ( ) ,
5954 } ;
6055
61- let dimensions = self . dimensions ( ) . iter ( ) . map ( |d| {
62- types:: ArrayDimension {
63- len : d. len ,
64- lower_bound : d. lower_bound ,
65- }
56+ let dimensions = self . dimensions ( ) . iter ( ) . map ( |d| types:: ArrayDimension {
57+ len : d. len ,
58+ lower_bound : d. lower_bound ,
6659 } ) ;
6760 let elements = self . iter ( ) ;
6861
69- try! ( types:: array_to_sql (
62+ types:: array_to_sql (
7063 dimensions,
7164 true ,
7265 element_type. oid ( ) ,
7770 Err ( e) => Err ( e) ,
7871 } ,
7972 w,
80- ) ) ;
73+ ) ? ;
8174
8275 Ok ( IsNull :: No )
8376 }
@@ -96,18 +89,19 @@ where
9689mod test {
9790 use std:: fmt;
9891
99- use postgres :: { Connection , TlsMode } ;
92+ use crate :: Array ;
10093 use postgres:: types:: { FromSql , ToSql } ;
101- use Array ;
94+ use postgres :: { Connection , TlsMode } ;
10295
10396 fn test_type < T : PartialEq + FromSql + ToSql , S : fmt:: Display > (
10497 sql_type : & str ,
10598 checks : & [ ( T , S ) ] ,
10699 ) {
107- let conn = Connection :: connect ( "postgres://postgres:password@localhost" , TlsMode :: None )
108- . unwrap ( ) ;
100+ let conn =
101+ Connection :: connect ( "postgres://postgres:password@localhost" , TlsMode :: None ) . unwrap ( ) ;
109102 for & ( ref val, ref repr) in checks. iter ( ) {
110- let stmt = conn. prepare ( & format ! ( "SELECT {}::{}" , * repr, sql_type) )
103+ let stmt = conn
104+ . prepare ( & format ! ( "SELECT {}::{}" , * repr, sql_type) )
111105 . unwrap ( ) ;
112106 let result = stmt. query ( & [ ] ) . unwrap ( ) . iter ( ) . next ( ) . unwrap ( ) . get ( 0 ) ;
113107 assert ! ( val == & result) ;
@@ -119,19 +113,24 @@ mod test {
119113 }
120114
121115 macro_rules! test_array_params {
122- ( $name: expr, $v1: expr, $s1: expr, $v2: expr, $s2: expr, $v3: expr, $s3: expr) => ( {
123-
124- let tests = & [ ( Some ( Array :: from_vec( vec!( Some ( $v1) , Some ( $v2) , None ) , 1 ) ) ,
125- format!( "'{{{},{},NULL}}'" , $s1, $s2) ) ,
126- ( None , "NULL" . to_string( ) ) ] ;
116+ ( $name: expr, $v1: expr, $s1: expr, $v2: expr, $s2: expr, $v3: expr, $s3: expr) => { {
117+ let tests = & [
118+ (
119+ Some ( Array :: from_vec( vec![ Some ( $v1) , Some ( $v2) , None ] , 1 ) ) ,
120+ format!( "'{{{},{},NULL}}'" , $s1, $s2) ,
121+ ) ,
122+ ( None , "NULL" . to_string( ) ) ,
123+ ] ;
127124 test_type( & format!( "{}[]" , $name) , tests) ;
128- let mut a = Array :: from_vec( vec!( Some ( $v1) , Some ( $v2) ) , 0 ) ;
125+ let mut a = Array :: from_vec( vec![ Some ( $v1) , Some ( $v2) ] , 0 ) ;
129126 a. wrap( -1 ) ;
130- a. push( Array :: from_vec( vec!( None , Some ( $v3) ) , 0 ) ) ;
131- let tests = & [ ( Some ( a) , format!( "'[-1:0][0:1]={{{{{},{}}},{{NULL,{}}}}}'" ,
132- $s1, $s2, $s3) ) ] ;
127+ a. push( Array :: from_vec( vec![ None , Some ( $v3) ] , 0 ) ) ;
128+ let tests = & [ (
129+ Some ( a) ,
130+ format!( "'[-1:0][0:1]={{{{{},{}}},{{NULL,{}}}}}'" , $s1, $s2, $s3) ,
131+ ) ] ;
133132 test_type( & format!( "{}[][]" , $name) , tests) ;
134- } )
133+ } } ;
135134 }
136135
137136 #[ test]
0 commit comments