mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-30 13:30:57 +08:00
"optimize" sets: since the attr part must be an attribute, use the AttributeDescription
This commit is contained in:
parent
559cf8bfb1
commit
2f6f6f6a07
@ -1844,7 +1844,7 @@ aci_set_cb_gather( Operation *op, SlapReply *rs )
|
||||
}
|
||||
|
||||
BerVarray
|
||||
aci_set_gather( SetCookie *cookie, struct berval *name, struct berval *attr )
|
||||
aci_set_gather( SetCookie *cookie, struct berval *name, AttributeDescription *desc )
|
||||
{
|
||||
AciSetCookie *cp = (AciSetCookie *)cookie;
|
||||
int rc = 0;
|
||||
@ -1863,7 +1863,7 @@ aci_set_gather( SetCookie *cookie, struct berval *name, struct berval *attr )
|
||||
* also return the syntax or some "comparison cookie".
|
||||
*/
|
||||
if ( strncasecmp( name->bv_val, "ldap:///", STRLENOF( "ldap:///" ) ) != 0 ) {
|
||||
return aci_set_gather2( cookie, name, attr );
|
||||
return aci_set_gather2( cookie, name, desc );
|
||||
}
|
||||
|
||||
rc = ldap_url_parse( name->bv_val, &ludp );
|
||||
@ -1935,13 +1935,8 @@ aci_set_gather( SetCookie *cookie, struct berval *name, struct berval *attr )
|
||||
anlistp = anlist;
|
||||
}
|
||||
|
||||
anlistp[ nattrs ].an_name = *attr;
|
||||
anlistp[ nattrs ].an_desc = NULL;
|
||||
rc = slap_bv2ad( &anlistp[ nattrs ].an_name,
|
||||
&anlistp[ nattrs ].an_desc, &text );
|
||||
if ( rc != LDAP_SUCCESS ) {
|
||||
goto url_done;
|
||||
}
|
||||
anlistp[ nattrs ].an_name = desc->ad_cname;
|
||||
anlistp[ nattrs ].an_desc = desc;
|
||||
|
||||
BER_BVZERO( &anlistp[ nattrs + 1 ].an_name );
|
||||
|
||||
@ -1997,7 +1992,7 @@ url_done:;
|
||||
}
|
||||
|
||||
BerVarray
|
||||
aci_set_gather2( SetCookie *cookie, struct berval *name, struct berval *attr )
|
||||
aci_set_gather2( SetCookie *cookie, struct berval *name, AttributeDescription *desc )
|
||||
{
|
||||
AciSetCookie *cp = (AciSetCookie *)cookie;
|
||||
BerVarray bvals = NULL;
|
||||
@ -2010,21 +2005,16 @@ aci_set_gather2( SetCookie *cookie, struct berval *name, struct berval *attr )
|
||||
*/
|
||||
rc = dnNormalize( 0, NULL, NULL, name, &ndn, cp->op->o_tmpmemctx );
|
||||
if ( rc == LDAP_SUCCESS ) {
|
||||
const char *text;
|
||||
AttributeDescription *desc = NULL;
|
||||
if ( desc == slap_schema.si_ad_entryDN ) {
|
||||
bvals = (BerVarray)slap_sl_malloc( sizeof( BerValue ) * 2,
|
||||
cp->op->o_tmpmemctx );
|
||||
bvals[ 0 ] = ndn;
|
||||
BER_BVZERO( &bvals[ 1 ] );
|
||||
BER_BVZERO( &ndn );
|
||||
|
||||
if ( slap_bv2ad( attr, &desc, &text ) == LDAP_SUCCESS ) {
|
||||
if ( desc == slap_schema.si_ad_entryDN ) {
|
||||
bvals = (BerVarray)slap_sl_malloc( sizeof( BerValue ) * 2,
|
||||
cp->op->o_tmpmemctx );
|
||||
bvals[ 0 ] = ndn;
|
||||
BER_BVZERO( &bvals[ 1 ] );
|
||||
BER_BVZERO( &ndn );
|
||||
|
||||
} else {
|
||||
backend_attribute( cp->op,
|
||||
cp->e, &ndn, desc, &bvals, ACL_NONE );
|
||||
}
|
||||
} else {
|
||||
backend_attribute( cp->op,
|
||||
cp->e, &ndn, desc, &bvals, ACL_NONE );
|
||||
}
|
||||
|
||||
if ( !BER_BVISNULL( &ndn ) ) {
|
||||
@ -2032,7 +2022,7 @@ aci_set_gather2( SetCookie *cookie, struct berval *name, struct berval *attr )
|
||||
}
|
||||
}
|
||||
|
||||
return( bvals );
|
||||
return bvals;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -21,25 +21,25 @@
|
||||
#include "slap.h"
|
||||
#include "sets.h"
|
||||
|
||||
static BerVarray set_chase (SLAP_SET_GATHER gatherer,
|
||||
SetCookie *cookie, BerVarray set, struct berval *attr, int closure);
|
||||
static int set_samedn (char *dn1, char *dn2);
|
||||
static BerVarray set_chase( SLAP_SET_GATHER gatherer,
|
||||
SetCookie *cookie, BerVarray set, AttributeDescription *desc, int closure );
|
||||
|
||||
long
|
||||
slap_set_size (BerVarray set)
|
||||
static long
|
||||
slap_set_size( BerVarray set )
|
||||
{
|
||||
long i;
|
||||
|
||||
i = 0;
|
||||
if (set != NULL) {
|
||||
while (set[i].bv_val)
|
||||
if ( set != NULL ) {
|
||||
while ( !BER_BVISNULL( &set[i] ) ) {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
void
|
||||
slap_set_dispose (SetCookie *cp, BerVarray set)
|
||||
static void
|
||||
slap_set_dispose( SetCookie *cp, BerVarray set )
|
||||
{
|
||||
ber_bvarray_free_x(set, cp->op->o_tmpmemctx);
|
||||
}
|
||||
@ -80,7 +80,8 @@ slap_set_join (SetCookie *cp, BerVarray lset, int op, BerVarray rset)
|
||||
cp->op->o_tmpfree(lset, cp->op->o_tmpmemctx);
|
||||
for (i = 0; rset[i].bv_val; i++) {
|
||||
for (j = 0; set[j].bv_val; j++) {
|
||||
if (set_samedn(rset[i].bv_val, set[j].bv_val)) {
|
||||
if ( dn_match( &rset[i], &set[j] ) )
|
||||
{
|
||||
cp->op->o_tmpfree(rset[i].bv_val, cp->op->o_tmpmemctx);
|
||||
rset[i].bv_val = NULL;
|
||||
break;
|
||||
@ -103,8 +104,9 @@ slap_set_join (SetCookie *cp, BerVarray lset, int op, BerVarray rset)
|
||||
last = slap_set_size(set) - 1;
|
||||
for (i = 0; set[i].bv_val; i++) {
|
||||
for (j = 0; rset[j].bv_val; j++) {
|
||||
if (set_samedn(set[i].bv_val, rset[j].bv_val))
|
||||
if ( dn_match( &set[i], &rset[j] ) ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (rset[j].bv_val == NULL) {
|
||||
cp->op->o_tmpfree(set[i].bv_val, cp->op->o_tmpmemctx);
|
||||
@ -123,90 +125,51 @@ slap_set_join (SetCookie *cp, BerVarray lset, int op, BerVarray rset)
|
||||
}
|
||||
|
||||
static BerVarray
|
||||
set_chase (SLAP_SET_GATHER gatherer,
|
||||
SetCookie *cp, BerVarray set, struct berval *attr, int closure)
|
||||
set_chase( SLAP_SET_GATHER gatherer,
|
||||
SetCookie *cp, BerVarray set, AttributeDescription *desc, int closure )
|
||||
{
|
||||
BerVarray vals, nset;
|
||||
char attrstr[32];
|
||||
struct berval bv;
|
||||
int i;
|
||||
|
||||
bv.bv_len = attr->bv_len;
|
||||
bv.bv_val = attrstr;
|
||||
|
||||
if (set == NULL)
|
||||
return(cp->op->o_tmpcalloc(1, sizeof(struct berval), cp->op->o_tmpmemctx));
|
||||
return cp->op->o_tmpcalloc( 1, sizeof(struct berval),
|
||||
cp->op->o_tmpmemctx );
|
||||
|
||||
if (set->bv_val == NULL)
|
||||
return(set);
|
||||
if ( BER_BVISNULL( set ) )
|
||||
return set;
|
||||
|
||||
if (attr->bv_len > (sizeof(attrstr) - 1)) {
|
||||
slap_set_dispose(cp, set);
|
||||
return(NULL);
|
||||
nset = cp->op->o_tmpcalloc( 1, sizeof(struct berval), cp->op->o_tmpmemctx );
|
||||
if ( nset == NULL ) {
|
||||
slap_set_dispose( cp, set );
|
||||
return NULL;
|
||||
}
|
||||
AC_MEMCPY(attrstr, attr->bv_val, attr->bv_len);
|
||||
attrstr[attr->bv_len] = 0;
|
||||
|
||||
nset = cp->op->o_tmpcalloc(1, sizeof(struct berval), cp->op->o_tmpmemctx);
|
||||
if (nset == NULL) {
|
||||
slap_set_dispose(cp, set);
|
||||
return(NULL);
|
||||
for ( i = 0; !BER_BVISNULL( &set[i] ); i++ ) {
|
||||
vals = (gatherer)( cp, &set[i], desc );
|
||||
if ( vals != NULL ) {
|
||||
nset = slap_set_join( cp, nset, '|', vals );
|
||||
}
|
||||
}
|
||||
for (i = 0; set[i].bv_val; i++) {
|
||||
vals = (gatherer)(cp, &set[i], &bv);
|
||||
if (vals != NULL)
|
||||
nset = slap_set_join(cp, nset, '|', vals);
|
||||
}
|
||||
slap_set_dispose(cp, set);
|
||||
slap_set_dispose( cp, set );
|
||||
|
||||
if (closure) {
|
||||
for (i = 0; nset[i].bv_val; i++) {
|
||||
vals = (gatherer)(cp, &nset[i], &bv);
|
||||
if (vals != NULL) {
|
||||
nset = slap_set_join(cp, nset, '|', vals);
|
||||
if (nset == NULL)
|
||||
if ( closure ) {
|
||||
for ( i = 0; !BER_BVISNULL( &nset[i] ); i++ ) {
|
||||
vals = (gatherer)( cp, &nset[i], desc );
|
||||
if ( vals != NULL ) {
|
||||
nset = slap_set_join( cp, nset, '|', vals );
|
||||
if ( nset == NULL ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return(nset);
|
||||
}
|
||||
|
||||
static int
|
||||
set_samedn (char *dn1, char *dn2)
|
||||
{
|
||||
char c1, c2;
|
||||
|
||||
while (*dn1 == ' ') dn1++;
|
||||
while (*dn2 == ' ') dn2++;
|
||||
while (*dn1 || *dn2) {
|
||||
if (*dn1 != '=' && *dn1 != ','
|
||||
&& *dn2 != '=' && *dn2 != ',')
|
||||
{
|
||||
c1 = *dn1++;
|
||||
c2 = *dn2++;
|
||||
if (c1 >= 'a' && c1 <= 'z')
|
||||
c1 -= 'a' - 'A';
|
||||
if (c2 >= 'a' && c2 <= 'z')
|
||||
c2 -= 'a' - 'A';
|
||||
if (c1 != c2)
|
||||
return(0);
|
||||
} else {
|
||||
while (*dn1 == ' ') dn1++;
|
||||
while (*dn2 == ' ') dn2++;
|
||||
if (*dn1++ != *dn2++)
|
||||
return(0);
|
||||
while (*dn1 == ' ') dn1++;
|
||||
while (*dn2 == ' ') dn2++;
|
||||
}
|
||||
}
|
||||
return(1);
|
||||
return nset;
|
||||
}
|
||||
|
||||
int
|
||||
slap_set_filter (SLAP_SET_GATHER gatherer,
|
||||
slap_set_filter( SLAP_SET_GATHER gatherer,
|
||||
SetCookie *cp, struct berval *fbv,
|
||||
struct berval *user, struct berval *this, BerVarray *results)
|
||||
struct berval *user, struct berval *target, BerVarray *results )
|
||||
{
|
||||
#define IS_SET(x) ( (unsigned long)(x) >= 256 )
|
||||
#define IS_OP(x) ( (unsigned long)(x) < 256 )
|
||||
@ -341,7 +304,7 @@ slap_set_filter (SLAP_SET_GATHER gatherer,
|
||||
set = cp->op->o_tmpcalloc(2, sizeof(struct berval), cp->op->o_tmpmemctx);
|
||||
if (set == NULL)
|
||||
SF_ERROR(memory);
|
||||
ber_dupbv_x( set, this, cp->op->o_tmpmemctx );
|
||||
ber_dupbv_x( set, target, cp->op->o_tmpmemctx );
|
||||
if (set->bv_val == NULL)
|
||||
SF_ERROR(memory);
|
||||
} else if (len == 4
|
||||
@ -358,12 +321,20 @@ slap_set_filter (SLAP_SET_GATHER gatherer,
|
||||
} else if (SF_TOP() != (void *)'/') {
|
||||
SF_ERROR(syntax);
|
||||
} else {
|
||||
struct berval fb2;
|
||||
struct berval fb2;
|
||||
AttributeDescription *ad = NULL;
|
||||
const char *text = NULL;
|
||||
|
||||
SF_POP();
|
||||
fb2.bv_val = filter;
|
||||
fb2.bv_len = len;
|
||||
|
||||
if ( slap_bv2ad( &fb2, &ad, &text ) != LDAP_SUCCESS ) {
|
||||
SF_ERROR(syntax);
|
||||
}
|
||||
|
||||
set = set_chase( gatherer,
|
||||
cp, SF_POP(), &fb2, c == '*' );
|
||||
cp, SF_POP(), ad, c == '*' );
|
||||
if (set == NULL)
|
||||
SF_ERROR(memory);
|
||||
if (c == '*')
|
||||
|
@ -29,19 +29,16 @@ typedef struct slap_set_cookie {
|
||||
* also return the syntax or some "comparison cookie"
|
||||
* that is used by set_filter.
|
||||
*/
|
||||
typedef BerVarray (SLAP_SET_GATHER)(
|
||||
SetCookie *cookie, struct berval *name, struct berval *attr);
|
||||
|
||||
LDAP_SLAPD_F (long) slap_set_size(BerVarray set);
|
||||
LDAP_SLAPD_F (void) slap_set_dispose(SetCookie *cookie, BerVarray set);
|
||||
typedef BerVarray (SLAP_SET_GATHER)( SetCookie *cookie,
|
||||
struct berval *name, AttributeDescription *ad);
|
||||
|
||||
LDAP_SLAPD_F (int) slap_set_filter(
|
||||
SLAP_SET_GATHER gatherer,
|
||||
SetCookie *cookie, struct berval *filter,
|
||||
struct berval *user, struct berval *this, BerVarray *results);
|
||||
struct berval *user, struct berval *target, BerVarray *results);
|
||||
|
||||
LDAP_SLAPD_F (BerVarray) slap_set_join(SetCookie *cp, BerVarray lset,
|
||||
int op, BerVarray rset);
|
||||
LDAP_SLAPD_F (BerVarray) slap_set_join(SetCookie *cp,
|
||||
BerVarray lset, int op, BerVarray rset);
|
||||
|
||||
LDAP_END_DECL
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user