about summary refs log tree commit diff
path: root/src/libstore/db.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore/db.cc')
-rw-r--r--src/libstore/db.cc28
1 files changed, 24 insertions, 4 deletions
diff --git a/src/libstore/db.cc b/src/libstore/db.cc
index 74c933d0e687..7ded82ef1fe8 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)
 {