diff --git a/db/builder_db.ml b/db/builder_db.ml index 494e921..54c958e 100644 --- a/db/builder_db.ml +++ b/db/builder_db.ml @@ -157,13 +157,15 @@ module Job_tag = struct let add = Caqti_request.exec Caqti_type.(tup3 id string id) - {| INSERT INTO job_tag (tag, value, job) - VALUES (?1, ?2, ?3) - ON CONFLICT(x) DO UPDATE SET value = ?2 WHERE tag = ?1 AND job = ?3 - |} + "INSERT INTO job_tag (tag, value, job) VALUES (?1, ?2, ?3)" + + let update = + Caqti_request.exec + Caqti_type.(tup3 id string id) + "UPDATE job_tag SET value = ?2 WHERE tag = ?1 AND job = ?3" let get_value = - Caqti_request.find + Caqti_request.find_opt Caqti_type.(tup2 id id) Caqti_type.string "SELECT value FROM job_tag WHERE tag = ? AND job = ?" diff --git a/db/builder_db.mli b/db/builder_db.mli index 0357343..70973e0 100644 --- a/db/builder_db.mli +++ b/db/builder_db.mli @@ -85,8 +85,10 @@ module Job_tag : sig (unit, unit, [< `Many | `One | `Zero > `Zero ]) Caqti_request.t val add : (id * string * id, unit, [< `Many | `One | `Zero > `Zero ]) Caqti_request.t + val update : + (id * string * id, unit, [< `Many | `One | `Zero > `Zero ]) Caqti_request.t val get_value : - (id * id, string, [< `Many | `One | `Zero > `One ]) Caqti_request.t + (id * id, string, [< `Many | `One | `Zero > `Zero `One ]) Caqti_request.t end module Build_artifact : sig diff --git a/lib/model.ml b/lib/model.ml index 141c645..05ab72c 100644 --- a/lib/model.ml +++ b/lib/model.ml @@ -270,15 +270,20 @@ let add_build main_binary = None; user_id; job_id } >>= fun () -> Db.find last_insert_rowid () >>= fun id -> let sec_syn = infer_section_and_synopsis raw_artifacts in + let add_or_update tag_id tag_value = + Db.find_opt Job_tag.get_value (tag_id, job_id) >>= function + | None -> Db.exec Job_tag.add (tag_id, tag_value, job_id) + | Some _ -> Db.exec Job_tag.update (tag_id, tag_value, job_id) + in (match fst sec_syn with | None -> Lwt_result.return () - | Some section_v -> Db.exec Job_tag.add (section_id, section_v, id)) >>= fun () -> + | Some section_v -> add_or_update section_id section_v) >>= fun () -> (match snd sec_syn with | None, _-> Lwt_result.return () - | Some synopsis_v, _ -> Db.exec Job_tag.add (synopsis_id, synopsis_v, id)) >>= fun () -> + | Some synopsis_v, _ -> add_or_update synopsis_id synopsis_v) >>= fun () -> (match snd sec_syn with | _, None -> Lwt_result.return () - | _, Some descr_v -> Db.exec Job_tag.add (descr_id, descr_v, id)) >>= fun () -> + | _, Some descr_v -> add_or_update descr_id descr_v) >>= fun () -> List.fold_left (fun r file -> r >>= fun () ->