]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/operational.c
Plug memory leak
[openldap] / servers / slapd / back-bdb / operational.c
index 278173fa2fdef92b04fd67e3859daf89a7c89578..7cead61e7c3d7cb375fcc8d29fba72f2c2087472 100644 (file)
 #include "proto-bdb.h"
 
 /*
- * sets the supported operational attributes (if required)
+ * sets *hasSubordinates to LDAP_COMPARE_TRUE/LDAP_COMPARE_FALSE
+ * if the entry has children or not.
  */
-
 int
-bdb_operational(
+bdb_hasSubordinates(
        BackendDB       *be,
        Connection      *conn, 
        Operation       *op,
        Entry           *e,
-       AttributeName           *attrs,
-       int             opattrs,
-       Attribute       **a )
+       int             *hasSubordinates )
 {
        struct bdb_info *bdb = (struct bdb_info *) be->be_private;
-       Attribute       **aa = a;
        int             rc;
        DB_TXN          *ltid = NULL;
-        struct bdb_op_info opinfo;
+       struct bdb_op_info opinfo;
        
        assert( e );
-
-       if ( !opattrs && !ad_inlist( slap_schema.si_ad_hasSubordinates, attrs ) ) {
-               return 0;
-       }
-
+       assert( hasSubordinates );
 
        if( 0 ) {
 retry: /* transaction retry */
+#if 0
                if( e != NULL ) {
-                       bdb_cache_return_entry_w(&bdb->bi_cache, e);
+                       bdb_unlocked_cache_return_entry_w(&bdb->bi_cache, e);
                }
-               Debug( LDAP_DEBUG_TRACE, "==> bdb_delete: retrying...\n", 
+#endif
+#ifdef NEW_LOGGING
+               LDAP_LOG ( OPERATION, DETAIL1, 
+                       "=> bdb_hasSubordinates: retrying...\n", 0, 0, 0 );
+#else
+               Debug( LDAP_DEBUG_TRACE, "==> bdb_hasSubordinates: retrying...\n", 
                                0, 0, 0 );
+#endif
                rc = TXN_ABORT( ltid );
                ltid = NULL;
                op->o_private = NULL;
@@ -62,9 +62,15 @@ retry:       /* transaction retry */
        /* begin transaction */
        rc = TXN_BEGIN( bdb->bi_dbenv, NULL, &ltid, bdb->bi_db_opflags );
        if ( rc != 0 ) {
+#ifdef NEW_LOGGING
+               LDAP_LOG ( OPERATION, ERR, 
+                       "=> bdb_hasSubordinates: txn_begin failed: %s (%d)\n",
+                       db_strerror(rc), rc, 0 );
+#else
                Debug( LDAP_DEBUG_TRACE,
-                       "bdb_operational: txn_begin failed: %s (%d)\n",
+                       "bdb_hasSubordinates: txn_begin failed: %s (%d)\n",
                        db_strerror( rc ), rc, 0 );
+#endif
                rc = LDAP_OTHER;
                return rc;
        }
@@ -74,7 +80,7 @@ retry:        /* transaction retry */
        opinfo.boi_err = 0;
        op->o_private = &opinfo;
 
-       rc = bdb_dn2id_children( be, ltid, &e->e_nname );
+       rc = bdb_dn2id_children( be, ltid, &e->e_nname, 0 );
        
        switch( rc ) {
        case DB_LOCK_DEADLOCK:
@@ -82,17 +88,24 @@ retry:      /* transaction retry */
                goto retry;
 
        case 0:
+               *hasSubordinates = LDAP_COMPARE_TRUE;
+               break;
+
        case DB_NOTFOUND:
-               *aa = slap_operational_hasSubordinate( rc == 0 );
-               if ( *aa != NULL ) {
-                       aa = &(*aa)->a_next;
-               }
+               *hasSubordinates = LDAP_COMPARE_FALSE;
+               rc = LDAP_SUCCESS;
                break;
 
        default:
+#ifdef NEW_LOGGING
+               LDAP_LOG ( OPERATION, ERR, 
+                       "=> bdb_hasSubordinates: has_children failed: %s (%d)\n",
+                       db_strerror(rc), rc, 0 );
+#else
                Debug(LDAP_DEBUG_ARGS, 
-                       "<=- bdb_operational: has_children failed: %s (%d)\n", 
+                       "<=- bdb_hasSubordinates: has_children failed: %s (%d)\n", 
                        db_strerror(rc), rc, 0 );
+#endif
                rc = LDAP_OTHER;
        }
 
@@ -111,3 +124,36 @@ return_results:
        return rc;
 }
 
+/*
+ * sets the supported operational attributes (if required)
+ */
+int
+bdb_operational(
+       BackendDB       *be,
+       Connection      *conn, 
+       Operation       *op,
+       Entry           *e,
+       AttributeName           *attrs,
+       int             opattrs,
+       Attribute       **a )
+{
+       Attribute       **aa = a;
+       int             rc = 0;
+       
+       assert( e );
+
+       if ( opattrs || ad_inlist( slap_schema.si_ad_hasSubordinates, attrs ) ) {
+               int     hasSubordinates;
+
+               rc = bdb_hasSubordinates( be, conn, op, e, &hasSubordinates );
+               if ( rc == LDAP_SUCCESS ) {
+                       *aa = slap_operational_hasSubordinate( hasSubordinates == LDAP_COMPARE_TRUE );
+                       if ( *aa != NULL ) {
+                               aa = &(*aa)->a_next;
+                       }
+               }
+       }
+
+       return rc;
+}
+