From 46c9d432eaa86d1733fd9a4c67f2302e072d6f8a Mon Sep 17 00:00:00 2001 From: Mathieu Lirzin Date: Sat, 16 Jul 2016 18:16:39 +0200 Subject: [PATCH] database: Use an external SQL schema. --- Makefile.am | 2 ++ build-aux/pre-inst-env.in | 3 +++ configure.ac | 10 ++++---- src/cuirass/config.scm.in | 4 ++++ src/cuirass/database.scm | 49 ++++++++++++++++++--------------------- src/schema.sql | 18 ++++++++++++++ 6 files changed, 56 insertions(+), 30 deletions(-) create mode 100644 src/schema.sql diff --git a/Makefile.am b/Makefile.am index 85cac05..438dcdc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -14,6 +14,8 @@ nodist_pkgmodule_DATA = \ src/cuirass/config.scm \ src/cuirass/config.go +dist_pkgdata_DATA = src/schema.sql + TEST_EXTENSIONS = .scm .sh AM_TESTS_ENVIRONMENT = \ env GUILE_AUTO_COMPILE='0' \ diff --git a/build-aux/pre-inst-env.in b/build-aux/pre-inst-env.in index b92a1a1..e8d9487 100644 --- a/build-aux/pre-inst-env.in +++ b/build-aux/pre-inst-env.in @@ -24,6 +24,9 @@ GUILE_LOAD_COMPILED_PATH="$abs_top_builddir/src${GUILE_LOAD_COMPILED_PATH:+:}$GU GUILE_LOAD_PATH="$abs_top_builddir/src:$abs_top_srcdir/src${GUILE_LOAD_PATH:+:}$GUILE_LOAD_PATH" export GUILE_LOAD_COMPILED_PATH GUILE_LOAD_PATH +CUIRASS_DATADIR="$abs_top_srcdir/src" +export CUIRASS_DATADIR + PATH="$abs_top_builddir/bin:$PATH" export PATH diff --git a/configure.ac b/configure.ac index 945260c..61f5d0a 100644 --- a/configure.ac +++ b/configure.ac @@ -8,11 +8,13 @@ AM_SILENT_RULES([yes]) # enables silent rules by default AC_CANONICAL_HOST -# Prepare a version of $localstatedir that does not contain references to -# shell variables. +# Prepare a version of installation directories that does not contain +# references to shell variables. expanded_prefix="`eval echo $prefix | sed -e "s|NONE|/usr/local|g"`" -expanded_localstatedir="`eval echo $localstatedir | sed -e "s|NONE|$expanded_prefix|g"`" -AC_SUBST([expanded_localstatedir]) +AC_SUBST([expanded_datadir], + [`eval echo $datadir | sed -e "s|NONE|$expanded_prefix|g"`]) +AC_SUBST([expanded_localstatedir], + [`eval echo $localstatedir | sed -e "s|NONE|$expanded_prefix|g"`]) PKG_CHECK_MODULES([GUILE], [guile-2.0 >= 2.0.7]) AC_PATH_PROG([GUILE], [guile]) diff --git a/src/cuirass/config.scm.in b/src/cuirass/config.scm.in index 361ccd8..5619168 100644 --- a/src/cuirass/config.scm.in +++ b/src/cuirass/config.scm.in @@ -47,6 +47,10 @@ ;; Define to the version of this package. "@PACKAGE_VERSION@") +(define-public %datadir + ;; Define to DATADIR without reference to '${prefix}'. + "@expanded_datadir@") + (define-public %localstatedir ;; Define to LOCALSTATEDIR without reference to '${prefix}'. "@expanded_localstatedir@") diff --git a/src/cuirass/database.scm b/src/cuirass/database.scm index 88e282c..72c5fd8 100644 --- a/src/cuirass/database.scm +++ b/src/cuirass/database.scm @@ -1,5 +1,4 @@ -;;;; database.scm - store evaluation and build results -;;; +;;; database.scm -- store evaluation and build results ;;; Copyright © 2016 Mathieu Lirzin ;;; ;;; This file is part of Cuirass. @@ -18,8 +17,8 @@ ;;; along with Cuirass. If not, see . (define-module (cuirass database) - #:use-module (cuirass base) #:use-module (cuirass config) + #:use-module (ice-9 rdelim) #:use-module (sqlite3) #:export (;; Procedures. db-init @@ -29,6 +28,7 @@ db-get-evaluation db-delete-evaluation db-add-build-log + read-sql-file ;; Parameters. %package-database ;; Macros. @@ -44,6 +44,24 @@ ;; Define to the database file name of this package. (make-parameter (string-append %localstatedir "/" %package ".db"))) +(define %package-schema-file + ;; Define to the database schema file of this package. + (make-parameter (string-append (or (getenv "CUIRASS_DATADIR") + (string-append %datadir "/" %package)) + "/schema.sql"))) + +(define (read-sql-file file-name) + "Return a list of string containing SQL instructions from FILE-NAME." + (call-with-input-file file-name + (λ (port) + (let loop ((insts '())) + (let ((inst (read-delimited ";" port 'concat))) + (if (or (eof-object? inst) + ;; Don't cons the spaces after the last instructions. + (string-every char-whitespace? inst)) + (reverse! insts) + (loop (cons inst insts)))))))) + (define (db-init) "Open the database to store and read jobs and builds informations. Return a database object." @@ -53,29 +71,8 @@ database object." (delete-file db-name)) (let ((db (sqlite-open db-name (logior SQLITE_OPEN_CREATE SQLITE_OPEN_READWRITE)))) - (for-each (λ (sql) (sqlite-exec db sql)) - '("PRAGMA foreign_keys=OFF;" - "BEGIN TRANSACTION;" - "COMMIT;" - " -CREATE TABLE job_spec ( - name text not null, - url text not null, - branch text not null, - file text not null, - proc text not null, - arguments text not null, - primary key (name) -);" - " -CREATE TABLE build ( - id integer primary key autoincrement not null, - job_spec text not null, - drv text not null, - log text, - output text - -- foreign key (job_spec) references job_spec(name) -);")) + (for-each (λ (sql) (false-if-exception (sqlite-exec db sql))) + (read-sql-file (%package-schema-file))) db))) (define (db-open) diff --git a/src/schema.sql b/src/schema.sql new file mode 100644 index 0000000..9786064 --- /dev/null +++ b/src/schema.sql @@ -0,0 +1,18 @@ +create table job_spec ( + name text not null, + url text not null, + branch text not null, + file text not null, + proc text not null, + arguments text not null, + primary key (name) +); + +create table build ( + id integer primary key autoincrement not null, + job_spec text not null, + drv text not null, + log text, + output text + -- foreign key (job_spec) references job_spec(name) +);