#include <ac/string.h>
#include <ac/socket.h>
-#include "ldapconfig.h"
+#include "ldap_defaults.h"
#include "slap.h"
#include "back-ldbm.h"
+static ID_BLOCK* idl_dup( ID_BLOCK *idl );
/* Allocate an ID_BLOCK with room for nids ids */
ID_BLOCK *
-idl_alloc( int nids )
+idl_alloc( unsigned int nids )
{
ID_BLOCK *new;
static ID_BLOCK *
idl_fetch_one(
Backend *be,
- struct dbcache *db,
+ DBCache *db,
Datum key
)
{
data = ldbm_cache_fetch( db, key );
- idl = (ID_BLOCK *) data.dptr;
+ if( data.dptr == NULL ) {
+ return NULL;
+ }
+
+ idl = idl_dup( (ID_BLOCK *) data.dptr);
+ ldbm_datum_free( db->dbc_db, data );
return( idl );
}
ID_BLOCK *
idl_fetch(
Backend *be,
- struct dbcache *db,
+ DBCache *db,
Datum key
)
{
- Datum data, k2;
+ Datum data;
ID_BLOCK *idl;
ID_BLOCK **tmp;
char *kstr;
int i, nids;
- ldbm_datum_init( k2 );
- ldbm_datum_init( data );
+ idl = idl_fetch_one( be, db, key );
- /* Debug( LDAP_DEBUG_TRACE, "=> idl_fetch\n", 0, 0, 0 ); */
+ if ( idl == NULL ) {
+ return NULL;
+ }
- data = ldbm_cache_fetch( db, key );
+ if ( ID_BLOCK_ALLIDS(idl) ) {
+ /* all ids block */
+ /* make sure we have the current value of highest id */
+ idl_free( idl );
+ idl = idl_allids( be );
- if ( (idl = (ID_BLOCK *) data.dptr) == NULL ) {
- return( NULL );
+ return( idl );
}
- /* regular block */
if ( ! ID_BLOCK_INDIRECT( idl ) ) {
- /*
- Debug( LDAP_DEBUG_TRACE, "<= idl_fetch %d ids (%d max)\n",
- ID_BLOCK_NIDS(idl), ID_BLOCK_NMAX(idl), 0 );
- */
-
- /* make sure we have the current value of highest id */
- if ( ID_BLOCK_ALLIDS(idl) ) {
- idl_free( idl );
- idl = idl_allids( be );
- }
+ /* regular block */
return( idl );
}
kstr = (char *) ch_malloc( key.dsize + 20 );
nids = 0;
for ( i = 0; !ID_BLOCK_NOID(idl, i); i++ ) {
+ ldbm_datum_init( data );
+
sprintf( kstr, "%c%s%ld", CONT_PREFIX, key.dptr, ID_BLOCK_ID(idl, i) );
- k2.dptr = kstr;
- k2.dsize = strlen( kstr ) + 1;
+ data.dptr = kstr;
+ data.dsize = strlen( kstr ) + 1;
- if ( (tmp[i] = idl_fetch_one( be, db, k2 )) == NULL ) {
+ if ( (tmp[i] = idl_fetch_one( be, db, data )) == NULL ) {
Debug( LDAP_DEBUG_ANY,
- "idl_fetch of (%s) returns NULL\n", k2.dptr, 0, 0 );
+ "idl_fetch of (%s) returns NULL\n", data.dptr, 0, 0 );
continue;
}
nids += ID_BLOCK_NIDS(tmp[i]);
}
tmp[i] = NULL;
+ free( kstr );
idl_free( idl );
/* allocate space for the big block */
}
free( (char *) tmp );
- Debug( LDAP_DEBUG_TRACE, "<= idl_fetch %lu ids (%lu max)\n",
+ Debug( LDAP_DEBUG_TRACE, "<= idl_fetch %ld ids (%ld max)\n",
ID_BLOCK_NIDS(idl), ID_BLOCK_NMAX(idl), 0 );
return( idl );
}
static int
idl_store(
Backend *be,
- struct dbcache *db,
+ DBCache *db,
Datum key,
ID_BLOCK *idl
)
static int
idl_change_first(
Backend *be,
- struct dbcache *db,
+ DBCache *db,
Datum hkey, /* header block key */
ID_BLOCK *h, /* header block */
int pos, /* pos in h to update */
int
idl_insert_key(
Backend *be,
- struct dbcache *db,
+ DBCache *db,
Datum key,
ID id
)
return( rc );
}
- /* regular block */
+ if ( ID_BLOCK_ALLIDS( idl ) ) {
+ /* ALLIDS */
+ idl_free( idl );
+ return 0;
+ }
+
if ( ! ID_BLOCK_INDIRECT( idl ) ) {
+ /* regular block */
switch ( idl_insert( &idl, id, db->dbc_maxids ) ) {
case 0: /* id inserted - store the updated block */
case 1:
idl_free( idl );
idl = idl_allids( be );
rc = idl_store( be, db, key, idl );
- idl_free( idl );
-
- return( rc );
+ break;
}
idl_split_block( idl, id, &tmp, &tmp2 );
if ( (tmp = idl_fetch_one( be, db, k2 )) == NULL ) {
Debug( LDAP_DEBUG_ANY, "nonexistent continuation block (%s)\n",
k2.dptr, 0, 0 );
+ free( kstr );
+ idl_free( idl );
return( -1 );
}
case 0: /* id inserted */
if ( rc == 2 ) {
Debug( LDAP_DEBUG_ANY,
- "id %lu already in next block\n",
+ "id %ld already in next block\n",
id, 0, 0 );
}
free( kstr );
return( 0 );
case 3: /* split the original block */
- idl_free( tmp2 );
break;
}
-
+ idl_free( tmp2 );
}
/*
* 3 id not inserted, block must be split
*/
int
-idl_insert( ID_BLOCK **idl, ID id, int maxids )
+idl_insert( ID_BLOCK **idl, ID id, unsigned int maxids )
{
unsigned int i, j;
int
idl_delete_key (
Backend *be,
- struct dbcache *db,
+ DBCache *db,
Datum key,
ID id
)
{
- Datum k2;
+ Datum data;
ID_BLOCK *idl, *tmp;
unsigned i;
int j, nids;
return -1;
}
- if ( ! ID_BLOCK_INDIRECT( idl ) )
- {
- for ( i=0; i < ID_BLOCK_NIDS(idl); i++ )
- {
- if ( ID_BLOCK_ID(idl, i) == id )
- {
- SAFEMEMCPY (
- &ID_BLOCK_ID(idl, i),
- &ID_BLOCK_ID(idl, i+1),
- (ID_BLOCK_NIDS(idl)-(i+1)) * sizeof(ID) );
+ if ( ID_BLOCK_ALLIDS( idl ) ) {
+ idl_free( idl );
+ return 0;
+ }
- ID_BLOCK_ID(idl, ID_BLOCK_NIDS(idl)-1) = NOID;
- ID_BLOCK_NIDS(idl)--;
+ if ( ! ID_BLOCK_INDIRECT( idl ) ) {
+ for ( i=0; i < ID_BLOCK_NIDS(idl); i++ ) {
+ if ( ID_BLOCK_ID(idl, i) == id ) {
+ if( --ID_BLOCK_NIDS(idl) == 0 ) {
+ ldbm_cache_delete( db, key );
+
+ } else {
+ SAFEMEMCPY (
+ &ID_BLOCK_ID(idl, i),
+ &ID_BLOCK_ID(idl, i+1),
+ (ID_BLOCK_NIDS(idl)-i) * sizeof(ID) );
+
+ ID_BLOCK_ID(idl, ID_BLOCK_NIDS(idl)) = NOID;
- if ( ID_BLOCK_NIDS(idl) )
idl_store( be, db, key, idl );
- else
- ldbm_cache_delete( db, key );
+ }
+
+ idl_free( idl );
return 0;
}
/* We didn't find the ID. Hmmm... */
}
+ idl_free( idl );
return -1;
}
for ( j = 0; !ID_BLOCK_NOID(idl, j); j++ )
{
- ldbm_datum_init( k2 );
+ ldbm_datum_init( data );
sprintf( kstr, "%c%s%ld", CONT_PREFIX, key.dptr, ID_BLOCK_ID(idl, j) );
- k2.dptr = kstr;
- k2.dsize = strlen( kstr ) + 1;
+ data.dptr = kstr;
+ data.dsize = strlen( kstr ) + 1;
- if ( (tmp = idl_fetch_one( be, db, k2 )) == NULL ) {
+ if ( (tmp = idl_fetch_one( be, db, data )) == NULL ) {
Debug( LDAP_DEBUG_ANY,
- "idl_fetch of (%s) returns NULL\n", k2.dptr, 0, 0 );
+ "idl_fetch of (%s) returns NULL\n", data.dptr, 0, 0 );
continue;
}
/*
(ID_BLOCK_NIDS(tmp)-(i+1)) * sizeof(ID));
ID_BLOCK_ID(tmp, ID_BLOCK_NIDS(tmp)-1 ) = NOID;
ID_BLOCK_NIDS(tmp)--;
- if ( ID_BLOCK_NIDS(tmp) )
- idl_store ( be, db, k2, tmp );
- else
- {
- ldbm_cache_delete( db, k2 );
+
+ if ( ID_BLOCK_NIDS(tmp) ) {
+ idl_store ( be, db, data, tmp );
+
+ } else {
+ ldbm_cache_delete( db, data );
SAFEMEMCPY(
&ID_BLOCK_ID(idl, j),
&ID_BLOCK_ID(idl, j+1),
else
idl_store( be, db, key, idl );
}
+ idl_free( tmp );
+ free( kstr );
+ idl_free( idl );
return 0;
}
}
+ idl_free( tmp );
}
+ free( kstr );
+ idl_free( idl );
return -1;
}