@@ -2,7 +2,7 @@ use super::{error::AxumResult, match_version_axum};
22use crate :: {
33 db:: Pool ,
44 impl_axum_webpage,
5- utils:: { get_correct_docsrs_style_file, spawn_blocking } ,
5+ utils:: get_correct_docsrs_style_file,
66 web:: {
77 cache:: CachePolicy , error:: AxumNope , file:: File as DbFile , headers:: CanonicalUrl ,
88 MatchSemver , MetaData ,
@@ -11,10 +11,7 @@ use crate::{
1111} ;
1212use anyhow:: Result ;
1313use axum:: { extract:: Path , headers:: HeaderMapExt , response:: IntoResponse , Extension } ;
14-
15- use postgres:: Client ;
1614use serde:: { Deserialize , Serialize } ;
17- use serde_json:: Value ;
1815use std:: { cmp:: Ordering , sync:: Arc } ;
1916use tracing:: instrument;
2017
@@ -68,34 +65,38 @@ impl FileList {
6865 /// it will return list of files (and dirs) for root directory. req_path must be a
6966 /// directory or empty for root directory.
7067 #[ instrument( skip( conn) ) ]
71- fn from_path (
72- conn : & mut Client ,
68+ async fn from_path (
69+ conn : & mut sqlx :: PgConnection ,
7370 name : & str ,
7471 version : & str ,
7572 version_or_latest : & str ,
7673 folder : & str ,
7774 ) -> Result < Option < FileList > > {
78- let row = match conn . query_opt (
75+ let row = match sqlx :: query! (
7976 "SELECT crates.name,
80- releases.version,
81- releases.description,
82- releases.target_name,
83- releases.rustdoc_status,
84- releases.files,
85- releases.default_target,
86- releases.doc_targets,
87- releases.yanked,
88- releases.doc_rustc_version
89- FROM releases
90- LEFT OUTER JOIN crates ON crates.id = releases.crate_id
91- WHERE crates.name = $1 AND releases.version = $2" ,
92- & [ & name, & version] ,
93- ) ? {
77+ releases.version,
78+ releases.description,
79+ releases.target_name,
80+ releases.rustdoc_status,
81+ releases.files,
82+ releases.default_target,
83+ releases.doc_targets,
84+ releases.yanked,
85+ releases.doc_rustc_version
86+ FROM releases
87+ INNER JOIN crates ON crates.id = releases.crate_id
88+ WHERE crates.name = $1 AND releases.version = $2" ,
89+ name,
90+ version,
91+ )
92+ . fetch_optional ( & mut * conn)
93+ . await ?
94+ {
9495 Some ( row) => row,
9596 None => return Ok ( None ) ,
9697 } ;
9798
98- let files = if let Some ( files) = row. try_get :: < _ , Option < Value > > ( 5 ) ? {
99+ let files = if let Some ( files) = row. files {
99100 files
100101 } else {
101102 return Ok ( None ) ;
@@ -144,16 +145,16 @@ impl FileList {
144145
145146 Ok ( Some ( FileList {
146147 metadata : MetaData {
147- name : row. get ( 0 ) ,
148- version : row. get ( 1 ) ,
148+ name : row. name ,
149+ version : row. version ,
149150 version_or_latest : version_or_latest. to_string ( ) ,
150- description : row. get ( 2 ) ,
151- target_name : row. get ( 3 ) ,
152- rustdoc_status : row. get ( 4 ) ,
153- default_target : row. get ( 6 ) ,
154- doc_targets : MetaData :: parse_doc_targets ( row. get ( 7 ) ) ,
155- yanked : row. get ( 8 ) ,
156- rustdoc_css_file : get_correct_docsrs_style_file ( row. get ( 9 ) ) ?,
151+ description : row. description ,
152+ target_name : Some ( row. target_name ) ,
153+ rustdoc_status : row. rustdoc_status ,
154+ default_target : row. default_target ,
155+ doc_targets : MetaData :: parse_doc_targets ( row. doc_targets ) ,
156+ yanked : row. yanked ,
157+ rustdoc_css_file : get_correct_docsrs_style_file ( & row. doc_rustc_version ) ?,
157158 } ,
158159 files : file_list,
159160 } ) )
@@ -203,6 +204,8 @@ pub(crate) async fn source_browser_handler(
203204 Extension ( storage) : Extension < Arc < AsyncStorage > > ,
204205 Extension ( pool) : Extension < Pool > ,
205206) -> AxumResult < impl IntoResponse > {
207+ let mut conn = pool. get_async ( ) . await ?;
208+
206209 let v = match_version_axum ( & pool, & name, Some ( & version) ) . await ?;
207210
208211 if let Some ( new_name) = & v. corrected_name {
@@ -222,25 +225,17 @@ pub(crate) async fn source_browser_handler(
222225 }
223226 } ;
224227
225- let archive_storage = spawn_blocking ( {
226- let pool = pool. clone ( ) ;
227- let name = name. clone ( ) ;
228- let version = version. clone ( ) ;
229- move || {
230- let mut conn = pool. get ( ) ?;
231- Ok ( conn
232- . query_one (
233- "SELECT archive_storage
234- FROM releases
235- INNER JOIN crates ON releases.crate_id = crates.id
236- WHERE
237- name = $1 AND
238- version = $2" ,
239- & [ & name, & version] ,
240- ) ?
241- . get :: < _ , bool > ( 0 ) )
242- }
243- } )
228+ let archive_storage = sqlx:: query_scalar!(
229+ "SELECT archive_storage
230+ FROM releases
231+ INNER JOIN crates ON releases.crate_id = crates.id
232+ WHERE
233+ name = $1 AND
234+ version = $2" ,
235+ name,
236+ version
237+ )
238+ . fetch_one ( & mut * conn)
244239 . await ?;
245240
246241 // try to get actual file first
@@ -289,20 +284,13 @@ pub(crate) async fn source_browser_handler(
289284 ""
290285 } ;
291286
292- let file_list = spawn_blocking ( {
293- let name = name. clone ( ) ;
294- let current_folder = current_folder. to_string ( ) ;
295- move || {
296- let mut conn = pool. get ( ) ?;
297- FileList :: from_path (
298- & mut conn,
299- & name,
300- & version,
301- & version_or_latest,
302- & current_folder,
303- )
304- }
305- } )
287+ let file_list = FileList :: from_path (
288+ & mut conn,
289+ & name,
290+ & version,
291+ & version_or_latest,
292+ current_folder,
293+ )
306294 . await ?
307295 . ok_or ( AxumNope :: ResourceNotFound ) ?;
308296
0 commit comments