Diff for /servers/slapd/back-bdb/dn2id.c between versions 1.137 and 1.137.2.14

version 1.137, 2006/01/03 22:12:17 version 1.137.2.14, 2009/01/21 00:30:42
Line 1 Line 1
 /* dn2id.c - routines to deal with the dn2id index */  /* dn2id.c - routines to deal with the dn2id index */
 /* $OpenLDAP: pkg/ldap/servers/slapd/back-bdb/dn2id.c,v 1.136 2005/12/15 21:52:31 hyc Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/back-bdb/dn2id.c,v 1.137.2.13 2008/10/31 23:23:59 quanah Exp $ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.  /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *   *
  * Copyright 2000-2006 The OpenLDAP Foundation.   * Copyright 2000-2008 The OpenLDAP Foundation.
  * All rights reserved.   * All rights reserved.
  *   *
  * Redistribution and use in source and binary forms, with or without   * Redistribution and use in source and binary forms, with or without
Line 23 Line 23
 #include "idl.h"  #include "idl.h"
 #include "lutil.h"  #include "lutil.h"
   
   #define bdb_dn2id_lock                                  BDB_SYMBOL(dn2id_lock)
   
   static int
   bdb_dn2id_lock( struct bdb_info *bdb, struct berval *dn,
           int rw, DB_TXN *txn, DB_LOCK *lock )
   {
           int       rc;
           DBT       lockobj;
           int       db_rw;
   
           if (!txn)
                   return 0;
   
           if (rw)
                   db_rw = DB_LOCK_WRITE;
           else
                   db_rw = DB_LOCK_READ;
   
           lockobj.data = dn->bv_val;
           lockobj.size = dn->bv_len;
   
           rc = LOCK_GET(bdb->bi_dbenv, TXN_ID(txn), DB_LOCK_NOWAIT,
                                           &lockobj, db_rw, lock);
           return rc;
   }
   
 #ifndef BDB_HIER  #ifndef BDB_HIER
 int  int
 bdb_dn2id_add(  bdb_dn2id_add(
Line 39  bdb_dn2id_add( Line 65  bdb_dn2id_add(
         char            *buf;          char            *buf;
         struct berval   ptr, pdn;          struct berval   ptr, pdn;
   
         Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_add( \"%s\", 0x%08lx )\n",          Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_add 0x%lx: \"%s\"\n",
                 e->e_ndn, (long) e->e_id, 0 );                  e->e_id, e->e_ndn, 0 );
         assert( e->e_id != NOID );          assert( e->e_id != NOID );
   
         DBTzero( &key );          DBTzero( &key );
Line 63  bdb_dn2id_add( Line 89  bdb_dn2id_add(
         /* store it -- don't override */          /* store it -- don't override */
         rc = db->put( db, txn, &key, &data, DB_NOOVERWRITE );          rc = db->put( db, txn, &key, &data, DB_NOOVERWRITE );
         if( rc != 0 ) {          if( rc != 0 ) {
                 Debug( LDAP_DEBUG_ANY, "=> bdb_dn2id_add: put failed: %s %d\n",                  char buf[ SLAP_TEXT_BUFLEN ];
                         db_strerror(rc), rc, 0 );                  snprintf( buf, sizeof( buf ), "%s => bdb_dn2id_add dn=\"%s\" ID=0x%lx",
                           op->o_log_prefix, e->e_name.bv_val, e->e_id );
                   Debug( LDAP_DEBUG_ANY, "%s: put failed: %s %d\n",
                           buf, db_strerror(rc), rc );
                 goto done;                  goto done;
         }          }
   
