]> git.sur5r.net Git - openldap/commitdiff
Fixed suffix DN_SUBTREE again. Index was still being written even though
authorHoward Chu <hyc@openldap.org>
Mon, 10 Dec 2001 18:09:07 +0000 (18:09 +0000)
committerHoward Chu <hyc@openldap.org>
Mon, 10 Dec 2001 18:09:07 +0000 (18:09 +0000)
it was not being read.

servers/slapd/back-bdb/dn2id.c
servers/slapd/back-ldbm/dn2id.c

index 2b1d3d603283ebda3fd7528570c804800462ddf3..ca360779d5bcf6fb6f2e1a2a3ebda2be571d8eea 100644 (file)
@@ -77,24 +77,12 @@ bdb_dn2id_add(
                                        pdn, rc, 0 );
                        goto done;
                }
-
-               pdn[-1] = DN_SUBTREE_PREFIX;
-               rc = bdb_idl_insert_key( be, db, txn, &key, e->e_id );
-
-               if( rc != 0 ) {
-                       Debug( LDAP_DEBUG_ANY,
-                               "=> bdb_dn2id_add: subtree (%s) insert failed: %d\n",
-                                       pdn, rc, 0 );
-                       goto done;
-               }
-               ptr = pdn;
-               pdn = dn_parent( be, pdn );
        }
 
        while( pdn != NULL ) {
+               if ( be_issuffix( be, pdn ))
+                       break;
                pdn[-1] = DN_SUBTREE_PREFIX;
-               key.size -= pdn - ptr;
-               key.data = pdn - 1;
 
                rc = bdb_idl_insert_key( be, db, txn, &key, e->e_id );
 
@@ -106,6 +94,8 @@ bdb_dn2id_add(
                }
                ptr = pdn;
                pdn = dn_parent( be, pdn );
+               key.size -= pdn - ptr;
+               key.data = pdn - 1;
        }
 
 done:
@@ -173,25 +163,13 @@ bdb_dn2id_delete(
                                pdn, rc, 0 );
                        goto done;
                }
