mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-03-07 14:18:15 +08:00
Merge remote branch 'mdb/mdb.master'
This commit is contained in:
commit
ffdf3d7afb
@ -440,7 +440,7 @@ struct MDB_env {
|
||||
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 */
|
||||
@ -2543,11 +2543,17 @@ mdb_cursor_set(MDB_cursor *cursor, MDB_val *key, MDB_val *data,
|
||||
}
|
||||
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;
|
||||
@ -2560,6 +2566,18 @@ set1:
|
||||
MDB_SET_KEY(leaf, &nodekey);
|
||||
}
|
||||
rc = cursor->mc_txn->mt_dbxs[cursor->mc_dbi].md_cmp(key, &nodekey);
|
||||
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;
|
||||
}
|
||||
rc = cursor->mc_txn->mt_dbxs[cursor->mc_dbi].md_cmp(key, &nodekey);
|
||||
if (rc <= 0) goto set1;
|
||||
}
|
||||
/* If any parents have right-sibs, search.
|
||||
@ -2573,6 +2591,18 @@ set1:
|
||||
/* There are no other pages */
|
||||
goto set1;
|
||||
}
|
||||
/* If any parents have right-sibs, search.
|
||||
* Otherwise, there's nothing further.
|
||||
*/
|
||||
for (i=0; i<cursor->mc_snum-1; i++)
|
||||
if (cursor->mc_stack[i].mp_ki <
|
||||
NUMKEYS(cursor->mc_stack[i].mp_page)-1)
|
||||
break;
|
||||
if (i == cursor->mc_snum - 1) {
|
||||
/* There are no other pages */
|
||||
top->mp_ki = NUMKEYS(top->mp_page);
|
||||
return MDB_NOTFOUND;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -2603,6 +2633,7 @@ set2:
|
||||
leaf = NODEPTR(mpp.mp_page, 0);
|
||||
}
|
||||
|
||||
set3:
|
||||
cursor->mc_flags |= C_INITIALIZED;
|
||||
cursor->mc_flags &= ~C_EOF;
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
*/
|
||||
#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 )
|
||||
{
|
||||
/*
|
||||
@ -119,7 +119,7 @@ int mdb_midl_insert( 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;
|
||||
@ -244,7 +244,7 @@ int mdb_mid2l_insert( ID2L ids, ID2 *id )
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ( ids[0].mid >= MDB_IDL_DB_MAX ) {
|
||||
if ( ids[0].mid >= MDB_IDL_UM_MAX ) {
|
||||
/* too big */
|
||||
return -2;
|
||||
|
||||
|
@ -101,12 +101,14 @@ typedef ID *IDL;
|
||||
#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.
|
||||
|
Loading…
Reference in New Issue
Block a user