10139N/A static void idl_check(ID_BLOCK *idl)
10139N/A- if( ID_BLOCK_INDIRECT(idl) || ID_BLOCK_ALLIDS(idl)
10139N/A+ for ( max = 0; !ID_BLOCK_NOID(idl, max); max++ ) ;
10139N/A for( last = ID_BLOCK_ID(idl, 0), i = 1;
10139N/A last = ID_BLOCK_ID(idl, i), i++ )
10139N/A assert (last < ID_BLOCK_ID(idl, i) );
10139N/A idl = idl_fetch_one( be, db, key );
10139N/A /* count the number of blocks & allocate space for pointers to them */
10139N/A- for ( i = 0; !ID_BLOCK_NOID(idl, i); i++ )
10139N/A+ for ( nblocks = 0; !ID_BLOCK_NOID(idl, nblocks); nblocks++ )
10139N/A- tmp = (ID_BLOCK **) ch_malloc( (i + 1) * sizeof(ID_BLOCK *) );
10139N/A+ tmp = (ID_BLOCK **) ch_malloc( nblocks * sizeof(ID_BLOCK *) );
10139N/A- for ( i = 0; !ID_BLOCK_NOID(idl, i); i++ ) {
10139N/A- for ( i = 0; i < ID_BLOCK_NIDS(idl); i++ ) {
10139N/A+ for ( i = 0; i < nblocks; i++ ) {
10139N/A cont_id( &data, ID_BLOCK_ID(idl, i) );
10139N/A if ( (tmp[i] = idl_fetch_one( be, db, data )) == NULL ) {
10139N/A /* copy in all the ids from the component blocks */
10139N/A- for ( i = 0; tmp[i] != NULL; i++ ) {
10139N/A+ for ( i = 0; i < nblocks; i++ ) {
10139N/A+ assert( ID_BLOCK_NIDS(idl) == nids );
10139N/A rc = ldbm_cache_store( db, key, data, flags );
10139N/A- Statslog( LDAP_DEBUG_STATS, "<= idl_store(): rc=%d\n",
10139N/A /* Debug( LDAP_DEBUG_TRACE, "<= idl_store %d\n", rc, 0, 0 ); */
10139N/A /* select the block to try inserting into *//* XXX linear search XXX */
10139N/A- for ( i = 0; !ID_BLOCK_NOID(idl, i) && id > ID_BLOCK_ID(idl, i); i++ )
10139N/A+ for ( i = 0; !ID_BLOCK_NOID(idl, i) && id >= ID_BLOCK_ID(idl, i); i++ )
10139N/A+ if (ID_BLOCK_ID(idl, i) <= id)
10139N/A+ /* At this point, the following condition must be true:
10139N/A+ * ID_BLOCK_ID(idl, i) <= id && id < ID_BLOCK_ID(idl, i+1)
10139N/A+ * except when i is the first or the last block.
10139N/A cont_id( &k2, ID_BLOCK_ID(idl, i) );
10139N/A if ( !first && (unsigned long)(i + 1) < ID_BLOCK_NIDS(idl) ) {
10139N/A- cont_id( &k2, ID_BLOCK_ID(idl, i) );
10139N/A- if ( (tmp2 = idl_fetch_one( be, db, k2 )) == NULL ) {
10139N/A+ cont_id( &k3, ID_BLOCK_ID(idl, i + 1) );
10139N/A+ if ( (tmp2 = idl_fetch_one( be, db, k3 )) == NULL ) {
10139N/A "idl_insert_key: idl_fetch_one returned NULL\n", 0, 0, 0);
10139N/A case 1: /* id inserted first in block */
10139N/A rc = idl_change_first( be, db, key, idl,
10139N/A case 2: /* id already there - how? */