|
1 | 1 | //! Structs using the builder pattern that make it easier to create records in tests.
|
2 | 2 |
|
3 | 3 | use cargo_registry::{
|
4 |
| - models::{Crate, CrateDownload, Keyword, NewCrate, NewVersion, Version}, |
5 |
| - schema::{crate_downloads, dependencies, versions}, |
| 4 | + models::{Crate, Keyword, NewCrate, NewVersion, Version}, |
| 5 | + schema::{crates, dependencies, version_downloads, versions}, |
6 | 6 | util::CargoResult,
|
7 | 7 | views::krate_publish as u,
|
8 | 8 | };
|
9 | 9 | use std::{collections::HashMap, io::Read};
|
10 | 10 |
|
11 |
| -use chrono::Utc; |
12 | 11 | use diesel::prelude::*;
|
13 | 12 | use flate2::{write::GzEncoder, Compression};
|
14 | 13 |
|
@@ -240,45 +239,34 @@ impl<'a> CrateBuilder<'a> {
|
240 | 239 | // Since we are using `NewCrate`, we can't set all the
|
241 | 240 | // crate properties in a single DB call.
|
242 | 241 |
|
243 |
| - let old_downloads = self.downloads.unwrap_or(0) - self.recent_downloads.unwrap_or(0); |
244 |
| - let now = Utc::now(); |
245 |
| - let old_date = now.naive_utc().date() - chrono::Duration::days(91); |
246 |
| - |
247 | 242 | if let Some(downloads) = self.downloads {
|
248 |
| - let crate_download = CrateDownload { |
249 |
| - crate_id: krate.id, |
250 |
| - downloads: old_downloads, |
251 |
| - date: old_date, |
252 |
| - }; |
253 |
| - |
254 |
| - insert_into(crate_downloads::table) |
255 |
| - .values(&crate_download) |
256 |
| - .execute(connection)?; |
257 |
| - krate.downloads = downloads; |
258 |
| - update(&krate).set(&krate).execute(connection)?; |
259 |
| - } |
260 |
| - |
261 |
| - if self.recent_downloads.is_some() { |
262 |
| - let crate_download = CrateDownload { |
263 |
| - crate_id: krate.id, |
264 |
| - downloads: self.recent_downloads.unwrap(), |
265 |
| - date: now.naive_utc().date(), |
266 |
| - }; |
267 |
| - |
268 |
| - insert_into(crate_downloads::table) |
269 |
| - .values(&crate_download) |
270 |
| - .execute(connection)?; |
271 |
| - |
272 |
| - no_arg_sql_function!(refresh_recent_crate_downloads, ()); |
273 |
| - select(refresh_recent_crate_downloads).execute(connection)?; |
| 243 | + krate = update(&krate) |
| 244 | + .set(crates::downloads.eq(downloads)) |
| 245 | + .returning(cargo_registry::models::krate::ALL_COLUMNS) |
| 246 | + .get_result(connection)?; |
274 | 247 | }
|
275 | 248 |
|
276 | 249 | if self.versions.is_empty() {
|
277 | 250 | self.versions.push(VersionBuilder::new("0.99.0"));
|
278 | 251 | }
|
279 | 252 |
|
| 253 | + let mut last_version_id = 0; |
280 | 254 | for version_builder in self.versions {
|
281 |
| - version_builder.build(krate.id, self.owner_id, connection)?; |
| 255 | + last_version_id = version_builder |
| 256 | + .build(krate.id, self.owner_id, connection)? |
| 257 | + .id; |
| 258 | + } |
| 259 | + |
| 260 | + if let Some(downloads) = self.recent_downloads { |
| 261 | + insert_into(version_downloads::table) |
| 262 | + .values(( |
| 263 | + version_downloads::version_id.eq(last_version_id), |
| 264 | + version_downloads::downloads.eq(downloads), |
| 265 | + )) |
| 266 | + .execute(connection)?; |
| 267 | + |
| 268 | + no_arg_sql_function!(refresh_recent_crate_downloads, ()); |
| 269 | + select(refresh_recent_crate_downloads).execute(connection)?; |
282 | 270 | }
|
283 | 271 |
|
284 | 272 | if !self.keywords.is_empty() {
|
|
0 commit comments