]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/operational.c
Plug memory leak
[openldap] / servers / slapd / back-bdb / operational.c
index cfcf17cdb3d02ec46f62cdd2c1354923b7ffca93..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 */
@@ -51,9 +44,9 @@ retry:        /* transaction retry */
 #endif
 #ifdef NEW_LOGGING
                LDAP_LOG ( OPERATION, DETAIL1, 
-                       "=> bdb_operational: retrying...\n", 0, 0, 0 );
+                       "=> bdb_hasSubordinates: retrying...\n", 0, 0, 0 );
 #else
-               Debug( LDAP_DEBUG_TRACE, "==> bdb_operational: retrying...\n", 
+               Debug( LDAP_DEBUG_TRACE, "==> bdb_hasSubordinates: retrying...\n", 
                                0, 0, 0 );
 #endif
                rc = TXN_ABORT( ltid );
@@ -71,11 +64,11 @@ retry:      /* transaction retry */
        if ( rc != 0 ) {
 #ifdef NEW_LOGGING
                LDAP_LOG ( OPERATION, ERR, 
-                       "=> bdb_operational: txn_begin failed: %s (%d)\n",
+                       "=> 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;
@@ -95,21 +88,22 @@ 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_operational: has_children failed: %s (%d)\n",
+                       "=> 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;
@@ -130,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;
+}
+