/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 1998-2003 The OpenLDAP Foundation.
+ * Copyright 1998-2004 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
#endif
int subsets = 0;
long now = slap_get_time();
+ char *replogfile;
- if ( op->o_bd->be_replogfile == NULL && replogfile == NULL ) {
+ replogfile = op->o_bd->be_replogfile ? op->o_bd->be_replogfile :
+ frontendDB->be_replogfile;
+ if ( !replogfile ) {
return;
}
ldap_pvt_thread_mutex_lock( &replog_mutex );
- if ( (fp = lock_fopen( op->o_bd->be_replogfile ? op->o_bd->be_replogfile :
- replogfile, "a", &lfp )) == NULL ) {
+ if ( (fp = lock_fopen( replogfile, "a", &lfp )) == NULL ) {
ldap_pvt_thread_mutex_unlock( &replog_mutex );
return;
}
Modifications *ml;
Attribute *a;
AttributeName *an;
- int dohdr = 1;
+ int dohdr = 1, ocs = -1;
struct berval vals[2];
+
vals[1].bv_val = NULL;
vals[1].bv_len = 0;
/* If this is objectClass, see if the value is included
* in any subset, otherwise drop it.
*/
- if ( ml->sml_desc == slap_schema.si_ad_objectClass
- && ml->sml_bvalues ) {
- int i, ocs = 0, first = 1;
- for ( i=0; ml->sml_bvalues[i].bv_val; i++ ) {
+ if ( ocs && ml->sml_desc == slap_schema.si_ad_objectClass
+ && ml->sml_values )
+ {
+ int i, first = 1;
+
+ if ( ocs == -1 ) ocs = 0;
+
+ for ( i=0; ml->sml_values[i].bv_val; i++ ) {
int match = 0;
for ( an = ri->ri_attrs; an->an_name.bv_val; an++ ) {
if ( an->an_oc ) {
ocs = 1;
- if ( ml->sml_bvalues[i].bv_len == an->an_name.bv_len
- && !strcasecmp(ml->sml_bvalues[i].bv_val,
+ match |= an->an_oc_exclude;
+ if ( ml->sml_values[i].bv_len == an->an_name.bv_len
+ && !strcasecmp(ml->sml_values[i].bv_val,
an->an_name.bv_val ) ) {
- match = 1 ^ an->an_oc_exclude;
+ match = !an->an_oc_exclude;
break;
}
}
}
- if ( ocs ) {
- match ^= ri->ri_exclude;
- /* Found a match, log it */
- if ( match ) {
- if ( dohdr ) {
- rephdr( ri, op, fp, now );
- fprintf( fp, "changetype: modify\n" );
- dohdr = 0;
- }
- if ( first ) {
- fprintf( fp, "%s: %s\n", did, type );
- first = 0;
- }
- vals[0] = an->an_name;
- print_vals( fp, &ml->sml_desc->ad_cname, vals );
- ocs = 2;
+ /* Objectclasses need no special treatment, drop into
+ * regular processing
+ */
+ if ( !ocs ) break;
+
+ match ^= ri->ri_exclude;
+ /* Found a match, log it */
+ if ( match ) {
+ if ( dohdr ) {
+ rephdr( ri, op, fp, now );
+ fprintf( fp, "changetype: modify\n" );
+ dohdr = 0;
}
+ if ( first ) {
+ fprintf( fp, "%s: %s\n", did, type );
+ first = 0;
+ }
+ vals[0] = an->an_name;
+ print_vals( fp, &ml->sml_desc->ad_cname, vals );
+ ocs = 2;
}
+
}
/* Explicit objectclasses have been handled already */
if ( ocs ) {
dohdr = 0;
}
fprintf( fp, "%s: %s\n", did, type );
- if ( ml->sml_bvalues ) {
- print_vals( fp, &ml->sml_desc->ad_cname, ml->sml_bvalues );
+ if ( ml->sml_values ) {
+ print_vals( fp, &ml->sml_desc->ad_cname, ml->sml_values );
}
fprintf( fp, "-\n" );
}
* only include those classes in the
* objectClass attribute
*/
- if ( a->a_desc == slap_schema.si_ad_objectClass ) {
- int i, ocs = 0;
+ if ( ocs && a->a_desc == slap_schema.si_ad_objectClass ) {
+ int i;
+
+ if ( ocs == -1 ) ocs = 0;
+
for ( i=0; a->a_vals[i].bv_val; i++ ) {
int match = 0;
for ( an = ri->ri_attrs; an->an_name.bv_val; an++ ) {
if ( an->an_oc ) {
ocs = 1;
+ match |= an->an_oc_exclude;
if ( a->a_vals[i].bv_len == an->an_name.bv_len
&& !strcasecmp(a->a_vals[i].bv_val,
an->an_name.bv_val ) ) {
- match = 1 ^ an->an_oc_exclude;
+ match = !an->an_oc_exclude;
break;
}
}
}
+ if ( !ocs ) break;
+
match ^= ri->ri_exclude;
- if ( ocs && match ) {
+ if ( match ) {
if ( dohdr ) {
rephdr( ri, op, fp, now );
fprintf( fp, "changetype: add\n" );