aboutsummaryrefslogtreecommitdiff
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 bffefbaa7..4378f0ba6 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");
+}
+
+
}