From 99ea177e0568f63dcc5715ba16cb5f1a5239f200 Mon Sep 17 00:00:00 2001 From: Pierangelo Masarati Date: Wed, 17 Aug 2005 08:34:49 +0000 Subject: [PATCH] implement overlapping targets enhancement (ITS#3711) --- servers/slapd/back-meta/back-meta.h | 2 + servers/slapd/back-meta/candidates.c | 64 +++++++++++++++++----------- servers/slapd/back-meta/config.c | 27 +++++++++--- servers/slapd/back-meta/conn.c | 1 + servers/slapd/back-meta/search.c | 11 ++++- 5 files changed, 73 insertions(+), 32 deletions(-) diff --git a/servers/slapd/back-meta/back-meta.h b/servers/slapd/back-meta/back-meta.h index daf6e85df9..df9bfdf023 100644 --- a/servers/slapd/back-meta/back-meta.h +++ b/servers/slapd/back-meta/back-meta.h @@ -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 ); diff --git a/servers/slapd/back-meta/candidates.c b/servers/slapd/back-meta/candidates.c index a59606ff70..aa8c7628df 100644 --- a/servers/slapd/back-meta/candidates.c +++ b/servers/slapd/back-meta/candidates.c @@ -23,6 +23,7 @@ #include "portable.h" #include +#include "ac/string.h" #include "slap.h" #include "../back-ldap/back-ldap.h" @@ -59,11 +60,46 @@ 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; diff --git a/servers/slapd/back-meta/config.c b/servers/slapd/back-meta/config.c index 24f357ed5e..996161dded 100644 --- a/servers/slapd/back-meta/config.c +++ b/servers/slapd/back-meta/config.c @@ -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 ); diff --git a/servers/slapd/back-meta/conn.c b/servers/slapd/back-meta/conn.c index ca6e692d86..5f10ce40d2 100644 --- a/servers/slapd/back-meta/conn.c +++ b/servers/slapd/back-meta/conn.c @@ -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; diff --git a/servers/slapd/back-meta/search.c b/servers/slapd/back-meta/search.c index f6cb31a9db..8437cea8e8 100644 --- a/servers/slapd/back-meta/search.c +++ b/servers/slapd/back-meta/search.c @@ -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 */ { -- 2.39.5