summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathieu Lirzin <mthl@gnu.org>2016-11-13 01:54:41 +0100
committerMathieu Lirzin <mthl@gnu.org>2016-11-17 01:19:05 +0100
commitbfd395c09fc2eae6b777ef775584337f26861877 (patch)
treefe8767f333603bd4fc1b656e596673ab52dd39dd
parenta948f556eb5e58f31aafa81e7e2125a6a1f91d7b (diff)
downloadcuirass-bfd395c09fc2eae6b777ef775584337f26861877.tar
cuirass-bfd395c09fc2eae6b777ef775584337f26861877.tar.gz
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.
-rw-r--r--src/cuirass/database.scm9
-rw-r--r--src/schema.sql11
-rw-r--r--tests/database.scm3
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")