]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/tools.c
silence warning(s)
[openldap] / servers / slapd / back-bdb / tools.c
index ddf92e751c521363c7d59f9a51c7a240c2511d5f..bafba3549e7a2ef597aba98f95496bcdc354d59f 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2000-2004 The OpenLDAP Foundation.
+ * Copyright 2000-2005 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -21,7 +21,6 @@
 
 #define AVL_INTERNAL
 #include "back-bdb.h"
-#include "external.h"
 
 static DBC *cursor = NULL;
 static DBT key, data;
@@ -36,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 )
@@ -130,7 +129,7 @@ ID bdb_tool_entry_next(
                return NOID;
        }
 
-       AC_MEMCPY( &id, key.data, key.size );
+       BDB_DISK2ID( key.data, &id );
        return id;
 }
 
@@ -139,33 +138,25 @@ ID bdb_tool_dn2id_get(
        struct berval *dn
 )
 {
-       struct bdb_info *bdb = (struct bdb_info *) be->be_private;
-       DB *db = bdb->bi_dn2id->bdi_db;
+       Operation op = {0};
+       Opheader ohdr = {0};
+       EntryInfo *ei = NULL;
        int rc;
-       DBT     key, data;
-       ID      id;
-
-       DBTzero( &key );
-       key.size = dn->bv_len + 2;
-       key.data = ch_malloc( key.size );
-       ((char*)key.data)[0] = DN_BASE_PREFIX;
-       AC_MEMCPY( &((char*)key.data)[1], dn->bv_val, key.size - 1 );
-
-       DBTzero( &data );
-       data.data = &id;
-       data.ulen = sizeof(ID);
-       data.flags = DB_DBT_USERMEM;
 
-       rc = db->get( db, NULL, &key, &data, bdb->bi_db_opflags );
+       if ( BER_BVISEMPTY(dn) )
+               return 0;
 
-    if( rc != 0 ) {
-               Debug( LDAP_DEBUG_TRACE, "bdb_tool_dn2id_get: get failed: %s (%d)\n",
-                               db_strerror( rc ), rc, 0 );
-               id = NOID;
-       }
+       op.o_hdr = &ohdr;
+       op.o_bd = be;
+       op.o_tmpmemctx = NULL;
+       op.o_tmpmfuncs = &ch_mfuncs;
 
-       ch_free( key.data );
-       return id;
+       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;
 }
 
 int bdb_tool_id2entry_get(
@@ -174,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 );
@@ -190,7 +196,12 @@ Entry* bdb_tool_entry_get( BackendDB *be, ID id )
 #ifndef BDB_HIER
        DBT2bv( &data, &bv );
 
+#ifdef SLAP_ZONE_ALLOC
+       /* FIXME: will add ctx later */
+       rc = entry_decode( &bv, &e, NULL );
+#else
        rc = entry_decode( &bv, &e );
+#endif
 
        if( rc == LDAP_SUCCESS ) {
                e->e_id = id;
@@ -199,7 +210,9 @@ Entry* bdb_tool_entry_get( BackendDB *be, ID id )
        {
                EntryInfo *ei = NULL;
                Operation op = {0};
+               Opheader ohdr = {0};
 
+               op.o_hdr = &ohdr;
                op.o_bd = be;
                op.o_tmpmemctx = NULL;
                op.o_tmpmfuncs = &ch_mfuncs;
@@ -219,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;
@@ -242,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 ) {
@@ -302,17 +326,19 @@ ID bdb_tool_entry_put(
        struct bdb_info *bdb = (struct bdb_info *) be->be_private;
        DB_TXN *tid = NULL;
        Operation op = {0};
+       Opheader ohdr = {0};
 
        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, "=> bdb_tool_entry_put( %ld, \"%s\" )\n",
-               (long) e->e_id, e->e_dn, 0 );
+       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 ) {
@@ -320,11 +346,13 @@ ID bdb_tool_entry_put(
                        "txn_begin failed: %s (%d)",
                        db_strerror(rc), rc );
                Debug( LDAP_DEBUG_ANY,
-                       "=> bdb_tool_entry_put: %s\n",
+                       "=> " LDAP_XSTRING(bdb_tool_entry_put) ": %s\n",
                         text->bv_val, 0, 0 );
                return NOID;
        }
+       }
 
