about summary refs log tree commit diff
path: root/src/libstore/build.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2006-11-30T17·43+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2006-11-30T17·43+0000
commite2ef5e07fdc142670f7f3161d3133ff04e99d342 (patch)
treebf724d6af6f7fbe3b388fdfdd40f190da9a8378e /src/libstore/build.cc
parent5f0b9de6d837daf43c6ab26d41c829621c3ca727 (diff)
* Refactoring. There is now an abstract interface class StoreAPI
  containing functions that operate on the Nix store.  One
  implementation is LocalStore, which operates on the Nix store
  directly.  The next step, to enable secure multi-user Nix, is to
  create a different implementation RemoteStore that talks to a
  privileged daemon process that uses LocalStore to perform the actual
  operations.

Diffstat (limited to 'src/libstore/build.cc')
-rw-r--r--src/libstore/build.cc32
1 files changed, 18 insertions, 14 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index 7058bd12b3..a78d5010cb 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -4,7 +4,7 @@
 #include "misc.hh"
 #include "globals.hh"
 #include "gc.hh"
-#include "store.hh"
+#include "local-store.hh"
 #include "db.hh"
 #include "util.hh"
 
@@ -636,7 +636,7 @@ void DerivationGoal::haveStoreExpr()
         return;
     }
 
-    assert(isValidPath(drvPath));
+    assert(store->isValidPath(drvPath));
 
     /* Get the derivation. */
     drv = derivationFromPath(drvPath);
@@ -661,7 +661,7 @@ void DerivationGoal::haveStoreExpr()
          i != invalidOutputs.end(); ++i)
         /* Don't bother creating a substitution goal if there are no
            substitutes. */
-        if (querySubstitutes(noTxn, *i).size() > 0)
+        if (store->querySubstitutes(*i).size() > 0)
             addWaitee(worker.makeSubstitutionGoal(*i));
 
     if (waitees.empty()) /* to prevent hang (no wake-up event) */
@@ -916,7 +916,7 @@ static string makeValidityRegistration(const PathSet & paths,
         s += deriver + "\n";
 
         PathSet references;
-        queryReferences(noTxn, *i, references);
+        store->queryReferences(*i, references);
 
         s += (format("%1%\n") % references.size()).str();
             
@@ -1130,7 +1130,7 @@ bool DerivationGoal::prepareBuild()
         /* Add the relevant output closures of the input derivation
            `*i' as input paths.  Only add the closures of output paths
            that are specified as inputs. */
-        assert(isValidPath(i->first));
+        assert(store->isValidPath(i->first));
         Derivation inDrv = derivationFromPath(i->first);
         for (StringSet::iterator j = i->second.begin();
              j != i->second.end(); ++j)
@@ -1172,7 +1172,7 @@ void DerivationGoal::startBuilder()
          i != drv.outputs.end(); ++i)
     {
         Path path = i->second.path;
-        if (isValidPath(path))
+        if (store->isValidPath(path))
             throw Error(format("obstructed build: path `%1%' exists") % path);
         if (pathExists(path)) {
             debug(format("removing unregistered path `%1%'") % path);
@@ -1259,7 +1259,7 @@ void DerivationGoal::startBuilder()
     for (Strings::iterator i = ss.begin(); i != ss.end(); ) {
         string fileName = *i++;
         Path storePath = *i++;
-        if (!isValidPath(storePath))
+        if (!store->isValidPath(storePath))
             throw Error(format("`exportReferencesGraph' refers to an invalid path `%1%'")
                 % storePath);
         checkStoreName(fileName); /* !!! abuse of this function */
@@ -1630,7 +1630,7 @@ PathSet DerivationGoal::checkPathValidity(bool returnValid)
     PathSet result;
     for (DerivationOutputs::iterator i = drv.outputs.begin();
          i != drv.outputs.end(); ++i)
-        if (isValidPath(i->second.path)) {
+        if (store->isValidPath(i->second.path)) {
             if (returnValid) result.insert(i->second.path);
         } else {
             if (!returnValid) result.insert(i->second.path);
@@ -1718,17 +1718,21 @@ void SubstitutionGoal::init()
     addTempRoot(storePath);
     
     /* If the path already exists we're done. */
-    if (isValidPath(storePath)) {
+    if (store->isValidPath(storePath)) {
         amDone();
         return;
     }
 
+    /* !!! race condition; should get the substitutes and the
+       references in a transaction (in case a clearSubstitutes() is
+       done simultaneously). */
+
     /* Read the substitutes. */
-    subs = querySubstitutes(noTxn, storePath);
+    subs = store->querySubstitutes(storePath);
 
     /* To maintain the closure invariant, we first have to realise the
        paths referenced by this one. */
-    queryReferences(noTxn, storePath, references);
+    store->queryReferences(storePath, references);
 
     for (PathSet::iterator i = references.begin();
          i != references.end(); ++i)
@@ -1752,7 +1756,7 @@ void SubstitutionGoal::referencesValid()
     for (PathSet::iterator i = references.begin();
          i != references.end(); ++i)
         if (*i != storePath) /* ignore self-references */
-            assert(isValidPath(*i));
+            assert(store->isValidPath(*i));
     
     tryNext();
 }
@@ -1796,7 +1800,7 @@ void SubstitutionGoal::tryToRun()
         (format("waiting for lock on `%1%'") % storePath).str());
 
     /* Check again whether the path is invalid. */
-    if (isValidPath(storePath)) {
+    if (store->isValidPath(storePath)) {
         debug(format("store path `%1%' has become valid") % storePath);
         outputLock->setDeletion(true);
         amDone();
@@ -2221,7 +2225,7 @@ void buildDerivations(const PathSet & drvPaths)
 void ensurePath(const Path & path)
 {
     /* If the path is already valid, we're done. */
-    if (isValidPath(path)) return;
+    if (store->isValidPath(path)) return;
 
     Worker worker;
     GoalPtr goal = worker.makeSubstitutionGoal(path);