1
1
use crate :: error:: Result ;
2
- use postgres:: Client ;
2
+ use futures_util:: stream:: TryStreamExt ;
3
+ use sqlx:: { postgres:: PgRow , FromRow , Row } ;
3
4
use std:: time:: Duration ;
4
5
5
6
#[ derive( Default , Debug , Clone , Copy , Eq , PartialEq ) ]
@@ -9,75 +10,83 @@ pub struct Overrides {
9
10
pub timeout : Option < Duration > ,
10
11
}
11
12
12
- impl Overrides {
13
- pub fn all ( conn : & mut Client ) -> Result < Vec < ( String , Self ) > > {
14
- Ok ( conn
15
- . query ( "SELECT * FROM sandbox_overrides" , & [ ] ) ?
16
- . into_iter ( )
17
- . map ( |row| ( row. get ( "crate_name" ) , Self :: from_row ( row) ) )
18
- . collect ( ) )
19
- }
20
-
21
- pub fn for_crate ( conn : & mut Client , krate : & str ) -> Result < Option < Self > > {
22
- Ok ( conn
23
- . query_opt (
24
- "SELECT * FROM sandbox_overrides WHERE crate_name = $1" ,
25
- & [ & krate] ,
26
- ) ?
27
- . map ( Self :: from_row) )
28
- }
29
-
30
- fn from_row ( row : postgres:: Row ) -> Self {
31
- Self {
13
+ impl FromRow < ' _ , PgRow > for Overrides {
14
+ fn from_row ( row : & PgRow ) -> sqlx:: Result < Self > {
15
+ Ok ( Self {
32
16
memory : row
33
- . get :: < _ , Option < i64 > > ( "max_memory_bytes" )
17
+ . get :: < Option < i64 > , _ > ( "max_memory_bytes" )
34
18
. map ( |i| i as usize ) ,
35
- targets : row. get :: < _ , Option < i32 > > ( "max_targets" ) . map ( |i| i as usize ) ,
19
+ targets : row. get :: < Option < i32 > , _ > ( "max_targets" ) . map ( |i| i as usize ) ,
36
20
timeout : row
37
- . get :: < _ , Option < i32 > > ( "timeout_seconds" )
21
+ . get :: < Option < i32 > , _ > ( "timeout_seconds" )
38
22
. map ( |i| Duration :: from_secs ( i as u64 ) ) ,
39
- }
23
+ } )
24
+ }
25
+ }
26
+
27
+ impl Overrides {
28
+ pub async fn all ( conn : & mut sqlx:: PgConnection ) -> Result < Vec < ( String , Self ) > > {
29
+ Ok ( sqlx:: query ( "SELECT * FROM sandbox_overrides" )
30
+ . fetch ( conn)
31
+ . map_ok ( |row| {
32
+ (
33
+ row. get ( "crate_name" ) ,
34
+ Overrides :: from_row ( & row)
35
+ . expect ( "this is fine because we never return Err(_) in from_row" ) ,
36
+ )
37
+ } )
38
+ . try_collect ( )
39
+ . await ?)
40
40
}
41
41
42
- pub fn save ( conn : & mut Client , krate : & str , overrides : Self ) -> Result < ( ) > {
42
+ pub async fn for_crate ( conn : & mut sqlx:: PgConnection , krate : & str ) -> Result < Option < Self > > {
43
+ Ok (
44
+ sqlx:: query_as ( "SELECT * FROM sandbox_overrides WHERE crate_name = $1" )
45
+ . bind ( krate)
46
+ . fetch_optional ( conn)
47
+ . await ?,
48
+ )
49
+ }
50
+
51
+ pub async fn save ( conn : & mut sqlx:: PgConnection , krate : & str , overrides : Self ) -> Result < ( ) > {
43
52
if overrides. timeout . is_some ( ) && overrides. targets . is_none ( ) {
44
53
tracing:: warn!( "setting `Overrides::timeout` implies a default `Overrides::targets = 1`, prefer setting this explicitly" ) ;
45
54
}
46
55
47
- if conn
48
- . query_opt ( "SELECT id FROM crates WHERE crates.name = $1" , & [ & krate] ) ?
56
+ if sqlx:: query_scalar!( "SELECT id FROM crates WHERE crates.name = $1" , krate)
57
+ . fetch_optional ( & mut * conn)
58
+ . await ?
49
59
. is_none ( )
50
60
{
51
61
tracing:: warn!( "setting overrides for unknown crate `{krate}`" ) ;
52
62
}
53
63
54
- conn . execute (
64
+ sqlx :: query! (
55
65
"
56
- INSERT INTO sandbox_overrides (
57
- crate_name, max_memory_bytes, max_targets, timeout_seconds
58
- )
59
- VALUES ($1, $2, $3, $4)
60
- ON CONFLICT (crate_name) DO UPDATE
61
- SET
62
- max_memory_bytes = $2,
63
- max_targets = $3,
64
- timeout_seconds = $4
65
- " ,
66
- & [
67
- & krate ,
68
- & overrides. memory . map ( |i| i as i64 ) ,
69
- & overrides. targets . map ( |i| i as i32 ) ,
70
- & overrides . timeout . map ( |d| d . as_secs ( ) as i32 ) ,
71
- ] ,
72
- ) ?;
66
+ INSERT INTO sandbox_overrides (
67
+ crate_name, max_memory_bytes, max_targets, timeout_seconds
68
+ )
69
+ VALUES ($1, $2, $3, $4)
70
+ ON CONFLICT (crate_name) DO UPDATE
71
+ SET
72
+ max_memory_bytes = $2,
73
+ max_targets = $3,
74
+ timeout_seconds = $4
75
+ " ,
76
+ krate ,
77
+ overrides . memory . map ( |i| i as i64 ) ,
78
+ overrides. targets . map( |i| i as i32 ) ,
79
+ overrides. timeout . map( |d| d . as_secs ( ) as i32 ) ,
80
+ )
81
+ . execute ( & mut * conn )
82
+ . await ?;
73
83
Ok ( ( ) )
74
84
}
75
85
76
- pub fn remove ( conn : & mut Client , krate : & str ) -> Result < ( ) > {
77
- conn. execute (
78
- "DELETE FROM sandbox_overrides WHERE crate_name = $1" ,
79
- & [ & krate] ,
80
- ) ?;
86
+ pub async fn remove ( conn : & mut sqlx:: PgConnection , krate : & str ) -> Result < ( ) > {
87
+ sqlx:: query!( "DELETE FROM sandbox_overrides WHERE crate_name = $1" , krate)
88
+ . execute ( conn)
89
+ . await ?;
81
90
Ok ( ( ) )
82
91
}
83
92
}
@@ -87,24 +96,25 @@ mod test {
87
96
use crate :: { db:: Overrides , test:: * } ;
88
97
use std:: time:: Duration ;
89
98
90
- #[ test]
91
- fn retrieve_overrides ( ) {
92
- wrapper ( |env| {
93
- let db = env. db ( ) ;
99
+ #[ tokio:: test]
100
+ async fn retrieve_overrides ( ) {
101
+ async_wrapper ( |env| async move {
102
+ let db = env. async_db ( ) . await ;
103
+ let mut conn = db. async_conn ( ) . await ;
94
104
95
105
let krate = "hexponent" ;
96
106
97
107
// no overrides
98
- let actual = Overrides :: for_crate ( & mut db . conn ( ) , krate) ?;
108
+ let actual = Overrides :: for_crate ( & mut conn, krate) . await ?;
99
109
assert_eq ! ( actual, None ) ;
100
110
101
111
// add partial overrides
102
112
let expected = Overrides {
103
113
targets : Some ( 1 ) ,
104
114
..Overrides :: default ( )
105
115
} ;
106
- Overrides :: save ( & mut db . conn ( ) , krate, expected) ?;
107
- let actual = Overrides :: for_crate ( & mut db . conn ( ) , krate) ?;
116
+ Overrides :: save ( & mut conn, krate, expected) . await ?;
117
+ let actual = Overrides :: for_crate ( & mut conn, krate) . await ?;
108
118
assert_eq ! ( actual, Some ( expected) ) ;
109
119
110
120
// overwrite with full overrides
@@ -113,25 +123,26 @@ mod test {
113
123
targets : Some ( 1 ) ,
114
124
timeout : Some ( Duration :: from_secs ( 300 ) ) ,
115
125
} ;
116
- Overrides :: save ( & mut db . conn ( ) , krate, expected) ?;
117
- let actual = Overrides :: for_crate ( & mut db . conn ( ) , krate) ?;
126
+ Overrides :: save ( & mut conn, krate, expected) . await ?;
127
+ let actual = Overrides :: for_crate ( & mut conn, krate) . await ?;
118
128
assert_eq ! ( actual, Some ( expected) ) ;
119
129
120
130
// overwrite with partial overrides
121
131
let expected = Overrides {
122
132
memory : Some ( 1 ) ,
123
133
..Overrides :: default ( )
124
134
} ;
125
- Overrides :: save ( & mut db . conn ( ) , krate, expected) ?;
126
- let actual = Overrides :: for_crate ( & mut db . conn ( ) , krate) ?;
135
+ Overrides :: save ( & mut conn, krate, expected) . await ?;
136
+ let actual = Overrides :: for_crate ( & mut conn, krate) . await ?;
127
137
assert_eq ! ( actual, Some ( expected) ) ;
128
138
129
139
// remove overrides
130
- Overrides :: remove ( & mut db . conn ( ) , krate) ?;
131
- let actual = Overrides :: for_crate ( & mut db . conn ( ) , krate) ?;
140
+ Overrides :: remove ( & mut conn, krate) . await ?;
141
+ let actual = Overrides :: for_crate ( & mut conn, krate) . await ?;
132
142
assert_eq ! ( actual, None ) ;
133
143
134
144
Ok ( ( ) )
135
- } ) ;
145
+ } )
146
+ . await ;
136
147
}
137
148
}
0 commit comments