Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Joe Martin
OpenLDAP
Commits
0e407191
Commit
0e407191
authored
Jan 26, 2009
by
Quanah Gibson-Mount
Browse files
ITS#5756
parent
bded736f
Changes
2
Hide whitespace changes
Inline
Side-by-side
CHANGES
View file @
0e407191
...
...
@@ -31,6 +31,7 @@ OpenLDAP 2.4.14 Engineering
Fixed slapd-ldif deadlock (ITS#5329)
Fixed slapd-meta double response sending (ITS#5854)
Fixed slapd-meta alias deref for retry (ITS#5889)
Fixed slapo-pcache filter sorting (ITS#5756)
Fixed slapo-ppolicy to not be global (ITS#5858)
Fixed slapo-rwm with back-config (ITS#5906)
Updated contrib/addpartial module (ITS#5764)
...
...
servers/slapd/overlays/pcache.c
View file @
0e407191
...
...
@@ -588,13 +588,12 @@ static int lex_bvcmp( struct berval *bv1, struct berval *bv2 )
return
len
;
}
/* compare the
firs
t value in each filter */
static
int
pcache_filter_cmp
(
const
void
*
v
1
,
const
void
*
v
2
)
/* compare the
curren
t value in each filter */
static
int
pcache_filter_cmp
(
Filter
*
f
1
,
Filter
*
f
2
)
{
const
CachedQuery
*
q1
=
v1
,
*
q2
=
v2
;
int
rc
,
weight1
,
weight2
;
switch
(
q1
->
first
->
f_choice
)
{
switch
(
f1
->
f_choice
)
{
case
LDAP_FILTER_PRESENT
:
weight1
=
0
;
break
;
...
...
@@ -606,7 +605,7 @@ static int pcache_filter_cmp( const void *v1, const void *v2 )
default:
weight1
=
2
;
}
switch
(
q2
->
first
->
f_choice
)
{
switch
(
f2
->
f_choice
)
{
case
LDAP_FILTER_PRESENT
:
weight2
=
0
;
break
;
...
...
@@ -621,56 +620,80 @@ static int pcache_filter_cmp( const void *v1, const void *v2 )
rc
=
weight1
-
weight2
;
if
(
!
rc
)
{
switch
(
weight1
)
{
case
0
:
return
0
;
case
0
:
break
;
case
1
:
rc
=
lex_bvcmp
(
&
q1
->
first
->
f_av_value
,
&
q2
->
first
->
f_av_value
);
rc
=
lex_bvcmp
(
&
f1
->
f_av_value
,
&
f2
->
f_av_value
);
break
;
case
2
:
if
(
q1
->
first
->
f_choice
==
LDAP_FILTER_SUBSTRINGS
)
{
if
(
f1
->
f_choice
==
LDAP_FILTER_SUBSTRINGS
)
{
rc
=
0
;
if
(
!
BER_BVISNULL
(
&
q1
->
first
->
f_sub_initial
))
{
if
(
!
BER_BVISNULL
(
&
q2
->
first
->
f_sub_initial
))
{
rc
=
lex_bvcmp
(
&
q1
->
first
->
f_sub_initial
,
&
q2
->
first
->
f_sub_initial
);
if
(
!
BER_BVISNULL
(
&
f1
->
f_sub_initial
))
{
if
(
!
BER_BVISNULL
(
&
f2
->
f_sub_initial
))
{
rc
=
lex_bvcmp
(
&
f1
->
f_sub_initial
,
&
f2
->
f_sub_initial
);
}
else
{
rc
=
1
;
}
}
else
if
(
!
BER_BVISNULL
(
&
q2
->
first
->
f_sub_initial
))
{
}
else
if
(
!
BER_BVISNULL
(
&
f2
->
f_sub_initial
))
{
rc
=
-
1
;
}
if
(
rc
)
break
;
if
(
q1
->
first
->
f_sub_any
)
{
if
(
q2
->
first
->
f_sub_any
)
{
rc
=
lex_bvcmp
(
q1
->
first
->
f_sub_any
,
q2
->
first
->
f_sub_any
);
if
(
f1
->
f_sub_any
)
{
if
(
f2
->
f_sub_any
)
{
rc
=
lex_bvcmp
(
f1
->
f_sub_any
,
f2
->
f_sub_any
);
}
else
{
rc
=
1
;
}
}
else
if
(
q2
->
first
->
f_sub_any
)
{
}
else
if
(
f2
->
f_sub_any
)
{
rc
=
-
1
;
}
if
(
rc
)
break
;
if
(
!
BER_BVISNULL
(
&
q1
->
first
->
f_sub_final
))
{
if
(
!
BER_BVISNULL
(
&
q2
->
first
->
f_sub_final
))
{
rc
=
lex_bvcmp
(
&
q1
->
first
->
f_sub_final
,
&
q2
->
first
->
f_sub_final
);
if
(
!
BER_BVISNULL
(
&
f1
->
f_sub_final
))
{
if
(
!
BER_BVISNULL
(
&
f2
->
f_sub_final
))
{
rc
=
lex_bvcmp
(
&
f1
->
f_sub_final
,
&
f2
->
f_sub_final
);
}
else
{
rc
=
1
;
}
}
else
if
(
!
BER_BVISNULL
(
&
q2
->
first
->
f_sub_final
))
{
}
else
if
(
!
BER_BVISNULL
(
&
f2
->
f_sub_final
))
{
rc
=
-
1
;
}
}
else
{
rc
=
lex_bvcmp
(
&
q1
->
first
->
f_mr_value
,
&
q2
->
first
->
f_mr_value
);
rc
=
lex_bvcmp
(
&
f1
->
f_mr_value
,
&
f2
->
f_mr_value
);
}
break
;
}
if
(
!
rc
)
{
f1
=
f1
->
f_next
;
f2
=
f2
->
f_next
;
if
(
f1
||
f2
)
{
if
(
!
f1
)
rc
=
-
1
;
else
if
(
!
f2
)
rc
=
1
;
else
{
while
(
f1
->
f_choice
==
LDAP_FILTER_AND
||
f1
->
f_choice
==
LDAP_FILTER_OR
)
f1
=
f1
->
f_and
;
while
(
f2
->
f_choice
==
LDAP_FILTER_AND
||
f2
->
f_choice
==
LDAP_FILTER_OR
)
f2
=
f2
->
f_and
;
rc
=
pcache_filter_cmp
(
f1
,
f2
);
}
}
}
}
return
rc
;
}
/* compare filters in each query */
static
int
pcache_query_cmp
(
const
void
*
v1
,
const
void
*
v2
)
{
const
CachedQuery
*
q1
=
v1
,
*
q2
=
v2
;
return
pcache_filter_cmp
(
q1
->
first
,
q2
->
first
);
}
/* add query on top of LRU list */
static
void
add_query_on_top
(
query_manager
*
qm
,
CachedQuery
*
qc
)
...
...
@@ -922,7 +945,7 @@ find_filter( Operation *op, Avlnode *root, Filter *inputf, Filter *first )
ptr
=
tavl_end
(
root
,
1
);
dir
=
TAVL_DIR_LEFT
;
}
else
{
ptr
=
tavl_find3
(
root
,
&
cq
,
pcache_
filt
er_cmp
,
&
ret
);
ptr
=
tavl_find3
(
root
,
&
cq
,
pcache_
qu
er
y
_cmp
,
&
ret
);
dir
=
(
first
->
f_choice
==
LDAP_FILTER_GE
)
?
TAVL_DIR_LEFT
:
TAVL_DIR_RIGHT
;
}
...
...
@@ -1227,7 +1250,7 @@ add_query(
new_cached_query
->
prev
=
NULL
;
new_cached_query
->
qbase
=
qbase
;
rc
=
tavl_insert
(
&
qbase
->
scopes
[
query
->
scope
],
new_cached_query
,
pcache_
filt
er_cmp
,
avl_dup_error
);
pcache_
qu
er
y
_cmp
,
avl_dup_error
);
if
(
rc
==
0
)
{
qbase
->
queries
++
;
if
(
templ
->
query
==
NULL
)
...
...
@@ -1273,7 +1296,7 @@ remove_from_template (CachedQuery* qc, QueryTemplate* template)
qc
->
next
->
prev
=
qc
->
prev
;
qc
->
prev
->
next
=
qc
->
next
;
}
tavl_delete
(
&
qc
->
qbase
->
scopes
[
qc
->
scope
],
qc
,
pcache_
filt
er_cmp
);
tavl_delete
(
&
qc
->
qbase
->
scopes
[
qc
->
scope
],
qc
,
pcache_
qu
er
y
_cmp
);
qc
->
qbase
->
queries
--
;
if
(
qc
->
qbase
->
queries
==
0
)
{
avl_delete
(
&
template
->
qbase
,
qc
->
qbase
,
pcache_dn_cmp
);
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment