summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/db/product.rs27
1 files changed, 21 insertions, 6 deletions
diff --git a/src/db/product.rs b/src/db/product.rs
index 2fd2f54..0b90810 100644
--- a/src/db/product.rs
+++ b/src/db/product.rs
@@ -31,19 +31,34 @@ impl Product {
.await?;
if !tags.is_empty() {
- let mut tags_query_builder: QueryBuilder<Sqlite> = QueryBuilder::new("INSERT OR REPLACE INTO tag (name) ");
+ // insert tags that do not exist yet
+ let mut tags_query_builder: QueryBuilder<Sqlite> = QueryBuilder::new("INSERT INTO tag (name) ");
tags_query_builder.push_values(tags.iter(), | mut b, tag | { b.push_bind(tag); });
- tags_query_builder.push(" RETURNING id, name;");
- let added_tags: Vec<Tag> = tags_query_builder
- .build_query_as::<Tag>()
- .fetch_all(&mut **tx)
- .await?;
+ tags_query_builder.push(" ON CONFLICT(name) DO NOTHING;");
+ tags_query_builder.build().execute(&mut **tx).await?;
+
+ // fetch all tags of story
+ let added_tags: Vec<Tag> = {
+ let mut tags_fetch_query_builder = QueryBuilder::new("WITH input(name) AS (");
+ tags_fetch_query_builder.push_values(tags.iter(), |mut b, tag| {
+ b.push_bind(tag);
+ });
+ tags_fetch_query_builder.push(
+ ") \
+ SELECT t.id, t.name \
+ FROM tag t \
+ JOIN input i ON i.name = t.name;"
+ );
+ tags_fetch_query_builder.build_query_as::<Tag>().fetch_all(&mut **tx).await?
+ };
println!("{:?}", added_tags);
+ // bind tags to story if they are not bound yet
let mut producttags_query_builder: QueryBuilder<Sqlite> = QueryBuilder::new("INSERT INTO producttag (pid, tid) ");
producttags_query_builder.push_values(added_tags.iter(), | mut b, added_tag | {
b.push_bind(product.id).push_bind(added_tag.id);
});
+ producttags_query_builder.push(" ON CONFLICT(pid, tid) DO NOTHING;");
producttags_query_builder
.build().execute(&mut **tx).await?;