More subDB fixes

vmware
Howard Chu 13 years ago
parent 39817f6e85
commit 40df306d52
  1. 7
      libraries/libmdb/mdb.c
  2. 9
      libraries/libmdb/mdb_stat.c

@ -821,7 +821,7 @@ mdb_txn_commit(MDB_txn *txn)
for (i = 2; i < txn->mt_numdbs; i++) { for (i = 2; i < txn->mt_numdbs; i++) {
if (txn->mt_dbxs[i].md_dirty) { if (txn->mt_dbxs[i].md_dirty) {
data.mv_data = &txn->mt_dbs[i]; data.mv_data = &txn->mt_dbs[i];
mdb_put0(txn, i, &txn->mt_dbxs[i].md_name, &data, 0); mdb_put0(txn, MAIN_DBI, &txn->mt_dbxs[i].md_name, &data, 0);
} }
} }
} }
@ -2987,7 +2987,6 @@ mdb_put0(MDB_txn *txn, MDB_dbi dbi,
if (SIZELEFT(mpp.mp_page) < mdb_leaf_size(txn->mt_env, key, data)) { if (SIZELEFT(mpp.mp_page) < mdb_leaf_size(txn->mt_env, key, data)) {
rc = mdb_split(txn, dbi, &mpp.mp_page, &ki, key, data, P_INVALID); rc = mdb_split(txn, dbi, &mpp.mp_page, &ki, key, data, P_INVALID);
leaf = NODEPTR(mpp.mp_page, ki);
} else { } else {
/* There is room already in this leaf page. */ /* There is room already in this leaf page. */
rc = mdb_add_node(txn, dbi, mpp.mp_page, ki, key, data, 0, 0); rc = mdb_add_node(txn, dbi, mpp.mp_page, ki, key, data, 0, 0);
@ -2999,8 +2998,10 @@ mdb_put0(MDB_txn *txn, MDB_dbi dbi,
txn->mt_dbs[dbi].md_entries++; txn->mt_dbs[dbi].md_entries++;
/* Remember if we just added a subdatabase */ /* Remember if we just added a subdatabase */
if (flags & F_SUBDATA) if (flags & F_SUBDATA) {
leaf = NODEPTR(mpp.mp_page, ki);
leaf->mn_flags |= F_SUBDATA; leaf->mn_flags |= F_SUBDATA;
}
/* Now store the actual data in the child DB. Note that we're /* Now store the actual data in the child DB. Note that we're
* storing the user data in the keys field, so there are strict * storing the user data in the keys field, so there are strict

@ -26,10 +26,13 @@ int main(int argc,char * argv[])
char *envname = argv[1]; char *envname = argv[1];
char *subname = NULL; char *subname = NULL;
if (argc > 2)
subname = argv[2];
rc = mdbenv_create(&env); rc = mdbenv_create(&env);
if (argc > 2) {
mdbenv_set_maxdbs(env, 4);
subname = argv[2];
}
rc = mdbenv_open(env, envname, MDB_RDONLY, 0); rc = mdbenv_open(env, envname, MDB_RDONLY, 0);
if (rc) { if (rc) {
printf("mdbenv_open failed, error %d\n", rc); printf("mdbenv_open failed, error %d\n", rc);

Loading…
Cancel
Save