From bfd395c09fc2eae6b777ef775584337f26861877 Mon Sep 17 00:00:00 2001 From: Mathieu Lirzin Date: Sun, 13 Nov 2016 01:54:41 +0100 Subject: [PATCH] db: Forbid inserting the same specification twice. * src/schema.sql (Specifications): Make 'repo_name' the primary key. (Stamps, Evaluations): Adapt. * src/cuirass/database.scm (db-get-specifications): Likewise. (db-add-specification): Ignore if SPEC has already been added. * tests/database.scm (example-spec): Adapt. --- src/cuirass/database.scm | 9 ++++----- src/schema.sql | 11 +++++------ tests/database.scm | 3 +-- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/cuirass/database.scm b/src/cuirass/database.scm index f1505e8..870cdc0 100644 --- a/src/cuirass/database.scm +++ b/src/cuirass/database.scm @@ -115,8 +115,8 @@ database object." (define (db-add-specification db spec) "Store specification SPEC in database DB and return its ID." (apply sqlite-exec db "\ -INSERT INTO Specifications (repo_name, url, load_path, file, proc, arguments, \ - branch, tag, revision, no_compile_p) \ +INSERT OR IGNORE INTO Specifications (repo_name, url, load_path, file, \ + proc, arguments, branch, tag, revision, no_compile_p) \ VALUES ('~A', '~A', '~A', '~A', '~S', '~S', '~A', '~A', '~A', ~A);" (append (assq-refs spec '(#:name #:url #:load-path #:file #:proc #:arguments)) @@ -129,11 +129,10 @@ INSERT INTO Specifications (repo_name, url, load_path, file, proc, arguments, \ (specs '())) (match rows (() specs) - ((#(id name url load-path file proc args branch tag rev no-compile?) + ((#(name url load-path file proc args branch tag rev no-compile?) . rest) (loop rest - (cons `((#:id . ,id) - (#:name . ,name) + (cons `((#:name . ,name) (#:url . ,url) (#:load-path . ,load-path) (#:file . ,file) diff --git a/src/schema.sql b/src/schema.sql index f8042d1..4aeebb7 100644 --- a/src/schema.sql +++ b/src/schema.sql @@ -1,8 +1,7 @@ BEGIN TRANSACTION; CREATE TABLE Specifications ( - id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - repo_name TEXT NOT NULL, + repo_name TEXT NOT NULL PRIMARY KEY, url TEXT NOT NULL, load_path TEXT NOT NULL, file TEXT NOT NULL, @@ -16,16 +15,16 @@ CREATE TABLE Specifications ( ); CREATE TABLE Stamps ( - specification INTEGER NOT NULL PRIMARY KEY, + specification TEXT NOT NULL PRIMARY KEY, stamp TEXT NOT NULL, - FOREIGN KEY (specification) REFERENCES Specifications (id) + FOREIGN KEY (specification) REFERENCES Specifications (repo_name) ); CREATE TABLE Evaluations ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - specification INTEGER NOT NULL, + specification TEXT NOT NULL, revision TEXT NOT NULL, - FOREIGN KEY (specification) REFERENCES Specifications (id) + FOREIGN KEY (specification) REFERENCES Specifications (repo_name) ); CREATE TABLE Derivations ( diff --git a/tests/database.scm b/tests/database.scm index 2dd3746..7f3b972 100644 --- a/tests/database.scm +++ b/tests/database.scm @@ -21,8 +21,7 @@ (srfi srfi-64)) (define example-spec - '((#:id . 1) - (#:name . "guix") + '((#:name . "guix") (#:url . "git://git.savannah.gnu.org/guix.git") (#:load-path . ".") (#:file . "/tmp/gnu-system.scm")