]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/rwmmap.c
More schema tweaks
[openldap] / servers / slapd / overlays / rwmmap.c
index 3b3352556530aa00a02c30e6573c9aa333ccb714..4747113e7766e57f76a3928a6718fbb33236feca 100644 (file)
@@ -82,19 +82,21 @@ rwm_map_init( struct ldapmap *lm, struct ldapmapping **m )
        }
 
        /* FIXME: I don't think this is needed any more... */
-       rc = slap_str2ad( "objectClass", &mapping->m_src_ad, &text );
+       rc = slap_str2ad( "objectClass", &mapping[0].m_src_ad, &text );
        if ( rc != LDAP_SUCCESS ) {
                return rc;
        }
 
-       mapping->m_dst_ad = mapping->m_src_ad;
-       ber_dupbv( &mapping->m_dst, &mapping->m_src_ad->ad_cname );
-       ber_dupbv( &mapping->m_dst, &mapping->m_src );
+       mapping[0].m_dst_ad = mapping[0].m_src_ad;
+       ber_dupbv( &mapping[0].m_src, &mapping[0].m_src_ad->ad_cname );
+       ber_dupbv( &mapping[0].m_dst, &mapping[0].m_src );
 
-       mapping[1].m_src = mapping->m_src;
-       mapping[1].m_dst = mapping->m_dst;
+       mapping[1].m_src = mapping[0].m_src;
+       mapping[1].m_dst = mapping[0].m_dst;
+       mapping[1].m_src_ad = mapping[0].m_src_ad;
+       mapping[1].m_dst_ad = mapping[1].m_src_ad;
 
