diff --git a/lmdb.h b/lmdb.h index 05c86ed4..4a3d57e7 100644 --- a/lmdb.h +++ b/lmdb.h @@ -341,7 +341,8 @@ typedef void (MDB_rel_func)(MDB_val *item, void *oldptr, void *newptr, void *rel #define MDB_REVERSEKEY 0x02 /** use sorted duplicates */ #define MDB_DUPSORT 0x04 - /** numeric keys in native byte order: either unsigned int or size_t. + /** numeric keys in native byte order, either unsigned int or #mdb_size_t. + * (lmdb expects 32-bit int <= size_t <= 32/64-bit mdb_size_t.) * The keys must all be of the same size. */ #define MDB_INTEGERKEY 0x08 /** with #MDB_DUPSORT, sorted dup items have fixed size */ @@ -1181,7 +1182,8 @@ int mdb_txn_renew(MDB_txn *txn); * keys must be unique and may have only a single data item. *
  • #MDB_INTEGERKEY * Keys are binary integers in native byte order, either unsigned int - * or size_t, and will be sorted as such. + * or #mdb_size_t, and will be sorted as such. + * (lmdb expects 32-bit int <= size_t <= 32/64-bit mdb_size_t.) * The keys must all be of the same size. *
  • #MDB_DUPFIXED * This flag may only be used in combination with #MDB_DUPSORT. This option diff --git a/mdb.c b/mdb.c index ff3188e2..f1995f27 100644 --- a/mdb.c +++ b/mdb.c @@ -5399,10 +5399,8 @@ mdb_page_get(MDB_txn *txn, pgno_t pgno, MDB_page **ret, int *lvl) if (tx2->mt_spill_pgs) { MDB_ID pn = pgno << 1; x = mdb_midl_search(tx2->mt_spill_pgs, pn); - if (x <= tx2->mt_spill_pgs[0] && tx2->mt_spill_pgs[x] == pn) { - p = (MDB_page *)(env->me_map + env->me_psize * pgno); - goto done; - } + if (x <= tx2->mt_spill_pgs[0] && tx2->mt_spill_pgs[x] == pn) + goto mapped; } if (dl[0].mid) { unsigned x = mdb_mid2l_search(dl, pgno); @@ -5415,14 +5413,15 @@ mdb_page_get(MDB_txn *txn, pgno_t pgno, MDB_page **ret, int *lvl) } while ((tx2 = tx2->mt_parent) != NULL); } - if (likely(pgno < txn->mt_next_pgno)) { - level = 0; - p = (MDB_page *)(env->me_map + env->me_psize * pgno); - } else { + if (unlikely(pgno >= txn->mt_next_pgno)) { mdb_debug("page %zu not found", pgno); txn->mt_flags |= MDB_TXN_ERROR; return MDB_PAGE_NOTFOUND; } + level = 0; + +mapped: + p = (MDB_page *)(env->me_map + env->me_psize * pgno); done: *ret = p;