]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/tools.c
silence warning(s)
[openldap] / servers / slapd / back-bdb / tools.c
index f65d4b99d4b96edba4797c13104c88e24e0a8fc8..bafba3549e7a2ef597aba98f95496bcdc354d59f 100644 (file)
@@ -35,7 +35,7 @@ static dn_id hbuf[HOLE_SIZE], *holes = hbuf;
 static unsigned nhmax = HOLE_SIZE;
 static unsigned nholes;
 
-Avlnode *index_attrs, index_dummy;
+static Avlnode *index_attrs, index_dummy;
 
 int bdb_tool_entry_open(
        BackendDB *be, int mode )
@@ -140,18 +140,23 @@ ID bdb_tool_dn2id_get(
 {
        Operation op = {0};
        Opheader ohdr = {0};
-       EntryInfo ei = {0};
+       EntryInfo *ei = NULL;
+       int rc;
+
+       if ( BER_BVISEMPTY(dn) )
+               return 0;
 
        op.o_hdr = &ohdr;
        op.o_bd = be;
        op.o_tmpmemctx = NULL;
        op.o_tmpmfuncs = &ch_mfuncs;
 
-       ei.bei_id = NOID;
-
-       bdb_dn2id( &op, NULL, dn, &ei );
+       rc = bdb_cache_find_ndn( &op, NULL, dn, &ei );
+       if ( ei ) bdb_cache_entryinfo_unlock( ei );
+       if ( rc == DB_NOTFOUND )
+               return NOID;
        
-       return ei.bei_id;
+       return ei->bei_id;
 }
 
 int bdb_tool_id2entry_get(
@@ -160,14 +165,29 @@ int bdb_tool_id2entry_get(
        Entry **e
 )
 {
-       return bdb_id2entry( be, NULL, id, e );
+       int rc = bdb_id2entry( be, NULL, id, e );
+
+       if ( rc == DB_NOTFOUND && id == 0 ) {
+               Entry *dummy = ch_calloc( 1, sizeof(Entry) );
+               struct berval gluebv = BER_BVC("glue");
+               dummy->e_name.bv_val = ch_strdup( "" );
+               dummy->e_nname.bv_val = ch_strdup( "" );
+               attr_merge_one( dummy, slap_schema.si_ad_objectClass, &gluebv, NULL );
+               attr_merge_one( dummy, slap_schema.si_ad_structuralObjectClass,
+                       &gluebv, NULL );
+               *e = dummy;
+               rc = LDAP_SUCCESS;
+       }
+       return rc;
 }
 
 Entry* bdb_tool_entry_get( BackendDB *be, ID id )
 {
        int rc;
        Entry *e = NULL;
+#ifndef BDB_HIER
        struct berval bv;
+#endif
 
        assert( be != NULL );
        assert( slapMode & SLAP_TOOL_MODE );
@@ -212,19 +232,22 @@ static int bdb_tool_next_id(
        struct berval *text,
        int hole )
 {
-       struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
        struct berval dn = e->e_name;
        struct berval ndn = e->e_nname;
        struct berval pdn, npdn;
-       EntryInfo *ei = NULL;
+       EntryInfo *ei = NULL, eidummy;
        int rc;
 
-       if (ndn.bv_len == 0) return 0;
+       if (ndn.bv_len == 0) {
+               e->e_id = 0;
+               return 0;
+       }
 
        rc = bdb_cache_find_ndn( op, tid, &ndn, &ei );
        if ( ei ) bdb_cache_entryinfo_unlock( ei );
        if ( rc == DB_NOTFOUND ) {
                if ( !be_issuffix( op->o_bd, &ndn ) ) {
+                       ID eid = e->e_id;
                        dnParent( &dn, &pdn );
                        dnParent( &ndn, &npdn );
                        e->e_name = pdn;
@@ -235,6 +258,14 @@ static int bdb_tool_next_id(
                        if ( rc ) {
                                return rc;
                        }
+                       /* If parent didn't exist, it was created just now
+                        * and its ID is now in e->e_id. Make sure the current
+                        * entry gets added under the new parent ID.
+                        */
+                       if ( eid != e->e_id ) {
+                               eidummy.bei_id = e->e_id;
+                               ei = &eidummy;
+                       }
                }
                rc = bdb_next_id( op->o_bd, tid, &e->e_id );
                if ( rc ) {
@@ -300,13 +331,14 @@ ID bdb_tool_entry_put(
        assert( be != NULL );
        assert( slapMode & SLAP_TOOL_MODE );
 
-       assert( text );
-       assert( text->bv_val );
+       assert( text != NULL );
+       assert( text->bv_val != NULL );
        assert( text->bv_val[0] == '\0' );      /* overconservative? */
 
        Debug( LDAP_DEBUG_TRACE, "=> " LDAP_XSTRING(bdb_tool_entry_put)
                "( %ld, \"%s\" )\n", (long) e->e_id, e->e_dn, 0 );
 
+       if (! (slapMode & SLAP_TOOL_QUICK)) {
        rc = TXN_BEGIN( bdb->bi_dbenv, NULL, &tid, 
                bdb->bi_db_opflags );
        if( rc != 0 ) {
@@ -318,6 +350,7 @@ ID bdb_tool_entry_put(
                         text->bv_val, 0, 0 );
                return NOID;
        }
+       }
 
        op.o_hdr = &ohdr;
        op.o_bd = be;
@@ -356,6 +389,7 @@ ID bdb_tool_entry_put(
 
 done:
        if( rc == 0 ) {
+               if ( !( slapMode & SLAP_TOOL_QUICK )) {
                rc = TXN_COMMIT( tid, 0 );
                if( rc != 0 ) {
                        snprintf( text->bv_val, text->bv_len,
@@ -366,8 +400,10 @@ done:
                                text->bv_val, 0, 0 );
                        e->e_id = NOID;
                }
+               }
 
        } else {
+               if ( !( slapMode & SLAP_TOOL_QUICK )) {
                TXN_ABORT( tid );
                snprintf( text->bv_val, text->bv_len,
                        "txn_aborted! %s (%d)",
@@ -375,6 +411,7 @@ done:
                Debug( LDAP_DEBUG_ANY,
                        "=> " LDAP_XSTRING(bdb_tool_entry_put) ": %s\n",
                        text->bv_val, 0, 0 );
+               }
                e->e_id = NOID;
        }
 
@@ -420,6 +457,7 @@ int bdb_tool_entry_reindex(
                return -1;
        }
 
+       if (! (slapMode & SLAP_TOOL_QUICK)) {
        rc = TXN_BEGIN( bi->bi_dbenv, NULL, &tid, bi->bi_db_opflags );
        if( rc != 0 ) {
                Debug( LDAP_DEBUG_ANY,
@@ -428,6 +466,7 @@ int bdb_tool_entry_reindex(
                        db_strerror(rc), rc, 0 );
                goto done;
        }
+       }
        
        /*
         * just (re)add them for now
@@ -445,22 +484,11 @@ int bdb_tool_entry_reindex(
        op.o_tmpmemctx = NULL;
        op.o_tmpmfuncs = &ch_mfuncs;
 
-#if 0 /* ndef BDB_HIER */
-       /* add dn2id indices */
-       rc = bdb_dn2id_add( &op, tid, NULL, e );
-       if( rc != 0 && rc != DB_KEYEXIST ) {
-               Debug( LDAP_DEBUG_ANY,
-                       "=> " LDAP_XSTRING(bdb_tool_entry_reindex)
-                       ": dn2id_add failed: %s (%d)\n",
-                       db_strerror(rc), rc, 0 );
-               goto done;
-       }
-#endif
-
        rc = bdb_index_entry_add( &op, tid, e );
 
 done:
        if( rc == 0 ) {
+               if (! (slapMode & SLAP_TOOL_QUICK)) {
                rc = TXN_COMMIT( tid, 0 );
                if( rc != 0 ) {
                        Debug( LDAP_DEBUG_ANY,
@@ -469,13 +497,16 @@ done:
                                db_strerror(rc), rc, 0 );
                        e->e_id = NOID;
                }
+               }
 
        } else {
+               if (! (slapMode & SLAP_TOOL_QUICK)) {
                TXN_ABORT( tid );
                Debug( LDAP_DEBUG_ANY,
                        "=> " LDAP_XSTRING(bdb_tool_entry_reindex)
                        ": txn_aborted! %s (%d)\n",
                        db_strerror(rc), rc, 0 );
+               }
                e->e_id = NOID;
        }
        bdb_entry_release( &op, e, 0 );
@@ -497,17 +528,17 @@ ID bdb_tool_entry_modify(
        assert( be != NULL );
        assert( slapMode & SLAP_TOOL_MODE );
 
-       assert( text );
-       assert( text->bv_val );
+       assert( text != NULL );
+       assert( text->bv_val != NULL );
        assert( text->bv_val[0] == '\0' );      /* overconservative? */
 
        assert ( e->e_id != NOID );
-       assert ( e->e_id != 0 );
 
        Debug( LDAP_DEBUG_TRACE,
                "=> " LDAP_XSTRING(bdb_tool_entry_modify) "( %ld, \"%s\" )\n",
                (long) e->e_id, e->e_dn, 0 );
 
+       if (! (slapMode & SLAP_TOOL_QUICK)) {
        rc = TXN_BEGIN( bdb->bi_dbenv, NULL, &tid, 
                bdb->bi_db_opflags );
        if( rc != 0 ) {
@@ -519,6 +550,7 @@ ID bdb_tool_entry_modify(
                         text->bv_val, 0, 0 );
                return NOID;
        }
+       }
 
        op.o_hdr = &ohdr;
        op.o_bd = be;
@@ -537,6 +569,10 @@ ID bdb_tool_entry_modify(
                goto done;
        }
 
+#if 0
+       /* FIXME: this is bogus, we don't have the old values to delete
+        * from the index because the given entry has already been modified.
+        */
        rc = bdb_index_entry_del( &op, tid, e );
        if( rc != 0 ) {
                snprintf( text->bv_val, text->bv_len,
@@ -547,6 +583,7 @@ ID bdb_tool_entry_modify(
                        text->bv_val, 0, 0 );
                goto done;
        }
+#endif
 
        rc = bdb_index_entry_add( &op, tid, e );
        if( rc != 0 ) {
@@ -561,6 +598,7 @@ ID bdb_tool_entry_modify(
 
 done:
        if( rc == 0 ) {
+               if (! (slapMode & SLAP_TOOL_QUICK)) {
                rc = TXN_COMMIT( tid, 0 );
                if( rc != 0 ) {
                        snprintf( text->bv_val, text->bv_len,
@@ -571,8 +609,10 @@ done:
                                "%s\n", text->bv_val, 0, 0 );
                        e->e_id = NOID;
                }
+               }
 
        } else {
+               if (! (slapMode & SLAP_TOOL_QUICK)) {
                TXN_ABORT( tid );
                snprintf( text->bv_val, text->bv_len,
                        "txn_aborted! %s (%d)",
@@ -580,6 +620,7 @@ done:
                Debug( LDAP_DEBUG_ANY,
                        "=> " LDAP_XSTRING(bdb_tool_entry_modify) ": %s\n",
                        text->bv_val, 0, 0 );
+               }
                e->e_id = NOID;
        }