about summary refs log tree commit diff
path: root/src/store.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/store.cc')
-rw-r--r--src/store.cc52
1 files changed, 38 insertions, 14 deletions
diff --git a/src/store.cc b/src/store.cc
index b2b479e0ddaa..de1dcca7082e 100644
--- a/src/store.cc
+++ b/src/store.cc
@@ -81,26 +81,50 @@ void copyPath(const Path & src, const Path & dst)
 }
 
 
+void registerSuccessor(const Transaction & txn,
+    const Path & path1, const Path & path2)
+{
+    Path known;
+    if (nixDB.queryString(txn, dbSuccessors, path1, known) &&
+        known != path2)
+    {
+        throw Error(format(
+            "the `impossible' happened: expression in path "
+            "`%1%' appears to have multiple successors "
+            "(known `%2%', new `%3%'")
+            % path1 % known % path2);
+    }
+
+    Paths revs;
+    nixDB.queryStrings(txn, dbSuccessorsRev, path2, revs);
+    revs.push_back(path1);
+
+    nixDB.setString(txn, dbSuccessors, path1, path2);
+    nixDB.setStrings(txn, dbSuccessorsRev, path2, revs);
+}
+
+
 void registerSubstitute(const Path & srcPath, const Path & subPath)
 {
-#if 0
-    Strings subs;
-    queryListDB(nixDB, dbSubstitutes, srcId, subs); /* non-existence = ok */
+    Transaction txn(nixDB);
 
-    for (Strings::iterator it = subs.begin(); it != subs.end(); it++)
-        if (parseHash(*it) == subId) return;
-    
-    subs.push_back(subId);
-    
-    setListDB(nixDB, dbSubstitutes, srcId, subs);
-#endif
+    Paths subs;
+    nixDB.queryStrings(txn, dbSubstitutes, srcPath, subs);
 
-    /* For now, accept only one substitute per id. */
-    Strings subs;
-    subs.push_back(subPath);
+    if (find(subs.begin(), subs.end(), subPath) != subs.end()) {
+        /* Nothing to do if the substitute is already known. */
+        txn.abort();
+        return;
+    }
+    subs.push_front(subPath); /* new substitutes take precedence */
+
+    Paths revs;
+    nixDB.queryStrings(txn, dbSubstitutesRev, subPath, revs);
+    revs.push_back(srcPath);
     
-    Transaction txn(nixDB);
     nixDB.setStrings(txn, dbSubstitutes, srcPath, subs);
+    nixDB.setStrings(txn, dbSubstitutesRev, subPath, revs);
+
     txn.commit();
 }