]> git.sur5r.net Git - openldap/commitdiff
add bdb_hasSubordinates() helper
authorPierangelo Masarati <ando@openldap.org>
Thu, 29 Aug 2002 10:50:53 +0000 (10:50 +0000)
committerPierangelo Masarati <ando@openldap.org>
Thu, 29 Aug 2002 10:50:53 +0000 (10:50 +0000)
servers/slapd/back-bdb/operational.c
servers/slapd/back-bdb/proto-bdb.h

index cfcf17cdb3d02ec46f62cdd2c1354923b7ffca93..1c5d4b14d6580bbc60bde18d608d0bd79e7c81c0 100644 (file)
  */
 
 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,33 @@ return_results:
        return rc;
 }
 
+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;
+}
+
index 8fa8b55181e2792923d3319321d00550808ce8e9..6c7dfeb5863175293a4808a692a946e8324634ab 100644 (file)
@@ -300,6 +300,17 @@ int bdb_modify_internal(
        char *textbuf,
        size_t textlen );
 
+/*
+ * operational.c
+ */
+int
+bdb_hasSubordinates(
+       BackendDB       *be,
+       Connection      *conn, 
+       Operation       *op,
+       Entry           *e,
+       int             *hasSubordinates );
+
 /*
  * passwd.c
  */