From ab582c45f206f62030b9d95dd8bf2150348fb030 Mon Sep 17 00:00:00 2001 From: Kornel Date: Fri, 10 Apr 2020 14:22:58 +0100 Subject: Handle invalid name --- crate_db/Cargo.toml | 2 +- crate_db/src/lib_crate_db.rs | 33 +++++++++++++++++++++------------ kitchen_sink/src/lib_kitchen_sink.rs | 1 - 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/crate_db/Cargo.toml b/crate_db/Cargo.toml index d8ee715..e5be1f0 100644 --- a/crate_db/Cargo.toml +++ b/crate_db/Cargo.toml @@ -1,7 +1,7 @@ [package] edition = "2018" name = "crate_db" -version = "0.4.7" +version = "0.4.8" authors = ["Kornel "] description = "Internal index of crates used by crates.rs" diff --git a/crate_db/src/lib_crate_db.rs b/crate_db/src/lib_crate_db.rs index 1fa967d..78b10cd 100644 --- a/crate_db/src/lib_crate_db.rs +++ b/crate_db/src/lib_crate_db.rs @@ -507,7 +507,7 @@ impl CrateDb { ORDER BY path, crate_name LIMIT 10 ")?; let q = q.query_map(&[&repo.canonical_git_url()], |r| { - let s = r.get_raw(0).as_str().unwrap(); + let s = r.get_raw(0).as_str()?; Ok(Origin::from_crates_io_name(s)) })?.filter_map(|r| r.ok()); Ok(q.collect()) @@ -566,6 +566,7 @@ impl CrateDb { }).await } + /// additions and removals pub async fn index_repo_changes(&self, repo: &Repo, changes: &[RepoChange]) -> FResult<()> { let repo = repo.canonical_git_url(); self.with_write("index_repo_changes", |tx| { @@ -573,10 +574,13 @@ impl CrateDb { for change in changes { match *change { RepoChange::Replaced { ref crate_name, ref replacement, weight } => { + assert!(Origin::is_valid_crate_name(crate_name)); + assert!(Origin::is_valid_crate_name(replacement)); let args: &[&dyn ToSql] = &[&repo, &crate_name.as_str(), &Some(replacement.as_str()), &weight]; insert_change.execute(args) }, RepoChange::Removed { ref crate_name, weight } => { + assert!(Origin::is_valid_crate_name(crate_name)); let args: &[&dyn ToSql] = &[&repo, &crate_name.as_str(), &(None as Option<&str>), &weight]; insert_change.execute(args) }, @@ -654,7 +658,7 @@ impl CrateDb { LIMIT 2000 "#)?; let q = query.query_map(&[&github_id], |row| { - let origin = Origin::from_str(row.get_raw(0).as_str().unwrap()); + let origin = Origin::from_str(row.get_raw(0).as_str()?); let invited_by_github_id: Option = row.get_unwrap(1); let invited_at = row.get_raw(2).as_str().ok().map(|d| match Utc.datetime_from_str(d, "%Y-%m-%d %H:%M:%S") { Ok(d) => d, @@ -784,7 +788,7 @@ impl CrateDb { }).await } - pub async fn replacement_crates(&self, crate_name: &str) -> FResult> { + pub async fn replacement_crates(&self, crate_name: &str) -> FResult> { self.with_read("replacement_crates", |conn| { let mut query = conn.prepare_cached(r#" SELECT sum(weight) as w, replacement @@ -796,7 +800,10 @@ impl CrateDb { ORDER by 1 desc LIMIT 4 "#)?; - let res = query.query_map(&[&crate_name], |row| row.get(1)).context("replacement_crates")?; + let res = query.query_map(&[&crate_name], |row| { + let s = row.get_raw(1).as_str()?; + Ok(Origin::from_crates_io_name(s)) + }).context("replacement_crates")?; Ok(res.collect::>()?) }).await } @@ -819,7 +826,7 @@ impl CrateDb { "#)?; let args: &[&dyn ToSql] = &[&origin.to_str(), &min_recent_downloads]; let res = query.query_map(args, |row| { - Ok(Origin::from_str(row.get_raw(1).as_str().unwrap())) + Ok(Origin::from_str(row.get_raw(1).as_str()?)) }).context("related_crates")?; Ok(res.collect::>()?) }).await @@ -904,8 +911,10 @@ impl CrateDb { WHERE replacement IS NULL GROUP BY crate_name")?; let q = query.query_map(NO_PARAMS, |row| { - let s = row.get_raw(0).as_str().unwrap(); - Ok((Origin::from_crates_io_name(s), row.get_unwrap(1))) + let s = row.get_raw(0).as_str()?; + let weight = row.get(1)?; + Ok((Origin::try_from_crates_io_name(s) + .ok_or_else(|| rusqlite::Error::ToSqlConversionFailure(format!("bad name in removals{}", s).into()))?, weight)) })?; let q = q.filter_map(|r| r.ok()); Ok(q.collect()) @@ -928,7 +937,7 @@ impl CrateDb { )?; let args: &[&dyn ToSql] = &[&slug, &limit]; let q = query.query_map(args, |row| { - Ok((Origin::from_str(row.get_raw(0).as_str().unwrap()), row.get_unwrap(1))) + Ok((Origin::from_str(row.get_raw(0).as_str()?), row.get_unwrap(1))) })?; let q = q.filter_map(|r| r.ok()); Ok(q.collect()) @@ -949,7 +958,7 @@ impl CrateDb { )?; let args: &[&dyn ToSql] = &[&limit]; let q = query.query_map(args, |row| { - Ok((Origin::from_str(row.get_raw(0).as_str().unwrap()), row.get_unwrap(1))) + Ok((Origin::from_str(row.get_raw(0).as_str()?), row.get_unwrap(1))) })?; let q = q.filter_map(|r| r.ok()); Ok(q.collect()) @@ -974,7 +983,7 @@ impl CrateDb { limit 20 "#)?; let q = query.query_map(&[&slug], |row| { - Ok(Origin::from_str(row.get_raw(1).as_str().unwrap())) + Ok(Origin::from_str(row.get_raw(1).as_str()?)) })?; let q = q.filter_map(|r| r.ok()); Ok(q.collect()) @@ -1026,7 +1035,7 @@ impl CrateDb { GROUP BY c.id "#)?; let q = q.query_map(NO_PARAMS, |row| -> Result<(Origin, f64, i64)> { - Ok((Origin::from_str(row.get_raw(0).as_str().unwrap()), row.get_unwrap(1), row.get_unwrap(2))) + Ok((Origin::from_str(row.get_raw(0).as_str()?), row.get_unwrap(1), row.get_unwrap(2))) }).context("sitemap")?.filter_map(|r| r.ok()); Ok(q.collect()) }).await @@ -1051,7 +1060,7 @@ impl CrateDb { let mut q = conn.prepare("SELECT origin FROM crates WHERE next_update < ?1 LIMIT 1000")?; let timestamp = Utc::now().timestamp() as u32; let q = q.query_map(&[×tamp], |r| { - let s = r.get_raw(0).as_str().unwrap(); + let s = r.get_raw(0).as_str()?; Ok(Origin::from_str(s)) })?.filter_map(|r| r.ok()); Ok(q.collect()) diff --git a/kitchen_sink/src/lib_kitchen_sink.rs b/kitchen_sink/src/lib_kitchen_sink.rs index 96be93c..9c63684 100644 --- a/kitchen_sink/src/lib_kitchen_sink.rs +++ b/kitchen_sink/src/lib_kitchen_sink.rs @@ -1294,7 +1294,6 @@ impl KitchenSink { )?; Ok(replacements.into_iter() - .map(|name| Origin::from_crates_io_name(&name)) .chain(related) .unique() .take(10) -- cgit v1.2.3