@@ -2,7 +2,7 @@ use super::{error::AxumResult, match_version_axum};
2
2
use crate :: {
3
3
db:: Pool ,
4
4
impl_axum_webpage,
5
- utils:: { get_correct_docsrs_style_file, spawn_blocking } ,
5
+ utils:: get_correct_docsrs_style_file,
6
6
web:: {
7
7
cache:: CachePolicy , error:: AxumNope , file:: File as DbFile , headers:: CanonicalUrl ,
8
8
MatchSemver , MetaData ,
@@ -11,10 +11,7 @@ use crate::{
11
11
} ;
12
12
use anyhow:: Result ;
13
13
use axum:: { extract:: Path , headers:: HeaderMapExt , response:: IntoResponse , Extension } ;
14
-
15
- use postgres:: Client ;
16
14
use serde:: { Deserialize , Serialize } ;
17
- use serde_json:: Value ;
18
15
use std:: { cmp:: Ordering , sync:: Arc } ;
19
16
use tracing:: instrument;
20
17
@@ -68,34 +65,38 @@ impl FileList {
68
65
/// it will return list of files (and dirs) for root directory. req_path must be a
69
66
/// directory or empty for root directory.
70
67
#[ instrument( skip( conn) ) ]
71
- fn from_path (
72
- conn : & mut Client ,
68
+ async fn from_path (
69
+ conn : & mut sqlx :: PgConnection ,
73
70
name : & str ,
74
71
version : & str ,
75
72
version_or_latest : & str ,
76
73
folder : & str ,
77
74
) -> Result < Option < FileList > > {
78
- let row = match conn . query_opt (
75
+ let row = match sqlx :: query! (
79
76
"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
+ {
94
95
Some ( row) => row,
95
96
None => return Ok ( None ) ,
96
97
} ;
97
98
98
- let files = if let Some ( files) = row. try_get :: < _ , Option < Value > > ( 5 ) ? {
99
+ let files = if let Some ( files) = row. files {
99
100
files
100
101
} else {
101
102
return Ok ( None ) ;
@@ -144,16 +145,16 @@ impl FileList {
144
145
145
146
Ok ( Some ( FileList {
146
147
metadata : MetaData {
147
- name : row. get ( 0 ) ,
148
- version : row. get ( 1 ) ,
148
+ name : row. name ,
149
+ version : row. version ,
149
150
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 ) ?,
157
158
} ,
158
159
files : file_list,
159
160
} ) )
@@ -203,6 +204,8 @@ pub(crate) async fn source_browser_handler(
203
204
Extension ( storage) : Extension < Arc < AsyncStorage > > ,
204
205
Extension ( pool) : Extension < Pool > ,
205
206
) -> AxumResult < impl IntoResponse > {
207
+ let mut conn = pool. get_async ( ) . await ?;
208
+
206
209
let v = match_version_axum ( & pool, & name, Some ( & version) ) . await ?;
207
210
208
211
if let Some ( new_name) = & v. corrected_name {
@@ -222,25 +225,17 @@ pub(crate) async fn source_browser_handler(
222
225
}
223
226
} ;
224
227
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)
244
239
. await ?;
245
240
246
241
// try to get actual file first
@@ -289,20 +284,13 @@ pub(crate) async fn source_browser_handler(
289
284
""
290
285
} ;
291
286
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
+ )
306
294
. await ?
307
295
. ok_or ( AxumNope :: ResourceNotFound ) ?;
308
296
0 commit comments