From f4c53629554604b21f19e9c9ac5ade3991384f36 Mon Sep 17 00:00:00 2001 From: Pierangelo Masarati Date: Thu, 29 Aug 2002 10:50:53 +0000 Subject: [PATCH] add bdb_hasSubordinates() helper --- servers/slapd/back-bdb/operational.c | 66 +++++++++++++++++++--------- servers/slapd/back-bdb/proto-bdb.h | 11 +++++ 2 files changed, 56 insertions(+), 21 deletions(-) diff --git a/servers/slapd/back-bdb/operational.c b/servers/slapd/back-bdb/operational.c index cfcf17cdb3..1c5d4b14d6 100644 --- a/servers/slapd/back-bdb/operational.c +++ b/servers/slapd/back-bdb/operational.c @@ -20,27 +20,20 @@ */ 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; +} + diff --git a/servers/slapd/back-bdb/proto-bdb.h b/servers/slapd/back-bdb/proto-bdb.h index 8fa8b55181..6c7dfeb586 100644 --- a/servers/slapd/back-bdb/proto-bdb.h +++ b/servers/slapd/back-bdb/proto-bdb.h @@ -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 */ -- 2.39.5