Skip to content

Commit 0cd696f

Browse files
committed
migrate web::source to sqlx
1 parent 81a8398 commit 0cd696f

3 files changed

+152
-64
lines changed

.sqlx/query-73bf03e72a4795b54f878d30c30d2895a2acfa491b5925b1e576de5e6b686b8b.json

Lines changed: 23 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.sqlx/query-9f1181d51fde9d63ffafbf397e5a5af66cdd3764872cd5a3a401ffd5ca075de8.json

Lines changed: 77 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/web/source.rs

Lines changed: 52 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use super::{error::AxumResult, match_version_axum};
22
use 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
};
1212
use anyhow::Result;
1313
use axum::{extract::Path, headers::HeaderMapExt, response::IntoResponse, Extension};
14-
15-
use postgres::Client;
1614
use serde::{Deserialize, Serialize};
17-
use serde_json::Value;
1815
use std::{cmp::Ordering, sync::Arc};
1916
use 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

Comments
 (0)