Skip to content

Commit 9888fdf

Browse files
committed
Extract sql module with all custom sql_function!() calls
1 parent b070d14 commit 9888fdf

File tree

11 files changed

+35
-32
lines changed

11 files changed

+35
-32
lines changed

src/bin/monitor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ fn check_stalled_update_downloads(conn: &PgConnection) -> Result<()> {
108108

109109
/// Check for known spam patterns
110110
fn check_spam_attack(conn: &PgConnection) -> Result<()> {
111-
use cargo_registry::models::krate::canon_crate_name;
111+
use cargo_registry::sql::canon_crate_name;
112112
use diesel::dsl::*;
113113

114114
const EVENT_KEY: &str = "spam_attack";

src/controllers/krate/downloads.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,9 @@ use crate::controllers::frontend_prelude::*;
99

1010
use crate::models::{Crate, CrateVersions, Version, VersionDownload};
1111
use crate::schema::version_downloads;
12+
use crate::sql::to_char;
1213
use crate::views::EncodableVersionDownload;
1314

14-
use crate::models::krate::to_char;
15-
1615
/// Handles the `GET /crates/:crate_id/downloads` route.
1716
pub fn downloads(req: &mut dyn RequestExt) -> EndpointResult {
1817
use diesel::dsl::*;

src/controllers/krate/search.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//! Endpoint for searching and discovery functionality
22
33
use diesel::dsl::*;
4+
use diesel::sql_types::Array;
45
use diesel_full_text_search::*;
56
use indexmap::IndexMap;
67

@@ -14,7 +15,8 @@ use crate::util::errors::{bad_request, ChainError};
1415
use crate::views::EncodableCrate;
1516

1617
use crate::controllers::helpers::pagination::{Page, Paginated, PaginationOptions};
17-
use crate::models::krate::{canon_crate_name, ALL_COLUMNS};
18+
use crate::models::krate::ALL_COLUMNS;
19+
use crate::sql::{array_agg, canon_crate_name, lower};
1820

1921
/// Handles the `GET /crates` route.
2022
/// Returns a list of crates. Called in a variety of scenarios in the
@@ -109,9 +111,6 @@ pub fn search(req: &mut dyn RequestExt) -> EndpointResult {
109111
}
110112

111113
if let Some(kws) = params.get("all_keywords") {
112-
use diesel::sql_types::Array;
113-
sql_function!(#[aggregate] fn array_agg<T>(x: T) -> Array<T>);
114-
115114
// Calculating the total number of results with filters is not supported yet.
116115
supports_seek = false;
117116

@@ -141,7 +140,7 @@ pub fn search(req: &mut dyn RequestExt) -> EndpointResult {
141140
crates_keywords::table
142141
.select(crates_keywords::crate_id)
143142
.inner_join(keywords::table)
144-
.filter(crate::lower(keywords::keyword).eq(crate::lower(kw))),
143+
.filter(lower(keywords::keyword).eq(lower(kw))),
145144
),
146145
);
147146
} else if let Some(letter) = params.get("letter") {

src/controllers/user/other.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,18 @@ use crate::controllers::frontend_prelude::*;
22

33
use crate::models::{CrateOwner, OwnerKind, User};
44
use crate::schema::{crate_owners, crates, users};
5+
use crate::sql::lower;
56
use crate::util::errors::ChainError;
67
use crate::views::EncodablePublicUser;
78

89
/// Handles the `GET /users/:user_id` route.
910
pub fn show(req: &mut dyn RequestExt) -> EndpointResult {
1011
use self::users::dsl::{gh_login, id, users};
1112

12-
let name = crate::lower(&req.params()["user_id"]);
13+
let name = lower(&req.params()["user_id"]);
1314
let conn = req.db_conn()?;
1415
let user: User = users
15-
.filter(crate::lower(gh_login).eq(name))
16+
.filter(lower(gh_login).eq(name))
1617
.order(id.desc())
1718
.first(&*conn)?;
1819

src/lib.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ pub mod middleware;
4747
mod publish_rate_limit;
4848
pub mod render;
4949
pub mod schema;
50+
pub mod sql;
5051
pub mod tasks;
5152
mod test_util;
5253
pub mod uploaders;
@@ -125,5 +126,3 @@ pub fn env_optional<T: FromStr>(s: &str) -> Option<T> {
125126
.unwrap_or_else(|_| panic!("`{}` was defined but could not be parsed", s))
126127
})
127128
}
128-
129-
sql_function!(fn lower(x: ::diesel::sql_types::Text) -> ::diesel::sql_types::Text);

src/models/category.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ pub struct Category {
1515
pub created_at: NaiveDateTime,
1616
}
1717

18-
type WithSlug<'a> = diesel::dsl::Eq<categories::slug, crate::lower::HelperType<&'a str>>;
18+
type WithSlug<'a> = diesel::dsl::Eq<categories::slug, crate::sql::lower::HelperType<&'a str>>;
1919
type BySlug<'a> = diesel::dsl::Filter<categories::table, WithSlug<'a>>;
2020
type WithSlugsCaseSensitive<'a> = diesel::dsl::Eq<
2121
categories::slug,
@@ -40,7 +40,7 @@ pub struct CrateCategory {
4040

4141
impl Category {
4242
pub fn with_slug(slug: &str) -> WithSlug<'_> {
43-
categories::slug.eq(crate::lower(slug))
43+
categories::slug.eq(crate::sql::lower(slug))
4444
}
4545

4646
pub fn by_slug(slug: &str) -> BySlug<'_> {

src/models/keyword.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use diesel::prelude::*;
33

44
use crate::models::Crate;
55
use crate::schema::*;
6+
use crate::sql::lower;
67

78
#[derive(Clone, Identifiable, Queryable, Debug)]
89
pub struct Keyword {
@@ -25,7 +26,7 @@ pub struct CrateKeyword {
2526
impl Keyword {
2627
pub fn find_by_keyword(conn: &PgConnection, name: &str) -> QueryResult<Keyword> {
2728
keywords::table
28-
.filter(keywords::keyword.eq(crate::lower(name)))
29+
.filter(keywords::keyword.eq(lower(name)))
2930
.first(&*conn)
3031
}
3132

src/models/krate.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use chrono::NaiveDateTime;
22
use diesel::associations::Identifiable;
33
use diesel::pg::Pg;
44
use diesel::prelude::*;
5-
use diesel::sql_types::Bool;
5+
use diesel::sql_types::{Bool, Text};
66
use url::Url;
77

88
use crate::app::App;
@@ -17,6 +17,7 @@ use crate::util::errors::{cargo_err, AppResult};
1717
use crate::models::helpers::with_count::*;
1818
use crate::publish_rate_limit::PublishRateLimit;
1919
use crate::schema::*;
20+
use crate::sql::canon_crate_name;
2021

2122
#[derive(Debug, Queryable, Identifiable, Associations, Clone, Copy)]
2223
#[belongs_to(Crate)]
@@ -72,7 +73,7 @@ pub const ALL_COLUMNS: AllColumns = (
7273

7374
pub const MAX_NAME_LENGTH: usize = 64;
7475

75-
type CanonCrateName<T> = self::canon_crate_name::HelperType<T>;
76+
type CanonCrateName<T> = canon_crate_name::HelperType<T>;
7677
type All = diesel::dsl::Select<crates::table, AllColumns>;
7778
type WithName<'a> = diesel::dsl::Eq<CanonCrateName<crates::name>, CanonCrateName<&'a str>>;
7879
type ByName<'a> = diesel::dsl::Filter<All, WithName<'a>>;
@@ -440,10 +441,6 @@ impl Crate {
440441
}
441442
}
442443

443-
use diesel::sql_types::{Date, Text};
444-
sql_function!(fn canon_crate_name(x: Text) -> Text);
445-
sql_function!(fn to_char(a: Date, b: Text) -> Text);
446-
447444
#[cfg(test)]
448445
mod tests {
449446
use crate::models::{Crate, NewCrate};

src/models/owner.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use crate::util::errors::{cargo_err, AppResult};
66

77
use crate::models::{Crate, Team, User};
88
use crate::schema::{crate_owners, users};
9+
use crate::sql::lower;
910

1011
#[derive(Insertable, Associations, Identifiable, Debug, Clone, Copy)]
1112
#[belongs_to(Crate)]
@@ -69,7 +70,7 @@ impl Owner {
6970
)?))
7071
} else {
7172
users::table
72-
.filter(crate::lower(users::gh_login).eq(name.to_lowercase()))
73+
.filter(lower(users::gh_login).eq(name.to_lowercase()))
7374
.filter(users::gh_id.ne(-1))
7475
.order(users::gh_id.desc())
7576
.first(conn)

src/publish_rate_limit.rs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
use chrono::{NaiveDateTime, Utc};
22
use diesel::data_types::PgInterval;
33
use diesel::prelude::*;
4+
use diesel::sql_types::Interval;
45
use std::time::Duration;
56

67
use crate::schema::{publish_limit_buckets, publish_rate_overrides};
8+
use crate::sql::{date_part, floor, greatest, interval_part, least};
79
use crate::util::errors::{AppResult, TooManyRequests};
810

911
#[derive(Debug, Clone, Copy)]
@@ -67,16 +69,6 @@ impl PublishRateLimit {
6769
conn: &PgConnection,
6870
) -> QueryResult<Bucket> {
6971
use self::publish_limit_buckets::dsl::*;
70-
use diesel::sql_types::{Double, Interval, Text, Timestamp};
71-
72-
sql_function!(fn date_part(x: Text, y: Timestamp) -> Double);
73-
sql_function! {
74-
#[sql_name = "date_part"]
75-
fn interval_part(x: Text, y: Interval) -> Double;
76-
}
77-
sql_function!(fn floor(x: Double) -> Integer);
78-
sql_function!(fn greatest<T>(x: T, y: T) -> T);
79-
sql_function!(fn least<T>(x: T, y: T) -> T);
8072

8173
let burst: i32 = publish_rate_overrides::table
8274
.find(uploader)

src/sql.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
use diesel::sql_types::{Array, Date, Double, Interval, Text, Timestamp};
2+
3+
sql_function!(#[aggregate] fn array_agg<T>(x: T) -> Array<T>);
4+
sql_function!(fn canon_crate_name(x: Text) -> Text);
5+
sql_function!(fn to_char(a: Date, b: Text) -> Text);
6+
sql_function!(fn lower(x: Text) -> Text);
7+
sql_function!(fn date_part(x: Text, y: Timestamp) -> Double);
8+
sql_function! {
9+
#[sql_name = "date_part"]
10+
fn interval_part(x: Text, y: Interval) -> Double;
11+
}
12+
sql_function!(fn floor(x: Double) -> Integer);
13+
sql_function!(fn greatest<T>(x: T, y: T) -> T);
14+
sql_function!(fn least<T>(x: T, y: T) -> T);

0 commit comments

Comments
 (0)