pthread_key_t me_txkey; /* thread-key for readers */
MDB_dpage *me_dpages;
pgno_t me_free_pgs[MDB_IDL_UM_SIZE];
- ID2 me_dirty_list[MDB_IDL_DB_SIZE];
+ ID2 me_dirty_list[MDB_IDL_UM_SIZE];
LAZY_RWLOCK_DEF(me_dblock);
#ifdef _WIN32
HANDLE me_rmutex; /* Windows mutexes don't reside in shared mem */
}
rc = cursor->mc_txn->mt_dbxs[cursor->mc_dbi].md_cmp(key, &nodekey);
if (rc == 0) {
+ /* Probably happens rarely, but first node on the page
+ * was the one we wanted.
+ */
+ top->mp_ki = 0;
set1:
- /* we're already on the right page */
mpp.mp_page = top->mp_page;
+ if (exactp)
+ *exactp = 1;
rc = 0;
- goto set2;
+ leaf = NODEPTR(top->mp_page, top->mp_ki);
+ goto set3;
}
if (rc > 0) {
unsigned int i;
MDB_SET_KEY(leaf, &nodekey);
}
rc = cursor->mc_txn->mt_dbxs[cursor->mc_dbi].md_cmp(key, &nodekey);
- if (rc <= 0) goto set1;
+ if (rc == 0) {
+ /* last node was the one we wanted */
+ top->mp_ki = NUMKEYS(top->mp_page)-1;
+ goto set1;
+ }
+ if (rc < 0) {
+ /* This is definitely the right page, skip search_page */
+ mpp.mp_page = top->mp_page;
+ rc = 0;
+ goto set2;
+ }
}
/* If any parents have right-sibs, search.
* Otherwise, there's nothing further.
break;
if (i == cursor->mc_snum - 1) {
/* There are no other pages */
- goto set1;
+ top->mp_ki = NUMKEYS(top->mp_page);
+ return MDB_NOTFOUND;
}
}
}
leaf = NODEPTR(mpp.mp_page, 0);
}
+set3:
cursor->mc_flags |= C_INITIALIZED;
cursor->mc_flags &= ~C_EOF;
*/
#define CMP(x,y) ( (x) < (y) ? -1 : (x) > (y) )
-#if 0
+#if 0 /* superseded by append/sort */
static unsigned mdb_midl_search( IDL ids, ID id )
{
/*
int mdb_midl_append( IDL ids, ID id )
{
/* Too big? */
- if (ids[0] >= MDB_IDL_UM_SIZE)
+ if (ids[0] >= MDB_IDL_UM_MAX)
return -1;
ids[0]++;
ids[ids[0]] = id;
return -1;
}
- if ( ids[0].mid >= MDB_IDL_DB_MAX ) {
+ if ( ids[0].mid >= MDB_IDL_UM_MAX ) {
/* too big */
return -2;
#define MDB_IDL_N( ids ) ( MDB_IDL_IS_RANGE(ids) \
? ((ids)[2]-(ids)[1])+1 : (ids)[0] )
+#if 0 /* superseded by append/sort */
/** Insert an ID into an IDL.
* @param[in,out] ids The IDL to insert into.
* @param[in] id The ID to insert.
* @return 0 on success, -1 if the ID was already present in the IDL.
*/
int mdb_midl_insert( IDL ids, ID id );
+#endif
/** Append an ID onto an IDL.
* @param[in,out] ids The IDL to append to.