X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=servers%2Fslapd%2Fback-bdb%2Foperational.c;h=52504708038d7377b141a21a6b730c8a496964c4;hb=1a9bc6655ddf9a1d08ee4f5e6e4ef6a7707ca5f7;hp=1c5d4b14d6580bbc60bde18d608d0bd79e7c81c0;hpb=f4c53629554604b21f19e9c9ac5ade3991384f36;p=openldap diff --git a/servers/slapd/back-bdb/operational.c b/servers/slapd/back-bdb/operational.c index 1c5d4b14d6..5250470803 100644 --- a/servers/slapd/back-bdb/operational.c +++ b/servers/slapd/back-bdb/operational.c @@ -1,7 +1,17 @@ /* operational.c - bdb backend operational attributes function */ -/* - * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 2000-2004 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ #include "portable.h" @@ -13,78 +23,29 @@ #include "slap.h" #include "back-bdb.h" -#include "proto-bdb.h" +#include "external.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_hasSubordinates( - BackendDB *be, - Connection *conn, Operation *op, Entry *e, int *hasSubordinates ) { - struct bdb_info *bdb = (struct bdb_info *) be->be_private; int rc; - DB_TXN *ltid = NULL; - struct bdb_op_info opinfo; assert( e ); - assert( hasSubordinates ); - if( 0 ) { -retry: /* transaction retry */ -#if 0 - if( e != NULL ) { - bdb_unlocked_cache_return_entry_w(&bdb->bi_cache, e); - } -#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; - if( rc != 0 ) { - rc = LDAP_OTHER; - goto return_results; - } - ldap_pvt_thread_yield(); - } - - /* begin transaction */ - rc = TXN_BEGIN( bdb->bi_dbenv, NULL, <id, 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_hasSubordinates: txn_begin failed: %s (%d)\n", - db_strerror( rc ), rc, 0 ); -#endif - rc = LDAP_OTHER; - return rc; - } - - opinfo.boi_bdb = be; - opinfo.boi_txn = ltid; - opinfo.boi_err = 0; - op->o_private = &opinfo; - - rc = bdb_dn2id_children( be, ltid, &e->e_nname, 0 ); +retry: + rc = bdb_cache_children( op, NULL, e ); switch( rc ) { case DB_LOCK_DEADLOCK: case DB_LOCK_NOTGRANTED: + ldap_pvt_thread_yield(); goto retry; case 0: @@ -109,41 +70,28 @@ retry: /* transaction retry */ rc = LDAP_OTHER; } -return_results: - if ( rc == LDAP_SUCCESS && bdb->bi_txn_cp ) { - ldap_pvt_thread_yield(); - TXN_CHECKPOINT( bdb->bi_dbenv, - bdb->bi_txn_cp_kbyte, bdb->bi_txn_cp_min, 0 ); - } - - if ( ltid != NULL ) { - TXN_ABORT( ltid ); - op->o_private = NULL; - } - return rc; } +/* + * sets the supported operational attributes (if required) + */ int bdb_operational( - BackendDB *be, - Connection *conn, Operation *op, - Entry *e, - AttributeName *attrs, + SlapReply *rs, int opattrs, Attribute **a ) { Attribute **aa = a; - int rc = 0; - assert( e ); + assert( rs->sr_entry ); - if ( opattrs || ad_inlist( slap_schema.si_ad_hasSubordinates, attrs ) ) { + if ( opattrs || ad_inlist( slap_schema.si_ad_hasSubordinates, rs->sr_attrs ) ) { int hasSubordinates; - rc = bdb_hasSubordinates( be, conn, op, e, &hasSubordinates ); - if ( rc == LDAP_SUCCESS ) { + rs->sr_err = bdb_hasSubordinates( op, rs->sr_entry, &hasSubordinates ); + if ( rs->sr_err == LDAP_SUCCESS ) { *aa = slap_operational_hasSubordinate( hasSubordinates == LDAP_COMPARE_TRUE ); if ( *aa != NULL ) { aa = &(*aa)->a_next; @@ -151,6 +99,6 @@ bdb_operational( } } - return rc; + return rs->sr_err; }