⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filterindex.c

📁 ldap服务器源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* filterindex.c - generate the list of candidate entries from a filter *//* $OpenLDAP: pkg/ldap/servers/slapd/back-bdb/filterindex.c,v 1.51.2.10 2007/01/02 21:44:00 kurt Exp $ *//* This work is part of OpenLDAP Software <http://www.openldap.org/>. * * Copyright 2000-2007 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted only as authorized by the OpenLDAP * Public License. * * A copy of this license is available in the file LICENSE in the * top-level directory of the distribution or, alternatively, at * <http://www.OpenLDAP.org/license.html>. */#include "portable.h"#include <stdio.h>#include <ac/string.h>#include "back-bdb.h"#include "idl.h"#ifdef LDAP_COMP_MATCH#include <component.h>#endifstatic int presence_candidates(	Operation *op,	AttributeDescription *desc,	ID *ids );static int equality_candidates(	Operation *op,	AttributeAssertion *ava,	ID *ids,	ID *tmp );static int inequality_candidates(	Operation *op,	AttributeAssertion *ava,	ID *ids,	ID *tmp,	int gtorlt );static int approx_candidates(	Operation *op,	AttributeAssertion *ava,	ID *ids,	ID *tmp );static int substring_candidates(	Operation *op,	SubstringsAssertion *sub,	ID *ids,	ID *tmp );static int list_candidates(	Operation *op,	Filter *flist,	int ftype,	ID *ids,	ID *tmp,	ID *stack );#ifdef LDAP_COMP_MATCHstatic intext_candidates(        Operation *op,        MatchingRuleAssertion *mra,        ID *ids,        ID *tmp,        ID *stack);static intcomp_candidates (	Operation *op,	MatchingRuleAssertion *mra,	ComponentFilter *f,	ID *ids,	ID *tmp,	ID *stack);static intava_comp_candidates (		Operation *op,		AttributeAssertion *ava,		AttributeAliasing *aa,		ID *ids,		ID *tmp,		ID *stack);#endifintbdb_filter_candidates(	Operation *op,	Filter	*f,	ID *ids,	ID *tmp,	ID *stack ){	int rc = 0;#ifdef LDAP_COMP_MATCH	AttributeAliasing *aa;#endif	Debug( LDAP_DEBUG_FILTER, "=> bdb_filter_candidates\n", 0, 0, 0 );	switch ( f->f_choice ) {	case SLAPD_FILTER_COMPUTED:		switch( f->f_result ) {		case SLAPD_COMPARE_UNDEFINED:		/* This technically is not the same as FALSE, but it		 * certainly will produce no matches.		 */		/* FALL THRU */		case LDAP_COMPARE_FALSE:			BDB_IDL_ZERO( ids );			break;		case LDAP_COMPARE_TRUE: {			struct bdb_info *bdb = (struct bdb_info *)op->o_bd->be_private;			BDB_IDL_ALL( bdb, ids );			} break;		case LDAP_SUCCESS:			/* this is a pre-computed scope, leave it alone */			break;		}		break;	case LDAP_FILTER_PRESENT:		Debug( LDAP_DEBUG_FILTER, "\tPRESENT\n", 0, 0, 0 );		rc = presence_candidates( op, f->f_desc, ids );		break;	case LDAP_FILTER_EQUALITY:		Debug( LDAP_DEBUG_FILTER, "\tEQUALITY\n", 0, 0, 0 );#ifdef LDAP_COMP_MATCH		if ( is_aliased_attribute && ( aa = is_aliased_attribute ( f->f_ava->aa_desc ) ) ) {			rc = ava_comp_candidates ( op, f->f_ava, aa, ids, tmp, stack );		}		else#endif		{			rc = equality_candidates( op, f->f_ava, ids, tmp );		}		break;	case LDAP_FILTER_APPROX:		Debug( LDAP_DEBUG_FILTER, "\tAPPROX\n", 0, 0, 0 );		rc = approx_candidates( op, f->f_ava, ids, tmp );		break;	case LDAP_FILTER_SUBSTRINGS:		Debug( LDAP_DEBUG_FILTER, "\tSUBSTRINGS\n", 0, 0, 0 );		rc = substring_candidates( op, f->f_sub, ids, tmp );		break;	case LDAP_FILTER_GE:		/* if no GE index, use pres */		Debug( LDAP_DEBUG_FILTER, "\tGE\n", 0, 0, 0 );		if( f->f_ava->aa_desc->ad_type->sat_ordering &&			( f->f_ava->aa_desc->ad_type->sat_ordering->smr_usage & SLAP_MR_ORDERED_INDEX ) )			rc = inequality_candidates( op, f->f_ava, ids, tmp, LDAP_FILTER_GE );		else			rc = presence_candidates( op, f->f_ava->aa_desc, ids );		break;	case LDAP_FILTER_LE:		/* if no LE index, use pres */		Debug( LDAP_DEBUG_FILTER, "\tLE\n", 0, 0, 0 );		if( f->f_ava->aa_desc->ad_type->sat_ordering &&			( f->f_ava->aa_desc->ad_type->sat_ordering->smr_usage & SLAP_MR_ORDERED_INDEX ) )			rc = inequality_candidates( op, f->f_ava, ids, tmp, LDAP_FILTER_LE );		else			rc = presence_candidates( op, f->f_ava->aa_desc, ids );		break;	case LDAP_FILTER_NOT:		/* no indexing to support NOT filters */		Debug( LDAP_DEBUG_FILTER, "\tNOT\n", 0, 0, 0 );		{ struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;		BDB_IDL_ALL( bdb, ids );		}		break;	case LDAP_FILTER_AND:		Debug( LDAP_DEBUG_FILTER, "\tAND\n", 0, 0, 0 );		rc = list_candidates( op, 			f->f_and, LDAP_FILTER_AND, ids, tmp, stack );		break;	case LDAP_FILTER_OR:		Debug( LDAP_DEBUG_FILTER, "\tOR\n", 0, 0, 0 );		rc = list_candidates( op, 			f->f_or, LDAP_FILTER_OR, ids, tmp, stack );		break;#ifdef LDAP_COMP_MATCH	case LDAP_FILTER_EXT:                Debug( LDAP_DEBUG_FILTER, "\tEXT\n", 0, 0, 0 );                rc = ext_candidates( op, f->f_mra, ids, tmp, stack );                break;#endif	default:		Debug( LDAP_DEBUG_FILTER, "\tUNKNOWN %lu\n",			(unsigned long) f->f_choice, 0, 0 );		/* Must not return NULL, otherwise extended filters break */		{ struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;		BDB_IDL_ALL( bdb, ids );		}	}	Debug( LDAP_DEBUG_FILTER,		"<= bdb_filter_candidates: id=%ld first=%ld last=%ld\n",		(long) ids[0],		(long) BDB_IDL_FIRST( ids ),		(long) BDB_IDL_LAST( ids ) );	return rc;}#ifdef LDAP_COMP_MATCHstatic intcomp_list_candidates(	Operation *op,	MatchingRuleAssertion* mra,	ComponentFilter	*flist,	int	ftype,	ID *ids,	ID *tmp,	ID *save ){	int rc = 0;	ComponentFilter	*f;	Debug( LDAP_DEBUG_FILTER, "=> comp_list_candidates 0x%x\n", ftype, 0, 0 );	for ( f = flist; f != NULL; f = f->cf_next ) {		/* ignore precomputed scopes */		if ( f->cf_choice == SLAPD_FILTER_COMPUTED &&		     f->cf_result == LDAP_SUCCESS ) {			continue;		}		BDB_IDL_ZERO( save );		rc = comp_candidates( op, mra, f, save, tmp, save+BDB_IDL_UM_SIZE );		if ( rc != 0 ) {			if ( ftype == LDAP_COMP_FILTER_AND ) {				rc = 0;				continue;			}			break;		}				if ( ftype == LDAP_COMP_FILTER_AND ) {			if ( f == flist ) {				BDB_IDL_CPY( ids, save );			} else {				bdb_idl_intersection( ids, save );			}			if( BDB_IDL_IS_ZERO( ids ) )				break;		} else {			if ( f == flist ) {				BDB_IDL_CPY( ids, save );			} else {				bdb_idl_union( ids, save );			}		}	}	if( rc == LDAP_SUCCESS ) {		Debug( LDAP_DEBUG_FILTER,			"<= comp_list_candidates: id=%ld first=%ld last=%ld\n",			(long) ids[0],			(long) BDB_IDL_FIRST(ids),			(long) BDB_IDL_LAST(ids) );	} else {		Debug( LDAP_DEBUG_FILTER,			"<= comp_list_candidates: undefined rc=%d\n",			rc, 0, 0 );	}	return rc;}static intcomp_equality_candidates (        Operation *op,        MatchingRuleAssertion *mra,	ComponentAssertion *ca,        ID *ids,        ID *tmp,        ID *stack){       struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;        DB      *db;        int i;        int rc;        slap_mask_t mask;        struct berval prefix = {0, NULL};        struct berval *keys = NULL;        MatchingRule *mr = mra->ma_rule;        Syntax *sat_syntax;	ComponentReference* cr_list, *cr;	AttrInfo *ai;        BDB_IDL_ALL( bdb, ids );	if ( !ca->ca_comp_ref )		return 0;	ai = bdb_attr_mask( op->o_bd->be_private, mra->ma_desc );	if( ai ) {		cr_list = ai->ai_cr;	}	else {		return 0;	}	/* find a component reference to be indexed */	sat_syntax = ca->ca_ma_rule->smr_syntax;	for ( cr = cr_list ; cr ; cr = cr->cr_next ) {		if ( cr->cr_string.bv_len == ca->ca_comp_ref->cr_string.bv_len &&			strncmp( cr->cr_string.bv_val, ca->ca_comp_ref->cr_string.bv_val,cr->cr_string.bv_len ) == 0 )			break;	}		if ( !cr )		return 0;        rc = bdb_index_param( op->o_bd, mra->ma_desc, LDAP_FILTER_EQUALITY,                &db, &mask, &prefix );        if( rc != LDAP_SUCCESS ) {                return 0;        }        if ( db == NULL ) {                return 0;        }        if( !mr ) {                return 0;        }        if( !mr->smr_filter ) {                return 0;        }	rc = (ca->ca_ma_rule->smr_filter)(                LDAP_FILTER_EQUALITY,                cr->cr_indexmask,                sat_syntax,                ca->ca_ma_rule,                &prefix,                &ca->ca_ma_value,                &keys, op->o_tmpmemctx );        if( rc != LDAP_SUCCESS ) {                return 0;        }        if( keys == NULL ) {                return 0;        }        for ( i= 0; keys[i].bv_val != NULL; i++ ) {                rc = bdb_key_read( op->o_bd, db, NULL, &keys[i], tmp, NULL, 0 );                if( rc == DB_NOTFOUND ) {                        BDB_IDL_ZERO( ids );                        rc = 0;                        break;                } else if( rc != LDAP_SUCCESS ) {                        break;                }                if( BDB_IDL_IS_ZERO( tmp ) ) {                        BDB_IDL_ZERO( ids );                        break;                }                if ( i == 0 ) {                        BDB_IDL_CPY( ids, tmp );                } else {                        bdb_idl_intersection( ids, tmp );                }                if( BDB_IDL_IS_ZERO( ids ) )                        break;        }        ber_bvarray_free_x( keys, op->o_tmpmemctx );        Debug( LDAP_DEBUG_TRACE,                "<= comp_equality_candidates: id=%ld, first=%ld, last=%ld\n",                (long) ids[0],                (long) BDB_IDL_FIRST(ids),                (long) BDB_IDL_LAST(ids) );        return( rc );}static intava_comp_candidates (	Operation *op,	AttributeAssertion *ava,	AttributeAliasing *aa,	ID *ids,	ID *tmp,	ID *stack ){	MatchingRuleAssertion mra;		mra.ma_rule = ava->aa_desc->ad_type->sat_equality;	if ( !mra.ma_rule ) {		struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;		BDB_IDL_ALL( bdb, ids );		return 0;	}	mra.ma_desc = aa->aa_aliased_ad;	mra.ma_rule = ava->aa_desc->ad_type->sat_equality;		return comp_candidates ( op, &mra, ava->aa_cf, ids, tmp, stack );}static intcomp_candidates (	Operation *op,	MatchingRuleAssertion *mra,	ComponentFilter *f,	ID *ids,	ID *tmp,	ID *stack){	int	rc;	if ( !f ) return LDAP_PROTOCOL_ERROR;	Debug( LDAP_DEBUG_FILTER, "comp_candidates\n", 0, 0, 0 );	switch ( f->cf_choice ) {	case SLAPD_FILTER_COMPUTED:		rc = f->cf_result;		break;	case LDAP_COMP_FILTER_AND:		rc = comp_list_candidates( op, mra, f->cf_and, LDAP_COMP_FILTER_AND, ids, tmp, stack );		break;	case LDAP_COMP_FILTER_OR:		rc = comp_list_candidates( op, mra, f->cf_or, LDAP_COMP_FILTER_OR, ids, tmp, stack );		break;	case LDAP_COMP_FILTER_NOT:		/* No component indexing supported for NOT filter */		Debug( LDAP_DEBUG_FILTER, "\tComponent NOT\n", 0, 0, 0 );		{			struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;			BDB_IDL_ALL( bdb, ids );		}		rc = LDAP_PROTOCOL_ERROR;		break;	case LDAP_COMP_FILTER_ITEM:		rc = comp_equality_candidates( op, mra, f->cf_ca, ids, tmp, stack );		break;	default:		{			struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;			BDB_IDL_ALL( bdb, ids );		}		rc = LDAP_PROTOCOL_ERROR;	}	return( rc );}static intext_candidates(        Operation *op,        MatchingRuleAssertion *mra,        ID *ids,        ID *tmp,        ID *stack){	/*	 * Currently Only Component Indexing for componentFilterMatch is supported	 * Indexing for an extensible filter is not supported yet	 */	if ( !mra->ma_cf ) {		struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;		BDB_IDL_ALL( bdb, ids );		return 0;	}	return comp_candidates ( op, mra, mra->ma_cf, ids, tmp, stack);}#endifstatic intlist_candidates(	Operation *op,	Filter	*flist,	int		ftype,	ID *ids,	ID *tmp,	ID *save ){	int rc = 0;	Filter	*f;	Debug( LDAP_DEBUG_FILTER, "=> bdb_list_candidates 0x%x\n", ftype, 0, 0 );	for ( f = flist; f != NULL; f = f->f_next ) {		/* ignore precomputed scopes */		if ( f->f_choice == SLAPD_FILTER_COMPUTED &&		     f->f_result == LDAP_SUCCESS ) {			continue;		}		BDB_IDL_ZERO( save );		rc = bdb_filter_candidates( op, f, save, tmp,			save+BDB_IDL_UM_SIZE );		if ( rc != 0 ) {			if ( ftype == LDAP_FILTER_AND ) {				rc = 0;				continue;			}			break;		}				if ( ftype == LDAP_FILTER_AND ) {			if ( f == flist ) {				BDB_IDL_CPY( ids, save );			} else {				bdb_idl_intersection( ids, save );			}			if( BDB_IDL_IS_ZERO( ids ) )				break;		} else {			if ( f == flist ) {				BDB_IDL_CPY( ids, save );			} else {				bdb_idl_union( ids, save );			}		}	}	if( rc == LDAP_SUCCESS ) {		Debug( LDAP_DEBUG_FILTER,			"<= bdb_list_candidates: id=%ld first=%ld last=%ld\n",			(long) ids[0],			(long) BDB_IDL_FIRST(ids),			(long) BDB_IDL_LAST(ids) );	} else {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -