@@ -8,9 +8,8 @@ use sqlx::{Acquire, Executor, Pool, Sqlite};
8
8
use thiserror:: Error ;
9
9
10
10
use crate :: db:: Encoding ;
11
- use crate :: state:: { self , Id } ;
12
- use crate :: Installation ;
13
- use crate :: { package, State } ;
11
+ use crate :: state:: { self , Id , Selection } ;
12
+ use crate :: { Installation , State } ;
14
13
15
14
#[ derive( Debug ) ]
16
15
pub struct Database {
@@ -63,38 +62,44 @@ impl Database {
63
62
" ,
64
63
)
65
64
. bind ( id. encode ( ) ) ;
66
- let packages_query = sqlx:: query_as :: < _ , encoding:: Package > (
65
+ let selections_query = sqlx:: query_as :: < _ , encoding:: Selection > (
67
66
"
68
- SELECT package_id
69
- FROM state_packages
67
+ SELECT package_id,
68
+ explicit,
69
+ reason
70
+ FROM state_selections
70
71
WHERE state_id = ?;
71
72
" ,
72
73
)
73
74
. bind ( id. encode ( ) ) ;
74
75
75
- let ( state, package_rows ) = futures:: try_join!(
76
+ let ( state, selections_rows ) = futures:: try_join!(
76
77
state_query. fetch_one( & self . pool) ,
77
- packages_query . fetch_all( & self . pool)
78
+ selections_query . fetch_all( & self . pool)
78
79
) ?;
79
80
80
- let packages = package_rows
81
+ let selections = selections_rows
81
82
. into_iter ( )
82
- . map ( |row| row. package_id . 0 )
83
+ . map ( |row| Selection {
84
+ package : row. package_id . 0 ,
85
+ explicit : row. explicit ,
86
+ reason : row. reason ,
87
+ } )
83
88
. collect ( ) ;
84
89
85
90
Ok ( State {
86
91
id : state. id . 0 ,
87
92
summary : state. summary ,
88
93
description : state. description ,
89
- packages ,
94
+ selections ,
90
95
created : state. created ,
91
96
kind : state. kind . 0 ,
92
97
} )
93
98
}
94
99
95
100
pub async fn add (
96
101
& self ,
97
- packages : & [ package :: Id ] ,
102
+ selections : & [ Selection ] ,
98
103
summary : Option < String > ,
99
104
description : Option < String > ,
100
105
) -> Result < State , Error > {
@@ -113,18 +118,19 @@ impl Database {
113
118
. fetch_one ( transaction. acquire ( ) . await ?)
114
119
. await ?;
115
120
116
- if !packages . is_empty ( ) {
121
+ if !selections . is_empty ( ) {
117
122
transaction
118
123
. execute (
119
124
sqlx:: QueryBuilder :: new (
120
125
"
121
- INSERT INTO state_packages (state_id, package_id, reason)
126
+ INSERT INTO state_selections (state_id, package_id, explicit , reason)
122
127
" ,
123
128
)
124
- . push_values ( packages , |mut b, package | {
129
+ . push_values ( selections , |mut b, selection | {
125
130
b. push_bind ( id. 0 . encode ( ) )
126
- . push_bind ( package. encode ( ) )
127
- . push_bind ( Option :: < String > :: None ) ;
131
+ . push_bind ( selection. package . encode ( ) )
132
+ . push_bind ( selection. explicit )
133
+ . push_bind ( selection. reason . as_ref ( ) ) ;
128
134
} )
129
135
. build ( ) ,
130
136
)
@@ -202,8 +208,10 @@ mod encoding {
202
208
}
203
209
204
210
#[ derive( FromRow ) ]
205
- pub struct Package {
211
+ pub struct Selection {
206
212
pub package_id : Decoder < package:: Id > ,
213
+ pub explicit : bool ,
214
+ pub reason : Option < String > ,
207
215
}
208
216
}
209
217
@@ -214,6 +222,7 @@ mod test {
214
222
use chrono:: Utc ;
215
223
216
224
use super :: * ;
225
+ use crate :: package;
217
226
218
227
#[ tokio:: test]
219
228
async fn create_insert_select ( ) {
@@ -222,15 +231,15 @@ mod test {
222
231
. await
223
232
. unwrap ( ) ;
224
233
225
- let packages = vec ! [
226
- package:: Id :: from( "pkg a" . to_string( ) ) ,
227
- package:: Id :: from( "pkg b " . to_string( ) ) ,
228
- package:: Id :: from( "pkg c " . to_string( ) ) ,
234
+ let selections = vec ! [
235
+ Selection :: explicit ( package:: Id :: from( "pkg a" . to_string( ) ) ) ,
236
+ Selection :: explicit ( package:: Id :: from( "pkg a " . to_string( ) ) ) ,
237
+ Selection :: explicit ( package:: Id :: from( "pkg a " . to_string( ) ) ) ,
229
238
] ;
230
239
231
240
let state = database
232
241
. add (
233
- & packages ,
242
+ & selections ,
234
243
Some ( "test" . to_string ( ) ) ,
235
244
Some ( "test" . to_string ( ) ) ,
236
245
)
@@ -248,6 +257,6 @@ mod test {
248
257
assert_eq ! ( state. summary. as_deref( ) , Some ( "test" ) ) ;
249
258
assert_eq ! ( state. description. as_deref( ) , Some ( "test" ) ) ;
250
259
251
- assert_eq ! ( state. packages , packages ) ;
260
+ assert_eq ! ( state. selections , selections ) ;
252
261
}
253
262
}
0 commit comments