]> git.sur5r.net Git - openldap/commitdiff
implement overlapping targets enhancement (ITS#3711)
authorPierangelo Masarati <ando@openldap.org>
Wed, 17 Aug 2005 08:34:49 +0000 (08:34 +0000)
committerPierangelo Masarati <ando@openldap.org>
Wed, 17 Aug 2005 08:34:49 +0000 (08:34 +0000)
servers/slapd/back-meta/back-meta.h
servers/slapd/back-meta/candidates.c
servers/slapd/back-meta/config.c
servers/slapd/back-meta/conn.c
servers/slapd/back-meta/search.c

index daf6e85df9f35567073ccb978bf88b50f68442f6..df9bfdf0237bfbad3791b69c1b225bfb464d0e0f 100644 (file)
@@ -203,6 +203,7 @@ enum {
 
 typedef struct metatarget_t {
        char                    *mt_uri;
+       int                     mt_scope;
 
        struct berval           mt_psuffix;             /* pretty suffix */
        struct berval           mt_nsuffix;             /* normalized suffix */
@@ -351,6 +352,7 @@ meta_back_conn_dup(
 extern int
 meta_back_is_candidate(
        struct berval           *nsuffix,
+       int                     suffixscope,
        struct berval           *ndn,
        int                     scope );
 
index a59606ff702c67b449f02b1385bb7d0fc38f8b51..aa8c7628df6bdf65931d52121a10919903ff9406 100644 (file)
@@ -23,6 +23,7 @@
 #include "portable.h"
 
 #include <stdio.h>
+#include "ac/string.h"
 
 #include "slap.h"
 #include "../back-ldap/back-ldap.h"
 int 
 meta_back_is_candidate(
        struct berval   *nsuffix,
+       int             suffixscope,
        struct berval   *ndn,
        int             scope )
 {
        if ( dnIsSuffix( ndn, nsuffix ) ) {
-               return META_CANDIDATE;
+               switch ( suffixscope ) {
+               case LDAP_SCOPE_SUBTREE:
+               default:
+                       return META_CANDIDATE;
+
+#ifdef LDAP_SCOPE_SUBORDINATE
+               case LDAP_SCOPE_SUBORDINATE:
+                       if ( ndn->bv_len > nsuffix->bv_len ) {
+                               return META_CANDIDATE;
+                       }
+                       break;
+#endif /* LDAP_SCOPE_SUBORDINATE */
+
+               /* nearly useless; not allowed by config */
+               case LDAP_SCOPE_ONELEVEL:
+                       if ( ndn->bv_len > nsuffix->bv_len ) {
+                               struct berval   rdn = *ndn;
+
+                               rdn.bv_len -= nsuffix->bv_len
+                                       + STRLENOF( "," );
+                               if ( dnIsOneLevelRDN( &rdn ) ) {
+                                       return META_CANDIDATE;
+                               }
+                       }
+                       break;
+
+               /* nearly useless; not allowed by config */
+               case LDAP_SCOPE_BASE:
+                       if ( ndn->bv_len == nsuffix->bv_len ) {
+                               return META_CANDIDATE;
+                       }
+                       break;
+               }
+
+               return META_NOT_CANDIDATE;
        }
 
        if ( scope == LDAP_SCOPE_SUBTREE && dnIsSuffix( nsuffix, ndn ) ) {
@@ -76,28 +112,6 @@ meta_back_is_candidate(
        return META_NOT_CANDIDATE;
 }
 
-#if 0
-/*
- * meta_back_is_candidate_unique
- *
- * checks whether a candidate is unique
- * Note: dn MUST be normalized
- */
-static int
-meta_back_is_candidate_unique(
-       metainfo_t      *mi,
-       struct berval   *ndn )
-{
-       switch ( meta_back_select_unique_candidate( mi, ndn ) ) {
-       case META_TARGET_MULTIPLE:
-       case META_TARGET_NONE:
-               return 0;
-       }
-
-       return 1;
-}
-#endif /* 0 */
-
 /*
  * meta_back_select_unique_candidate
  *
@@ -114,7 +128,9 @@ meta_back_select_unique_candidate(
        int     i, candidate = META_TARGET_NONE;
 
        for ( i = 0; i < mi->mi_ntargets; ++i ) {
-               if ( meta_back_is_candidate( &mi->mi_targets[ i ].mt_nsuffix, ndn, LDAP_SCOPE_BASE ) )
+               if ( meta_back_is_candidate( &mi->mi_targets[ i ].mt_nsuffix,
+                               mi->mi_targets[ i ].mt_scope,
+                               ndn, LDAP_SCOPE_BASE ) )
                {
                        if ( candidate == META_TARGET_NONE ) {
                                candidate = i;
index 24f357ed5ecb4c80fad48f2d4bf450d3e1e88b3f..996161ddedd5851e958319fd7c51871af3f843a0 100644 (file)
@@ -159,9 +159,7 @@ meta_back_db_config(
                /*
                 * copies and stores uri and suffix
                 */
-               dn.bv_val = ludp->lud_dn;
-               dn.bv_len = strlen( ludp->lud_dn );
-
+               ber_str2bv( ludp->lud_dn, 0, 0, &dn );
                rc = dnPrettyNormal( NULL, &dn, &mi->mi_targets[ i ].mt_psuffix,
                        &mi->mi_targets[ i ].mt_nsuffix, NULL );
                if( rc != LDAP_SUCCESS ) {
@@ -173,6 +171,25 @@ meta_back_db_config(
 
                ludp->lud_dn[ 0 ] = '\0';
 
+               switch ( ludp->lud_scope ) {
+               case LDAP_SCOPE_DEFAULT:
+                       mi->mi_targets[ i ].mt_scope = LDAP_SCOPE_SUBTREE;
+                       break;
+
+               case LDAP_SCOPE_SUBTREE:
+#ifdef LDAP_SCOPE_SUBORDINATE
+               case LDAP_SCOPE_SUBORDINATE:
+#endif /* LDAP_SCOPE_SUBORDINATE */
+                       mi->mi_targets[ i ].mt_scope = ludp->lud_scope;
+                       break;
+
+               default:
+                       fprintf( stderr, "%s: line %d: "
+                                       "invalid scope for target '%s'\n",
+                                       fname, lineno, argv[ 1 ] );
+                       return( 1 );
+               }
+
                /* check all, to apply the scope check on the first one */
                for ( tmpludp = ludp; tmpludp; tmpludp = tmpludp->lud_next ) {
                        if ( tmpludp->lud_dn != NULL && tmpludp->lud_dn[ 0 ] != '\0' ) {
@@ -183,10 +200,6 @@ meta_back_db_config(
                                return( 1 );
 
                        }
-
-                       if ( tmpludp->lud_scope == LDAP_SCOPE_BASE ) {
-                               tmpludp->lud_scope = LDAP_SCOPE_DEFAULT;
-                       }
                }
 
                mi->mi_targets[ i ].mt_uri = ldap_url_list2urls( ludp );
index ca6e692d8628cf30b66d86a0ca271982bcdc30f8..5f10ce40d22098c084969528b92e6015e673d4e2 100644 (file)
@@ -526,6 +526,7 @@ meta_back_get_candidate(
                         * a candidate, try using it (FIXME: YMMV) */
                        if ( mi->mi_defaulttarget != META_DEFAULT_TARGET_NONE
                                && meta_back_is_candidate( &mi->mi_targets[ mi->mi_defaulttarget ].mt_nsuffix,
+                                               mi->mi_targets[ mi->mi_defaulttarget ].mt_scope,
                                                ndn, op->o_tag == LDAP_REQ_SEARCH ? op->ors_scope : LDAP_SCOPE_BASE ) )
                        {
                                candidate = mi->mi_defaulttarget;
index f6cb31a9db8942732a7ff3bcab4f4b2240861d09..8437cea8e8232331a24000f921bc3c96898e32b5 100644 (file)
@@ -97,6 +97,11 @@ meta_back_search_start(
                                        &op->o_req_ndn ) )
                        {
                                realbase = mi->mi_targets[ candidate ].mt_nsuffix;
+#ifdef LDAP_SCOPE_SUBORDINATE
+                               if ( mi->mi_targets[ candidate ].mt_scope == LDAP_SCOPE_SUBORDINATE ) {
+                                       realscope = LDAP_SCOPE_SUBORDINATE;
+                               }
+#endif /* LDAP_SCOPE_SUBORDINATE */
 
                        } else {
                                /*
@@ -124,7 +129,11 @@ meta_back_search_start(
                                realbase = mi->mi_targets[ candidate ].mt_nsuffix;
 #ifdef LDAP_SCOPE_SUBORDINATE
                                if ( op->ors_scope == LDAP_SCOPE_SUBORDINATE ) {
-                                       realscope = LDAP_SCOPE_SUBTREE;
+                                       if ( mi->mi_targets[ candidate ].mt_scope == LDAP_SCOPE_SUBORDINATE ) {
+                                               realscope = LDAP_SCOPE_SUBORDINATE;
+                                       } else {
+                                               realscope = LDAP_SCOPE_SUBTREE;
+                                       }
                                } else
 #endif /* LDAP_SCOPE_SUBORDINATE */
                                {