+       op.o_hdr = &ohdr;
        op.o_bd = be;
        op.o_tmpmemctx = NULL;
        op.o_tmpmfuncs = &ch_mfuncs;
@@ -342,7 +370,8 @@ ID bdb_tool_entry_put(
                                "id2entry_add failed: %s (%d)",
                                db_strerror(rc), rc );
                Debug( LDAP_DEBUG_ANY,
-                       "=> bdb_tool_entry_put: %s\n", text->bv_val, 0, 0 );
+                       "=> " LDAP_XSTRING(bdb_tool_entry_put) ": %s\n",
+                       text->bv_val, 0, 0 );
                goto done;
        }
 
@@ -353,31 +382,36 @@ ID bdb_tool_entry_put(
                                "index_entry_add failed: %s (%d)",
                                db_strerror(rc), rc );
                Debug( LDAP_DEBUG_ANY,
-                       "=> bdb_tool_entry_put: %s\n", text->bv_val, 0, 0 );
+                       "=> " LDAP_XSTRING(bdb_tool_entry_put) ": %s\n",
+                       text->bv_val, 0, 0 );
                goto done;
        }
 
 done:
        if( rc == 0 ) {
+               if ( !( slapMode & SLAP_TOOL_QUICK )) {
                rc = TXN_COMMIT( tid, 0 );
                if( rc != 0 ) {
                        snprintf( text->bv_val, text->bv_len,
                                        "txn_commit failed: %s (%d)",
                                        db_strerror(rc), rc );
                        Debug( LDAP_DEBUG_ANY,
-                               "=> bdb_tool_entry_put: %s\n",
+                               "=> " LDAP_XSTRING(bdb_tool_entry_put) ": %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)",
                        db_strerror(rc), rc );
                Debug( LDAP_DEBUG_ANY,
-                       "=> bdb_tool_entry_put: %s\n",
+                       "=> " LDAP_XSTRING(bdb_tool_entry_put) ": %s\n",
                        text->bv_val, 0, 0 );
+               }
                e->e_id = NOID;
        }
 
@@ -393,8 +427,10 @@ int bdb_tool_entry_reindex(
        Entry *e;
        DB_TXN *tid = NULL;
        Operation op = {0};
+       Opheader ohdr = {0};
 
-       Debug( LDAP_DEBUG_ARGS, "=> bdb_tool_entry_reindex( %ld )\n",
+       Debug( LDAP_DEBUG_ARGS,
+               "=> " LDAP_XSTRING(bdb_tool_entry_reindex) "( %ld )\n",
                (long) id, 0, 0 );
 
        /* No indexes configured, nothing to do. Could return an
@@ -415,18 +451,22 @@ int bdb_tool_entry_reindex(
 
        if( e == NULL ) {
                Debug( LDAP_DEBUG_ANY,
-                       "bdb_tool_entry_reindex:: could not locate id=%ld\n",
+                       LDAP_XSTRING(bdb_tool_entry_reindex)
+                       ": could not locate id=%ld\n",
                        (long) id, 0, 0 );
                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,
-                       "=> bdb_tool_entry_reindex: txn_begin failed: %s (%d)\n",
+                       "=> " LDAP_XSTRING(bdb_tool_entry_reindex) ": "
+                       "txn_begin failed: %s (%d)\n",
                        db_strerror(rc), rc, 0 );
                goto done;
        }
+       }
        
        /*
         * just (re)add them for now
@@ -435,41 +475,38 @@ int bdb_tool_entry_reindex(
         *
         */
 
-       Debug( LDAP_DEBUG_TRACE, "=> bdb_tool_entry_reindex( %ld, \"%s\" )\n",
+       Debug( LDAP_DEBUG_TRACE,
+               "=> " LDAP_XSTRING(bdb_tool_entry_reindex) "( %ld, \"%s\" )\n",
                (long) id, e->e_dn, 0 );
 
+       op.o_hdr = &ohdr;
        op.o_bd = be;
        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,
-                       "=> 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,
-                               "=> bdb_tool_entry_reindex: txn_commit failed: %s (%d)\n",
+                               "=> " LDAP_XSTRING(bdb_tool_entry_reindex)
+                               ": txn_commit failed: %s (%d)\n",
                                db_strerror(rc), rc, 0 );
                        e->e_id = NOID;
                }
+               }
 
        } else {
+               if (! (slapMode & SLAP_TOOL_QUICK)) {
                TXN_ABORT( tid );
                Debug( LDAP_DEBUG_ANY,
-                       "=> bdb_tool_entry_reindex: txn_aborted! %s (%d)\n",
+                       "=> " 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 );
@@ -486,20 +523,22 @@ ID bdb_tool_entry_modify(
        struct bdb_info *bdb = (struct bdb_info *) be->be_private;
        DB_TXN *tid = NULL;
        Operation op = {0};
+       Opheader ohdr = {0};
 
        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, "=> bdb_tool_entry_put( %ld, \"%s\" )\n",
+       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 ) {
@@ -507,11 +546,13 @@ ID bdb_tool_entry_modify(
                        "txn_begin failed: %s (%d)",
                        db_strerror(rc), rc );
                Debug( LDAP_DEBUG_ANY,
-                       "=> bdb_tool_entry_put: %s\n",
+                       "=> " LDAP_XSTRING(bdb_tool_entry_modify) ": %s\n",
                         text->bv_val, 0, 0 );
                return NOID;
        }
+       }
 
+       op.o_hdr = &ohdr;
        op.o_bd = be;
        op.o_tmpmemctx = NULL;
        op.o_tmpmfuncs = &ch_mfuncs;
@@ -523,19 +564,26 @@ ID bdb_tool_entry_modify(
                                "id2entry_add failed: %s (%d)",
                                db_strerror(rc), rc );
                Debug( LDAP_DEBUG_ANY,
-                       "=> bdb_tool_entry_put: %s\n", text->bv_val, 0, 0 );
+                       "=> " LDAP_XSTRING(bdb_tool_entry_modify) ": %s\n",
+                       text->bv_val, 0, 0 );
                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,
                                "index_entry_del failed: %s (%d)",
                                db_strerror(rc), rc );
                Debug( LDAP_DEBUG_ANY,
-                       "=> bdb_tool_entry_put: %s\n", text->bv_val, 0, 0 );
+                       "=> " LDAP_XSTRING(bdb_tool_entry_modify) ": %s\n",
+                       text->bv_val, 0, 0 );
                goto done;
        }
