diff --git a/.sqlx/query-2c1f393f0c38c013c99629b5f0d3611c5153730091dd5488e2ef21b495942b93.json b/.sqlx/query-2c1f393f0c38c013c99629b5f0d3611c5153730091dd5488e2ef21b495942b93.json new file mode 100644 index 000000000..c0d980f02 --- /dev/null +++ b/.sqlx/query-2c1f393f0c38c013c99629b5f0d3611c5153730091dd5488e2ef21b495942b93.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO crates (name)\n VALUES ($1)\n ON CONFLICT (name) DO UPDATE\n SET -- this `SET` is needed so the id is always returned.\n name = EXCLUDED.name\n RETURNING id", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Varchar" + ] + }, + "nullable": [ + false + ] + }, + "hash": "2c1f393f0c38c013c99629b5f0d3611c5153730091dd5488e2ef21b495942b93" +} diff --git a/.sqlx/query-7be4a44a1336e41023eca9b313d23adcafaeaeeb39322c565e59f3c4af79ca56.json b/.sqlx/query-7be4a44a1336e41023eca9b313d23adcafaeaeeb39322c565e59f3c4af79ca56.json deleted file mode 100644 index 009a16cc6..000000000 --- a/.sqlx/query-7be4a44a1336e41023eca9b313d23adcafaeaeeb39322c565e59f3c4af79ca56.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO crates (name) VALUES ($1) RETURNING id", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int4" - } - ], - "parameters": { - "Left": [ - "Varchar" - ] - }, - "nullable": [ - false - ] - }, - "hash": "7be4a44a1336e41023eca9b313d23adcafaeaeeb39322c565e59f3c4af79ca56" -} diff --git a/src/db/add_package.rs b/src/db/add_package.rs index 1495a8198..5cc5a87f3 100644 --- a/src/db/add_package.rs +++ b/src/db/add_package.rs @@ -42,7 +42,7 @@ pub(crate) async fn add_package_into_database( archive_storage: bool, ) -> Result { debug!("Adding package into database"); - let crate_id = initialize_package_in_database(conn, metadata_pkg).await?; + let crate_id = initialize_crate(conn, &metadata_pkg.name).await?; let dependencies = convert_dependencies(metadata_pkg); let rustdoc = get_rustdoc(metadata_pkg, source_dir).unwrap_or(None); let readme = get_readme(metadata_pkg, source_dir).unwrap_or(None); @@ -261,24 +261,19 @@ pub(crate) async fn add_build_into_database( Ok(build_id) } -async fn initialize_package_in_database( - conn: &mut sqlx::PgConnection, - pkg: &MetadataPackage, -) -> Result { - if let Some(id) = sqlx::query_scalar!("SELECT id FROM crates WHERE name = $1", pkg.name) - .fetch_optional(&mut *conn) - .await? - { - Ok(id) - } else { - // insert crate into database if it is not exists - Ok(sqlx::query_scalar!( - "INSERT INTO crates (name) VALUES ($1) RETURNING id", - pkg.name, - ) - .fetch_one(&mut *conn) - .await?) - } +pub(crate) async fn initialize_crate(conn: &mut sqlx::PgConnection, name: &str) -> Result { + sqlx::query_scalar!( + "INSERT INTO crates (name) + VALUES ($1) + ON CONFLICT (name) DO UPDATE + SET -- this `SET` is needed so the id is always returned. + name = EXCLUDED.name + RETURNING id", + name + ) + .fetch_one(&mut *conn) + .await + .map_err(Into::into) } /// Convert dependencies into Vec<(String, String, String, bool)> @@ -526,7 +521,7 @@ where mod test { use super::*; use crate::test::*; - use crate::utils::{CargoMetadata, MetadataPackage}; + use crate::utils::CargoMetadata; use test_case::test_case; #[test] @@ -647,13 +642,7 @@ mod test { async_wrapper(|env| async move { let mut conn = env.async_db().await.async_conn().await; - let crate_id = initialize_package_in_database( - &mut conn, - &MetadataPackage { - ..Default::default() - }, - ) - .await?; + let crate_id = initialize_crate(&mut conn, "").await?; let owner1 = CrateOwner { avatar: "avatar".into(), @@ -691,8 +680,7 @@ mod test { fn update_owner_detais() { async_wrapper(|env| async move { let mut conn = env.async_db().await.async_conn().await; - let crate_id = - initialize_package_in_database(&mut conn, &MetadataPackage::default()).await?; + let crate_id = initialize_crate(&mut conn, "").await?; // set initial owner details update_owners_in_database( @@ -737,13 +725,7 @@ mod test { fn add_new_owners_and_delete_old() { async_wrapper(|env| async move { let mut conn = env.async_db().await.async_conn().await; - let crate_id = initialize_package_in_database( - &mut conn, - &MetadataPackage { - ..Default::default() - }, - ) - .await?; + let crate_id = initialize_crate(&mut conn, "").await?; // set initial owner details update_owners_in_database(