-       avl_insert( &lm->map, (caddr_t)mapping
+       avl_insert( &lm->map, (caddr_t)&mapping[0]
                        rwm_mapping_cmp, rwm_mapping_dup );
        avl_insert( &lm->remap, (caddr_t)&mapping[1], 
                        rwm_mapping_cmp, rwm_mapping_dup );
@@ -440,6 +442,7 @@ map_attr_value(
 
 static int
 rwm_int_filter_map_rewrite(
+               Operation               *op,
                dncookie                *dc,
                Filter                  *f,
                struct berval           *fstr )
@@ -448,7 +451,7 @@ rwm_int_filter_map_rewrite(
        Filter          *p;
        struct berval   atmp,
                        vtmp,
-                       tmp;
+                       *tmp;
        static struct berval
                        /* better than nothing... */
                        ber_bvfalse = BER_BVC( "(!(objectClass=*))" ),
@@ -456,7 +459,10 @@ rwm_int_filter_map_rewrite(
                        /* better than nothing... */
                        ber_bvtrue = BER_BVC( "(objectClass=*)" ),
                        ber_bvtf_true = BER_BVC( "(&)" ),
+#if 0
+                       /* no longer needed; preserved for completeness */
                        ber_bvundefined = BER_BVC( "(?=undefined)" ),
+#endif
                        ber_bverror = BER_BVC( "(?=error)" ),
                        ber_bvunknown = BER_BVC( "(?=unknown)" ),
                        ber_bvnone = BER_BVC( "(?=none)" );
@@ -464,7 +470,7 @@ rwm_int_filter_map_rewrite(
 
        if ( f == NULL ) {
                ber_dupbv( fstr, &ber_bvnone );
-               return -1;
+               return LDAP_OTHER;
        }
 
        switch ( f->f_choice ) {
@@ -472,7 +478,7 @@ rwm_int_filter_map_rewrite(
                if ( map_attr_value( dc, &f->f_av_desc, &atmp,
                                        &f->f_av_value, &vtmp, RWM_MAP ) )
                {
-                       return -1;
+                       goto computed;
                }
 
                fstr->bv_len = atmp.bv_len + vtmp.bv_len + STRLENOF( "(=)" );
@@ -488,7 +494,7 @@ rwm_int_filter_map_rewrite(
                if ( map_attr_value( dc, &f->f_av_desc, &atmp,
                                        &f->f_av_value, &vtmp, RWM_MAP ) )
                {
-                       return -1;
+                       goto computed;
                }
 
                fstr->bv_len = atmp.bv_len + vtmp.bv_len + STRLENOF( "(>=)" );
@@ -504,7 +510,7 @@ rwm_int_filter_map_rewrite(
                if ( map_attr_value( dc, &f->f_av_desc, &atmp,
                                        &f->f_av_value, &vtmp, RWM_MAP ) )
                {
-                       return -1;
+                       goto computed;
                }
 
                fstr->bv_len = atmp.bv_len + vtmp.bv_len + STRLENOF( "(<=)" );
@@ -520,7 +526,7 @@ rwm_int_filter_map_rewrite(
                if ( map_attr_value( dc, &f->f_av_desc, &atmp,
                                        &f->f_av_value, &vtmp, RWM_MAP ) )
                {
-                       return -1;
+                       goto computed;
                }
 
                fstr->bv_len = atmp.bv_len + vtmp.bv_len + STRLENOF( "(~=)" );
@@ -536,7 +542,7 @@ rwm_int_filter_map_rewrite(
                if ( map_attr_value( dc, &f->f_sub_desc, &atmp,
                                        NULL, NULL, RWM_MAP ) )
                {
-                       return -1;
+                       goto computed;
                }
 
                /* cannot be a DN ... */
@@ -598,7 +604,7 @@ rwm_int_filter_map_rewrite(
                if ( map_attr_value( dc, &f->f_desc, &atmp,
                                        NULL, NULL, RWM_MAP ) )
                {
-                       return -1;
+                       goto computed;
                }
 
                fstr->bv_len = atmp.bv_len + STRLENOF( "(=*)" );
@@ -619,11 +625,13 @@ rwm_int_filter_map_rewrite(
                        f->f_choice == LDAP_FILTER_OR ? '|' : '!' );
 
                for ( p = f->f_list; p != NULL; p = p->f_next ) {
+                       int     rc;
+
                        len = fstr->bv_len;
 
-                       if ( rwm_int_filter_map_rewrite( dc, p, &vtmp ) )
-                       {
-                               return -1;
+                       rc = rwm_int_filter_map_rewrite( op, dc, p, &vtmp );
+                       if ( rc != LDAP_SUCCESS ) {
+                               return rc;
                        }
                        
                        fstr->bv_len += vtmp.bv_len;
@@ -642,7 +650,7 @@ rwm_int_filter_map_rewrite(
                        if ( map_attr_value( dc, &f->f_mr_desc, &atmp,
                                                &f->f_mr_value, &vtmp, RWM_MAP ) )
                        {
-                               return -1;
+                               goto computed;
                        }
 
                } else {
@@ -667,33 +675,39 @@ rwm_int_filter_map_rewrite(
                break;
        }
 
+       case 0:
+computed:;
+               filter_free_x( op, f );
+               f->f_choice = SLAPD_FILTER_COMPUTED;
+               f->f_result = SLAPD_COMPARE_UNDEFINED;
+               /* fallthru */
+
        case SLAPD_FILTER_COMPUTED:
                switch ( f->f_result ) {
                case LDAP_COMPARE_FALSE:
+               /* FIXME: treat UNDEFINED as FALSE */
+               case SLAPD_COMPARE_UNDEFINED:
                        if ( dc->rwmap->rwm_flags & RWM_F_SUPPORT_T_F ) {
-                               tmp = ber_bvtf_false;
+                               tmp = &ber_bvtf_false;
                                break;
                        }
-                       /* fallthru */
-
-               case SLAPD_COMPARE_UNDEFINED:
-                       tmp = ber_bvfalse;
+                       tmp = &ber_bvfalse;
                        break;
 
                case LDAP_COMPARE_TRUE:
                        if ( dc->rwmap->rwm_flags & RWM_F_SUPPORT_T_F ) {
-                               tmp = ber_bvtf_true;
-                       } else {
-                               tmp = ber_bvtrue;
+                               tmp = &ber_bvtf_true;
+                               break;
                        }
+                       tmp = &ber_bvtrue;
                        break;
                        
                default:
-                       tmp = ber_bverror;
+                       tmp = &ber_bverror;
                        break;
                }
 
-               ber_dupbv( fstr, &tmp );
+               ber_dupbv( fstr, tmp );
                break;
                
        default:
@@ -701,11 +715,12 @@ rwm_int_filter_map_rewrite(
                break;
        }
 
-       return 0;
+       return LDAP_SUCCESS;
 }
 
 int
 rwm_filter_map_rewrite(
+               Operation               *op,
                dncookie                *dc,
                Filter                  *f,
                struct berval           *fstr )
@@ -714,10 +729,10 @@ rwm_filter_map_rewrite(
        dncookie        fdc;
        struct berval   ftmp;
 
-       rc = rwm_int_filter_map_rewrite( dc, f, fstr );
+       rc = rwm_int_filter_map_rewrite( op, dc, f, fstr );
 
 #ifdef ENABLE_REWRITE
-       if ( rc != LDAP_SUCCESS ) {
+       if ( rc != 0 ) {
                return rc;
        }
 
@@ -761,8 +776,8 @@ rwm_filter_map_rewrite(
                rc = LDAP_OTHER;
                break;
        }
-
 #endif /* ENABLE_REWRITE */
+
        return rc;
 }