diff --git a/src/libstore/db.cc b/src/libstore/db.cc index 74c933d0e6..7ded82ef1f 100644 --- a/src/libstore/db.cc +++ b/src/libstore/db.cc @@ -292,11 +292,12 @@ void Database::close() try { for (map::iterator i = tables.begin(); - i != tables.end(); i++) + i != tables.end(); ) { - Db * db = i->second; - db->close(DB_NOSYNC); - delete db; + map::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 b7ebd44679..dd7d76b8ce 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 fbbf12269a..db12ba2d53 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"); }