X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Frepl.c;h=270f9a11f34ae540e31964b35a2b7051b833a1b8;hb=a17df0e810578d593808c6afeb0cdea55a65633c;hp=73b3c8ca96c03f60ced1da115e4c2c8efef14d1c;hpb=28aca605c7b475a4fc09854ba6a596bcd731d60f;p=openldap diff --git a/servers/slapd/repl.c b/servers/slapd/repl.c index 73b3c8ca96..270f9a11f3 100644 --- a/servers/slapd/repl.c +++ b/servers/slapd/repl.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2005 The OpenLDAP Foundation. + * Copyright 1998-2006 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -166,7 +166,7 @@ replog( Operation *op ) /* undef NO_LOG_WHEN_NO_REPLICAS */ #ifdef NO_LOG_WHEN_NO_REPLICAS int count = 0; -#endif +#endif /* NO_LOG_WHEN_NO_REPLICAS */ int subsets = 0; long now = slap_get_time(); char *replogfile; @@ -212,7 +212,7 @@ replog( Operation *op ) fprintf( fp, "replica: %s\n", op->o_bd->be_replica[i]->ri_host ); #ifdef NO_LOG_WHEN_NO_REPLICAS ++count; -#endif +#endif /* NO_LOG_WHEN_NO_REPLICAS */ } #ifdef NO_LOG_WHEN_NO_REPLICAS @@ -224,7 +224,7 @@ replog( Operation *op ) return; } -#endif +#endif /* NO_LOG_WHEN_NO_REPLICAS */ replog1( NULL, op, fp, now ); @@ -328,11 +328,22 @@ replog1( if ( ri && ri->ri_attrs ) { int is_in = ad_inlist( ml->sml_desc, ri->ri_attrs ); + /* skip if: + * 1) the attribute is not in the list, + * and it's not an exclusion list + * 2) the attribute is in the list + * and it's an exclusion list, + * and either the objectClass attribute + * has already been dealt with or + * this is not the objectClass attr + */ if ( ( !is_in && !ri->ri_exclude ) - || ( is_in && ri->ri_exclude ) ) + || ( ( is_in && ri->ri_exclude ) + && ( !ocs || ml->sml_desc != slap_schema.si_ad_objectClass ) ) ) { continue; } + /* If this is objectClass, see if the value is included * in any subset, otherwise drop it. */ @@ -347,11 +358,24 @@ replog1( int match = 0; for ( an = ri->ri_attrs; an->an_name.bv_val; an++ ) { if ( an->an_oc ) { + struct berval bv = an->an_name; + ocs = 1; match |= an->an_oc_exclude; - if ( ml->sml_values[i].bv_len == an->an_name.bv_len + + switch ( bv.bv_val[ 0 ] ) { + case '@': + case '+': + case '!': + bv.bv_val++; + bv.bv_len--; + break; + } + + if ( ml->sml_values[i].bv_len == bv.bv_len && !strcasecmp(ml->sml_values[i].bv_val, - an->an_name.bv_val ) ) { + bv.bv_val ) ) + { match = !an->an_oc_exclude; break; } @@ -374,7 +398,7 @@ replog1( fprintf( fp, "%s: %s\n", did, type ); first = 0; } - vals[0] = an->an_name; + vals[0] = a->a_nvals[i]; print_vals( fp, &ml->sml_desc->ad_cname, vals ); ocs = 2; } @@ -406,7 +430,20 @@ replog1( for ( a = op->ora_e->e_attrs ; a != NULL; a=a->a_next ) { if ( ri && ri->ri_attrs ) { int is_in = ad_inlist( a->a_desc, ri->ri_attrs ); - if ( ( !is_in && !ri->ri_exclude ) || ( is_in && ri->ri_exclude ) ) { + + /* skip if: + * 1) the attribute is not in the list, + * and it's not an exclusion list + * 2) the attribute is in the list + * and it's an exclusion list, + * and either the objectClass attribute + * has already been dealt with or + * this is not the objectClass attr + */ + if ( ( !is_in && !ri->ri_exclude ) + || ( ( is_in && ri->ri_exclude ) + && ( !ocs || a->a_desc != slap_schema.si_ad_objectClass ) ) ) + { continue; } @@ -423,11 +460,24 @@ replog1( int match = 0; for ( an = ri->ri_attrs; an->an_name.bv_val; an++ ) { if ( an->an_oc ) { + struct berval bv = an->an_name; + ocs = 1; match |= an->an_oc_exclude; - if ( a->a_vals[i].bv_len == an->an_name.bv_len + + switch ( bv.bv_val[ 0 ] ) { + case '@': + case '+': + case '!': + bv.bv_val++; + bv.bv_len--; + break; + } + + if ( a->a_vals[i].bv_len == bv.bv_len && !strcasecmp(a->a_vals[i].bv_val, - an->an_name.bv_val ) ) { + bv.bv_val ) ) + { match = !an->an_oc_exclude; break; } @@ -442,7 +492,7 @@ replog1( fprintf( fp, "changetype: add\n" ); dohdr = 0; } - vals[0] = an->an_name; + vals[0] = a->a_nvals[i]; print_vals( fp, &a->a_desc->ad_cname, vals ); } }