44
55use crate :: models:: { Crate , CrateVersions , Dependency , Version } ;
66use crate :: schema:: { crates, dependencies} ;
7- use crate :: util:: diesel:: Conn ;
87use anyhow:: Context ;
98use crates_io_index:: features:: split_features;
109use diesel:: prelude:: * ;
10+ use diesel_async:: { AsyncPgConnection , RunQueryDsl } ;
1111use sentry:: Level ;
1212
1313#[ instrument( skip_all, fields( krate. name = ?name) ) ]
14- pub fn get_index_data ( name : & str , conn : & mut impl Conn ) -> anyhow:: Result < Option < String > > {
14+ pub async fn get_index_data (
15+ name : & str ,
16+ conn : & mut AsyncPgConnection ,
17+ ) -> anyhow:: Result < Option < String > > {
1518 debug ! ( "Looking up crate by name" ) ;
16- let Some ( krate) : Option < Crate > = Crate :: by_exact_name ( name) . first ( conn) . optional ( ) ? else {
19+ let krate = crates:: table
20+ . select ( Crate :: as_select ( ) )
21+ . filter ( crates:: name. eq ( name) )
22+ . first :: < Crate > ( conn)
23+ . await
24+ . optional ( ) ;
25+
26+ let Some ( krate) = krate? else {
1727 return Ok ( None ) ;
1828 } ;
1929
2030 debug ! ( "Gathering remaining index data" ) ;
21- let crates = index_metadata ( & krate, conn) . context ( "Failed to gather index metadata" ) ?;
31+ let crates = index_metadata ( & krate, conn)
32+ . await
33+ . context ( "Failed to gather index metadata" ) ?;
2234
2335 // This can sometimes happen when we delete versions upon owner request
2436 // but don't realize that the crate is now left with no versions at all.
@@ -43,11 +55,11 @@ pub fn get_index_data(name: &str, conn: &mut impl Conn) -> anyhow::Result<Option
4355}
4456
4557/// Gather all the necessary data to write an index metadata file
46- pub fn index_metadata (
58+ pub async fn index_metadata (
4759 krate : & Crate ,
48- conn : & mut impl Conn ,
60+ conn : & mut AsyncPgConnection ,
4961) -> QueryResult < Vec < crates_io_index:: Crate > > {
50- let mut versions: Vec < Version > = krate. all_versions ( ) . load ( conn) ?;
62+ let mut versions: Vec < Version > = krate. all_versions ( ) . load ( conn) . await ?;
5163
5264 // We sort by `created_at` by default, but since tests run within a
5365 // single database transaction the versions will all have the same
@@ -57,7 +69,8 @@ pub fn index_metadata(
5769 let deps: Vec < ( Dependency , String ) > = Dependency :: belonging_to ( & versions)
5870 . inner_join ( crates:: table)
5971 . select ( ( dependencies:: all_columns, crates:: name) )
60- . load ( conn) ?;
72+ . load ( conn)
73+ . await ?;
6174
6275 let deps = deps. grouped_by ( & versions) ;
6376
@@ -127,12 +140,14 @@ mod tests {
127140 use crate :: tests:: builders:: { CrateBuilder , VersionBuilder } ;
128141 use chrono:: { Days , Utc } ;
129142 use crates_io_test_db:: TestDatabase ;
143+ use diesel_async:: AsyncConnection ;
130144 use insta:: assert_json_snapshot;
131145
132- #[ test]
133- fn test_index_metadata ( ) {
146+ #[ tokio :: test]
147+ async fn test_index_metadata ( ) {
134148 let test_db = TestDatabase :: new ( ) ;
135149 let mut conn = test_db. connect ( ) ;
150+ let mut async_conn = AsyncPgConnection :: establish ( test_db. url ( ) ) . await . unwrap ( ) ;
136151
137152 let user_id = diesel:: insert_into ( users:: table)
138153 . values ( (
@@ -142,7 +157,8 @@ mod tests {
142157 users:: gh_access_token. eq ( "some random token" ) ,
143158 ) )
144159 . returning ( users:: id)
145- . get_result :: < i32 > ( & mut conn)
160+ . get_result :: < i32 > ( & mut async_conn)
161+ . await
146162 . unwrap ( ) ;
147163
148164 let created_at_1 = Utc :: now ( )
@@ -159,7 +175,7 @@ mod tests {
159175 . version ( VersionBuilder :: new ( "0.1.0" ) )
160176 . expect_build ( & mut conn) ;
161177
162- let metadata = index_metadata ( & fooo, & mut conn ) . unwrap ( ) ;
178+ let metadata = index_metadata ( & fooo, & mut async_conn ) . await . unwrap ( ) ;
163179 assert_json_snapshot ! ( metadata) ;
164180
165181 let bar = CrateBuilder :: new ( "bar" , user_id)
@@ -177,7 +193,7 @@ mod tests {
177193 . version ( VersionBuilder :: new ( "1.0.1" ) . checksum ( "0123456789abcdef" ) )
178194 . expect_build ( & mut conn) ;
179195
180- let metadata = index_metadata ( & bar, & mut conn ) . unwrap ( ) ;
196+ let metadata = index_metadata ( & bar, & mut async_conn ) . await . unwrap ( ) ;
181197 assert_json_snapshot ! ( metadata) ;
182198 }
183199}
0 commit comments