Line 76  bdb_dn2id_add( Line 105  bdb_dn2id_add(
                 rc = db->put( db, txn, &key, &data, DB_NOOVERWRITE );                  rc = db->put( db, txn, &key, &data, DB_NOOVERWRITE );
                 if( rc != 0 ) {                  if( rc != 0 ) {
                         Debug( LDAP_DEBUG_ANY,                          Debug( LDAP_DEBUG_ANY,
                         "=> bdb_dn2id_add: subtree (%s) put failed: %d\n",                          "=> bdb_dn2id_add 0x%lx: subtree (%s) put failed: %d\n",
                         ptr.bv_val, rc, 0 );                          e->e_id, ptr.bv_val, rc );
                         goto done;                          goto done;
                 }                  }
                                   
Line 97  bdb_dn2id_add( Line 126  bdb_dn2id_add(
   
                 if( rc != 0 ) {                  if( rc != 0 ) {
                         Debug( LDAP_DEBUG_ANY,                          Debug( LDAP_DEBUG_ANY,
                                 "=> bdb_dn2id_add: parent (%s) insert failed: %d\n",                                  "=> bdb_dn2id_add 0x%lx: parent (%s) insert failed: %d\n",
                                         ptr.bv_val, rc, 0 );                                          e->e_id, ptr.bv_val, rc );
                         goto done;                          goto done;
                 }                  }
         }          }
Line 115  bdb_dn2id_add( Line 144  bdb_dn2id_add(
   
                 if( rc != 0 ) {                  if( rc != 0 ) {
                         Debug( LDAP_DEBUG_ANY,                          Debug( LDAP_DEBUG_ANY,
                                 "=> bdb_dn2id_add: subtree (%s) insert failed: %d\n",                                  "=> bdb_dn2id_add 0x%lx: subtree (%s) insert failed: %d\n",
                                         ptr.bv_val, rc, 0 );                                          e->e_id, ptr.bv_val, rc );
                         break;                          break;
                 }                  }
 #ifdef BDB_MULTIPLE_SUFFIXES  #ifdef BDB_MULTIPLE_SUFFIXES
Line 133  bdb_dn2id_add( Line 162  bdb_dn2id_add(
   
 done:  done:
         op->o_tmpfree( buf, op->o_tmpmemctx );          op->o_tmpfree( buf, op->o_tmpmemctx );
         Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id_add: %d\n", rc, 0, 0 );          Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id_add 0x%lx: %d\n", e->e_id, rc, 0 );
         return rc;          return rc;
 }  }
   
Line 146  bdb_dn2id_delete( Line 175  bdb_dn2id_delete(
 {  {
         struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;          struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
         DB *db = bdb->bi_dn2id->bdi_db;          DB *db = bdb->bi_dn2id->bdi_db;
         int             rc;  
         DBT             key;  
         char            *buf;          char            *buf;
           DBT             key;
           DB_LOCK lock;
         struct berval   pdn, ptr;          struct berval   pdn, ptr;
           int             rc;
   
         Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_delete( \"%s\", 0x%08lx )\n",          Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_delete 0x%lx: \"%s\"\n",
                 e->e_ndn, e->e_id, 0 );                  e->e_id, e->e_ndn, 0 );
   
         DBTzero( &key );          DBTzero( &key );
         key.size = e->e_nname.bv_len + 2;          key.size = e->e_nname.bv_len + 2;
Line 165  bdb_dn2id_delete( Line 195  bdb_dn2id_delete(
         AC_MEMCPY( ptr.bv_val, e->e_nname.bv_val, e->e_nname.bv_len );          AC_MEMCPY( ptr.bv_val, e->e_nname.bv_val, e->e_nname.bv_len );
         ptr.bv_val[ptr.bv_len] = '\0';          ptr.bv_val[ptr.bv_len] = '\0';
   
           /* We hold this lock until the TXN completes */
           rc = bdb_dn2id_lock( bdb, &e->e_nname, 1, txn, &lock );
           if ( rc ) goto done;
   
         /* delete it */          /* delete it */
         rc = db->del( db, txn, &key, 0 );          rc = db->del( db, txn, &key, 0 );
         if( rc != 0 ) {          if( rc != 0 ) {
                 Debug( LDAP_DEBUG_ANY, "=> bdb_dn2id_delete: delete failed: %s %d\n",                  Debug( LDAP_DEBUG_ANY, "=> bdb_dn2id_delete 0x%lx: delete failed: %s %d\n",
                         db_strerror(rc), rc, 0 );                          e->e_id, db_strerror(rc), rc );
                 goto done;                  goto done;
         }          }
   
Line 181  bdb_dn2id_delete( Line 215  bdb_dn2id_delete(
                 rc = bdb_idl_delete_key( op->o_bd, db, txn, &key, e->e_id );                  rc = bdb_idl_delete_key( op->o_bd, db, txn, &key, e->e_id );
                 if( rc != 0 ) {                  if( rc != 0 ) {
                         Debug( LDAP_DEBUG_ANY,                          Debug( LDAP_DEBUG_ANY,
                         "=> bdb_dn2id_delete: subtree (%s) delete failed: %d\n",                          "=> bdb_dn2id_delete 0x%lx: subtree (%s) delete failed: %d\n",
                         ptr.bv_val, rc, 0 );                          e->e_id, ptr.bv_val, rc );
                         goto done;                          goto done;
                 }                  }
   
Line 202  bdb_dn2id_delete( Line 236  bdb_dn2id_delete(
   
                 if( rc != 0 ) {                  if( rc != 0 ) {
                         Debug( LDAP_DEBUG_ANY,                          Debug( LDAP_DEBUG_ANY,
                                 "=> bdb_dn2id_delete: parent (%s) delete failed: %d\n",                                  "=> bdb_dn2id_delete 0x%lx: parent (%s) delete failed: %d\n",
                                 ptr.bv_val, rc, 0 );                                  e->e_id, ptr.bv_val, rc );
                         goto done;                          goto done;
                 }                  }
         }          }
Line 219  bdb_dn2id_delete( Line 253  bdb_dn2id_delete(
                 rc = bdb_idl_delete_key( op->o_bd, db, txn, &key, e->e_id );                  rc = bdb_idl_delete_key( op->o_bd, db, txn, &key, e->e_id );
                 if( rc != 0 ) {                  if( rc != 0 ) {
                         Debug( LDAP_DEBUG_ANY,                          Debug( LDAP_DEBUG_ANY,
                                 "=> bdb_dn2id_delete: subtree (%s) delete failed: %d\n",                                  "=> bdb_dn2id_delete 0x%lx: subtree (%s) delete failed: %d\n",
                                 ptr.bv_val, rc, 0 );                                  e->e_id, ptr.bv_val, rc );
                         goto done;                          goto done;
                 }                  }
 #ifdef BDB_MULTIPLE_SUFFIXES  #ifdef BDB_MULTIPLE_SUFFIXES
Line 237  bdb_dn2id_delete( Line 271  bdb_dn2id_delete(
   
 done:  done:
         op->o_tmpfree( buf, op->o_tmpmemctx );          op->o_tmpfree( buf, op->o_tmpmemctx );
         Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id_delete %d\n", rc, 0, 0 );          Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id_delete 0x%lx: %d\n", e->e_id, rc, 0 );
         return rc;          return rc;
 }  }
   
 int  int
 bdb_dn2id(  bdb_dn2id(
         Operation *op,          Operation *op,
         DB_TXN *txn,  
         struct berval   *dn,          struct berval   *dn,
         EntryInfo *ei )          EntryInfo *ei,
           DB_TXN *txn,
           DB_LOCK *lock )
 {  {
         struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;          struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
         DB *db = bdb->bi_dn2id->bdi_db;          DB *db = bdb->bi_dn2id->bdi_db;
           DBC     *cursor;
         int             rc;          int             rc;
         DBT             key, data;          DBT             key, data;
         ID              nid;          ID              nid;
   
         Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id(\"%s\")\n", dn->bv_val, 0, 0 );          Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id(\"%s\")\n", dn->bv_val, 0, 0 );
   
         DBTzero( &key );          DBTzero( &key );
         key.size = dn->bv_len + 2;          key.size = dn->bv_len + 2;
         key.data = op->o_tmpalloc( key.size, op->o_tmpmemctx );          key.data = op->o_tmpalloc( key.size, op->o_tmpmemctx );
Line 267  bdb_dn2id( Line 304  bdb_dn2id(
         data.ulen = sizeof(ID);          data.ulen = sizeof(ID);
         data.flags = DB_DBT_USERMEM;          data.flags = DB_DBT_USERMEM;
   
           rc = db->cursor( db, txn, &cursor, bdb->bi_db_opflags );
           if ( rc ) goto func_leave;
   
           rc = bdb_dn2id_lock( bdb, dn, 0, txn, lock );
           if ( rc ) goto nolock;
   
         /* fetch it */          /* fetch it */
         rc = db->get( db, txn, &key, &data, bdb->bi_db_opflags );          rc = cursor->c_get( cursor, &key, &data, DB_SET );
   
   nolock:
           cursor->c_close( cursor );
   func_leave:
   
         if( rc != 0 ) {          if( rc != 0 ) {
                 Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id: get failed: %s (%d)\n",                  Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id: get failed: %s (%d)\n",
                         db_strerror( rc ), rc, 0 );                          db_strerror( rc ), rc, 0 );
         } else {          } else {
                 BDB_DISK2ID( &nid, &ei->bei_id );                  BDB_DISK2ID( &nid, &ei->bei_id );
                 Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id: got id=0x%08lx\n",                  Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id: got id=0x%lx\n",
                         ei->bei_id, 0, 0 );                          ei->bei_id, 0, 0 );
         }          }
   
         op->o_tmpfree( key.data, op->o_tmpmemctx );          op->o_tmpfree( key.data, op->o_tmpmemctx );
         return rc;          return rc;
 }  }
Line 332  bdb_dn2id_children( Line 378  bdb_dn2id_children(
 int  int
 bdb_dn2idl(  bdb_dn2idl(
         Operation *op,          Operation *op,
         Entry *e,          DB_TXN *txn,
           struct berval *ndn,
           EntryInfo *ei,
         ID *ids,          ID *ids,
         ID *stack )          ID *stack )
 {  {
Line 344  bdb_dn2idl( Line 392  bdb_dn2idl(
                 ? DN_ONE_PREFIX : DN_SUBTREE_PREFIX;                  ? DN_ONE_PREFIX : DN_SUBTREE_PREFIX;
   
         Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2idl(\"%s\")\n",          Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2idl(\"%s\")\n",
                 e->e_nname.bv_val, 0, 0 );                  ndn->bv_val, 0, 0 );
   
 #ifndef BDB_MULTIPLE_SUFFIXES  #ifndef BDB_MULTIPLE_SUFFIXES
         if ( prefix == DN_SUBTREE_PREFIX && BEI(e)->bei_parent->bei_id == 0 ) {          if ( prefix == DN_SUBTREE_PREFIX
                   && ( ei->bei_id == 0 ||
                   ( ei->bei_parent->bei_id == 0 && op->o_bd->be_suffix[0].bv_len ))) {
                 BDB_IDL_ALL(bdb, ids);                  BDB_IDL_ALL(bdb, ids);
                 return 0;                  return 0;
         }          }
 #endif  #endif
   
         DBTzero( &key );          DBTzero( &key );
         key.size = e->e_nname.bv_len + 2;          key.size = ndn->bv_len + 2;
         key.ulen = key.size;          key.ulen = key.size;
         key.flags = DB_DBT_USERMEM;          key.flags = DB_DBT_USERMEM;
         key.data = op->o_tmpalloc( key.size, op->o_tmpmemctx );          key.data = op->o_tmpalloc( key.size, op->o_tmpmemctx );
         ((char *)key.data)[0] = prefix;          ((char *)key.data)[0] = prefix;
         AC_MEMCPY( &((char *)key.data)[1], e->e_nname.bv_val, key.size - 1 );          AC_MEMCPY( &((char *)key.data)[1], ndn->bv_val, key.size - 1 );
   
         BDB_IDL_ZERO( ids );          BDB_IDL_ZERO( ids );
         rc = bdb_idl_fetch_key( op->o_bd, db, NULL, &key, ids, NULL, 0 );          rc = bdb_idl_fetch_key( op->o_bd, db, txn, &key, ids, NULL, 0 );
   
         if( rc != 0 ) {          if( rc != 0 ) {
                 Debug( LDAP_DEBUG_TRACE,                  Debug( LDAP_DEBUG_TRACE,
Line 404  typedef struct diskNode { Line 454  typedef struct diskNode {
         unsigned char entryID[sizeof(ID)];  /* variable placement */          unsigned char entryID[sizeof(ID)];  /* variable placement */
 } diskNode;  } diskNode;
   
   /* Sort function for the sorted duplicate data items of a dn2id key.
    * Sorts based on normalized RDN, in length order.
    */
   int
   hdb_dup_compare(
           DB *db, 
           const DBT *usrkey,
           const DBT *curkey
   )
   {
           diskNode *un, *cn;
           int rc;
   
           un = (diskNode *)usrkey->data;
           cn = (diskNode *)curkey->data;
   
           /* data is not aligned, cannot compare directly */
           rc = un->nrdnlen[0] - cn->nrdnlen[0];
           if ( rc ) return rc;
           rc = un->nrdnlen[1] - cn->nrdnlen[1];
           if ( rc ) return rc;
   
           return strcmp( un->nrdn, cn->nrdn );
   }
   
 /* This function constructs a full DN for a given entry.  /* This function constructs a full DN for a given entry.
  */   */
 int hdb_fix_dn(  int hdb_fix_dn(
Line 479  hdb_dn2id_add( Line 554  hdb_dn2id_add(
         diskNode *d;          diskNode *d;
         char *ptr;          char *ptr;
   
           Debug( LDAP_DEBUG_TRACE, "=> hdb_dn2id_add 0x%lx: \"%s\"\n",
                   e->e_id, e->e_ndn, 0 );
   
         nrlen = dn_rdnlen( op->o_bd, &e->e_nname );          nrlen = dn_rdnlen( op->o_bd, &e->e_nname );
         if (nrlen) {          if (nrlen) {
                 rlen = dn_rdnlen( op->o_bd, &e->e_name );                  rlen = dn_rdnlen( op->o_bd, &e->e_name );
Line 539  hdb_dn2id_add( Line 617  hdb_dn2id_add(
                 tmp[1] = eip->bei_id;                  tmp[1] = eip->bei_id;
                 *ptr = DN_ONE_PREFIX;                  *ptr = DN_ONE_PREFIX;
                 bdb_idl_cache_add_id( bdb, db, &key, e->e_id );                  bdb_idl_cache_add_id( bdb, db, &key, e->e_id );
                 *ptr = DN_SUBTREE_PREFIX;                  if ( eip->bei_parent ) {
                 for (; eip && eip->bei_parent->bei_id; eip = eip->bei_parent) {                          *ptr = DN_SUBTREE_PREFIX;
                         tmp[1] = eip->bei_id;                          for (; eip && eip->bei_parent->bei_id; eip = eip->bei_parent) {
                         bdb_idl_cache_add_id( bdb, db, &key, e->e_id );                                  tmp[1] = eip->bei_id;
                                   bdb_idl_cache_add_id( bdb, db, &key, e->e_id );
                           }
                 }                  }
         }          }
   
         op->o_tmpfree( d, op->o_tmpmemctx );          op->o_tmpfree( d, op->o_tmpmemctx );
           Debug( LDAP_DEBUG_TRACE, "<= hdb_dn2id_add 0x%lx: %d\n", e->e_id, rc, 0 );
   
         return rc;          return rc;
 }  }
Line 565  hdb_dn2id_delete( Line 647  hdb_dn2id_delete(
         int rc;          int rc;
         ID      nid;          ID      nid;
         unsigned char dlen[2];          unsigned char dlen[2];
           DB_LOCK lock;
   
           Debug( LDAP_DEBUG_TRACE, "=> hdb_dn2id_delete 0x%lx: \"%s\"\n",
                   e->e_id, e->e_ndn, 0 );
   
         DBTzero(&key);          DBTzero(&key);
         key.size = sizeof(ID);          key.size = sizeof(ID);
Line 579  hdb_dn2id_delete( Line 665  hdb_dn2id_delete(
         data.flags = DB_DBT_USERMEM | DB_DBT_PARTIAL;          data.flags = DB_DBT_USERMEM | DB_DBT_PARTIAL;
   
         key.data = &nid;          key.data = &nid;
         rc = db->cursor( db, txn, &cursor, bdb->bi_db_opflags );  
         if ( rc ) return rc;  
   
         d = op->o_tmpalloc( data.size, op->o_tmpmemctx );          d = op->o_tmpalloc( data.size, op->o_tmpmemctx );
         d->nrdnlen[1] = BEI(e)->bei_nrdn.bv_len & 0xff;          d->nrdnlen[1] = BEI(e)->bei_nrdn.bv_len & 0xff;
Line 590  hdb_dn2id_delete( Line 674  hdb_dn2id_delete(
         strcpy( d->nrdn, BEI(e)->bei_nrdn.bv_val );          strcpy( d->nrdn, BEI(e)->bei_nrdn.bv_val );
         data.data = d;          data.data = d;
   
           rc = db->cursor( db, txn, &cursor, bdb->bi_db_opflags );
           if ( rc ) goto func_leave;
   
           /* We hold this lock until the TXN completes */
           rc = bdb_dn2id_lock( bdb, &e->e_nname, 1, txn, &lock );
           if ( rc ) goto nolock;
   
         /* Delete our ID from the parent's list */          /* Delete our ID from the parent's list */
         rc = cursor->c_get( cursor, &key, &data, DB_GET_BOTH_RANGE );          rc = cursor->c_get( cursor, &key, &data, DB_GET_BOTH_RANGE );
         if ( rc == 0 ) {          if ( rc == 0 ) {
Line 610  hdb_dn2id_delete( Line 701  hdb_dn2id_delete(
                 if ( rc == 0 )                  if ( rc == 0 )
                         rc = cursor->c_del( cursor, 0 );                          rc = cursor->c_del( cursor, 0 );
         }          }
   
   nolock:
         cursor->c_close( cursor );          cursor->c_close( cursor );
   func_leave:
         op->o_tmpfree( d, op->o_tmpmemctx );          op->o_tmpfree( d, op->o_tmpmemctx );
   
         /* Delete IDL cache entries */          /* Delete IDL cache entries */
Line 622  hdb_dn2id_delete( Line 716  hdb_dn2id_delete(
                 tmp[1] = eip->bei_id;                  tmp[1] = eip->bei_id;
                 *ptr = DN_ONE_PREFIX;                  *ptr = DN_ONE_PREFIX;
                 bdb_idl_cache_del_id( bdb, db, &key, e->e_id );                  bdb_idl_cache_del_id( bdb, db, &key, e->e_id );
                 *ptr = DN_SUBTREE_PREFIX;                  if ( eip ->bei_parent ) {
                 for (; eip && eip->bei_parent->bei_id; eip = eip->bei_parent) {                          *ptr = DN_SUBTREE_PREFIX;
                         tmp[1] = eip->bei_id;                          for (; eip && eip->bei_parent->bei_id; eip = eip->bei_parent) {
                         bdb_idl_cache_del_id( bdb, db, &key, e->e_id );                                  tmp[1] = eip->bei_id;
                                   bdb_idl_cache_del_id( bdb, db, &key, e->e_id );
                           }
                 }                  }
         }          }
           Debug( LDAP_DEBUG_TRACE, "<= hdb_dn2id_delete 0x%lx: %d\n", e->e_id, rc, 0 );
         return rc;          return rc;
 }  }
   
Line 635  hdb_dn2id_delete( Line 732  hdb_dn2id_delete(
 int  int
 hdb_dn2id(  hdb_dn2id(
         Operation       *op,          Operation       *op,
         DB_TXN *txn,  
         struct berval   *in,          struct berval   *in,
         EntryInfo       *ei )          EntryInfo       *ei,
           DB_TXN *txn,
           DB_LOCK *lock )
 {  {
         struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;          struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
         DB *db = bdb->bi_dn2id->bdi_db;          DB *db = bdb->bi_dn2id->bdi_db;
Line 649  hdb_dn2id( Line 747  hdb_dn2id(
         unsigned char dlen[2];          unsigned char dlen[2];
         ID idp, parentID;          ID idp, parentID;
   
           Debug( LDAP_DEBUG_TRACE, "=> hdb_dn2id(\"%s\")\n", in->bv_val, 0, 0 );
   
         nrlen = dn_rdnlen( op->o_bd, in );          nrlen = dn_rdnlen( op->o_bd, in );
         if (!nrlen) nrlen = in->bv_len;          if (!nrlen) nrlen = in->bv_len;
   
Line 678  hdb_dn2id( Line 778  hdb_dn2id(
         *ptr = '\0';          *ptr = '\0';
         data.data = d;          data.data = d;
   
           rc = bdb_dn2id_lock( bdb, in, 0, txn, lock );
           if ( rc ) goto func_leave;
   
         rc = cursor->c_get( cursor, &key, &data, DB_GET_BOTH_RANGE );          rc = cursor->c_get( cursor, &key, &data, DB_GET_BOTH_RANGE );
         if ( rc == 0 && (dlen[1] != d->nrdnlen[1] || dlen[0] != d->nrdnlen[0] ||          if ( rc == 0 && (dlen[1] != d->nrdnlen[1] || dlen[0] != d->nrdnlen[0] ||
                 strncmp( d->nrdn, in->bv_val, nrlen ))) {                  strncmp( d->nrdn, in->bv_val, nrlen ))) {
Line 699  hdb_dn2id( Line 802  hdb_dn2id(
                         ei->bei_parent->bei_dkids = dkids;                          ei->bei_parent->bei_dkids = dkids;
                 }                  }
         }          }
   
   func_leave:
         cursor->c_close( cursor );          cursor->c_close( cursor );
         op->o_tmpfree( d, op->o_tmpmemctx );          op->o_tmpfree( d, op->o_tmpmemctx );
           if( rc != 0 ) {
                   Debug( LDAP_DEBUG_TRACE, "<= hdb_dn2id: get failed: %s (%d)\n",
                           db_strerror( rc ), rc, 0 );
           } else {
                   Debug( LDAP_DEBUG_TRACE, "<= hdb_dn2id: got id=0x%lx\n",
                           ei->bei_id, 0, 0 );
           }
   
         return rc;          return rc;
 }  }
Line 709  int Line 821  int
 hdb_dn2id_parent(  hdb_dn2id_parent(
         Operation *op,          Operation *op,
         DB_TXN *txn,          DB_TXN *txn,
         u_int32_t       locker,  
         EntryInfo *ei,          EntryInfo *ei,
         ID *idp )          ID *idp )
 {  {
Line 734  hdb_dn2id_parent( Line 845  hdb_dn2id_parent(
   
         rc = db->cursor( db, txn, &cursor, bdb->bi_db_opflags );          rc = db->cursor( db, txn, &cursor, bdb->bi_db_opflags );
         if ( rc ) return rc;          if ( rc ) return rc;
         if ( !txn && locker ) {  
                 cursor->locker = locker;  
         }  
   
         data.ulen = sizeof(diskNode) + (SLAP_LDAPDN_MAXLEN * 2);          data.ulen = sizeof(diskNode) + (SLAP_LDAPDN_MAXLEN * 2);
         d = op->o_tmpalloc( data.ulen, op->o_tmpmemctx );          d = op->o_tmpalloc( data.ulen, op->o_tmpmemctx );
Line 830  hdb_dn2id_children( Line 938  hdb_dn2id_children(
 struct dn2id_cookie {  struct dn2id_cookie {
         struct bdb_info *bdb;          struct bdb_info *bdb;
         Operation *op;          Operation *op;
           DB_TXN *txn;
         EntryInfo *ei;          EntryInfo *ei;
         ID *ids;          ID *ids;
         ID *tmp;          ID *tmp;
Line 1044  gotit: Line 1153  gotit:
                                 }                                  }
                                 cx->depth--;                                  cx->depth--;
                                 cx->op->o_tmpfree( save, cx->op->o_tmpmemctx );                                  cx->op->o_tmpfree( save, cx->op->o_tmpmemctx );
                                 if ( nokids ) ei->bei_state |= CACHE_ENTRY_NO_GRANDKIDS;                                  if ( nokids ) {
                                           bdb_cache_entryinfo_lock( ei );
                                           ei->bei_state |= CACHE_ENTRY_NO_GRANDKIDS;
                                           bdb_cache_entryinfo_unlock( ei );
                                   }
                         }                          }
                         /* Make sure caller knows it had kids! */                          /* Make sure caller knows it had kids! */
                         cx->tmp[0]=1;                          cx->tmp[0]=1;
Line 1060  gotit: Line 1173  gotit:
 int  int
 hdb_dn2idl(  hdb_dn2idl(
         Operation       *op,          Operation       *op,
         Entry           *e,          DB_TXN *txn,
           struct berval *ndn,
           EntryInfo       *ei,
         ID *ids,          ID *ids,
         ID *stack )          ID *stack )
 {  {
Line 1068  hdb_dn2idl( Line 1183  hdb_dn2idl(
         struct dn2id_cookie cx;          struct dn2id_cookie cx;
   
         Debug( LDAP_DEBUG_TRACE, "=> hdb_dn2idl(\"%s\")\n",          Debug( LDAP_DEBUG_TRACE, "=> hdb_dn2idl(\"%s\")\n",
                 e->e_nname.bv_val, 0, 0 );                  ndn->bv_val, 0, 0 );
   
 #ifndef BDB_MULTIPLE_SUFFIXES  #ifndef BDB_MULTIPLE_SUFFIXES
         if ( op->ors_scope != LDAP_SCOPE_ONELEVEL &&           if ( op->ors_scope != LDAP_SCOPE_ONELEVEL && 
                 BEI(e)->bei_parent->bei_id == 0 )                  ( ei->bei_id == 0 ||
                   ( ei->bei_parent->bei_id == 0 && op->o_bd->be_suffix[0].bv_len )))
         {          {
                 BDB_IDL_ALL( bdb, ids );                  BDB_IDL_ALL( bdb, ids );
                 return 0;                  return 0;
         }          }
 #endif  #endif
   
         cx.id = e->e_id;          cx.id = ei->bei_id;
         BDB_ID2DISK( cx.id, &cx.nid );          BDB_ID2DISK( cx.id, &cx.nid );
         cx.ei = e->e_id ? BEI(e) : &bdb->bi_cache.c_dntree;          cx.ei = ei;
         cx.bdb = bdb;          cx.bdb = bdb;
         cx.db = cx.bdb->bi_dn2id->bdi_db;          cx.db = cx.bdb->bi_dn2id->bdi_db;
         cx.prefix = (op->ors_scope == LDAP_SCOPE_ONELEVEL) ?          cx.prefix = (op->ors_scope == LDAP_SCOPE_ONELEVEL) ?
Line 1090  hdb_dn2idl( Line 1206  hdb_dn2idl(
         cx.tmp = stack;          cx.tmp = stack;
         cx.buf = stack + BDB_IDL_UM_SIZE;          cx.buf = stack + BDB_IDL_UM_SIZE;
         cx.op = op;          cx.op = op;
           cx.txn = txn;
         cx.need_sort = 0;          cx.need_sort = 0;
         cx.depth = 0;          cx.depth = 0;
   
Line 1117  hdb_dn2idl( Line 1234  hdb_dn2idl(
                 cx.key.data = ptr;                  cx.key.data = ptr;
                 cx.key.size = sizeof(ID)+1;                  cx.key.size = sizeof(ID)+1;
                 *ptr = cx.prefix;                  *ptr = cx.prefix;
                 cx.id = e->e_id;                  cx.id = ei->bei_id;
                 bdb_idl_cache_put( cx.bdb, cx.db, &cx.key, cx.ids, cx.rc );                  if ( cx.bdb->bi_idl_cache_max_size )
                           bdb_idl_cache_put( cx.bdb, cx.db, &cx.key, cx.ids, cx.rc );
         }          }
   
         if ( cx.rc == DB_NOTFOUND )          if ( cx.rc == DB_NOTFOUND )

Removed from v.1.137  
changed lines
  Added in v.1.137.2.14


______________
© Copyright 1998-2020, OpenLDAP Foundation, info@OpenLDAP.org