From 02c30d991657f9715ddf33ed420fdb35f57a7b37 Mon Sep 17 00:00:00 2001 From: Quentin Gliech Date: Fri, 21 Oct 2022 15:04:02 +0200 Subject: [PATCH] Insert client redirect_uris in one query --- crates/storage/src/oauth2/client.rs | 66 ++++++++++++++++------------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/crates/storage/src/oauth2/client.rs b/crates/storage/src/oauth2/client.rs index 959398a5..d9c77958 100644 --- a/crates/storage/src/oauth2/client.rs +++ b/crates/storage/src/oauth2/client.rs @@ -391,21 +391,24 @@ pub async fn insert_client( .execute(&mut *conn) .await?; - for redirect_uri in redirect_uris { - let id = Ulid::new(); - sqlx::query!( - r#" - INSERT INTO oauth2_client_redirect_uris - (oauth2_client_redirect_uri_id, oauth2_client_id, redirect_uri) - VALUES ($1, $2, $3) - "#, - Uuid::from(id), - Uuid::from(client_id), - redirect_uri.as_str(), - ) - .execute(&mut *conn) - .await?; - } + let (ids, redirect_uris): (Vec, Vec) = redirect_uris + .iter() + .map(|uri| (Uuid::from(Ulid::new()), uri.as_str().to_owned())) + .unzip(); + + sqlx::query!( + r#" + INSERT INTO oauth2_client_redirect_uris + (oauth2_client_redirect_uri_id, oauth2_client_id, redirect_uri) + SELECT id, $2, redirect_uri + FROM UNNEST($1::uuid[], $3::text[]) r(id, redirect_uri) + "#, + &ids, + Uuid::from(client_id), + &redirect_uris, + ) + .execute(&mut *conn) + .await?; Ok(()) } @@ -448,21 +451,24 @@ pub async fn insert_client_from_config( .execute(&mut *conn) .await?; - for redirect_uri in redirect_uris { - let id = Ulid::new(); - sqlx::query!( - r#" - INSERT INTO oauth2_client_redirect_uris - (oauth2_client_redirect_uri_id, oauth2_client_id, redirect_uri) - VALUES ($1, $2, $3) - "#, - Uuid::from(id), - Uuid::from(client_id), - redirect_uri.as_str(), - ) - .execute(&mut *conn) - .await?; - } + let (ids, redirect_uris): (Vec, Vec) = redirect_uris + .iter() + .map(|uri| (Uuid::from(Ulid::new()), uri.as_str().to_owned())) + .unzip(); + + sqlx::query!( + r#" + INSERT INTO oauth2_client_redirect_uris + (oauth2_client_redirect_uri_id, oauth2_client_id, redirect_uri) + SELECT id, $2, redirect_uri + FROM UNNEST($1::uuid[], $3::text[]) r(id, redirect_uri) + "#, + &ids, + Uuid::from(client_id), + &redirect_uris, + ) + .execute(&mut *conn) + .await?; Ok(()) }