Diff for /servers/slapd/back-bdb/dn2id.c between versions 1.137.2.26 and 1.138

version 1.137.2.26, 2011/01/26 23:23:31 version 1.138, 2007/01/02 19:01:08
Line 1 Line 1
 /* dn2id.c - routines to deal with the dn2id index */  /* dn2id.c - routines to deal with the dn2id index */
 /* $OpenLDAP$ */  /* $OpenLDAP: pkg/ldap/servers/slapd/back-bdb/dn2id.c,v 1.137 2006/01/03 22:12:17 kurt 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-2011 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 39  bdb_dn2id_add( Line 39  bdb_dn2id_add(
         char            *buf;          char            *buf;
         struct berval   ptr, pdn;          struct berval   ptr, pdn;
   
         Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_add 0x%lx: \"%s\"\n",          Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_add( \"%s\", 0x%08lx )\n",
                 e->e_id, e->e_ndn, 0 );                  e->e_ndn, (long) e->e_id, 0 );
         assert( e->e_id != NOID );          assert( e->e_id != NOID );
   
         DBTzero( &key );          DBTzero( &key );
Line 63  bdb_dn2id_add( Line 63  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 ) {
                 char buf[ SLAP_TEXT_BUFLEN ];                  Debug( LDAP_DEBUG_ANY, "=> bdb_dn2id_add: put failed: %s %d\n",
                 snprintf( buf, sizeof( buf ), "%s => bdb_dn2id_add dn=\"%s\" ID=0x%lx",                          db_strerror(rc), rc, 0 );
                         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 79  bdb_dn2id_add( Line 76  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 0x%lx: subtree (%s) put failed: %d\n",                          "=> bdb_dn2id_add: subtree (%s) put failed: %d\n",
                         e->e_id, ptr.bv_val, rc );                          ptr.bv_val, rc, 0 );
                         goto done;                          goto done;
                 }                  }
                                   
Line 100  bdb_dn2id_add( Line 97  bdb_dn2id_add(
   
                 if( rc != 0 ) {                  if( rc != 0 ) {
                         Debug( LDAP_DEBUG_ANY,                          Debug( LDAP_DEBUG_ANY,
                                 "=> bdb_dn2id_add 0x%lx: parent (%s) insert failed: %d\n",                                  "=> bdb_dn2id_add: parent (%s) insert failed: %d\n",
                                         e->e_id, ptr.bv_val, rc );                                          ptr.bv_val, rc, 0 );
                         goto done;                          goto done;
                 }                  }
         }          }
Line 118  bdb_dn2id_add( Line 115  bdb_dn2id_add(
   
                 if( rc != 0 ) {                  if( rc != 0 ) {
                         Debug( LDAP_DEBUG_ANY,                          Debug( LDAP_DEBUG_ANY,
                                 "=> bdb_dn2id_add 0x%lx: subtree (%s) insert failed: %d\n",                                  "=> bdb_dn2id_add: subtree (%s) insert failed: %d\n",
                                         e->e_id, ptr.bv_val, rc );                                          ptr.bv_val, rc, 0 );
                         break;                          break;
                 }                  }
 #ifdef BDB_MULTIPLE_SUFFIXES  #ifdef BDB_MULTIPLE_SUFFIXES
Line 136  bdb_dn2id_add( Line 133  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 0x%lx: %d\n", e->e_id, rc, 0 );          Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id_add: %d\n", rc, 0, 0 );
         return rc;          return rc;
 }  }
   
Line 149  bdb_dn2id_delete( Line 146  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;
         char            *buf;          int             rc;
         DBT             key;          DBT             key;
           char            *buf;
         struct berval   pdn, ptr;          struct berval   pdn, ptr;
         int             rc;  
   
         Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_delete 0x%lx: \"%s\"\n",          Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_delete( \"%s\", 0x%08lx )\n",
                 e->e_id, e->e_ndn, 0 );                  e->e_ndn, e->e_id, 0 );
   
         DBTzero( &key );          DBTzero( &key );
         key.size = e->e_nname.bv_len + 2;          key.size = e->e_nname.bv_len + 2;
Line 171  bdb_dn2id_delete( Line 168  bdb_dn2id_delete(
         /* 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 0x%lx: delete failed: %s %d\n",                  Debug( LDAP_DEBUG_ANY, "=> bdb_dn2id_delete: delete failed: %s %d\n",
                         e->e_id, db_strerror(rc), rc );                          db_strerror(rc), rc, 0 );
                 goto done;                  goto done;
         }          }
   
Line 184  bdb_dn2id_delete( Line 181  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 0x%lx: subtree (%s) delete failed: %d\n",                          "=> bdb_dn2id_delete: subtree (%s) delete failed: %d\n",
                         e->e_id, ptr.bv_val, rc );                          ptr.bv_val, rc, 0 );
                         goto done;                          goto done;
                 }                  }
   
Line 205  bdb_dn2id_delete( Line 202  bdb_dn2id_delete(
   
                 if( rc != 0 ) {                  if( rc != 0 ) {
                         Debug( LDAP_DEBUG_ANY,                          Debug( LDAP_DEBUG_ANY,
                                 "=> bdb_dn2id_delete 0x%lx: parent (%s) delete failed: %d\n",                                  "=> bdb_dn2id_delete: parent (%s) delete failed: %d\n",
                                 e->e_id, ptr.bv_val, rc );                                  ptr.bv_val, rc, 0 );
                         goto done;                          goto done;
                 }                  }
         }          }
Line 222  bdb_dn2id_delete( Line 219  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 0x%lx: subtree (%s) delete failed: %d\n",                                  "=> bdb_dn2id_delete: subtree (%s) delete failed: %d\n",
                                 e->e_id, ptr.bv_val, rc );                                  ptr.bv_val, rc, 0 );
                         goto done;                          goto done;
                 }                  }
 #ifdef BDB_MULTIPLE_SUFFIXES  #ifdef BDB_MULTIPLE_SUFFIXES
Line 240  bdb_dn2id_delete( Line 237  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 0x%lx: %d\n", e->e_id, rc, 0 );          Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id_delete %d\n", rc, 0, 0 );
         return rc;          return rc;
 }  }
   
 int  int
 bdb_dn2id(  bdb_dn2id(
         Operation *op,          Operation *op,
         struct berval   *dn,  
         EntryInfo *ei,  
         DB_TXN *txn,          DB_TXN *txn,
         DBC **cursor )          struct berval   *dn,
           EntryInfo *ei )
 {  {
         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 259  bdb_dn2id( Line 255  bdb_dn2id(
         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 272  bdb_dn2id( Line 267  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 );  
   
         /* fetch it */          /* fetch it */
         if ( !rc )          rc = db->get( db, txn, &key, &data, bdb->bi_db_opflags );
                 rc = (*cursor)->c_get( *cursor, &key, &data, DB_SET );  
   
         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%lx\n",                  Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id: got id=0x%08lx\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 339  bdb_dn2id_children( Line 332  bdb_dn2id_children(
 int  int
 bdb_dn2idl(  bdb_dn2idl(
         Operation *op,          Operation *op,
         DB_TXN *txn,          Entry *e,
         struct berval *ndn,  
         EntryInfo *ei,  
         ID *ids,          ID *ids,
         ID *stack )          ID *stack )
 {  {
Line 353  bdb_dn2idl( Line 344  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",
                 ndn->bv_val, 0, 0 );                  e->e_nname.bv_val, 0, 0 );
   
 #ifndef BDB_MULTIPLE_SUFFIXES  #ifndef BDB_MULTIPLE_SUFFIXES
         if ( prefix == DN_SUBTREE_PREFIX          if ( prefix == DN_SUBTREE_PREFIX && 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
   
         DBTzero( &key );          DBTzero( &key );
         key.size = ndn->bv_len + 2;          key.size = e->e_nname.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], ndn->bv_val, key.size - 1 );          AC_MEMCPY( &((char *)key.data)[1], e->e_nname.bv_val, key.size - 1 );
   
         BDB_IDL_ZERO( ids );          BDB_IDL_ZERO( ids );
         rc = bdb_idl_fetch_key( op->o_bd, db, txn, &key, ids, NULL, 0 );          rc = bdb_idl_fetch_key( op->o_bd, db, NULL, &key, ids, NULL, 0 );
   
         if( rc != 0 ) {          if( rc != 0 ) {
                 Debug( LDAP_DEBUG_TRACE,                  Debug( LDAP_DEBUG_TRACE,
Line 415  typedef struct diskNode { Line 404  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 490  int hdb_fix_dn( Line 454  int hdb_fix_dn(
                 }                  }
         }          }
         BEI(e)->bei_modrdns = max;          BEI(e)->bei_modrdns = max;
         if ( ptr > e->e_name.bv_val ) ptr[-1] = '\0';          ptr[-1] = '\0';
         if ( nptr > e->e_nname.bv_val ) nptr[-1] = '\0';          nptr[-1] = '\0';
   
         return 0;          return 0;
 }  }
Line 515  hdb_dn2id_add( Line 479  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 578  hdb_dn2id_add( Line 539  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 );
                 if ( eip->bei_parent ) {                  *ptr = DN_SUBTREE_PREFIX;
                         *ptr = DN_SUBTREE_PREFIX;                  for (; eip && eip->bei_parent->bei_id; eip = eip->bei_parent) {
                         for (; eip && eip->bei_parent->bei_id; eip = eip->bei_parent) {                          tmp[1] = eip->bei_id;
                                 tmp[1] = eip->bei_id;                          bdb_idl_cache_add_id( bdb, db, &key, e->e_id );
                                 bdb_idl_cache_add_id( bdb, db, &key, e->e_id );  
                         }  
                         /* Handle DB with empty suffix */  
                         if ( !op->o_bd->be_suffix[0].bv_len && eip ) {  
                                 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 614  hdb_dn2id_delete( Line 566  hdb_dn2id_delete(
         ID      nid;          ID      nid;
         unsigned char dlen[2];          unsigned char dlen[2];
   
         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);
         key.ulen = key.size;          key.ulen = key.size;
Line 630  hdb_dn2id_delete( Line 579  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;
         d->nrdnlen[0] = (BEI(e)->bei_nrdn.bv_len >> 8) | 0x80;          d->nrdnlen[0] = (BEI(e)->bei_nrdn.bv_len >> 8) | 0x80;
         dlen[0] = d->nrdnlen[0];          dlen[0] = d->nrdnlen[0];
         dlen[1] = d->nrdnlen[1];          dlen[1] = d->nrdnlen[1];
         memcpy( d->nrdn, BEI(e)->bei_nrdn.bv_val, BEI(e)->bei_nrdn.bv_len+1 );          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;  
   
         /* 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 662  hdb_dn2id_delete( Line 610  hdb_dn2id_delete(
                 if ( rc == 0 )                  if ( rc == 0 )
                         rc = cursor->c_del( cursor, 0 );                          rc = cursor->c_del( cursor, 0 );
         }          }
   
         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 676  func_leave: Line 622  func_leave:
                 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 );
                 if ( eip ->bei_parent ) {                  *ptr = DN_SUBTREE_PREFIX;
                         *ptr = DN_SUBTREE_PREFIX;                  for (; eip && eip->bei_parent->bei_id; eip = eip->bei_parent) {
                         for (; eip && eip->bei_parent->bei_id; eip = eip->bei_parent) {                          tmp[1] = eip->bei_id;
                                 tmp[1] = eip->bei_id;                          bdb_idl_cache_del_id( bdb, db, &key, e->e_id );
                                 bdb_idl_cache_del_id( bdb, db, &key, e->e_id );  
                         }  
                         /* Handle DB with empty suffix */  
                         if ( !op->o_bd->be_suffix[0].bv_len && eip ) {  
                                 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 697  func_leave: Line 635  func_leave:
 int  int
 hdb_dn2id(  hdb_dn2id(
         Operation       *op,          Operation       *op,
         struct berval   *in,  
         EntryInfo       *ei,  
         DB_TXN *txn,          DB_TXN *txn,
         DBC **cursor )          struct berval   *in,
           EntryInfo       *ei )
 {  {
         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;
         DBT             key, data;          DBT             key, data;
           DBC     *cursor;
         int             rc = 0, nrlen;          int             rc = 0, nrlen;
         diskNode *d;          diskNode *d;
         char    *ptr;          char    *ptr;
         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 730  hdb_dn2id( Line 666  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, txn, &cursor, bdb->bi_db_opflags );
         if ( rc ) return rc;          if ( rc ) return rc;
   
         d = op->o_tmpalloc( data.size * 3, op->o_tmpmemctx );          d = op->o_tmpalloc( data.size * 3, op->o_tmpmemctx );
Line 742  hdb_dn2id( Line 678  hdb_dn2id(
         *ptr = '\0';          *ptr = '\0';
         data.data = d;          data.data = d;
   
         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 ))) {
                 rc = DB_NOTFOUND;                  rc = DB_NOTFOUND;
Line 759  hdb_dn2id( Line 695  hdb_dn2id(
                         /* FIXME: do we need to lock the parent                          /* FIXME: do we need to lock the parent
                          * entryinfo? Seems safe...                           * entryinfo? Seems safe...
                          */                           */
                         (*cursor)->c_count( *cursor, &dkids, 0 );                          cursor->c_count( cursor, &dkids, 0 );
                         ei->bei_parent->bei_dkids = dkids;                          ei->bei_parent->bei_dkids = dkids;
                 }                  }
         }          }
           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 780  int Line 709  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 804  hdb_dn2id_parent( Line 734  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 897  hdb_dn2id_children( Line 830  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 1051  hdb_dn2idl_internal( Line 983  hdb_dn2idl_internal(
                 cx->rc = cx->dbc->c_close( cx->dbc );                  cx->rc = cx->dbc->c_close( cx->dbc );
 done_one:  done_one:
                 bdb_cache_entryinfo_lock( cx->ei );                  bdb_cache_entryinfo_lock( cx->ei );
                 cx->ei->bei_state &= ~CACHE_ENTRY_ONELEVEL;                  cx->ei->bei_state ^= CACHE_ENTRY_ONELEVEL;
                 bdb_cache_entryinfo_unlock( cx->ei );                  bdb_cache_entryinfo_unlock( cx->ei );
                 if ( cx->rc )                  if ( cx->rc )
                         return cx->rc;                          return cx->rc;
Line 1100  gotit: Line 1032  gotit:
                                 for ( cx->id = bdb_idl_first( save, &idcurs );                                  for ( cx->id = bdb_idl_first( save, &idcurs );
                                         cx->id != NOID;                                          cx->id != NOID;
                                         cx->id = bdb_idl_next( save, &idcurs )) {                                          cx->id = bdb_idl_next( save, &idcurs )) {
                                         EntryInfo *ei2;                                          cx->ei = bdb_cache_find_info( cx->bdb, cx->id );
                                         cx->ei = NULL;                                          if ( !cx->ei ||
                                         if ( bdb_cache_find_id( cx->op, cx->txn, cx->id, &cx->ei,                                                  ( cx->ei->bei_state & CACHE_ENTRY_NO_KIDS ))
                                                 ID_NOENTRY, NULL ))  
                                                 continue;                                                  continue;
                                         if ( cx->ei ) {  
                                                 ei2 = cx->ei;                                          BDB_ID2DISK( cx->id, &cx->nid );
                                                 if ( !( ei2->bei_state & CACHE_ENTRY_NO_KIDS )) {                                          hdb_dn2idl_internal( cx );
                                                         BDB_ID2DISK( cx->id, &cx->nid );                                          if ( !BDB_IDL_IS_ZERO( cx->tmp ))
                                                         hdb_dn2idl_internal( cx );                                                  nokids = 0;
                                                         if ( !BDB_IDL_IS_ZERO( cx->tmp ))  
                                                                 nokids = 0;  
                                                 }  
                                                 bdb_cache_entryinfo_lock( ei2 );  
                                                 ei2->bei_finders--;  
                                                 bdb_cache_entryinfo_unlock( ei2 );  
                                         }  
                                 }                                  }
                                 cx->depth--;                                  cx->depth--;
                                 cx->op->o_tmpfree( save, cx->op->o_tmpmemctx );                                  cx->op->o_tmpfree( save, cx->op->o_tmpmemctx );
                                 if ( nokids ) {                                  if ( nokids ) ei->bei_state |= CACHE_ENTRY_NO_GRANDKIDS;
                                         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 1140  gotit: Line 1060  gotit:
 int  int
 hdb_dn2idl(  hdb_dn2idl(
         Operation       *op,          Operation       *op,
         DB_TXN *txn,          Entry           *e,
         struct berval *ndn,  
         EntryInfo       *ei,  
         ID *ids,          ID *ids,
         ID *stack )          ID *stack )
 {  {
Line 1150  hdb_dn2idl( Line 1068  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",
                 ndn->bv_val, 0, 0 );                  e->e_nname.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 && 
                 ( ei->bei_id == 0 ||                  BEI(e)->bei_parent->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 = ei->bei_id;          cx.id = e->e_id;
         BDB_ID2DISK( cx.id, &cx.nid );          BDB_ID2DISK( cx.id, &cx.nid );
         cx.ei = ei;          cx.ei = e->e_id ? BEI(e) : &bdb->bi_cache.c_dntree;
         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 1173  hdb_dn2idl( Line 1090  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 1201  hdb_dn2idl( Line 1117  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 = ei->bei_id;                  cx.id = e->e_id;
                 if ( cx.bdb->bi_idl_cache_max_size )                  bdb_idl_cache_put( cx.bdb, cx.db, &cx.key, cx.ids, cx.rc );
                         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.2.26  
changed lines
  Added in v.1.138


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