diff --git a/src/bin/enqueue-job.rs b/src/bin/enqueue-job.rs new file mode 100644 index 00000000000..5a3494acdf0 --- /dev/null +++ b/src/bin/enqueue-job.rs @@ -0,0 +1,17 @@ +use cargo_registry::util::{CargoError, CargoResult}; +use cargo_registry::{db, tasks}; +use std::env::args; +use swirl::Job; + +fn main() -> CargoResult<()> { + let conn = db::connect_now()?; + + match &*args().nth(1).unwrap_or_default() { + "update_downloads" => tasks::update_downloads() + .enqueue(&conn) + .map_err(|e| CargoError::from_std_error(e))?, + other => panic!("Unrecognized job type `{}`", other), + }; + + Ok(()) +} diff --git a/src/lib.rs b/src/lib.rs index 5b5ca0a94a9..ec774e4dab2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -40,6 +40,7 @@ pub mod middleware; mod publish_rate_limit; pub mod render; pub mod schema; +pub mod tasks; mod test_util; pub mod uploaders; pub mod util; diff --git a/src/tasks.rs b/src/tasks.rs new file mode 100644 index 00000000000..930f83bfc11 --- /dev/null +++ b/src/tasks.rs @@ -0,0 +1,3 @@ +mod update_downloads; + +pub use update_downloads::update_downloads; diff --git a/src/bin/update-downloads.rs b/src/tasks/update_downloads.rs similarity index 94% rename from src/bin/update-downloads.rs rename to src/tasks/update_downloads.rs index 3ada76a7106..2bc63a2bac2 100644 --- a/src/bin/update-downloads.rs +++ b/src/tasks/update_downloads.rs @@ -1,25 +1,21 @@ -#![deny(warnings, clippy::all, rust_2018_idioms)] - -#[macro_use] -extern crate diesel; - -use cargo_registry::{ - db, +use crate::{ + background_jobs::Environment, models::VersionDownload, schema::{crates, metadata, version_downloads, versions}, - util::CargoResult, }; use diesel::prelude::*; +use swirl::PerformError; -fn main() -> CargoResult<()> { - let conn = db::connect_now()?; +#[swirl::background_job] +pub fn update_downloads(env: &Environment) -> Result<(), PerformError> { + let conn = env.connection()?; update(&conn)?; Ok(()) } fn update(conn: &PgConnection) -> QueryResult<()> { - use crate::version_downloads::dsl::*; + use self::version_downloads::dsl::*; use diesel::dsl::now; use diesel::select; @@ -84,7 +80,7 @@ fn collect(conn: &PgConnection, rows: &[VersionDownload]) -> QueryResult<()> { #[cfg(test)] mod test { use super::*; - use cargo_registry::{ + use crate::{ env, models::{Crate, NewCrate, NewUser, NewVersion, User, Version}, }; @@ -143,7 +139,7 @@ mod test { .execute(&conn) .unwrap(); - crate::update(&conn).unwrap(); + super::update(&conn).unwrap(); let version_downloads = versions::table .find(version.id) .select(versions::downloads) @@ -154,7 +150,7 @@ mod test { .select(crates::downloads) .first(&conn); assert_eq!(Ok(1), crate_downloads); - crate::update(&conn).unwrap(); + super::update(&conn).unwrap(); let version_downloads = versions::table .find(version.id) .select(versions::downloads) @@ -179,7 +175,7 @@ mod test { )) .execute(&conn) .unwrap(); - crate::update(&conn).unwrap(); + super::update(&conn).unwrap(); let processed = version_downloads::table .filter(version_downloads::version_id.eq(version.id)) .select(version_downloads::processed) @@ -203,7 +199,7 @@ mod test { )) .execute(&conn) .unwrap(); - crate::update(&conn).unwrap(); + super::update(&conn).unwrap(); let processed = version_downloads::table .filter(version_downloads::version_id.eq(version.id)) .select(version_downloads::processed) @@ -253,7 +249,7 @@ mod test { .filter(crates::id.eq(krate.id)) .first::(&conn) .unwrap(); - crate::update(&conn).unwrap(); + super::update(&conn).unwrap(); let version2 = versions::table .find(version.id) .first::(&conn) @@ -266,7 +262,7 @@ mod test { .unwrap(); assert_eq!(krate2.downloads, 2); assert_eq!(krate2.updated_at, krate_before.updated_at); - crate::update(&conn).unwrap(); + super::update(&conn).unwrap(); let version3 = versions::table .find(version.id) .first::(&conn) @@ -301,7 +297,7 @@ mod test { .execute(&conn) .unwrap(); - crate::update(&conn).unwrap(); + super::update(&conn).unwrap(); let versions_changed = versions::table .select(versions::updated_at.ne(now - 2.days())) .get_result(&conn);