about summary refs log tree commit diff
path: root/src/libstore/local-store.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore/local-store.cc')
-rw-r--r--src/libstore/local-store.cc32
1 files changed, 30 insertions, 2 deletions
diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc
index bffefbaa780e..4378f0ba6101 100644
--- a/src/libstore/local-store.cc
+++ b/src/libstore/local-store.cc
@@ -58,6 +58,7 @@ static TableId dbDerivers = 0;
 
 static void upgradeStore07();
 static void upgradeStore09();
+static void upgradeStore11();
 
 
 void checkStoreNotSymlink()
@@ -131,6 +132,8 @@ LocalStore::LocalStore(bool reserveSpace)
             upgradeStore07();
         if (curSchema == 2)
             upgradeStore09();
+        if (curSchema == 3)
+            upgradeStore11();
         writeFile(schemaFN, (format("%1%") % nixSchemaVersion).str());
     }
 }
@@ -1042,10 +1045,10 @@ static void upgradeStore09()
 {
     /* !!! we should disallow concurrent upgrades */
     
-    printMsg(lvlError, "upgrading Nix store to new schema (this may take a while)...");
-
     if (!pathExists(nixDBPath + "/referers")) return;
 
+    printMsg(lvlError, "upgrading Nix store to new schema (this may take a while)...");
+
     Transaction txn(nixDB);
 
     std::cerr << "converting referers to referrers...";
@@ -1082,4 +1085,29 @@ static void upgradeStore09()
 }
 
  
+/* Upgrade from schema 3 (Nix 0.10) to schema 4 (Nix >= 0.11).  The
+   only thing to do here is to delete the substitutes table and get
+   rid of invalid but substitutable references/referrers.  */
+static void upgradeStore11()
+{
+    if (!pathExists(nixDBPath + "/substitutes")) return;
+
+    printMsg(lvlError, "upgrading Nix store to new schema (this may take a while)...");
+
+    Transaction txn(nixDB);
+    TableId dbSubstitutes = nixDB.openTable("substitutes");
+
+    Paths subKeys;
+    nixDB.enumTable(txn, dbSubstitutes, subKeys);
+    for (Paths::iterator i = subKeys.begin(); i != subKeys.end(); ++i) {
+        if (!isValidPathTxn(txn, *i))
+            invalidatePath(txn, *i);
+    }
+    
+    txn.commit();
+    nixDB.closeTable(dbSubstitutes);
+    nixDB.deleteTable("substitutes");
+}
+
+
 }