Add mdb_get for sorted dups

vmware
Howard Chu 13 years ago
parent e3703ab58c
commit f48f085ed8
  1. 23
      libraries/libmdb/mdb.c

@ -385,6 +385,10 @@ static int mdb_cursor_first(MDB_cursor *cursor,
static int mdb_cursor_last(MDB_cursor *cursor, static int mdb_cursor_last(MDB_cursor *cursor,
MDB_val *key, MDB_val *data); MDB_val *key, MDB_val *data);
static void mdb_xcursor_init0(MDB_txn *txn, MDB_dbi dbi, MDB_xcursor *mx);
static void mdb_xcursor_init1(MDB_txn *txn, MDB_dbi dbi, MDB_xcursor *mx, MDB_db *db);
static void mdb_xcursor_fini(MDB_txn *txn, MDB_dbi dbi, MDB_xcursor *mx);
static size_t mdb_leaf_size(MDB_env *env, MDB_val *key, static size_t mdb_leaf_size(MDB_env *env, MDB_val *key,
MDB_val *data); MDB_val *data);
static size_t mdb_branch_size(MDB_env *env, MDB_val *key); static size_t mdb_branch_size(MDB_env *env, MDB_val *key);
@ -1472,6 +1476,8 @@ mdb_get_page(MDB_txn *txn, pgno_t pgno)
} }
} }
if (!found) { if (!found) {
if (pgno > txn->mt_env->me_meta->mm_last_pg)
return NULL;
p = (MDB_page *)(txn->mt_env->me_map + txn->mt_env->me_psize * pgno); p = (MDB_page *)(txn->mt_env->me_map + txn->mt_env->me_psize * pgno);
} }
return p; return p;
@ -1653,9 +1659,20 @@ mdb_get(MDB_txn *txn, MDB_dbi dbi,
return rc; return rc;
leaf = mdb_search_node(txn, dbi, mpp.mp_page, key, &exact, NULL); leaf = mdb_search_node(txn, dbi, mpp.mp_page, key, &exact, NULL);
if (leaf && exact) if (leaf && exact) {
/* Return first duplicate data item */
if (F_ISSET(txn->mt_dbs[dbi].md_flags, MDB_DUPSORT)) {
MDB_xcursor mx;
mdb_xcursor_init0(txn, dbi, &mx);
mdb_xcursor_init1(txn, dbi, &mx, NODEDATA(leaf));
rc = mdb_search_page(&mx.mx_txn, mx.mx_txn.mt_numdbs-1, NULL, NULL, 0, &mpp);
if (rc != MDB_SUCCESS)
return rc;
leaf = NODEPTR(mpp.mp_page, 0);
}
rc = mdb_read_data(txn, leaf, data); rc = mdb_read_data(txn, leaf, data);
else { } else {
rc = ENOENT; rc = ENOENT;
} }
@ -2607,7 +2624,7 @@ mdb_del(MDB_txn *txn, MDB_dbi dbi,
parent = SLIST_NEXT(top, mp_entry); parent = SLIST_NEXT(top, mp_entry);
} else { } else {
ni = NODEPTR(parent->mp_page, parent->mp_ki); ni = NODEPTR(parent->mp_page, parent->mp_ki);
top = mdb_get_page(mc.mc_txn, ni->mn_pgno); top->mp_page = mdb_get_page(mc.mc_txn, ni->mn_pgno);
} }
} }
} }

Loading…
Cancel
Save