hydra/src/hydra.sql
Eelco Dolstra e742833da3 * Get rid of "positive failures" and separate log phases.
* Specifically log, for a build, whether the top-level derivation
  failed, or some dependency failed, or Nix itself barfed.  In the
  latter case log the error output from Nix.
2008-11-25 00:38:16 +00:00

226 lines
7.5 KiB
SQL

-- This table contains all builds, either scheduled or finished. For
-- scheduled builds, additional info (such as the priority) can be
-- found in the BuildSchedulingInfo table. For finished builds,
-- additional info (such as the logs, build products, etc.) can be
-- found in several tables, such as BuildResultInfo and BuildProducts.
create table Builds (
id integer primary key autoincrement not null,
finished integer not null, -- 0 = scheduled, 1 = finished
timestamp integer not null, -- time this build was scheduled / finished building
-- Info about the inputs.
project text not null, -- !!! foreign key
jobset text not null, -- !!! foreign key
attrName text not null,
-- Info about the build result.
nixName text, -- name attribute of the derivation
description text,
drvPath text not null,
outPath text not null,
system text not null,
foreign key (project) references Projects(name), -- ignored by sqlite
foreign key (project, jobset) references Jobsets(project, name) -- ignored by sqlite
);
-- Info for a scheduled build.
create table BuildSchedulingInfo (
id integer primary key not null,
priority integer not null default 0,
busy integer not null default 0, -- true means someone is building this job now
locker text not null default '', -- !!! hostname/pid of the process building this job?
logfile text, -- if busy, the path of the logfile
foreign key (id) references Builds(id) on delete cascade -- ignored by sqlite
);
-- Info for a finished build.
create table BuildResultInfo (
id integer primary key not null,
isCachedBuild integer not null, -- boolean
-- Status codes:
-- 0 = succeeded
-- 1 = build of this derivation failed
-- 2 = build of some dependency failed
-- 3 = other failure (see errorMsg)
buildStatus integer,
errorMsg text, -- error message in case of a Nix failure
startTime integer, -- in Unix time, 0 = used cached build result
stopTime integer,
logfile text, -- the path of the logfile
foreign key (id) references Builds(id) on delete cascade -- ignored by sqlite
);
create table BuildSteps (
id integer not null,
stepnr integer not null,
type integer not null, -- 0 = build, 1 = substitution
drvPath text,
outPath text,
logfile text,
busy integer not null,
status integer,
errorMsg text,
startTime integer, -- in Unix time, 0 = used cached build result
stopTime integer,
primary key (id, stepnr),
foreign key (id) references Builds(id) on delete cascade -- ignored by sqlite
);
-- Inputs of builds.
create table BuildInputs (
id integer primary key autoincrement not null,
-- Which build this input belongs to.
build integer,
-- Copied from the jobsetinputs from which the build was created.
name text not null,
type text not null,
uri text,
revision integer,
tag text,
value text,
dependency integer, -- build ID of the input, for type == 'build'
path text,
sha256hash text,
foreign key (build) references Builds(id) on delete cascade, -- ignored by sqlite
foreign key (dependency) references Builds(id) -- ignored by sqlite
);
create table BuildProducts (
build integer not null,
productnr integer not null,
type text not null, -- "nix-build", "file", "doc", "report", ...
subtype text not null, -- "source-dist", "rpm", ...
fileSize integer,
sha1hash text,
sha256hash text,
path text,
name text not null, -- generally just the filename part of `path'
description text, -- optionally, some description of this file/directory
primary key (build, productnr),
foreign key (build) references Builds(id) on delete cascade -- ignored by sqlite
);
-- Emulate "on delete cascade" foreign key constraints.
create trigger cascadeBuildDeletion
before delete on Builds
for each row begin
delete from BuildSchedulingInfo where id = old.id;
delete from BuildResultInfo where id = old.id;
delete from BuildInputs where build = old.id;
delete from BuildProducts where build = old.id;
end;
create table Projects (
name text primary key not null, -- project id, lowercase (e.g. "patchelf")
displayName text not null, -- display name (e.g. "PatchELF")
description text,
enabled integer not null default 1
);
create trigger cascadeProjectUpdate
update of name on Projects
for each row begin
update Jobsets set project = new.name where project = old.name;
update JobsetInputs set project = new.name where project = old.name;
update JobsetInputAlts set project = new.name where project = old.name;
update Builds set project = new.name where project = old.name;
end;
-- A jobset consists of a set of inputs (e.g. SVN repositories), one
-- of which contains a Nix expression containing an attribute set
-- describing build jobs.
create table Jobsets (
name text not null,
project text not null,
description text,
nixExprInput text not null, -- name of the jobsetInput containing the Nix expression
nixExprPath text not null, -- relative path of the Nix expression
primary key (project, name),
foreign key (project) references Projects(name) on delete cascade, -- ignored by sqlite
foreign key (project, name, nixExprInput) references JobsetInputs(project, job, name)
);
create trigger cascadeJobsetUpdate
update of name on Jobsets
for each row begin
update JobsetInputs set jobset = new.name where project = old.project and jobset = old.name;
update JobsetInputAlts set jobset = new.name where project = old.project and jobset = old.name;
update Builds set jobset = new.name where project = old.project and jobset = old.name;
end;
create table JobsetInputs (
project text not null,
jobset text not null,
name text not null,
type text not null, -- "svn", "cvs", "path", "uri", "string"
primary key (project, jobset, name),
foreign key (project, jobset) references Jobsets(project, name) on delete cascade -- ignored by sqlite
);
create trigger cascadeJobsetInputUpdate
update of name on JobsetInputs
for each row begin
update JobsetInputAlts set input = new.name where project = old.project and jobset = old.jobset and input = old.name;
end;
create trigger cascadeJobsetInputDelete
before delete on JobsetInputs
for each row begin
delete from JobsetInputAlts where project = old.project and jobset = old.jobset and input = old.name;
end;
create table JobsetInputAlts (
project text not null,
jobset text not null,
input text not null,
altnr integer not null,
-- urgh
value text, -- for most types, a URI; for 'path', an absolute path; for 'string', an arbitrary value
revision integer, -- for type == 'svn'
tag text, -- for type == 'cvs'
primary key (project, jobset, input, altnr),
foreign key (project, jobset, input) references JobsetInputs(project, jobset, name) on delete cascade -- ignored by sqlite
);