1
1
use fallible_iterator:: FallibleIterator ;
2
- use postgres_shared:: types:: { Type , Kind , ToSql , FromSql , IsNull } ;
3
- use postgres_protocol:: types;
4
2
use postgres_protocol;
3
+ use postgres_protocol:: types;
4
+ use postgres_shared:: to_sql_checked;
5
+ use postgres_shared:: types:: { FromSql , IsNull , Kind , ToSql , Type } ;
5
6
use std:: error:: Error ;
6
7
7
- use { Array , Dimension } ;
8
+ use crate :: { Array , Dimension } ;
8
9
9
10
impl < T > FromSql for Array < T >
10
11
where
11
12
T : FromSql ,
12
13
{
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 > > {
14
15
let element_type = match * ty. kind ( ) {
15
16
Kind :: Array ( ref ty) => ty,
16
17
_ => unreachable ! ( ) ,
17
18
} ;
18
19
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) ?;
32
21
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 ( ) ?;
39
34
40
35
Ok ( Array :: from_parts ( elements, dimensions) )
41
36
}
@@ -52,21 +47,19 @@ impl<T> ToSql for Array<T>
52
47
where
53
48
T : ToSql ,
54
49
{
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 > > {
56
51
let element_type = match ty. kind ( ) {
57
52
& Kind :: Array ( ref ty) => ty,
58
53
_ => unreachable ! ( ) ,
59
54
} ;
60
55
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 ,
66
59
} ) ;
67
60
let elements = self . iter ( ) ;
68
61
69
- try! ( types:: array_to_sql (
62
+ types:: array_to_sql (
70
63
dimensions,
71
64
true ,
72
65
element_type. oid ( ) ,
77
70
Err ( e) => Err ( e) ,
78
71
} ,
79
72
w,
80
- ) ) ;
73
+ ) ? ;
81
74
82
75
Ok ( IsNull :: No )
83
76
}
@@ -96,18 +89,19 @@ where
96
89
mod test {
97
90
use std:: fmt;
98
91
99
- use postgres :: { Connection , TlsMode } ;
92
+ use crate :: Array ;
100
93
use postgres:: types:: { FromSql , ToSql } ;
101
- use Array ;
94
+ use postgres :: { Connection , TlsMode } ;
102
95
103
96
fn test_type < T : PartialEq + FromSql + ToSql , S : fmt:: Display > (
104
97
sql_type : & str ,
105
98
checks : & [ ( T , S ) ] ,
106
99
) {
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 ( ) ;
109
102
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) )
111
105
. unwrap ( ) ;
112
106
let result = stmt. query ( & [ ] ) . unwrap ( ) . iter ( ) . next ( ) . unwrap ( ) . get ( 0 ) ;
113
107
assert ! ( val == & result) ;
@@ -119,19 +113,24 @@ mod test {
119
113
}
120
114
121
115
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
+ ] ;
127
124
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 ) ;
129
126
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
+ ) ] ;
133
132
test_type( & format!( "{}[][]" , $name) , tests) ;
134
- } )
133
+ } } ;
135
134
}
136
135
137
136
#[ test]
0 commit comments