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 ) ) { |