From 8d40c49170971ad7bbf8b97336934dbb3d949fc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Lassieur?= Date: Sat, 11 Aug 2018 20:30:11 +0200 Subject: database: Add a Checkouts table. It is used to know when a new evaluation must be triggered and to display input changes. * Makefile.am (dist_sql_DATA): Add 'src/sql/upgrade-3.sql'. * bin/cuirass.in (main): Call DB-SET-EVALUATION-DONE at startup to clear 'in-progress' evaluations. * bin/evaluate.in (input-checkout, format-checkouts): Rename '#:name' to '#:input'. * doc/cuirass.texi (Stamps): Remove section. (Checkouts): New section. * src/cuirass/base.scm (fetch-input, fetch-inputs, compile-checkouts): Rename '#:name' to '#:input'. (evaluate): Remove the COMMITS argument. Add an EVAL-ID argument. Don't call DB-ADD-EVALUATION because it was called sooner. Remove the EVAL-ID argument to AUGMENT-JOB because it's a closure. (build-packages): Add an EVAL-ID argument. Call DB-SET-EVALUATION-DONE once all the derivations are registered. (process-specs): Replace the stamping mechanism by the primary key constraint of the Checkouts table: call "evaluate" only when DB-ADD-EVALUATION is true, which means that at least one checkout was added. Change the EVALUATE and BUILD-PACKAGES arguments accordingly. * src/cuirass/database.scm (db-add-stamp, db-get-stamp): Remove procedures. (db-set-evaluations-done, db-set-evaluation-done): New exported procedure. (db-add-checkout): New procedure that returns #f if a checkout with the same revision already exists. (db-add-evaluation): Replace the EVAL argument with a SPEC-NAME and a CHECKOUTS arguments. Insert the evaluation only if at least one checkout was inserted. Return #f otherwise. (db-get-checkouts): New procedure. (db-get-evaluations, db-get-evaluations-build-summary): Handle the 'in_progress' column, remove the 'commits' column. Return the result of DB-GET-CHECKOUTS as part of the evaluation. * src/cuirass/templates.scm (input-changes, evaluation-badges): New procedures. (evaluation-info-table): Rename "Commits" to "Input changes". Use INPUT-CHANGES to display the input changes that triggered the evaluation. Use EVALUATION-BADGES to display a message indicating that the evaluation is in progress. * src/schema.sql (Stamps): Remove table. (Checkouts): New table. (Evaluations): Remove the 'commits' column. Add an 'in_progress' column. * src/sql/upgrade-3.sql: New file with SQL queries to upgrade the database. * tests/database.scm (make-dummy-eval): Remove procedure. (make-dummy-checkouts): New procedure. ("sqlite-exec"): Remove the 'commits' column. Add the 'in_progress' column. ("db-update-build-status!", "db-get-builds", "db-get-pending-derivations"): Update the arguments of DB-ADD-EVALUATION accordingly. * tests/http.scm (hash-table=?): Add support for lists of hash tables. (evaluations-query-result): Replace '#:commits' with '#:checkouts'. Return a list instead of returning one element, for symmetry. ("fill-db"): Add a new input so that the second checkout can refer to it. Replace EVALUATION1 and EVALUATION2 with CHECKOUTS1 and CHECKOUTS2. Update the arguments of DB-ADD-EVALUATION accordingly. ("/api/queue?nr=100"): Take the CAR of the EVALUATIONS-QUERY-RESULT list to make it symmetrical with the other argument of HASH-TABLE=?. --- src/sql/upgrade-3.sql | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/sql/upgrade-3.sql (limited to 'src/sql') diff --git a/src/sql/upgrade-3.sql b/src/sql/upgrade-3.sql new file mode 100644 index 0000000..8e4a1bd --- /dev/null +++ b/src/sql/upgrade-3.sql @@ -0,0 +1,46 @@ +BEGIN TRANSACTION; + +ALTER TABLE Evaluations RENAME TO tmp_Evaluations; + +CREATE TABLE Evaluations ( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + specification TEXT NOT NULL, + in_progress INTEGER NOT NULL, + FOREIGN KEY (specification) REFERENCES Specifications (name) +); + +CREATE TABLE Checkouts ( + specification TEXT NOT NULL, + revision TEXT NOT NULL, + evaluation INTEGER NOT NULL, + input TEXT NOT NULL, + directory TEXT NOT NULL, + PRIMARY KEY (specification, revision), + FOREIGN KEY (evaluation) REFERENCES Evaluations (id), + FOREIGN KEY (specification) REFERENCES Specifications (name), + FOREIGN KEY (input) REFERENCES Inputs (name) +); + +INSERT INTO Evaluations (id, specification, in_progress) +SELECT id, specification, false +FROM tmp_Evaluations; + +-- Copied from https://www.samuelbosch.com/2018/02/split-into-rows-sqlite.html. +INSERT OR IGNORE INTO Checkouts (specification, revision, evaluation, input, directory) +WITH RECURSIVE split(id, specification, revision, rest) AS ( + SELECT id, specification, '', commits || ' ' FROM tmp_Evaluations + UNION ALL + SELECT id, + specification, + substr(rest, 0, instr(rest, ' ')), + substr(rest, instr(rest, ' ') + 1) + FROM split + WHERE rest <> '') +SELECT specification, revision, id, 'unknown', 'unknown' + FROM split + WHERE revision <> ''; + +DROP TABLE tmp_Evaluations; +DROP TABLE Stamps; + +COMMIT; -- cgit v1.2.3