--000000000000a517d40574956804
Content-Type: text/plain; charset="UTF-8"
Thanks!
On Wed, Aug 29, 2018, 12:05 Howard Chu, <hyc(a)symas.com> wrote:
karl(a)waclawek.net wrote:
> --00000000000018b43a057492d87f
> Content-Type: text/plain; charset="UTF-8"
> As far as point 2 is concerned I was basing it on this
piece of code,
where
> it looks like MDB_GET_MULTIPLE just checks some flags and then goes to
the
> fetchm label where the code does nothing but retrieve data:
You're not reading the code correctly. See below.
> case MDB_GET_MULTIPLE:
> if (data == NULL || !(mc->mc_flags & C_INITIALIZED)) {
> rc = EINVAL;
> break;
> }
> if (!(mc->mc_db->md_flags & MDB_DUPFIXED)) {
> 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))
> break;
> goto fetchm;
> case MDB_NEXT_MULTIPLE:
> if (data == NULL) {
> rc = EINVAL;
> break;
> }
> if (!(mc->mc_db->md_flags & MDB_DUPFIXED)) {
> rc = MDB_INCOMPATIBLE;
> break;
> }
> rc = mdb_cursor_next(mc, key, data, MDB_NEXT_DUP);
> if (rc == MDB_SUCCESS) {
> if (mc->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED) {
> MDB_cursor *mx;
> fetchm:
> mx = &mc->mc_xcursor->mx_cursor;
> data->mv_size = NUMKEYS(mx->mc_pg[mx->mc_top]) *
> mx->mc_db->md_pad;
> data->mv_data = METADATA(mx->mc_pg[mx->mc_top]);
> mx->mc_ki[mx->mc_top] = NUMKEYS(mx->mc_pg[mx->mc_top])-1;
^^^ this line advances the cursor.
> } else {
> rc = MDB_NOTFOUND;
> }
> }
> break;
> On Tue, Aug 28, 2018 at 8:26
PM Howard Chu <openldap-its(a)openldap.org
>
wrote:
>>> Full_Name: Karl Waclawek
>>> Version: LMDB 0.9.22
>>> OS: Windows 10
>>> URL:
ftp://ftp.openldap.org/incoming/
>>> Submission from: (NULL) (2607:fea8:7a80:814:3ca9:e8f6:801c:d6f8)
>>
>>
>>> The documentation in lmdb.h for MDB_GET_MULTIPLE,
MDB_NEXT_MULTIPLE and
>>> MDB_PREV_MULTIPLE seems to have two issues:
>>
>>> 1) The documentation
indicates that both, the key and data, are
>> returned, but
>> in
>>> reality only the data is returned.
>
>> Looks like you're right. Since these are DUPs the
key would be the same
>> every time so there's no need to return it on each call.
>> Doc fixed in git mdb.master.
>
>>> 2) The documentation states that MDB_GET_MULTIPLE
moves the cursor.
This
>> does
>>> not seem to be true.
>
>> The doc is correct here. The cursor is advanced far
enough that a
>> MDB_NEXT_MULTIPLE will return the following data, as opposed to just
>> returning the same data again.
>
--
-- Howard Chu
CTO, Symas Corp.
http://www.symas.com
Director, Highland Sun
http://highlandsun.com/hyc/
Chief Architect, OpenLDAP
http://www.openldap.org/project/
--000000000000a517d40574956804
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"auto">Thanks!</div><br><div
class=3D"gmail_quote"><div dir=3D"l=
tr">On Wed, Aug 29, 2018, 12:05 Howard Chu, <<a
href=3D"mailto:hyc@symas=
.com">hyc(a)symas.com</a>&gt; wrote:<br></div><blockquote
class=3D"gmail_quot=
e" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc
solid;padding-left:1ex">=
<a href=3D"mailto:karl@waclawek.net" target=3D"_blank"
rel=3D"noreferrer">k=
arl(a)waclawek.net</a> wrote:<br
>
--00000000000018b43a057492d87f<br
>
Content-Type: text/plain; charset=3D"UTF-8"<br
> <br
>
As far as point 2 is concerned I was basing it on this piece of code, =
where<br
> it looks like
MDB_GET_MULTIPLE just checks some flags and then goes to=
the<br
> fetchm label where the code
does nothing but retrieve data:<br
<br
You're not reading the code
correctly. See below.<br
> <br
> case MDB_GET_MULTIPLE:<br
> if (data =3D=3D NULL || !(mc->mc_flags
& C_INITIALIZED)) {<br
> rc =3D EINVAL;<br
> break;<br
>
}<br
> if (!(mc->mc_db->md_flags &
MDB_DUPFIXED)) {<br
> rc =3D
MDB_INCOMPATIBLE;<br
> break;<br
> }<br
>
rc =3D MDB_SUCCESS;<br
> if
(!(mc->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED) ||=
<br
> (mc->mc_xcursor->mx_cursor.mc_flags
& C_EOF))<br
> break;<br
> goto fetchm;<br
>
case MDB_NEXT_MULTIPLE:<br
> if (data =3D=3D NULL)
{<br
> rc =3D EINVAL;<br
>
break;<br
> }<br
> if (!(mc->mc_db->md_flags &
MDB_DUPFIXED)) {<br
> rc =3D
MDB_INCOMPATIBLE;<br
> break;<br
> }<br
>
rc =3D mdb_cursor_next(mc, key, data, MDB_NEXT_DUP);<br
>
if (rc =3D=3D MDB_SUCCESS) {<br
> if
(mc->mc_xcursor->mx_cursor.mc_flags & C_INITIALIZED) {<br=
> MDB_cursor *mx;<br
>
fetchm:<br
> mx =3D
&mc->mc_xcursor->mx_cursor;<br
>
data->mv_size =3D NUMKEYS(mx->mc_pg[mx->mc_top]) *<br
> mx->mc_db->md_pad;<br
> data->mv_data =3D
METADATA(mx->mc_pg[mx->mc_top]);<br
>
mx->mc_ki[mx->mc_top] =3D NUMKEYS(mx->mc_pg[mx->mc_top])-1=
;<br
<br
^^^ this line advances the
cursor.<br
<br
>
} else {<br
> rc =3D
MDB_NOTFOUND;<br
> }<br
> }<br
>
break;<br
> <br
> <br
>
On Tue, Aug 28, 2018 at 8:26 PM Howard Chu <<a href=3D"mailto:openl=
dap-its(a)openldap.org" target=3D"_blank"
rel=3D"noreferrer">openldap-its@ope=
nldap.org</a>><br
> wrote:<br
> <br
>>> Full_Name: Karl Waclawek<br
>>> Version: LMDB 0.9.22<br
>>> OS: Windows 10<br
>>> URL: <a
href=3D"ftp://ftp.openldap.org/incoming/" rel=3D"noref=
errer noreferrer"
target=3D"_blank">ftp://ftp.openldap.org/incoming/</a>...
>>> Submission from: (NULL)
(2607:fea8:7a80:814:3ca9:e8f6:801c:d6f=
8)<br
>>><br
>>><br
>>> The documentation in lmdb.h for MDB_GET_MULTIPLE,
MDB_NEXT_MUL=
TIPLE and<br
>>>
MDB_PREV_MULTIPLE seems to have two issues:<br
>>><br
>>> 1) The documentation indicates that both, the key and data,
ar=
e<br
>> returned, but<br
>> in<br
>>> reality only the data is returned.<br
>><br
>> Looks like you're right. Since these are DUPs the key would
be=
the same<br
>> every time so
there's no need to return it on each call.<br
>> Doc fixed in git mdb.master.<br
>><br
>>> 2) The
documentation states that MDB_GET_MULTIPLE moves the cu=
rsor. This<br
>> does<br
>>> not seem to be true.<br
>><br
>> The doc is correct here. The cursor is advanced far enough that
a<=
br
>> MDB_NEXT_MULTIPLE will return the following
data, as opposed to ju=
st<br
>> returning the same
data again.<br
>><br
> <br
<br
<br
<br
-- <br
=C2=A0 =C2=A0-- Howard Chu<br
=C2=A0
=C2=A0CTO, Symas Corp.=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0<a hr=
ef=3D"http://www.symas.com" rel=3D"noreferrer noreferrer"
target=3D"_blank"=
>http://www.symas.com</a><br
=C2=A0
=C2=A0Director, Highland Sun=C2=A0 =C2=A0 =C2=A0<a href=3D"http://hi=
ghlandsun.com/hyc/" rel=3D"noreferrer noreferrer"
target=3D"_blank">http://=
highlandsun.com/hyc/</a><br
=C2=A0
=C2=A0Chief Architect, OpenLDAP=C2=A0 <a href=3D"http://www.openldap=
.org/project/" rel=3D"noreferrer noreferrer"
target=3D"_blank">http://www.o=
penldap.org/project/</a><br
</blockquote></div
--000000000000a517d40574956804--