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

version 1.137, 2006/01/03 22:12:17 version 1.137.2.5, 2007/12/06 15:55:27
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.4 2007/12/06 15:13:57 hyc 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-2007 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, BDB_LOCKER locker, DB_LOCK *lock )
   {
           int       rc;
           DBT       lockobj;
           int       db_rw;
   
           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, BDB_LOCKID(locker), 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 62  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 86  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",                  Debug( LDAP_DEBUG_ANY, "=> bdb_dn2id_add 0x%lx: put failed: %s %d\n",
                         db_strerror(rc), rc, 0 );                          e->e_id, db_strerror(rc), rc );
                 goto done;                  goto done;
         }          }
   
Line 76  bdb_dn2id_add( Line 99  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 120  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 138  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 156  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 169  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 189  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_ID( 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 209  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 230  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 247  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 265  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,
           BDB_LOCKER locker,
           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 298  bdb_dn2id(
         data.ulen = sizeof(ID);          data.ulen = sizeof(ID);
         data.flags = DB_DBT_USERMEM;          data.flags = DB_DBT_USERMEM;
   
           rc = db->cursor( db, NULL, &cursor, bdb->bi_db_opflags );
           if ( rc ) goto leave;
   
           rc = bdb_dn2id_lock( bdb, dn, 0, locker, lock );
           if ( rc ) goto nolock;
   
           if ( locker ) {
                   CURSOR_SETLOCKER(cursor, locker);
           }
   
         /* 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 );
   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 376  bdb_dn2id_children(
 int  int
 bdb_dn2idl(  bdb_dn2idl(
         Operation *op,          Operation *op,
         Entry *e,          BDB_LOCKER locker,
           struct berval *ndn,
           EntryInfo *ei,
         ID *ids,          ID *ids,
         ID *stack )          ID *stack )
 {  {
Line 344  bdb_dn2idl( Line 390  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 )) {
                 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, locker, &key, ids, NULL, 0 );
   
         if( rc != 0 ) {          if( rc != 0 ) {
                 Debug( LDAP_DEBUG_TRACE,                  Debug( LDAP_DEBUG_TRACE,
Line 404  typedef struct diskNode { Line 451  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, ul, cl;
   
           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 551  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 545  hdb_dn2id_add( Line 620  hdb_dn2id_add(
                         bdb_idl_cache_add_id( bdb, db, &key, e->e_id );                          bdb_idl_cache_add_id( bdb, db, &key, e->e_id );
                 }                  }
         }          }
   
   leave:
         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 643  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 661  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 670  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 leave;
   
           /* We hold this lock until the TXN completes */
           rc = bdb_dn2id_lock( bdb, &e->e_nname, 1, TXN_ID( 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 697  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 );
   leave:
         op->o_tmpfree( d, op->o_tmpmemctx );          op->o_tmpfree( d, op->o_tmpmemctx );
   
         /* Delete IDL cache entries */          /* Delete IDL cache entries */
Line 628  hdb_dn2id_delete( Line 718  hdb_dn2id_delete(
                         bdb_idl_cache_del_id( bdb, db, &key, e->e_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 726  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,
           BDB_LOCKER locker,
           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 741  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 666  hdb_dn2id( Line 760  hdb_dn2id(
         data.dlen = data.ulen;          data.dlen = data.ulen;
         data.flags = DB_DBT_USERMEM | DB_DBT_PARTIAL;          data.flags = DB_DBT_USERMEM | DB_DBT_PARTIAL;
   
         rc = db->cursor( db, txn, &cursor, bdb->bi_db_opflags );          rc = db->cursor( db, NULL, &cursor, bdb->bi_db_opflags );
         if ( rc ) return rc;          if ( rc ) return rc;
           if ( locker ) {
                   CURSOR_SETLOCKER( cursor, locker );
           }
   
         d = op->o_tmpalloc( data.size * 3, op->o_tmpmemctx );          d = op->o_tmpalloc( data.size * 3, op->o_tmpmemctx );
         d->nrdnlen[1] = nrlen & 0xff;          d->nrdnlen[1] = nrlen & 0xff;
Line 678  hdb_dn2id( Line 775  hdb_dn2id(
         *ptr = '\0';          *ptr = '\0';
         data.data = d;          data.data = d;
   
           rc = bdb_dn2id_lock( bdb, in, 0, locker, lock );
           if ( rc ) goto 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 799  hdb_dn2id(
                         ei->bei_parent->bei_dkids = dkids;                          ei->bei_parent->bei_dkids = dkids;
                 }                  }
         }          }
   
   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 708  hdb_dn2id( Line 817  hdb_dn2id(
 int  int
 hdb_dn2id_parent(  hdb_dn2id_parent(
         Operation *op,          Operation *op,
         DB_TXN *txn,          BDB_LOCKER      locker,
         u_int32_t       locker,  
         EntryInfo *ei,          EntryInfo *ei,
         ID *idp )          ID *idp )
 {  {
Line 732  hdb_dn2id_parent( Line 840  hdb_dn2id_parent(
         DBTzero(&data);          DBTzero(&data);
         data.flags = DB_DBT_USERMEM;          data.flags = DB_DBT_USERMEM;
   
         rc = db->cursor( db, txn, &cursor, bdb->bi_db_opflags );          rc = db->cursor( db, NULL, &cursor, bdb->bi_db_opflags );
         if ( rc ) return rc;          if ( rc ) return rc;
         if ( !txn && locker ) {          if ( locker ) {
                 cursor->locker = locker;                  CURSOR_SETLOCKER(cursor, locker);
         }          }
   
         data.ulen = sizeof(diskNode) + (SLAP_LDAPDN_MAXLEN * 2);          data.ulen = sizeof(diskNode) + (SLAP_LDAPDN_MAXLEN * 2);
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;
           BDB_LOCKER locker;
         EntryInfo *ei;          EntryInfo *ei;
         ID *ids;          ID *ids;
         ID *tmp;          ID *tmp;
Line 1060  gotit: Line 1169  gotit:
 int  int
 hdb_dn2idl(  hdb_dn2idl(
         Operation       *op,          Operation       *op,
         Entry           *e,          BDB_LOCKER locker,
           struct berval *ndn,
           EntryInfo       *ei,
         ID *ids,          ID *ids,
         ID *stack )          ID *stack )
 {  {
Line 1068  hdb_dn2idl( Line 1179  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 ))
         {          {
                 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 1202  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.locker = locker;
         cx.need_sort = 0;          cx.need_sort = 0;
         cx.depth = 0;          cx.depth = 0;
   
Line 1117  hdb_dn2idl( Line 1230  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.5


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