diff options
Diffstat (limited to 'src/db/product.rs')
| -rw-r--r-- | src/db/product.rs | 27 |
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?; |
