]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldbm/dn2id.c
Remove abandon cruft
[openldap] / servers / slapd / back-ldbm / dn2id.c
index 97430943406ac3a0c646965152562bc2a0160bcd..14f108753bac2eef67deab89194d807c86b8ae9b 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
@@ -206,7 +208,7 @@ dn2id(
 int
 dn2idl(
     Backend    *be,
-    const char *dn,
+    struct berval      *dn,
     int                prefix,
     ID_BLOCK    **idlp
 )
@@ -216,15 +218,15 @@ dn2idl(
 
 #ifdef NEW_LOGGING
        LDAP_LOG(( "backend", LDAP_LEVEL_ENTRY,
-                  "dn2idl: \"%c%s\"\n", prefix, dn ));
+                  "dn2idl: \"%c%s\"\n", prefix, dn->bv_val ));
 #else
-       Debug( LDAP_DEBUG_TRACE, "=> dn2idl( \"%c%s\" )\n", prefix, dn, 0 );
+       Debug( LDAP_DEBUG_TRACE, "=> dn2idl( \"%c%s\" )\n", prefix, dn->bv_val, 0 );
 #endif
 
        assert( idlp != NULL );
        *idlp = NULL;
 
-       if ( prefix == DN_SUBTREE_PREFIX && be_issuffix(be, dn) ) {
+       if ( prefix == DN_SUBTREE_PREFIX && be_issuffix(be, dn->bv_val) ) {
                *idlp = ch_malloc( sizeof(ID) );
                **idlp = ID_BLOCK_ALLIDS_VALUE;
                return 0;
@@ -245,9 +247,9 @@ dn2idl(
 
        ldbm_datum_init( key );
 
-       key.dsize = strlen( dn ) + 2;
+       key.dsize = dn->bv_len + 2;
        key.dptr = ch_malloc( key.dsize );
-       sprintf( key.dptr, "%c%s", prefix, dn );
+       sprintf( key.dptr, "%c%s", prefix, dn->bv_val );
 
        *idlp = idl_fetch( be, db, key );
 
@@ -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 );
+       while ( pdn != NULL ) {
+               if ( be_issuffix( be, pdn ))
+                       break;
 
-               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] );
+               pdn[-1] = 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 );
+               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 );
 
-                               free( key.dptr );
-                       }
-
-                       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 );