From b965b3ca7ce1c3ff33300de16682c1525c7b272c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reynir=20Bj=C3=B6rnsson?= Date: Fri, 23 Apr 2021 12:06:39 +0200 Subject: [PATCH] Add Build.get_previous database lookup --- db/builder_db.ml | 15 +++++++++++++++ db/builder_db.mli | 3 +++ test/builder_db.ml | 18 ++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/db/builder_db.ml b/db/builder_db.ml index e723abb..c6203d7 100644 --- a/db/builder_db.ml +++ b/db/builder_db.ml @@ -382,6 +382,21 @@ module Build = struct LIMIT 1 |} + let get_previous = + Caqti_request.find_opt + id + Caqti_type.(tup2 id Meta.t) + {| SELECT b.id, + b.uuid, b.start_d, b.start_ps, b.finish_d, b.finish_ps, + b.result_kind, b.result_code, b.result_msg, + b.main_binary, b.job + FROM build b, build b0 + WHERE b0.id = ? AND b0.job = b.job AND + (b0.start_d > b.start_d OR b0.start_d = b.start_d AND b0.start_ps > b.start_ps) + ORDER BY b.start_d DESC, b.start_ps DESC + LIMIT 1 + |} + let add = Caqti_request.exec t diff --git a/db/builder_db.mli b/db/builder_db.mli index 3b0f206..309e2c4 100644 --- a/db/builder_db.mli +++ b/db/builder_db.mli @@ -146,6 +146,9 @@ sig val get_latest : (id, id * Meta.t * file option, [< `Many | `One | `Zero > `One `Zero ]) Caqti_request.t + val get_previous : + (id, id * Meta.t, [< `Many | `One | `Zero > `One `Zero ]) + Caqti_request.t val add : (t, unit, [< `Many | `One | `Zero > `Zero ]) Caqti_request.t val get_by_hash : (Cstruct.t, string * t, [< `Many | `One | `Zero > `One `Zero]) Caqti_request.t diff --git a/test/builder_db.ml b/test/builder_db.ml index 1086839..18d3333 100644 --- a/test/builder_db.ml +++ b/test/builder_db.ml @@ -233,6 +233,22 @@ let test_build_get_latest (module Db : CONN) = Alcotest.(check (option Testable.file)) "same main binary" main_binary' (Some main_binary); Alcotest.(check Testable.uuid) "same uuid" meta.uuid uuid' +let test_build_get_previous (module Db : CONN) = + add_second_build (module Db) >>= fun () -> + Db.find_opt Builder_db.Build.get_by_uuid uuid' + >>| get_opt "no build" >>= fun (id, _build) -> + Db.find_opt Builder_db.Build.get_previous id + >>| get_opt "no previous build" >>| fun (_id, meta) -> + Alcotest.(check Testable.uuid) "same uuid" meta.uuid uuid + +let test_build_get_previous_none (module Db : CONN) = + Db.find_opt Builder_db.Build.get_by_uuid uuid + >>| get_opt "no build" >>= fun (id, _build) -> + Db.find_opt Builder_db.Build.get_previous id >>| function + | None -> () + | Some (_id, meta) -> + Alcotest.failf "Got unexpected result %a" Uuidm.pp meta.uuid + let test_build_get_by_hash (module Db : CONN) = add_second_build (module Db) >>= fun () -> Db.find_opt Builder_db.Build.get_by_hash main_binary.sha256 @@ -293,6 +309,8 @@ let () = test_case "One build (meta data)" `Quick (with_build_db test_build_get_all_meta); test_case "Get latest build" `Quick (with_build_db test_build_get_latest); test_case "Get build by hash" `Quick (with_build_db test_build_get_by_hash); + test_case "Get previous build" `Quick (with_build_db test_build_get_previous); + test_case "Get previous build when first" `Quick (with_build_db test_build_get_previous_none); ]; "build-artifact", [ test_case "Get all by build" `Quick (with_build_db test_artifact_get_all_by_build);