-
-               pdn[-1] = DN_SUBTREE_PREFIX;
-
-               rc = bdb_idl_delete_key( be, db, txn, &key, e->e_id );
-
-               if( rc != 0 ) {
-                       Debug( LDAP_DEBUG_ANY,
-                               "=> bdb_dn2id_delete: subtree (%s) delete failed: %d\n",
-                               pdn, rc, 0 );
-                       goto done;
-               }
-               ptr = pdn;
-               pdn = dn_parent( be, pdn );
        }
 
        while( pdn != NULL ) {
+               if ( be_issuffix( be, pdn ))
+                       break;
+
                pdn[-1] = DN_SUBTREE_PREFIX;
-               key.size -= pdn - ptr;
-               key.data = pdn - 1;
 
                rc = bdb_idl_delete_key( be, db, txn, &key, e->e_id );
                if( rc != 0 ) {
@@ -202,6 +180,8 @@ bdb_dn2id_delete(
                }
                ptr = pdn;
                pdn = dn_parent( be, pdn );
+               key.size -= pdn - ptr;
+               key.data = pdn - 1;
        }
 
 done:
index 97430943406ac3a0c646965152562bc2a0160bcd..2092b46f39c08943718068fb7f6dc295508c6dda 100644 (file)
@@ -26,6 +26,7 @@ dn2id_add(
        int             rc, flags;
        DBCache *db;
        Datum           key, data;
+       char            *buf, *ptr, *pdn;
 
 #ifdef NEW_LOGGING
        LDAP_LOG(( "backend", LDAP_LEVEL_ENTRY,
@@ -51,8 +52,11 @@ dn2id_add(
 
        ldbm_datum_init( key );
        key.dsize = strlen( dn ) + 2;
-       key.dptr = ch_malloc( key.dsize );
-       sprintf( key.dptr, "%c%s", DN_BASE_PREFIX, dn );
+       buf = ch_malloc( key.dsize );
+       key.dptr = buf;
+       buf[0] = DN_BASE_PREFIX;
+       ptr = buf + 1;
+       strcpy( ptr, dn );
 
        ldbm_datum_init( data );
        data.dptr = (char *) &id;
@@ -61,46 +65,44 @@ dn2id_add(
        flags = LDBM_INSERT;
        rc = ldbm_cache_store( db, key, data, flags );
 
-       free( key.dptr );
+       if ( rc != -1 && !be_issuffix( be, ptr )) {
+               buf[0] = DN_SUBTREE_PREFIX;
+               ldap_pvt_thread_mutex_lock( &db->dbc_write_mutex );
+               rc = idl_insert_key( be, db, key, id );
+               ldap_pvt_thread_mutex_unlock( &db->dbc_write_mutex );
+       }
 
        if ( rc != -1 ) {
-               char *pdn = dn_parent( be, dn );
+               pdn = dn_parent( be, ptr );
 
                if( pdn != NULL ) {
-                       ldbm_datum_init( key );
-                       key.dsize = strlen( pdn ) + 2;
-                       key.dptr = ch_malloc( key.dsize );
-                       sprintf( key.dptr, "%c%s", DN_ONE_PREFIX, pdn );
+                       pdn[-1] = DN_ONE_PREFIX;
+                       key.dsize -= pdn - ptr;
+                       key.dptr = pdn - 1;
                        ldap_pvt_thread_mutex_lock( &db->dbc_write_mutex );
                        rc = idl_insert_key( be, db, key, id );
                        ldap_pvt_thread_mutex_unlock( &db->dbc_write_mutex );
-                       free( key.dptr );
                }
        }
 
-       if ( rc != -1 ) {
-               char **subtree = dn_subtree( be, dn );
-
-               if( subtree != NULL ) {
-                       int i;
-                       for( i=0; subtree[i] != NULL; i++ ) {
-                               ldbm_datum_init( key );
-                               key.dsize = strlen( subtree[i] ) + 2;
-                               key.dptr = ch_malloc( key.dsize );
-                               sprintf( key.dptr, "%c%s",
-                                       DN_SUBTREE_PREFIX, subtree[i] );
-                               ldap_pvt_thread_mutex_lock( &db->dbc_write_mutex );
-                               rc = idl_insert_key( be, db, key, id );
-                               ldap_pvt_thread_mutex_unlock( &db->dbc_write_mutex );
-                               free( key.dptr );
-
-                               if(rc == -1) break;
-                       }
-
-                       charray_free( subtree );
-               }
+       while ( rc != -1 && pdn != NULL ) {
+               if ( be_issuffix( be, pdn ))
+                       break;
+
+               pdn[-1] = DN_SUBTREE_PREFIX;
+
+               ldap_pvt_thread_mutex_lock( &db->dbc_write_mutex );
+               rc = idl_insert_key( be, db, key, id );
+               ldap_pvt_thread_mutex_unlock( &db->dbc_write_mutex );
+
+               if( rc != 0 ) break;
+               ptr = pdn;
+               pdn = dn_parent( be, pdn );
+               key.dsize -= pdn - ptr;
+               key.dptr = pdn - 1;
        }
 
+       free( buf );
        ldbm_cache_close( be, db );
 
 #ifdef NEW_LOGGING
@@ -269,6 +271,7 @@ dn2id_delete(
        DBCache *db;
        Datum           key;
        int             rc;
+       char            *buf, *ptr, *pdn;
 
 #ifdef NEW_LOGGING
        LDAP_LOG(( "backend", LDAP_LEVEL_ENTRY,
@@ -294,56 +297,52 @@ dn2id_delete(
                return( -1 );
        }
 
+       ldbm_datum_init( key );
+       key.dsize = strlen( dn ) + 2;
+       buf = ch_malloc( key.dsize );
+       key.dptr = buf;
+       buf[0] = DN_BASE_PREFIX;
+       ptr = buf + 1;
+       strcpy( ptr, dn );
 
-       {
-               char *pdn = dn_parent( be, dn );
+       rc = ldbm_cache_delete( db, key );
+       
+       if( !be_issuffix( be, ptr )) {
+               buf[0] = DN_SUBTREE_PREFIX;
+               ldap_pvt_thread_mutex_lock( &db->dbc_write_mutex );
+               (void) idl_delete_key( be, db, key, id );
+               ldap_pvt_thread_mutex_unlock( &db->dbc_write_mutex );
+       }
 
-               if( pdn != NULL ) {
-                       ldbm_datum_init( key );
-                       key.dsize = strlen( pdn ) + 2;
-                       key.dptr = ch_malloc( key.dsize );
-                       sprintf( key.dptr, "%c%s", DN_ONE_PREFIX, pdn );
+       pdn = dn_parent( be, ptr );
 
-                       ldap_pvt_thread_mutex_lock( &db->dbc_write_mutex );
-                       (void) idl_delete_key( be, db, key, id );
-                       ldap_pvt_thread_mutex_unlock( &db->dbc_write_mutex );
+       if( pdn != NULL ) {
+               pdn[-1] = DN_ONE_PREFIX;
+               key.dsize -= pdn - ptr;
+               key.dptr = pdn - 1;
 
-                       free( key.dptr );
-               }
+               ldap_pvt_thread_mutex_lock( &db->dbc_write_mutex );
+               (void) idl_delete_key( be, db, key, id );
+               ldap_pvt_thread_mutex_unlock( &db->dbc_write_mutex );
        }
 
-       {
-               char **subtree = dn_subtree( be, dn );
-
-               if( subtree != NULL ) {
-                       int i;
-                       for( i=0; subtree[i] != NULL; i++ ) {
-                               ldbm_datum_init( key );
-                               key.dsize = strlen( subtree[i] ) + 2;
-                               key.dptr = ch_malloc( key.dsize );
-                               sprintf( key.dptr, "%c%s",
-                                       DN_SUBTREE_PREFIX, subtree[i] );
+       while ( pdn != NULL ) {
+               if ( be_issuffix( be, pdn ))
+                       break;
 
-                               ldap_pvt_thread_mutex_lock( &db->dbc_write_mutex );
-                               (void) idl_delete_key( be, db, key, id );
-                               ldap_pvt_thread_mutex_unlock( &db->dbc_write_mutex );
+               pdn[-1] = DN_SUBTREE_PREFIX;
 
-                               free( key.dptr );
-                       }
+               ldap_pvt_thread_mutex_lock( &db->dbc_write_mutex );
+               (void) idl_delete_key( be, db, key, id );
+               ldap_pvt_thread_mutex_unlock( &db->dbc_write_mutex );
 
-                       charray_free( subtree );
-               }
+               ptr = pdn;
+               pdn = dn_parent( be, pdn );
+               key.dsize -= pdn - ptr;
+               key.dptr = pdn - 1;
        }
 
-       ldbm_datum_init( key );
-
-       key.dsize = strlen( dn ) + 2;
-       key.dptr = ch_malloc( key.dsize );
-       sprintf( key.dptr, "%c%s", DN_BASE_PREFIX, dn );
-
-       rc = ldbm_cache_delete( db, key );
-
-       free( key.dptr );
+       free( buf );
 
        ldbm_cache_close( be, db );