aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libstore/db.cc28
-rw-r--r--src/libstore/db.hh2
-rw-r--r--src/libstore/store.cc6
3 files changed, 31 insertions, 5 deletions
diff --git a/src/libstore/db.cc b/src/libstore/db.cc
index 74c933d0e..7ded82ef1 100644
--- a/src/libstore/db.cc
+++ b/src/libstore/db.cc
@@ -292,11 +292,12 @@ void Database::close()
try {
for (map<TableId, Db *>::iterator i = tables.begin();
- i != tables.end(); i++)
+ i != tables.end(); )
{
- Db * db = i->second;
- db->close(DB_NOSYNC);
- delete db;
+ map<TableId, Db *>::iterator j = i;
+ ++j;
+ closeTable(i->first);
+ i = j;
}
/* Do a checkpoint every 128 kilobytes, or every 5 minutes. */
@@ -336,6 +337,25 @@ TableId Database::openTable(const string & tableName, bool sorted)
}
+void Database::closeTable(TableId table)
+{
+ try {
+ Db * db = getDb(table);
+ db->close(DB_NOSYNC);
+ delete db;
+ tables.erase(table);
+ } catch (DbException e) { rethrow(e); }
+}
+
+
+void Database::deleteTable(const string & table)
+{
+ try {
+ env->dbremove(0, table.c_str(), 0, DB_AUTO_COMMIT);
+ } catch (DbException e) { rethrow(e); }
+}
+
+
bool Database::queryString(const Transaction & txn, TableId table,
const string & key, string & data)
{
diff --git a/src/libstore/db.hh b/src/libstore/db.hh
index b7ebd4467..dd7d76b8c 100644
--- a/src/libstore/db.hh
+++ b/src/libstore/db.hh
@@ -65,6 +65,8 @@ public:
void close();
TableId openTable(const string & table, bool sorted = false);
+ void closeTable(TableId table);
+ void deleteTable(const string & table);
bool queryString(const Transaction & txn, TableId table,
const string & key, string & data);
diff --git a/src/libstore/store.cc b/src/libstore/store.cc
index fbbf12269..db12ba2d5 100644
--- a/src/libstore/store.cc
+++ b/src/libstore/store.cc
@@ -1034,8 +1034,12 @@ static void upgradeStore09()
nixDB.setString(txn, dbReferrers, addPrefix(*i, *j), "");
cerr << ".";
}
-
+
cerr << "\n";
txn.commit();
+
+ nixDB.closeTable(dbReferers);
+
+ nixDB.deleteTable("referers");
}