static void wt_modify_idxflags( Operation *op, AttributeDescription *desc, int got_delete, Attribute *newattrs, Attribute *oldattrs ) { struct berval ix_at; AttrInfo *ai; /* check if modified attribute was indexed * but not in case of NOOP... */ ai = wt_index_mask( op->o_bd, desc, &ix_at ); if ( ai ) { if ( got_delete ) { Attribute *ap; struct berval ix2; ap = attr_find( oldattrs, desc ); if ( ap ) ap->a_flags |= SLAP_ATTR_IXDEL; /* Find all other attrs that index to same slot */ for ( ap = newattrs; ap; ap = ap->a_next ) { ai = wt_index_mask( op->o_bd, ap->a_desc, &ix2 ); if ( ai && ix2.bv_val == ix_at.bv_val ) ap->a_flags |= SLAP_ATTR_IXADD; } } else { Attribute *ap; ap = attr_find( newattrs, desc ); if ( ap ) ap->a_flags |= SLAP_ATTR_IXADD; } } }
/* This function is only called when evaluating search filters. */ int wt_index_param( Backend *be, AttributeDescription *desc, int ftype, slap_mask_t *maskp, struct berval *prefixp ) { AttrInfo *ai; int rc; slap_mask_t mask, type = 0; ai = wt_index_mask( be, desc, prefixp ); if ( !ai ) { /* TODO: add monitor */ return LDAP_INAPPROPRIATE_MATCHING; } mask = ai->ai_indexmask; switch( ftype ) { case LDAP_FILTER_PRESENT: type = SLAP_INDEX_PRESENT; if( IS_SLAP_INDEX( mask, SLAP_INDEX_PRESENT ) ) { *prefixp = presence_key; *maskp = mask; return LDAP_SUCCESS; } break; case LDAP_FILTER_APPROX: type = SLAP_INDEX_APPROX; if ( desc->ad_type->sat_approx ) { if( IS_SLAP_INDEX( mask, SLAP_INDEX_APPROX ) ) { *maskp = mask; return LDAP_SUCCESS; } break; } /* Use EQUALITY rule and index for approximate match */ /* fall thru */ case LDAP_FILTER_EQUALITY: type = SLAP_INDEX_EQUALITY; if( IS_SLAP_INDEX( mask, SLAP_INDEX_EQUALITY ) ) { *maskp = mask; return LDAP_SUCCESS; } break; case LDAP_FILTER_SUBSTRINGS: type = SLAP_INDEX_SUBSTR; if( IS_SLAP_INDEX( mask, SLAP_INDEX_SUBSTR ) ) { *maskp = mask; return LDAP_SUCCESS; } break; default: return LDAP_OTHER; } /* TODO: add monitor index */ return LDAP_INAPPROPRIATE_MATCHING; }