Skip to content

Commit e873809

Browse files
authored
diesel: Replace all_columns with as_select() (#9768)
With `all_columns` the field order inside the structs is very important and it is impossible to skip columns. `as_select()` solves both of these issues.
1 parent 3de6c20 commit e873809

File tree

13 files changed

+37
-38
lines changed

13 files changed

+37
-38
lines changed

src/admin/render_readmes.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ pub async fn run(opts: Opts) -> anyhow::Result<()> {
100100
let versions: Vec<(Version, String)> = versions::table
101101
.inner_join(crates::table)
102102
.filter(versions::id.eq_any(version_ids_chunk))
103-
.select((versions::all_columns, crates::name))
103+
.select((Version::as_select(), crates::name))
104104
.load(conn)
105105
.context("error loading versions")?;
106106

src/controllers/krate/metadata.rs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
use crate::app::AppState;
88
use crate::controllers::helpers::pagination::PaginationOptions;
99
use crate::models::{
10-
Category, Crate, CrateCategory, CrateKeyword, CrateVersions, Keyword, RecentCrateDownloads,
11-
User, Version, VersionOwnerAction,
10+
Category, Crate, CrateCategory, CrateKeyword, CrateName, CrateVersions, Keyword,
11+
RecentCrateDownloads, User, Version, VersionOwnerAction,
1212
};
1313
use crate::schema::*;
1414
use crate::tasks::spawn_blocking;
@@ -63,7 +63,7 @@ pub async fn show(app: AppState, Path(name): Path<String>, req: Parts) -> AppRes
6363
let mut versions_and_publishers: Vec<(Version, Option<User>)> = krate
6464
.all_versions()
6565
.left_outer_join(users::table)
66-
.select((versions::all_columns, users::all_columns.nullable()))
66+
.select(<(Version, Option<User>)>::as_select())
6767
.load(conn)?;
6868
versions_and_publishers.sort_by_cached_key(|(version, _)| {
6969
Reverse(semver::Version::parse(&version.num).ok())
@@ -92,7 +92,7 @@ pub async fn show(app: AppState, Path(name): Path<String>, req: Parts) -> AppRes
9292
Some(
9393
CrateKeyword::belonging_to(&krate)
9494
.inner_join(keywords::table)
95-
.select(keywords::all_columns)
95+
.select(Keyword::as_select())
9696
.load(conn)?,
9797
)
9898
} else {
@@ -102,7 +102,7 @@ pub async fn show(app: AppState, Path(name): Path<String>, req: Parts) -> AppRes
102102
Some(
103103
CrateCategory::belonging_to(&krate)
104104
.inner_join(categories::table)
105-
.select(categories::all_columns)
105+
.select(Category::as_select())
106106
.load(conn)?,
107107
)
108108
} else {
@@ -260,15 +260,11 @@ pub async fn reverse_dependencies(
260260

261261
let version_ids: Vec<i32> = rev_deps.iter().map(|dep| dep.version_id).collect();
262262

263-
let versions_and_publishers: Vec<(Version, String, Option<User>)> = versions::table
263+
let versions_and_publishers: Vec<(Version, CrateName, Option<User>)> = versions::table
264264
.filter(versions::id.eq_any(version_ids))
265265
.inner_join(crates::table)
266266
.left_outer_join(users::table)
267-
.select((
268-
versions::all_columns,
269-
crates::name,
270-
users::all_columns.nullable(),
271-
))
267+
.select(<(Version, CrateName, Option<User>)>::as_select())
272268
.load(conn)?;
273269
let versions = versions_and_publishers
274270
.iter()
@@ -279,7 +275,7 @@ pub async fn reverse_dependencies(
279275
.into_iter()
280276
.zip(actions)
281277
.map(|((version, krate_name, published_by), actions)| {
282-
EncodableVersion::from(version, &krate_name, published_by, actions)
278+
EncodableVersion::from(version, &krate_name.name, published_by, actions)
283279
})
284280
.collect::<Vec<_>>();
285281

src/controllers/krate/versions.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ fn list_by_date(
102102
let mut query = versions::table
103103
.filter(versions::crate_id.eq(crate_id))
104104
.left_outer_join(users::table)
105-
.select((versions::all_columns, users::all_columns.nullable()))
105+
.select(<(Version, Option<User>)>::as_select())
106106
.into_boxed();
107107

108108
let mut release_tracks = None;
@@ -239,7 +239,7 @@ fn list_by_semver(
239239
for result in versions::table
240240
.filter(versions::crate_id.eq(crate_id))
241241
.left_outer_join(users::table)
242-
.select((versions::all_columns, users::all_columns.nullable()))
242+
.select(<(Version, Option<User>)>::as_select())
243243
.filter(versions::id.eq_any(ids))
244244
.load_iter::<(Version, Option<User>), DefaultLoadingMode>(conn)?
245245
{
@@ -267,7 +267,7 @@ fn list_by_semver(
267267
let mut data: Vec<(Version, Option<User>)> = versions::table
268268
.filter(versions::crate_id.eq(crate_id))
269269
.left_outer_join(users::table)
270-
.select((versions::all_columns, users::all_columns.nullable()))
270+
.select(<(Version, Option<User>)>::as_select())
271271
.load(conn)?;
272272
data.sort_by_cached_key(|(version, _)| Reverse(semver::Version::parse(&version.num).ok()));
273273
let total = data.len();

src/controllers/user/me.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use std::collections::HashMap;
1111
use crate::app::AppState;
1212
use crate::controllers::helpers::pagination::{Paginated, PaginationOptions};
1313
use crate::controllers::helpers::{ok_true, Paginate};
14+
use crate::models::krate::CrateName;
1415
use crate::models::{CrateOwner, Follow, OwnerKind, User, Version, VersionOwnerAction};
1516
use crate::schema::{crate_owners, crates, emails, follows, users, versions};
1617
use crate::tasks::spawn_blocking;
@@ -31,7 +32,7 @@ pub async fn me(app: AppState, req: Parts) -> AppResult<Json<EncodableMe>> {
3132
.find(user_id)
3233
.left_join(emails::table)
3334
.select((
34-
users::all_columns,
35+
User::as_select(),
3536
emails::verified.nullable(),
3637
emails::email.nullable(),
3738
emails::token_generated_at.nullable().is_not_null(),
@@ -77,13 +78,9 @@ pub async fn updates(app: AppState, req: Parts) -> AppResult<Json<Value>> {
7778
.left_outer_join(users::table)
7879
.filter(crates::id.eq_any(followed_crates))
7980
.order(versions::created_at.desc())
80-
.select((
81-
versions::all_columns,
82-
crates::name,
83-
users::all_columns.nullable(),
84-
))
81+
.select(<(Version, CrateName, Option<User>)>::as_select())
8582
.pages_pagination(PaginationOptions::builder().gather(&req)?);
86-
let data: Paginated<(Version, String, Option<User>)> = query.load(conn)?;
83+
let data: Paginated<(Version, CrateName, Option<User>)> = query.load(conn)?;
8784
let more = data.next_page_params().is_some();
8885
let versions = data.iter().map(|(v, ..)| v).collect::<Vec<_>>();
8986
let actions = VersionOwnerAction::for_versions(conn, &versions)?;
@@ -95,7 +92,7 @@ pub async fn updates(app: AppState, req: Parts) -> AppResult<Json<Value>> {
9592
let versions = data
9693
.into_iter()
9794
.map(|(version, crate_name, published_by, actions)| {
98-
EncodableVersion::from(version, &crate_name, published_by, actions)
95+
EncodableVersion::from(version, &crate_name.name, published_by, actions)
9996
})
10097
.collect::<Vec<_>>();
10198

src/index.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
//! index files.
44
55
use crate::models::{Crate, CrateVersions, Dependency, Version};
6-
use crate::schema::{crates, dependencies};
6+
use crate::schema::crates;
77
use anyhow::Context;
88
use crates_io_index::features::split_features;
99
use diesel::prelude::*;
@@ -68,7 +68,7 @@ pub async fn index_metadata(
6868

6969
let deps: Vec<(Dependency, String)> = Dependency::belonging_to(&versions)
7070
.inner_join(crates::table)
71-
.select((dependencies::all_columns, crates::name))
71+
.select((Dependency::as_select(), crates::name))
7272
.load(conn)
7373
.await?;
7474

src/models.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ pub use self::download::VersionDownload;
77
pub use self::email::{Email, NewEmail};
88
pub use self::follow::Follow;
99
pub use self::keyword::{CrateKeyword, Keyword};
10-
pub use self::krate::{Crate, CrateVersions, NewCrate, RecentCrateDownloads};
10+
pub use self::krate::{Crate, CrateName, CrateVersions, NewCrate, RecentCrateDownloads};
1111
pub use self::owner::{CrateOwner, Owner, OwnerKind};
1212
pub use self::rights::Rights;
1313
pub use self::team::{NewTeam, Team};

src/models/category.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::models::Crate;
55
use crate::schema::*;
66
use crate::util::diesel::Conn;
77

8-
#[derive(Clone, Identifiable, Queryable, QueryableByName, Debug)]
8+
#[derive(Clone, Identifiable, Queryable, QueryableByName, Debug, Selectable)]
99
#[diesel(table_name = categories, check_for_backend(diesel::pg::Pg))]
1010
pub struct Category {
1111
pub id: i32,

src/models/dependency.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::schema::*;
55
use crate::sql::pg_enum;
66
use crates_io_index::DependencyKind as IndexDependencyKind;
77

8-
#[derive(Identifiable, Associations, Debug, Queryable, QueryableByName)]
8+
#[derive(Identifiable, Associations, Debug, Queryable, QueryableByName, Selectable)]
99
#[diesel(
1010
table_name = dependencies,
1111
check_for_backend(diesel::pg::Pg),

src/models/keyword.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::schema::*;
66
use crate::sql::lower;
77
use crate::util::diesel::Conn;
88

9-
#[derive(Clone, Identifiable, Queryable, Debug)]
9+
#[derive(Clone, Identifiable, Queryable, Debug, Selectable)]
1010
pub struct Keyword {
1111
pub id: i32,
1212
pub keyword: String,

src/models/krate.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ pub struct RecentCrateDownloads {
3434
pub downloads: i32,
3535
}
3636

37+
#[derive(Debug, Clone, Queryable, Selectable)]
38+
#[diesel(table_name = crates, check_for_backend(diesel::pg::Pg))]
39+
pub struct CrateName {
40+
pub name: String,
41+
}
42+
3743
#[derive(Debug, Clone, Queryable, Identifiable, AsChangeset, QueryableByName, Selectable)]
3844
#[diesel(table_name = crates, check_for_backend(diesel::pg::Pg))]
3945
pub struct Crate {
@@ -338,14 +344,14 @@ impl Crate {
338344
let users = CrateOwner::by_owner_kind(OwnerKind::User)
339345
.filter(crate_owners::crate_id.eq(self.id))
340346
.inner_join(users::table)
341-
.select(users::all_columns)
347+
.select(User::as_select())
342348
.load(conn)?
343349
.into_iter()
344350
.map(Owner::User);
345351
let teams = CrateOwner::by_owner_kind(OwnerKind::Team)
346352
.filter(crate_owners::crate_id.eq(self.id))
347353
.inner_join(teams::table)
348-
.select(teams::all_columns)
354+
.select(Team::as_select())
349355
.load(conn)?
350356
.into_iter()
351357
.map(Owner::Team);

0 commit comments

Comments
 (0)