From 102ded975606f5ae43345fb68b6649ac19deec0b Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Wed, 3 Mar 2021 21:46:13 -0800 Subject: [PATCH] Finally fiddled around enough to make this work --- migrations/sqlite/20210303191923_projects.sql | 2 +- services/reldata/src/main.rs | 33 +++++++++---------- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/migrations/sqlite/20210303191923_projects.sql b/migrations/sqlite/20210303191923_projects.sql index 6a5d6f6..ef92bcd 100644 --- a/migrations/sqlite/20210303191923_projects.sql +++ b/migrations/sqlite/20210303191923_projects.sql @@ -5,7 +5,7 @@ CREATE TABLE IF NOT EXISTS projects ( - uuid TEXT PRIMARY KEY NOT NULL, + uuid BLOB PRIMARY KEY NOT NULL, path TEXT UNIQUE NOT NULL, title TEXT NOT NULL, description TEXT, diff --git a/services/reldata/src/main.rs b/services/reldata/src/main.rs index f97d955..d608b00 100644 --- a/services/reldata/src/main.rs +++ b/services/reldata/src/main.rs @@ -97,27 +97,24 @@ impl Loader for ProjectLoader { type Error = FieldError; async fn load(&self, keys: &[Uuid]) -> Result, Self::Error> { - use std::str::FromStr; - use sqlx::Row; + let query = format!( + "SELECT * FROM projects WHERE uuid IN ({})", + (0..keys.len()) + .map(|_| "?") + .collect::>() + .join(",") + ); - let uuids = keys.iter().map(|u| u.to_string()).collect::>(); - // Doing awful things to allow the bulk query with the Uuid since sqlx cannot map a - // hyphenated string back out to a normal Uuid - let mut records = sqlx::query("SELECT * FROM projects WHERE uuid IN ($1)") - .bind(uuids.join(",")) - .fetch(&self.0); - - let mut out = HashMap::new(); - while let Some(row) = records.try_next().await? { - let project = Project { - uuid: Uuid::from_str(row.get("uuid"))?, - title: row.get("title"), - path: row.get("path"), - }; - out.insert(project.uuid, project); + let mut q = sqlx::query_as::(&query); + for x in (0..keys.len()) { + q = q.bind(keys[x]); } + debug!("query: {}", query); - Ok(out) + Ok(q.fetch(&self.0) + .map_ok(|p: Project| (p.uuid, p)) + .try_collect() + .await?) } }