Fix mdb_drop

if it was the only operation in a txn, it would be ignored.
vmware
Howard Chu 12 years ago
parent 0c4c6fe72a
commit cd228b4722
  1. 13
      libraries/libmdb/mdb.c

@ -6696,6 +6696,7 @@ int mdb_drop(MDB_txn *txn, MDB_dbi dbi, int del)
if (!rc) if (!rc)
mdb_close(txn->mt_env, dbi); mdb_close(txn->mt_env, dbi);
} else { } else {
/* reset the DB record, mark it dirty */
txn->mt_dbflags[dbi] |= DB_DIRTY; txn->mt_dbflags[dbi] |= DB_DIRTY;
txn->mt_dbs[dbi].md_depth = 0; txn->mt_dbs[dbi].md_depth = 0;
txn->mt_dbs[dbi].md_branch_pages = 0; txn->mt_dbs[dbi].md_branch_pages = 0;
@ -6703,6 +6704,18 @@ int mdb_drop(MDB_txn *txn, MDB_dbi dbi, int del)
txn->mt_dbs[dbi].md_overflow_pages = 0; txn->mt_dbs[dbi].md_overflow_pages = 0;
txn->mt_dbs[dbi].md_entries = 0; txn->mt_dbs[dbi].md_entries = 0;
txn->mt_dbs[dbi].md_root = P_INVALID; txn->mt_dbs[dbi].md_root = P_INVALID;
{
MDB_cursor m2;
MDB_val key;
/* make sure last page of freeDB is touched and on freelist
* otherwise if there are no other dirty pages in this txn,
* these changes will be ignored.
*/
key.mv_size = MAXKEYSIZE+1;
key.mv_data = NULL;
mdb_cursor_init(&m2, txn, FREE_DBI, NULL);
mdb_page_search(&m2, &key, MDB_PS_MODIFY);
}
} }
leave: leave:
mdb_cursor_close(mc); mdb_cursor_close(mc);

Loading…
Cancel
Save