11use crate :: schema:: { default_versions, versions} ;
22use crate :: sql:: SemverVersion ;
3- use crate :: util:: diesel:: prelude:: * ;
4- use crate :: util:: diesel:: Conn ;
5- use diesel_async:: AsyncPgConnection ;
3+ use diesel:: prelude:: * ;
4+ use diesel_async:: { AsyncPgConnection , RunQueryDsl } ;
65
76/// A subset of the columns of the `versions` table.
87///
@@ -57,13 +56,11 @@ impl Ord for Version {
5756///
5857/// The default version is then written to the `default_versions` table.
5958#[ instrument( skip( conn) ) ]
60- pub async fn async_update_default_version (
59+ pub async fn update_default_version (
6160 crate_id : i32 ,
6261 conn : & mut AsyncPgConnection ,
6362) -> QueryResult < ( ) > {
64- use diesel_async:: RunQueryDsl ;
65-
66- let default_version = async_calculate_default_version ( crate_id, conn) . await ?;
63+ let default_version = calculate_default_version ( crate_id, conn) . await ?;
6764
6865 debug ! (
6966 "Updating default version to {} (id: {})…" ,
@@ -84,49 +81,13 @@ pub async fn async_update_default_version(
8481 Ok ( ( ) )
8582}
8683
87- /// Updates the `default_versions` table entry for the specified crate.
88- ///
89- /// This function first loads all versions of the crate from the database,
90- /// then determines the default version based on the following criteria:
91- ///
92- /// 1. The highest non-prerelease version that is not yanked.
93- /// 2. The highest non-yanked version.
94- /// 3. The highest version.
95- ///
96- /// The default version is then written to the `default_versions` table.
97- #[ instrument( skip( conn) ) ]
98- pub fn update_default_version ( crate_id : i32 , conn : & mut impl Conn ) -> QueryResult < ( ) > {
99- use diesel:: RunQueryDsl ;
100-
101- let default_version = calculate_default_version ( crate_id, conn) ?;
102-
103- debug ! (
104- "Updating default version to {} (id: {})…" ,
105- default_version. num, default_version. id
106- ) ;
107-
108- diesel:: insert_into ( default_versions:: table)
109- . values ( (
110- default_versions:: crate_id. eq ( crate_id) ,
111- default_versions:: version_id. eq ( default_version. id ) ,
112- ) )
113- . on_conflict ( default_versions:: crate_id)
114- . do_update ( )
115- . set ( default_versions:: version_id. eq ( default_version. id ) )
116- . execute ( conn) ?;
117-
118- Ok ( ( ) )
119- }
120-
12184/// Verifies that the default version for the specified crate is up-to-date.
12285#[ instrument( skip( conn) ) ]
123- pub async fn async_verify_default_version (
86+ pub async fn verify_default_version (
12487 crate_id : i32 ,
12588 conn : & mut AsyncPgConnection ,
12689) -> QueryResult < ( ) > {
127- use diesel_async:: RunQueryDsl ;
128-
129- let calculated = async_calculate_default_version ( crate_id, conn) . await ?;
90+ let calculated = calculate_default_version ( crate_id, conn) . await ?;
13091
13192 let saved = default_versions:: table
13293 . select ( default_versions:: version_id)
@@ -154,44 +115,11 @@ pub async fn async_verify_default_version(
154115 Ok ( ( ) )
155116}
156117
157- /// Verifies that the default version for the specified crate is up-to-date.
158- #[ instrument( skip( conn) ) ]
159- pub fn verify_default_version ( crate_id : i32 , conn : & mut impl Conn ) -> QueryResult < ( ) > {
160- use diesel:: RunQueryDsl ;
161-
162- let calculated = calculate_default_version ( crate_id, conn) ?;
163-
164- let saved = default_versions:: table
165- . select ( default_versions:: version_id)
166- . filter ( default_versions:: crate_id. eq ( crate_id) )
167- . first :: < i32 > ( conn)
168- . optional ( ) ?;
169-
170- if let Some ( saved) = saved {
171- if saved == calculated. id {
172- debug ! ( "Default version for crate {crate_id} is up to date" ) ;
173- } else {
174- warn ! (
175- "Default version for crate {crate_id} is outdated (expected: {saved}, actual: {})" ,
176- calculated. id,
177- ) ;
178- }
179- } else {
180- warn ! (
181- "Default version for crate {crate_id} is missing (expected: {})" ,
182- calculated. id
183- ) ;
184- }
185-
186- Ok ( ( ) )
187- }
188-
189- async fn async_calculate_default_version (
118+ async fn calculate_default_version (
190119 crate_id : i32 ,
191120 conn : & mut AsyncPgConnection ,
192121) -> QueryResult < Version > {
193122 use diesel:: result:: Error :: NotFound ;
194- use diesel_async:: RunQueryDsl ;
195123
196124 debug ! ( "Loading all versions for the crate…" ) ;
197125 let versions = versions:: table
@@ -205,21 +133,6 @@ async fn async_calculate_default_version(
205133 versions. into_iter ( ) . max ( ) . ok_or ( NotFound )
206134}
207135
208- fn calculate_default_version ( crate_id : i32 , conn : & mut impl Conn ) -> QueryResult < Version > {
209- use diesel:: result:: Error :: NotFound ;
210- use diesel:: RunQueryDsl ;
211-
212- debug ! ( "Loading all versions for the crate…" ) ;
213- let versions = versions:: table
214- . filter ( versions:: crate_id. eq ( crate_id) )
215- . select ( Version :: as_returning ( ) )
216- . load :: < Version > ( conn) ?;
217-
218- debug ! ( "Found {} versions" , versions. len( ) ) ;
219-
220- versions. into_iter ( ) . max ( ) . ok_or ( NotFound )
221- }
222-
223136#[ cfg( test) ]
224137mod tests {
225138 use super :: * ;
@@ -331,19 +244,16 @@ mod tests {
331244 buf
332245 }
333246
334- fn create_crate ( name : & str , conn : & mut impl Conn ) -> i32 {
335- use diesel:: RunQueryDsl ;
336-
247+ async fn create_crate ( name : & str , conn : & mut AsyncPgConnection ) -> i32 {
337248 diesel:: insert_into ( crates:: table)
338249 . values ( crates:: name. eq ( name) )
339250 . returning ( crates:: id)
340251 . get_result ( conn)
252+ . await
341253 . unwrap ( )
342254 }
343255
344- fn create_version ( crate_id : i32 , num : & str , conn : & mut impl Conn ) {
345- use diesel:: RunQueryDsl ;
346-
256+ async fn create_version ( crate_id : i32 , num : & str , conn : & mut AsyncPgConnection ) {
347257 diesel:: insert_into ( versions:: table)
348258 . values ( (
349259 versions:: crate_id. eq ( crate_id) ,
@@ -353,36 +263,36 @@ mod tests {
353263 versions:: crate_size. eq ( 0 ) ,
354264 ) )
355265 . execute ( conn)
266+ . await
356267 . unwrap ( ) ;
357268 }
358269
359- fn get_default_version ( crate_id : i32 , conn : & mut impl Conn ) -> String {
360- use diesel:: RunQueryDsl ;
361-
270+ async fn get_default_version ( crate_id : i32 , conn : & mut AsyncPgConnection ) -> String {
362271 default_versions:: table
363272 . inner_join ( versions:: table)
364273 . select ( versions:: num)
365274 . filter ( default_versions:: crate_id. eq ( crate_id) )
366275 . first ( conn)
276+ . await
367277 . unwrap ( )
368278 }
369279
370- #[ test]
371- fn test_update_default_version ( ) {
280+ #[ tokio :: test]
281+ async fn test_update_default_version ( ) {
372282 let test_db = TestDatabase :: new ( ) ;
373- let conn = & mut test_db. connect ( ) ;
283+ let conn = & mut test_db. async_connect ( ) . await ;
374284
375- let crate_id = create_crate ( "foo" , conn) ;
376- create_version ( crate_id, "1.0.0" , conn) ;
285+ let crate_id = create_crate ( "foo" , conn) . await ;
286+ create_version ( crate_id, "1.0.0" , conn) . await ;
377287
378- update_default_version ( crate_id, conn) . unwrap ( ) ;
379- assert_eq ! ( get_default_version( crate_id, conn) , "1.0.0" ) ;
288+ update_default_version ( crate_id, conn) . await . unwrap ( ) ;
289+ assert_eq ! ( get_default_version( crate_id, conn) . await , "1.0.0" ) ;
380290
381- create_version ( crate_id, "1.1.0" , conn) ;
382- create_version ( crate_id, "1.0.1" , conn) ;
383- assert_eq ! ( get_default_version( crate_id, conn) , "1.0.0" ) ;
291+ create_version ( crate_id, "1.1.0" , conn) . await ;
292+ create_version ( crate_id, "1.0.1" , conn) . await ;
293+ assert_eq ! ( get_default_version( crate_id, conn) . await , "1.0.0" ) ;
384294
385- update_default_version ( crate_id, conn) . unwrap ( ) ;
386- assert_eq ! ( get_default_version( crate_id, conn) , "1.1.0" ) ;
295+ update_default_version ( crate_id, conn) . await . unwrap ( ) ;
296+ assert_eq ! ( get_default_version( crate_id, conn) . await , "1.1.0" ) ;
387297 }
388298}
0 commit comments