Diff for /servers/slapd/filter.c between versions 1.82 and 1.85

version 1.82, 2002/07/11 18:33:28 version 1.85, 2002/08/31 22:33:20
Line 1 Line 1
 /* filter.c - routines for parsing and dealing with filters */  /* filter.c - routines for parsing and dealing with filters */
 /* $OpenLDAP: pkg/ldap/servers/slapd/filter.c,v 1.81 2002/07/08 16:55:50 kurt Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/filter.c,v 1.84 2002/08/31 08:42:09 ando Exp $ */
 /*  /*
  * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.   * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file   * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
Line 70  get_filter( Line 70  get_filter(
          *              lessOrEqual     [6]     AttributeValueAssertion,           *              lessOrEqual     [6]     AttributeValueAssertion,
          *              present         [7]     AttributeType,,           *              present         [7]     AttributeType,,
          *              approxMatch     [8]     AttributeValueAssertion           *              approxMatch     [8]     AttributeValueAssertion
          *              extensibleMatch [9] MatchingRuleAssertion           *              extensibleMatch [9]     MatchingRuleAssertion
          *      }           *      }
          *           *
          *      SubstringFilter ::= SEQUENCE {           *      SubstringFilter ::= SEQUENCE {
Line 742  filter2bv( Filter *f, struct berval *fst Line 742  filter2bv( Filter *f, struct berval *fst
   
                 break;                  break;
   
         case LDAP_FILTER_EXT:          case LDAP_FILTER_EXT: {
                   struct berval ad;
                 filter_escape_value( &f->f_mr_value, &tmp );                  filter_escape_value( &f->f_mr_value, &tmp );
   
                 fstr->bv_len = f->f_mr_desc->ad_cname.bv_len +                  if ( f->f_mr_desc ) {
                           ad = f->f_mr_desc->ad_cname;
                   } else {
                           ad.bv_len = 0;
                           ad.bv_val = "";
                   }
                           
                   fstr->bv_len = ad.bv_len +
                         ( f->f_mr_dnattrs ? sizeof(":dn")-1 : 0 ) +                          ( f->f_mr_dnattrs ? sizeof(":dn")-1 : 0 ) +
                         ( f->f_mr_rule_text.bv_len ? f->f_mr_rule_text.bv_len+1 : 0 ) +                          ( f->f_mr_rule_text.bv_len ? f->f_mr_rule_text.bv_len+1 : 0 ) +
                         tmp.bv_len + ( sizeof("(:=)") - 1 );                          tmp.bv_len + ( sizeof("(:=)") - 1 );
                 fstr->bv_val = malloc( fstr->bv_len + 1 );                  fstr->bv_val = malloc( fstr->bv_len + 1 );
   
                 snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s%s%s%s:=%s)",                  snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s%s%s%s:=%s)",
                         f->f_mr_desc->ad_cname.bv_val,                          ad.bv_val,
                         f->f_mr_dnattrs ? ":dn" : "",                          f->f_mr_dnattrs ? ":dn" : "",
                         f->f_mr_rule_text.bv_len ? ":" : "",                          f->f_mr_rule_text.bv_len ? ":" : "",
                         f->f_mr_rule_text.bv_len ? f->f_mr_rule_text.bv_val : "",                          f->f_mr_rule_text.bv_len ? f->f_mr_rule_text.bv_val : "",
                         tmp.bv_val );                          tmp.bv_val );
                 ber_memfree( tmp.bv_val );                  ber_memfree( tmp.bv_val );
                 break;                  } break;
   
         case SLAPD_FILTER_COMPUTED:          case SLAPD_FILTER_COMPUTED:
                 ber_str2bv(                  ber_str2bv(
Line 1283  simple_vrFilter2bv( ValuesReturnFilter * Line 1291  simple_vrFilter2bv( ValuesReturnFilter *
                         f->f_desc->ad_cname.bv_val );                          f->f_desc->ad_cname.bv_val );
                 break;                  break;
   
         case LDAP_FILTER_EXT:          case LDAP_FILTER_EXT: {
                   struct berval ad;
                 filter_escape_value( &f->f_mr_value, &tmp );                  filter_escape_value( &f->f_mr_value, &tmp );
   
                 fstr->bv_len = f->f_mr_desc->ad_cname.bv_len +                  if ( f->f_mr_desc ) {
                           ad = f->f_mr_desc->ad_cname;
                   } else {
                           ad.bv_len = 0;
                           ad.bv_val = "";
                   }
                           
                   fstr->bv_len = ad.bv_len +
                         ( f->f_mr_dnattrs ? sizeof(":dn")-1 : 0 ) +                          ( f->f_mr_dnattrs ? sizeof(":dn")-1 : 0 ) +
                         ( f->f_mr_rule_text.bv_len ? f->f_mr_rule_text.bv_len+1 : 0 ) +                          ( f->f_mr_rule_text.bv_len ? f->f_mr_rule_text.bv_len+1 : 0 ) +
                         tmp.bv_len + ( sizeof("(:=)") - 1 );                          tmp.bv_len + ( sizeof("(:=)") - 1 );
                 fstr->bv_val = malloc( fstr->bv_len + 1 );                  fstr->bv_val = malloc( fstr->bv_len + 1 );
   
                 snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s%s%s%s:=%s)",                  snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s%s%s%s:=%s)",
                         f->f_mr_desc->ad_cname.bv_val,                          ad.bv_val,
                         f->f_mr_dnattrs ? ":dn" : "",                          f->f_mr_dnattrs ? ":dn" : "",
                         f->f_mr_rule_text.bv_len ? ":" : "",                          f->f_mr_rule_text.bv_len ? ":" : "",
                         f->f_mr_rule_text.bv_len ? f->f_mr_rule_text.bv_val : "",                          f->f_mr_rule_text.bv_len ? f->f_mr_rule_text.bv_val : "",
                         tmp.bv_val );                          tmp.bv_val );
   
                 ber_memfree( tmp.bv_val );                  ber_memfree( tmp.bv_val );
                 break;                  } break;
   
         case SLAPD_FILTER_COMPUTED:          case SLAPD_FILTER_COMPUTED:
                 ber_str2bv(                  ber_str2bv(
Line 1514  return_error: Line 1531  return_error:
         return( LDAP_SUCCESS );          return( LDAP_SUCCESS );
 }  }
   
   #ifdef SLAP_X_FILTER_HASSUBORDINATES
   static int filter_has_subordinates_list(
           Filter          *filter );
   
   /*
    * FIXME: we could detect the need to filter
    * for hasSubordinates when parsing the filter ...
    */
   
   static int
   filter_has_subordinates_list(
           Filter          *fl )
   {
           Filter                  *f;
   
           for ( f = fl; f != NULL; f = f->f_next ) {
                   int     rc;
   
                   rc = filter_has_subordinates( f );
   
                   if ( rc ) {
                           return rc;
                   }
           }
   
           return 0;
   }
   
   int
   filter_has_subordinates(
           Filter          *f )
   {
           AttributeDescription    *ad = NULL;
   
           switch ( f->f_choice ) {
           case LDAP_FILTER_PRESENT:
                   ad = f->f_desc;
                   break;
   
           case LDAP_FILTER_EQUALITY:
           case LDAP_FILTER_APPROX:
           case LDAP_FILTER_GE:
           case LDAP_FILTER_LE:
                   ad = f->f_ava->aa_desc;
                   break;
   
           case LDAP_FILTER_SUBSTRINGS:
                   ad = f->f_sub_desc;
                   break;
   
           case LDAP_FILTER_EXT:
                   /* could be null; however here it is harmless */
                   ad = f->f_mra->ma_desc;
                   break;
   
           case LDAP_FILTER_NOT:
                   return filter_has_subordinates( f->f_not );
   
           case LDAP_FILTER_AND:
                   return filter_has_subordinates_list( f->f_and );
   
           case LDAP_FILTER_OR:
                   return filter_has_subordinates_list( f->f_or );
   
           case SLAPD_FILTER_COMPUTED:
                   /*
                    * something wrong?
                    */
                   return 0;
   
           default:
                   /*
                    * this means a new type of filter has been implemented,
                    * which is not handled yet in this function; we should
                    * issue a developer's warning, e.g. an assertion
                    */
                   assert( 0 );
                   return -1;
           }
   
           if ( ad == slap_schema.si_ad_hasSubordinates ) {
                   return 1;
           }
   
           return 0;
   }
   
   #endif /* SLAP_X_FILTER_HASSUBORDINATES */
   

Removed from v.1.82  
changed lines
  Added in v.1.85


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