diff --git a/compute_tools/src/compute.rs b/compute_tools/src/compute.rs index f5e65a2cec..b3902a6c4a 100644 --- a/compute_tools/src/compute.rs +++ b/compute_tools/src/compute.rs @@ -1369,32 +1369,35 @@ LIMIT 100", download_size } - pub fn set_role_grants( + pub async fn set_role_grants( &self, db_name: &str, schema_name: &str, privileges: &[Privilege], role_name: &str, ) -> Result<()> { + use tokio_postgres::config::Config; + use tokio_postgres::NoTls; + let mut conf = Config::from_str(self.connstr.as_str()).unwrap(); conf.dbname(db_name); - let mut db_client = conf + let (db_client, conn) = conf .connect(NoTls) + .await .context("Failed to connect to the database")?; + tokio::spawn(conn); + // todo: pg_quote let query = format!( "GRANT {} ON SCHEMA {} TO {}", - privileges - .iter() - .map(|p| serde_json::to_string(p).unwrap()) - .collect::>() - .join(", "), + privileges.iter().map(|p| p.as_str()).join(", "), schema_name, role_name ); db_client .simple_query(&query) + .await .context(format!("Failed to execute query: {}", query))?; Ok(()) diff --git a/compute_tools/src/http/api.rs b/compute_tools/src/http/api.rs index 2f7b3feef1..03a3633342 100644 --- a/compute_tools/src/http/api.rs +++ b/compute_tools/src/http/api.rs @@ -182,14 +182,16 @@ async fn routes(req: Request, compute: &Arc) -> Response(&request).unwrap(); - let res = compute.set_role_grants( - &request.database, - &request.schema, - &request.privileges, - &request.role, - ); + let res = compute + .set_role_grants( + &request.database, + &request.schema, + &request.privileges, + &request.role, + ) + .await; match res { - Ok(_) => render_json(Body::from( + Ok(()) => render_json(Body::from( serde_json::to_string(&SetRoleGrantsResponse { database: request.database, schema: request.schema,