* Put the derivation outputs in the database. This is useful for the

garbage collector.
This commit is contained in:
Eelco Dolstra 2010-02-22 11:15:50 +00:00
parent 1930570ad9
commit 299ff64812
3 changed files with 35 additions and 2 deletions

View file

@ -3,9 +3,9 @@
#include "globals.hh" #include "globals.hh"
#include "archive.hh" #include "archive.hh"
#include "pathlocks.hh" #include "pathlocks.hh"
#include "aterm.hh"
#include "derivations-ast.hh" #include "derivations-ast.hh"
#include "worker-protocol.hh" #include "worker-protocol.hh"
#include "derivations.hh"
#include <iostream> #include <iostream>
#include <algorithm> #include <algorithm>
@ -295,6 +295,8 @@ void LocalStore::prepareStatements()
"insert into FailedPaths (path, time) values (?, ?);"); "insert into FailedPaths (path, time) values (?, ?);");
stmtHasPathFailed.create(db, stmtHasPathFailed.create(db,
"select time from FailedPaths where path = ?;"); "select time from FailedPaths where path = ?;");
stmtAddDerivationOutput.create(db,
"insert or replace into DerivationOutputs (drv, id, path) values (?, ?, ?);");
} }
@ -397,7 +399,27 @@ unsigned long long LocalStore::addValidPath(const ValidPathInfo & info)
stmtRegisterValidPath.bind(); // null stmtRegisterValidPath.bind(); // null
if (sqlite3_step(stmtRegisterValidPath) != SQLITE_DONE) if (sqlite3_step(stmtRegisterValidPath) != SQLITE_DONE)
throw SQLiteError(db, format("registering valid path `%1%' in database") % info.path); throw SQLiteError(db, format("registering valid path `%1%' in database") % info.path);
return sqlite3_last_insert_rowid(db); unsigned long long id = sqlite3_last_insert_rowid(db);
/* If this is a derivation, then store the derivation outputs in
the database. This is useful for the garbage collector: it can
efficiently query whether a path is an output of some
derivation. */
if (isDerivation(info.path)) {
ATerm t = ATreadFromNamedFile(info.path.c_str());
if (!t) throw Error(format("cannot read derivation `%1%'") % info.path);
Derivation drv = parseDerivation(t);
foreach (DerivationOutputs::iterator, i, drv.outputs) {
SQLiteStmtUse use(stmtAddDerivationOutput);
stmtAddDerivationOutput.bind(id);
stmtAddDerivationOutput.bind(i->first);
stmtAddDerivationOutput.bind(i->second.path);
if (sqlite3_step(stmtAddDerivationOutput) != SQLITE_DONE)
throw SQLiteError(db, format("adding derivation output for `%1%' in database") % info.path);
}
}
return id;
} }

View file

@ -198,6 +198,7 @@ private:
SQLiteStmt stmtInvalidatePath; SQLiteStmt stmtInvalidatePath;
SQLiteStmt stmtRegisterFailedPath; SQLiteStmt stmtRegisterFailedPath;
SQLiteStmt stmtHasPathFailed; SQLiteStmt stmtHasPathFailed;
SQLiteStmt stmtAddDerivationOutput;
int getSchema(); int getSchema();

View file

@ -17,6 +17,16 @@ create table if not exists Refs (
create index if not exists IndexReferrer on Refs(referrer); create index if not exists IndexReferrer on Refs(referrer);
create index if not exists IndexReference on Refs(reference); create index if not exists IndexReference on Refs(reference);
create table if not exists DerivationOutputs (
drv integer not null,
id text not null, -- symbolic output id, usually "out"
path text not null,
primary key (drv, id),
foreign key (drv) references ValidPaths(id) on delete cascade
);
create index if not exists IndexDerivationOutputs on DerivationOutputs(path);
create table if not exists FailedPaths ( create table if not exists FailedPaths (
path text primary key not null, path text primary key not null,
time integer not null time integer not null