/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 2000-2007 The OpenLDAP Foundation.
+ * Copyright 2000-2012 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
#include "back-bdb.h"
#include "idl.h"
-#define IDL_MAX(x,y) ( x > y ? x : y )
-#define IDL_MIN(x,y) ( x < y ? x : y )
-
-#define IDL_CMP(x,y) ( x < y ? -1 : ( x > y ? 1 : 0 ) )
+#define IDL_MAX(x,y) ( (x) > (y) ? (x) : (y) )
+#define IDL_MIN(x,y) ( (x) < (y) ? (x) : (y) )
+#define IDL_CMP(x,y) ( (x) < (y) ? -1 : (x) > (y) )
#define IDL_LRU_DELETE( bdb, e ) do { \
if ( (e) == (bdb)->bi_idl_lru_head ) { \
* if not found, returns first postion greater than id
*/
unsigned base = 0;
- unsigned cursor = 0;
+ unsigned cursor = 1;
int val = 0;
unsigned n = ids[0];
#endif
while( 0 < n ) {
- int pivot = n >> 1;
- cursor = base + pivot;
- val = IDL_CMP( id, ids[cursor + 1] );
+ unsigned pivot = n >> 1;
+ cursor = base + pivot + 1;
+ val = IDL_CMP( id, ids[cursor] );
if( val < 0 ) {
n = pivot;
} else if ( val > 0 ) {
- base = cursor + 1;
+ base = cursor;
n -= pivot + 1;
} else {
- return cursor + 1;
+ return cursor;
}
}
if( val > 0 ) {
- return cursor + 2;
- } else {
- return cursor + 1;
+ ++cursor;
}
+ return cursor;
#else
/* (reverse) linear search */
if (BDB_IDL_IS_RANGE( ids )) {
/* if already in range, treat as a dup */
- if (id >= BDB_IDL_FIRST(ids) && id <= BDB_IDL_LAST(ids))
+ if (id >= BDB_IDL_RANGE_FIRST(ids) && id <= BDB_IDL_RANGE_LAST(ids))
return -1;
- if (id < BDB_IDL_FIRST(ids))
+ if (id < BDB_IDL_RANGE_FIRST(ids))
ids[1] = id;
- else if (id > BDB_IDL_LAST(ids))
+ else if (id > BDB_IDL_RANGE_LAST(ids))
ids[2] = id;
return 0;
}
return 0;
}
-static int bdb_idl_delete( ID *ids, ID id )
+int bdb_idl_delete( ID *ids, ID id )
{
unsigned x;
}
bdb->bi_idl_lru_head = ee;
- if ( ++bdb->bi_idl_cache_size > bdb->bi_idl_cache_max_size ) {
+ if ( bdb->bi_idl_cache_size >= bdb->bi_idl_cache_max_size ) {
int i;
- ee = bdb->bi_idl_lru_tail;
- for ( i = 0; ee != NULL && i < 10; i++, ee = eprev ) {
+ eprev = bdb->bi_idl_lru_tail;
+ for ( i = 0; (ee = eprev) != NULL && i < 10; i++ ) {
eprev = ee->idl_lru_prev;
if ( eprev == ee ) {
eprev = NULL;
assert( bdb->bi_idl_lru_tail != NULL
|| bdb->bi_idl_lru_head == NULL );
}
+ bdb->bi_idl_cache_size++;
ldap_pvt_thread_mutex_unlock( &bdb->bi_idl_tree_lrulock );
ldap_pvt_thread_rdwr_wunlock( &bdb->bi_idl_tree_rwlock );
}
bdb_idl_fetch_key(
BackendDB *be,
DB *db,
- BDB_LOCKER locker,
+ DB_TXN *txn,
DBT *key,
ID *ids,
DBC **saved_cursor,
/* If we're not reusing an existing cursor, get a new one */
if( opflag != DB_NEXT ) {
- rc = db->cursor( db, NULL, &cursor, bdb->bi_db_opflags );
+ rc = db->cursor( db, txn, &cursor, bdb->bi_db_opflags );
if( rc != 0 ) {
Debug( LDAP_DEBUG_ANY, "=> bdb_idl_fetch_key: "
"cursor failed: %s (%d)\n", db_strerror(rc), rc, 0 );
return rc;
}
- CURSOR_SETLOCKER( cursor, locker );
} else {
cursor = *saved_cursor;
}
* turn it into a range.
*/
if ( BDB_IDL_IS_RANGE( b )
- && BDB_IDL_FIRST( b ) <= BDB_IDL_FIRST( a )
- && BDB_IDL_LAST( b ) >= BDB_IDL_LAST( a ) ) {
+ && BDB_IDL_RANGE_FIRST( b ) <= BDB_IDL_RANGE_FIRST( a )
+ && BDB_IDL_RANGE_LAST( b ) >= BDB_IDL_RANGE_LAST( a ) ) {
if (idmax - idmin + 1 == a[0])
{
a[0] = NOID;
{
if (BDB_IDL_IS_RANGE( ids )) {
/* if already in range, treat as a dup */
- if (id >= BDB_IDL_FIRST(ids) && id <= BDB_IDL_LAST(ids))
+ if (id >= BDB_IDL_RANGE_FIRST(ids) && id <= BDB_IDL_RANGE_LAST(ids))
return -1;
- if (id < BDB_IDL_FIRST(ids))
+ if (id < BDB_IDL_RANGE_FIRST(ids))
ids[1] = id;
- else if (id > BDB_IDL_LAST(ids))
+ else if (id > BDB_IDL_RANGE_LAST(ids))
ids[2] = id;
return 0;
}
return 0;
}
+ if ( b[0] == 1 ) {
+ return bdb_idl_append_one( a, BDB_IDL_FIRST( b ));
+ }
+
ida = BDB_IDL_LAST( a );
idb = BDB_IDL_LAST( b );
if ( BDB_IDL_IS_RANGE( a ) || BDB_IDL_IS_RANGE(b) ||
return 0;
}
- if ( b[0] > 1 && ida > idb ) {
+ if ( ida > idb ) {
swap = idb;
a[a[0]] = idb;
b[b[0]] = ida;
a[0]++;
a[a[0]] = tmp;
- if ( b[0] > 1 ) {
+ {
int i = b[0] - 1;
AC_MEMCPY(a+a[0]+1, b+2, i * sizeof(ID));
a[0] += i;