]> git.sur5r.net Git - openldap/commitdiff
port hasSubordinates handling to back-bdb
authorPierangelo Masarati <ando@openldap.org>
Sat, 23 Mar 2002 11:04:09 +0000 (11:04 +0000)
committerPierangelo Masarati <ando@openldap.org>
Sat, 23 Mar 2002 11:04:09 +0000 (11:04 +0000)
servers/slapd/back-bdb/Makefile.in
servers/slapd/back-bdb/external.h
servers/slapd/back-bdb/init.c
servers/slapd/back-bdb/operational.c [new file with mode: 0644]

index 764b0de6c5c520283c3e65175dfefdd76db266e3..e2208232dae7a601a0f9ebe8cdf56dbb145935e9 100644 (file)
@@ -2,12 +2,12 @@
 
 SRCS = init.c tools.c config.c \
        add.c bind.c compare.c delete.c modify.c modrdn.c search.c \
-       extended.c passwd.c referral.c attribute.c group.c \
+       extended.c passwd.c referral.c attribute.c group.c operational.c \
        attr.c index.c key.c dbcache.c filterindex.c \
        dn2entry.c dn2id.c error.c id2entry.c idl.c nextid.c cache.c
 OBJS = init.lo tools.lo config.lo \
        add.lo bind.lo compare.lo delete.lo modify.lo modrdn.lo search.lo \
-       extended.lo passwd.lo referral.lo attribute.lo group.lo \
+       extended.lo passwd.lo referral.lo attribute.lo group.lo operational.lo \
        attr.lo index.lo key.lo dbcache.lo filterindex.lo \
        dn2entry.lo dn2id.lo error.lo id2entry.lo idl.lo nextid.lo cache.lo
 
index dc49ce8a7ba7b82dad5dc6228006721af6f8e79e..f7c285a808621fd2c84810ded9b298ca033c3f8d 100644 (file)
@@ -31,6 +31,8 @@ extern BI_op_extended bdb_extended;
 
 extern BI_chk_referrals        bdb_referrals;
 
+extern BI_operational  bdb_operational;
+
 /* tools.c */
 extern BI_tool_entry_open      bdb_tool_entry_open;
 extern BI_tool_entry_close     bdb_tool_entry_close;
index 554ecf96c3b806f340f4440fa0f21cacf79d67f3..0aa13316f0a1ac2536b4d68009ee8113d3035d25 100644 (file)
@@ -562,6 +562,7 @@ bdb_initialize(
 #endif
 
        bi->bi_chk_referrals = bdb_referrals;
+       bi->bi_operational = bdb_operational;
        bi->bi_entry_release_rw = bdb_entry_release;
 
        /*
diff --git a/servers/slapd/back-bdb/operational.c b/servers/slapd/back-bdb/operational.c
new file mode 100644 (file)
index 0000000..278173f
--- /dev/null
@@ -0,0 +1,113 @@
+/* operational.c - bdb backend operational attributes function */
+/*
+ * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
+ * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+ */
+
+#include "portable.h"
+
+#include <stdio.h>
+
+#include <ac/string.h>
+#include <ac/socket.h>
+
+#include "slap.h"
+#include "back-bdb.h"
+#include "proto-bdb.h"
+
+/*
+ * sets the supported operational attributes (if required)
+ */
+
+int
+bdb_operational(
+       BackendDB       *be,
+       Connection      *conn, 
+       Operation       *op,
+       Entry           *e,
+       AttributeName           *attrs,
+       int             opattrs,
+       Attribute       **a )
+{
+       struct bdb_info *bdb = (struct bdb_info *) be->be_private;
+       Attribute       **aa = a;
+       int             rc;
+       DB_TXN          *ltid = NULL;
+        struct bdb_op_info opinfo;
+       
+       assert( e );
+
+       if ( !opattrs && !ad_inlist( slap_schema.si_ad_hasSubordinates, attrs ) ) {
+               return 0;
+       }
+
+
+       if( 0 ) {
+retry: /* transaction retry */
+               if( e != NULL ) {
+                       bdb_cache_return_entry_w(&bdb->bi_cache, e);
+               }
+               Debug( LDAP_DEBUG_TRACE, "==> bdb_delete: retrying...\n", 
+                               0, 0, 0 );
+               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, &ltid, bdb->bi_db_opflags );
+       if ( rc != 0 ) {
+               Debug( LDAP_DEBUG_TRACE,
+                       "bdb_operational: txn_begin failed: %s (%d)\n",
+                       db_strerror( rc ), rc, 0 );
+               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 );
+       
+       switch( rc ) {
+       case DB_LOCK_DEADLOCK:
+       case DB_LOCK_NOTGRANTED:
+               goto retry;
+
+       case 0:
+       case DB_NOTFOUND:
+               *aa = slap_operational_hasSubordinate( rc == 0 );
+               if ( *aa != NULL ) {
+                       aa = &(*aa)->a_next;
+               }
+               break;
+
+       default:
+               Debug(LDAP_DEBUG_ARGS, 
+                       "<=- bdb_operational: has_children failed: %s (%d)\n", 
+                       db_strerror(rc), rc, 0 );
+               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;
+}
+