Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Lukas However
OpenLDAP
Commits
ab18b27d
Commit
ab18b27d
authored
Jan 11, 2017
by
Howard Chu
Browse files
Tweak cursor_next C_EOF check
Allow C_EOF flag to be stale
parent
c97f4ed1
Changes
1
Show whitespace changes
Inline
Side-by-side
libraries/liblmdb/mdb.c
View file @
ab18b27d
...
...
@@ -5821,15 +5821,20 @@ mdb_cursor_next(MDB_cursor *mc, MDB_val *key, MDB_val *data, MDB_cursor_op op)
MDB_node
*
leaf
;
int
rc
;
if
((
mc
->
mc_flags
&
C_EOF
)
||
((
mc
->
mc_flags
&
C_DEL
)
&&
op
==
MDB_NEXT_DUP
))
{
if
((
mc
->
mc_flags
&
C_DEL
&&
op
==
MDB_NEXT_DUP
))
return
MDB_NOTFOUND
;
}
if
(
!
(
mc
->
mc_flags
&
C_INITIALIZED
))
return
mdb_cursor_first
(
mc
,
key
,
data
);
mp
=
mc
->
mc_pg
[
mc
->
mc_top
];
if
(
mc
->
mc_flags
&
C_EOF
)
{
if
(
mc
->
mc_ki
[
mc
->
mc_top
]
>=
NUMKEYS
(
mp
)
-
1
)
return
MDB_NOTFOUND
;
mc
->
mc_flags
^=
C_EOF
;
}
if
(
mc
->
mc_db
->
md_flags
&
MDB_DUPSORT
)
{
leaf
=
NODEPTR
(
mp
,
mc
->
mc_ki
[
mc
->
mc_top
]);
if
(
F_ISSET
(
leaf
->
mn_flags
,
F_DUPDATA
))
{
...
...
@@ -6340,10 +6345,19 @@ mdb_cursor_get(MDB_cursor *mc, MDB_val *key, MDB_val *data,
rc
=
MDB_INCOMPATIBLE
;
break
;
}
rc
=
MDB_SUCCESS
;
if
(
!
(
mc
->
mc_xcursor
->
mx_cursor
.
mc_flags
&
C_INITIALIZED
)
||
(
mc
->
mc_xcursor
->
mx_cursor
.
mc_flags
&
C_EOF
))
if
(
!
(
mc
->
mc_xcursor
->
mx_cursor
.
mc_flags
&
C_INITIALIZED
))
{
rc
=
EINVAL
;
break
;
}
if
(
mc
->
mc_xcursor
->
mx_cursor
.
mc_flags
&
C_EOF
)
{
MDB_cursor
*
mx
=
&
mc
->
mc_xcursor
->
mx_cursor
;
if
(
mx
->
mc_ki
[
mx
->
mc_top
]
>=
NUMKEYS
(
mx
->
mc_pg
[
mx
->
mc_top
])
-
1
)
{
rc
=
MDB_NOTFOUND
;
break
;
}
mx
->
mc_flags
^=
C_EOF
;
}
rc
=
MDB_SUCCESS
;
goto
fetchm
;
case
MDB_NEXT_MULTIPLE
:
if
(
data
==
NULL
)
{
...
...
@@ -7651,9 +7665,15 @@ mdb_cursor_count(MDB_cursor *mc, size_t *countp)
if
(
!
(
mc
->
mc_flags
&
C_INITIALIZED
))
return
EINVAL
;
if
(
!
mc
->
mc_snum
||
(
mc
->
mc_flags
&
C_EOF
)
)
if
(
!
mc
->
mc_snum
)
return
MDB_NOTFOUND
;
if
(
mc
->
mc_flags
&
C_EOF
)
{
if
(
mc
->
mc_ki
[
mc
->
mc_top
]
>=
NUMKEYS
(
mc
->
mc_pg
[
mc
->
mc_top
]))
return
MDB_NOTFOUND
;
mc
->
mc_flags
^=
C_EOF
;
}
leaf
=
NODEPTR
(
mc
->
mc_pg
[
mc
->
mc_top
],
mc
->
mc_ki
[
mc
->
mc_top
]);
if
(
!
F_ISSET
(
leaf
->
mn_flags
,
F_DUPDATA
))
{
*
countp
=
1
;
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a 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