Diff for /servers/slapd/overlays/refint.c between versions 1.19.2.16 and 1.19.2.17

version 1.19.2.16, 2011/01/03 23:41:56 version 1.19.2.17, 2011/01/03 23:43:17
Line 416  refint_search_cb( Line 416  refint_search_cb(
         **      if this attr exists in the search result,          **      if this attr exists in the search result,
         **      and it has a value matching the target:          **      and it has a value matching the target:
         **              allocate an attr;          **              allocate an attr;
           **              save/build DNs of any subordinate matches;
           **              handle special case: found exact + subordinate match;
         **              handle olcRefintNothing;          **              handle olcRefintNothing;
         **          **
         */          */
Line 428  refint_search_cb( Line 430  refint_search_cb(
         ip->attrs = NULL;          ip->attrs = NULL;
         for(ia = da; ia; ia = ia->next) {          for(ia = da; ia; ia = ia->next) {
                 if ( (a = attr_find(rs->sr_entry->e_attrs, ia->attr) ) ) {                  if ( (a = attr_find(rs->sr_entry->e_attrs, ia->attr) ) ) {
                         int             first = -1, count = 0, deleted = 0;                          int exact = -1, is_exact;
   
                         na = NULL;                          na = NULL;
   
                         for(i = 0, b = a->a_nvals; b[i].bv_val; i++) {                          for(i = 0, b = a->a_nvals; b[i].bv_val; i++) {
                                 if(dnIsSuffix(&b[i], &rq->oldndn)) {                                  if(dnIsSuffix(&b[i], &rq->oldndn)) {
                                           is_exact = b[i].bv_len == rq->oldndn.bv_len;
   
                                           /* Paranoia: skip buggy duplicate exact match,
                                            * it would break ra_numvals
                                            */
                                           if ( is_exact && exact >= 0 )
                                                   continue;
   
                                         /* first match? create structure */                                          /* first match? create structure */
                                         if ( na == NULL ) {                                          if ( na == NULL ) {
                                                 na = op->o_tmpcalloc( 1,                                                  na = op->o_tmpcalloc( 1,
Line 442  refint_search_cb( Line 452  refint_search_cb(
                                                 na->next = ip->attrs;                                                  na->next = ip->attrs;
                                                 ip->attrs = na;                                                  ip->attrs = na;
                                                 na->attr = ia->attr;                                                  na->attr = ia->attr;
   
                                                 /* delete, or exact match? note it's first match */  
                                                 if ( BER_BVISEMPTY( &rq->newdn ) &&  
                                                         b[i].bv_len == rq->oldndn.bv_len )  
                                                 {  
                                                         first = i;  
                                                 }  
                                         }                                          }
   
                                         /* if it's a rename, or a subordinate match,                                          na->ra_numvals++;
                                          * save old and build new dn */  
                                         if ( !BER_BVISEMPTY( &rq->newdn ) &&  
                                                 b[i].bv_len != rq->oldndn.bv_len )  
                                         {  
                                                 struct berval   newsub, newdn, olddn, oldndn;  
   
                                                 /* if not first, save first as well */  
                                                 if ( first != -1 ) {  
   
                                                         ber_dupbv_x( &olddn, &a->a_vals[first], op->o_tmpmemctx );  
                                                         ber_bvarray_add_x( &na->old_vals, &olddn, op->o_tmpmemctx );  
                                                         ber_dupbv_x( &oldndn, &a->a_nvals[first], op->o_tmpmemctx );  
                                                         ber_bvarray_add_x( &na->old_nvals, &oldndn, op->o_tmpmemctx );  
                                                         na->ra_numvals++;  
   
                                                         newsub = a->a_vals[first];  
                                                         newsub.bv_len -= rq->olddn.bv_len + 1;  
   
                                                         build_new_dn( &newdn, &rq->newdn, &newsub, op->o_tmpmemctx );  
   
                                                         ber_bvarray_add_x( &na->new_vals, &newdn, op->o_tmpmemctx );                                          if ( is_exact ) {
                                                   /* Exact match: refint_repair will deduce the DNs */
                                                   exact = i;
   
                                                         newsub = a->a_nvals[first];                                          } else {
                                                         newsub.bv_len -= rq->oldndn.bv_len + 1;                                                  /* Subordinate match */
                                                   struct berval   newsub, newdn, olddn, oldndn;
                                                         build_new_dn( &newdn, &rq->newndn, &newsub, op->o_tmpmemctx );  
   
                                                         ber_bvarray_add_x( &na->new_nvals, &newdn, op->o_tmpmemctx );  
                                                           
                                                         first = -1;  
                                                 }  
   
                                                   /* Save old DN */
                                                 ber_dupbv_x( &olddn, &a->a_vals[i], op->o_tmpmemctx );                                                  ber_dupbv_x( &olddn, &a->a_vals[i], op->o_tmpmemctx );
                                                 ber_bvarray_add_x( &na->old_vals, &olddn, op->o_tmpmemctx );                                                  ber_bvarray_add_x( &na->old_vals, &olddn, op->o_tmpmemctx );
   
                                                 ber_dupbv_x( &oldndn, &a->a_nvals[i], op->o_tmpmemctx );                                                  ber_dupbv_x( &oldndn, &a->a_nvals[i], op->o_tmpmemctx );
                                                 ber_bvarray_add_x( &na->old_nvals, &oldndn, op->o_tmpmemctx );                                                  ber_bvarray_add_x( &na->old_nvals, &oldndn, op->o_tmpmemctx );
                                                 na->ra_numvals++;  
   
                                                   if ( BER_BVISEMPTY( &rq->newdn ) )
                                                           continue;
   
                                                   /* Rename subordinate match: Build new DN */
                                                 newsub = a->a_vals[i];                                                  newsub = a->a_vals[i];
                                                 newsub.bv_len -= rq->olddn.bv_len + 1;                                                  newsub.bv_len -= rq->olddn.bv_len + 1;
   
                                                 build_new_dn( &newdn, &rq->newdn, &newsub, op->o_tmpmemctx );                                                  build_new_dn( &newdn, &rq->newdn, &newsub, op->o_tmpmemctx );
   
                                                 ber_bvarray_add_x( &na->new_vals, &newdn, op->o_tmpmemctx );                                                  ber_bvarray_add_x( &na->new_vals, &newdn, op->o_tmpmemctx );
   
                                                 newsub = a->a_nvals[i];                                                  newsub = a->a_nvals[i];
                                                 newsub.bv_len -= rq->oldndn.bv_len + 1;                                                  newsub.bv_len -= rq->oldndn.bv_len + 1;
   
                                                 build_new_dn( &newdn, &rq->newndn, &newsub, op->o_tmpmemctx );                                                  build_new_dn( &newdn, &rq->newndn, &newsub, op->o_tmpmemctx );
   
                                                 ber_bvarray_add_x( &na->new_nvals, &newdn, op->o_tmpmemctx );                                                  ber_bvarray_add_x( &na->new_nvals, &newdn, op->o_tmpmemctx );
                                         }                                          }
                                   }
                           }
   
                                         /* count deletes */                          /* If we got both subordinate and exact match,
                                         if ( BER_BVISEMPTY( &rq->newdn ) ) {                           * refint_repair won't special-case the exact match */
                                                 deleted++;                          if ( exact >= 0 && na->old_vals ) {
                                         }                                  struct berval   dn;
   
                                   ber_dupbv_x( &dn, &a->a_vals[exact], op->o_tmpmemctx );
                                   ber_bvarray_add_x( &na->old_vals, &dn, op->o_tmpmemctx );
                                   ber_dupbv_x( &dn, &a->a_nvals[exact], op->o_tmpmemctx );
                                   ber_bvarray_add_x( &na->old_nvals, &dn, op->o_tmpmemctx );
   
                                   if ( !BER_BVISEMPTY( &rq->newdn ) ) {
                                           ber_dupbv_x( &dn, &rq->newdn, op->o_tmpmemctx );
                                           ber_bvarray_add_x( &na->new_vals, &dn, op->o_tmpmemctx );
                                           ber_dupbv_x( &dn, &rq->newndn, op->o_tmpmemctx );
                                           ber_bvarray_add_x( &na->new_nvals, &dn, op->o_tmpmemctx );
                                 }                                  }
                         }                          }
   
                         /* Deleting/replacing all values and a nothing DN is configured? */                          /* Deleting/replacing all values and a nothing DN is configured? */
                         if ( deleted == i && na && !BER_BVISNULL(&dd->nothing) )                          if ( na && na->ra_numvals == i && !BER_BVISNULL(&dd->nothing) )
                                 na->dont_empty = 1;                                  na->dont_empty = 1;
   
                         Debug( LDAP_DEBUG_TRACE, "refint_search_cb: %s: %s (#%d)\n",                          Debug( LDAP_DEBUG_TRACE, "refint_search_cb: %s: %s (#%d)\n",
Line 572  refint_repair( Line 566  refint_repair(
   
         for ( dp = rq->attrs; dp; dp = dp->next ) {          for ( dp = rq->attrs; dp; dp = dp->next ) {
                 Operation       op2 = *op;                  Operation       op2 = *op;
                 SlapReply       rs2 = { 0 };                  SlapReply       rs2 = {REP_RESULT};
                 refint_attrs    *ra;                  refint_attrs    *ra;
                 Modifications   *m;                  Modifications   *m;
   
                   if ( dp->attrs == NULL ) continue; /* TODO: Is this needed? */
   
                 op2.o_tag = LDAP_REQ_MODIFY;                  op2.o_tag = LDAP_REQ_MODIFY;
                 op2.orm_modlist = NULL;                  op2.orm_modlist = NULL;
                 op2.o_req_dn    = dp->dn;                  op2.o_req_dn    = dp->dn;
Line 588  refint_repair( Line 584  refint_repair(
                         continue;                          continue;
                 }                  }
   
                 rs2.sr_type = REP_RESULT;                  /* Set our ModifiersName */
                 for ( ra = dp->attrs; ra; ra = ra->next ) {                  if ( SLAP_LASTMOD( op->o_bd ) ) {
                         size_t  len;  
   
                         /* Set our ModifiersName */  
                         if ( SLAP_LASTMOD( op->o_bd ) ) {  
                                 m = op2.o_tmpalloc( sizeof(Modifications) +                                  m = op2.o_tmpalloc( sizeof(Modifications) +
                                         4*sizeof(BerValue), op2.o_tmpmemctx );                                          4*sizeof(BerValue), op2.o_tmpmemctx );
                                 m->sml_next = op2.orm_modlist;                                  m->sml_next = op2.orm_modlist;
Line 609  refint_repair( Line 601  refint_repair(
                                 BER_BVZERO( &m->sml_nvalues[1] );                                  BER_BVZERO( &m->sml_nvalues[1] );
                                 m->sml_values[0] = id->refint_dn;                                  m->sml_values[0] = id->refint_dn;
                                 m->sml_nvalues[0] = id->refint_ndn;                                  m->sml_nvalues[0] = id->refint_ndn;
                         }                  }
   
                   for ( ra = dp->attrs; ra; ra = ra->next ) {
                           size_t  len;
   
                         /* Add values */                          /* Add values */
                         if ( ra->dont_empty || !BER_BVISEMPTY( &rq->newdn ) ) {                          if ( ra->dont_empty || !BER_BVISEMPTY( &rq->newdn ) ) {

Removed from v.1.19.2.16  
changed lines
  Added in v.1.19.2.17


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