+#endif
 
        rc = bdb_index_entry_add( &op, tid, e );
        if( rc != 0 ) {
@@ -543,31 +591,36 @@ ID bdb_tool_entry_modify(
                                "index_entry_add failed: %s (%d)",
                                db_strerror(rc), rc );
                Debug( LDAP_DEBUG_ANY,
-                       "=> bdb_tool_entry_put: %s\n", text->bv_val, 0, 0 );
+                       "=> " LDAP_XSTRING(bdb_tool_entry_modify) ": %s\n",
+                       text->bv_val, 0, 0 );
                goto done;
        }
 
 done:
        if( rc == 0 ) {
+               if (! (slapMode & SLAP_TOOL_QUICK)) {
                rc = TXN_COMMIT( tid, 0 );
                if( rc != 0 ) {
                        snprintf( text->bv_val, text->bv_len,
                                        "txn_commit failed: %s (%d)",
                                        db_strerror(rc), rc );
                        Debug( LDAP_DEBUG_ANY,
-                               "=> bdb_tool_entry_put: %s\n",
-                               text->bv_val, 0, 0 );
+                               "=> " LDAP_XSTRING(bdb_tool_entry_modify) ": "
+                               "%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)",
                        db_strerror(rc), rc );
                Debug( LDAP_DEBUG_ANY,
-                       "=> bdb_tool_entry_put: %s\n",
+                       "=> " LDAP_XSTRING(bdb_tool_entry_modify) ": %s\n",
                        text->bv_val, 0, 0 );
+               }
                e->e_id = NOID;
        }