From 3baecb48aa5fcd83b3bba67e8c973f4bca98c46f Mon Sep 17 00:00:00 2001 From: Denis Cornehl Date: Sun, 10 Mar 2024 05:07:56 +0100 Subject: [PATCH] don't refetch releases lists in platform & versions ajax partials --- ...8e1276f7f814f22b830c46d6b77edb209a033.json | 28 ++++++++++ ...10045c8cbcf443f6bfe78598bb75f05ecb249.json | 41 -------------- ...695c7a88206171881f2d9951eb2f40125b244.json | 28 ---------- ...1d0839fd63d13b08546c1506e7163bd363c19.json | 35 ------------ ...218a0fd4b7bbe2b229350523a1aa69a4d731f.json | 22 ++++++++ src/web/crate_details.rs | 55 +++++++------------ src/web/mod.rs | 6 +- 7 files changed, 74 insertions(+), 141 deletions(-) create mode 100644 .sqlx/query-0011936b31678ee644dff3f5f8d8e1276f7f814f22b830c46d6b77edb209a033.json delete mode 100644 .sqlx/query-0ce07fe1eea10dafed3c3feb36010045c8cbcf443f6bfe78598bb75f05ecb249.json delete mode 100644 .sqlx/query-0f51891df12ccdbecbdffef1588695c7a88206171881f2d9951eb2f40125b244.json delete mode 100644 .sqlx/query-3f0fb7b26fb494e04dab61a8a831d0839fd63d13b08546c1506e7163bd363c19.json create mode 100644 .sqlx/query-9a3bcf29ba086cd26102227e024218a0fd4b7bbe2b229350523a1aa69a4d731f.json diff --git a/.sqlx/query-0011936b31678ee644dff3f5f8d8e1276f7f814f22b830c46d6b77edb209a033.json b/.sqlx/query-0011936b31678ee644dff3f5f8d8e1276f7f814f22b830c46d6b77edb209a033.json new file mode 100644 index 000000000..a578ca3f8 --- /dev/null +++ b/.sqlx/query-0011936b31678ee644dff3f5f8d8e1276f7f814f22b830c46d6b77edb209a033.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n releases.default_target,\n releases.doc_targets\n FROM releases\n WHERE releases.id = $1;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "default_target", + "type_info": "Varchar" + }, + { + "ordinal": 1, + "name": "doc_targets", + "type_info": "Json" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false + ] + }, + "hash": "0011936b31678ee644dff3f5f8d8e1276f7f814f22b830c46d6b77edb209a033" +} diff --git a/.sqlx/query-0ce07fe1eea10dafed3c3feb36010045c8cbcf443f6bfe78598bb75f05ecb249.json b/.sqlx/query-0ce07fe1eea10dafed3c3feb36010045c8cbcf443f6bfe78598bb75f05ecb249.json deleted file mode 100644 index 155502d5b..000000000 --- a/.sqlx/query-0ce07fe1eea10dafed3c3feb36010045c8cbcf443f6bfe78598bb75f05ecb249.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n crates.id,\n crates.name,\n releases.default_target,\n releases.doc_targets\n FROM releases\n INNER JOIN crates ON releases.crate_id = crates.id\n WHERE crates.name = $1 AND releases.version = $2;", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int4" - }, - { - "ordinal": 1, - "name": "name", - "type_info": "Varchar" - }, - { - "ordinal": 2, - "name": "default_target", - "type_info": "Varchar" - }, - { - "ordinal": 3, - "name": "doc_targets", - "type_info": "Json" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - false, - false, - false, - false - ] - }, - "hash": "0ce07fe1eea10dafed3c3feb36010045c8cbcf443f6bfe78598bb75f05ecb249" -} diff --git a/.sqlx/query-0f51891df12ccdbecbdffef1588695c7a88206171881f2d9951eb2f40125b244.json b/.sqlx/query-0f51891df12ccdbecbdffef1588695c7a88206171881f2d9951eb2f40125b244.json deleted file mode 100644 index f7341988f..000000000 --- a/.sqlx/query-0f51891df12ccdbecbdffef1588695c7a88206171881f2d9951eb2f40125b244.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n target_name,\n rustdoc_status\n FROM releases\n WHERE releases.id = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "target_name", - "type_info": "Varchar" - }, - { - "ordinal": 1, - "name": "rustdoc_status", - "type_info": "Bool" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - false, - false - ] - }, - "hash": "0f51891df12ccdbecbdffef1588695c7a88206171881f2d9951eb2f40125b244" -} diff --git a/.sqlx/query-3f0fb7b26fb494e04dab61a8a831d0839fd63d13b08546c1506e7163bd363c19.json b/.sqlx/query-3f0fb7b26fb494e04dab61a8a831d0839fd63d13b08546c1506e7163bd363c19.json deleted file mode 100644 index 430c9b09a..000000000 --- a/.sqlx/query-3f0fb7b26fb494e04dab61a8a831d0839fd63d13b08546c1506e7163bd363c19.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT\n crates.id AS crate_id,\n releases.doc_targets,\n releases.target_name\n FROM crates\n INNER JOIN releases on crates.id = releases.crate_id\n WHERE crates.name = $1 and releases.version = $2;", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "crate_id", - "type_info": "Int4" - }, - { - "ordinal": 1, - "name": "doc_targets", - "type_info": "Json" - }, - { - "ordinal": 2, - "name": "target_name", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - }, - "nullable": [ - false, - false, - false - ] - }, - "hash": "3f0fb7b26fb494e04dab61a8a831d0839fd63d13b08546c1506e7163bd363c19" -} diff --git a/.sqlx/query-9a3bcf29ba086cd26102227e024218a0fd4b7bbe2b229350523a1aa69a4d731f.json b/.sqlx/query-9a3bcf29ba086cd26102227e024218a0fd4b7bbe2b229350523a1aa69a4d731f.json new file mode 100644 index 000000000..584d4ce86 --- /dev/null +++ b/.sqlx/query-9a3bcf29ba086cd26102227e024218a0fd4b7bbe2b229350523a1aa69a4d731f.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT\n releases.doc_targets\n FROM releases\n WHERE releases.id = $1;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "doc_targets", + "type_info": "Json" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false + ] + }, + "hash": "9a3bcf29ba086cd26102227e024218a0fd4b7bbe2b229350523a1aa69a4d731f" +} diff --git a/src/web/crate_details.rs b/src/web/crate_details.rs index 5d71671ef..5bd68ba7b 100644 --- a/src/web/crate_details.rs +++ b/src/web/crate_details.rs @@ -461,29 +461,21 @@ pub(crate) async fn get_all_releases( let req_path: String = params.path.clone().unwrap_or_default(); let req_path: Vec<&str> = req_path.split('/').collect(); - let version = match_version(&mut conn, ¶ms.name, ¶ms.version) + let matched_release = match_version(&mut conn, ¶ms.name, ¶ms.version) .await? - .into_canonical_req_version_or_else(|_| AxumNope::VersionNotFound)? - .into_version(); + .into_canonical_req_version_or_else(|_| AxumNope::VersionNotFound)?; let row = sqlx::query!( "SELECT - crates.id AS crate_id, - releases.doc_targets, - releases.target_name - FROM crates - INNER JOIN releases on crates.id = releases.crate_id - WHERE crates.name = $1 and releases.version = $2;", - params.name, - &version.to_string(), + releases.doc_targets + FROM releases + WHERE releases.id = $1;", + matched_release.id(), ) .fetch_optional(&mut *conn) .await? .ok_or(AxumNope::CrateNotFound)?; - // get releases, sorted by semver - let releases: Vec = releases_for_crate(&mut conn, row.crate_id).await?; - let doc_targets = MetaData::parse_doc_targets(row.doc_targets); let inner; @@ -505,9 +497,9 @@ pub(crate) async fn get_all_releases( (target, inner.trim_end_matches('/')) }; let inner_path = if inner_path.is_empty() { - format!("{}/index.html", row.target_name) + format!("{}/index.html", matched_release.target_name()) } else { - format!("{}/{inner_path}", row.target_name) + format!("{}/{inner_path}", matched_release.target_name()) }; let target = if target.is_empty() { @@ -517,7 +509,7 @@ pub(crate) async fn get_all_releases( }; let res = ReleaseList { - releases, + releases: matched_release.all_releases, target, inner_path, crate_name: params.name, @@ -556,7 +548,7 @@ pub(crate) async fn get_all_platforms_inner( let req_path: String = params.path.unwrap_or_default(); let req_path: Vec<&str> = req_path.split('/').collect(); - let version = match_version(&mut conn, ¶ms.name, ¶ms.version) + let matched_release = match_version(&mut conn, ¶ms.name, ¶ms.version) .await? .into_exactly_named_or_else(|corrected_name, req_version| { AxumNope::Redirect( @@ -579,33 +571,24 @@ pub(crate) async fn get_all_platforms_inner( )), CachePolicy::ForeverInCdn, ) - })? - .into_version(); + })?; let krate = sqlx::query!( "SELECT - crates.id, - crates.name, releases.default_target, releases.doc_targets FROM releases - INNER JOIN crates ON releases.crate_id = crates.id - WHERE crates.name = $1 AND releases.version = $2;", - params.name, - version.to_string(), + WHERE releases.id = $1;", + matched_release.id(), ) .fetch_optional(&mut *conn) .await? .ok_or(AxumNope::CrateNotFound)?; - let releases = releases_for_crate(&mut conn, krate.id).await?; - let doc_targets = MetaData::parse_doc_targets(krate.doc_targets); - let latest_release = releases - .iter() - .find(|release| release.version.pre.is_empty() && !release.yanked) - .unwrap_or(&releases[0]); + let latest_release = latest_release(&matched_release.all_releases) + .expect("we couldn't end up here without releases"); // The path within this crate version's rustdoc output let inner; @@ -627,9 +610,9 @@ pub(crate) async fn get_all_platforms_inner( (target, inner.trim_end_matches('/')) }; let inner_path = if inner_path.is_empty() { - format!("{}/index.html", krate.name) + format!("{}/index.html", matched_release.target_name()) } else { - format!("{}/{inner_path}", krate.name) + format!("{}/{inner_path}", matched_release.target_name()) }; let current_target = if latest_release.build_status { @@ -644,8 +627,8 @@ pub(crate) async fn get_all_platforms_inner( let res = PlatformList { metadata: ShortMetadata { - name: krate.name, - version: version.clone(), + name: params.name, + version: matched_release.version().clone(), req_version: params.version.clone(), doc_targets, }, diff --git a/src/web/mod.rs b/src/web/mod.rs index 0e94290b5..0b1fc109f 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -127,7 +127,7 @@ pub(crate) struct MatchedRelease { pub release: crate_details::Release, /// all releases since we have them anyways and so we can pass them to CrateDetails - all_releases: Vec, + pub(crate) all_releases: Vec, } impl MatchedRelease { @@ -210,6 +210,10 @@ impl MatchedRelease { &self.release.version } + fn id(&self) -> i32 { + self.release.id + } + fn rustdoc_status(&self) -> bool { self.release.rustdoc_status }