--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:
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; } else { rc = MDB_NOTFOUND; } } break;
On Tue, Aug 28, 2018 at 8:26 PM Howard Chu openldap-its@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:
- 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.
- 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.
--00000000000018b43a057492d87f Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div dir=3D"ltr">As far as point 2 is concerned I was basi= ng it on this piece of code, where it looks like MDB_GET_MULTIPLE just chec= ks some flags and then goes to the fetchm label where the code does nothing= but retrieve data:<div><br></div><div><div><font face=3D"monospace, monosp= ace"><span style=3D"white-space:pre"> </span>case MDB_GET_MULTIPLE:</font><= /div><div><font face=3D"monospace, monospace"><span style=3D"white-space:pr= e"> </span>if (data =3D=3D NULL || !(mc->mc_flags & C_INITIALIZED))= {</font></div><div><font face=3D"monospace, monospace"><span style=3D"whit= e-space:pre"> </span>rc =3D EINVAL;</font></div><div><font face=3D"monosp= ace, monospace"><span style=3D"white-space:pre"> </span>break;</font></di= v><div><font face=3D"monospace, monospace"><span style=3D"white-space:pre">= </span>}</font></div><div><font face=3D"monospace, monospace"><span style= =3D"white-space:pre"> </span>if (!(mc->mc_db->md_flags & MDB_DUP= FIXED)) {</font></div><div><font face=3D"monospace, monospace"><span style= =3D"white-space:pre"> </span>rc =3D MDB_INCOMPATIBLE;</font></div><div><f= ont face=3D"monospace, monospace"><span style=3D"white-space:pre"> </span=
break;</font></div><div><font face=3D"monospace, monospace"><span style=3D=
"white-space:pre"> </span>}</font></div><div><font face=3D"monospace, mono= space"><span style=3D"white-space:pre"> </span>rc =3D MDB_SUCCESS;</font><= /div><div><font face=3D"monospace, monospace"><span style=3D"white-space:pr= e"> </span>if (!(mc->mc_xcursor->mx_cursor.mc_flags & C_INITIALI= ZED) ||</font></div><div><font face=3D"monospace, monospace"><span style=3D= "white-space:pre"> </span>(mc->mc_xcursor->mx_cursor.mc_flags &= C_EOF))</font></div><div><font face=3D"monospace, monospace"><span style= =3D"white-space:pre"> </span>break;</font></div><div><font face=3D"monosp= ace, monospace"><span style=3D"white-space:pre"> </span>goto fetchm;</font=
</div><div><font face=3D"monospace, monospace"><span style=3D"white-space:=
pre"> </span>case MDB_NEXT_MULTIPLE:</font></div><div><font face=3D"monospa= ce, monospace"><span style=3D"white-space:pre"> </span>if (data =3D=3D NUL= L) {</font></div><div><font face=3D"monospace, monospace"><span style=3D"wh= ite-space:pre"> </span>rc =3D EINVAL;</font></div><div><font face=3D"mono= space, monospace"><span style=3D"white-space:pre"> </span>break;</font></= div><div><font face=3D"monospace, monospace"><span style=3D"white-space:pre= "> </span>}</font></div><div><font face=3D"monospace, monospace"><span sty= le=3D"white-space:pre"> </span>if (!(mc->mc_db->md_flags & MDB_D= UPFIXED)) {</font></div><div><font face=3D"monospace, monospace"><span styl= e=3D"white-space:pre"> </span>rc =3D MDB_INCOMPATIBLE;</font></div><div><= font face=3D"monospace, monospace"><span style=3D"white-space:pre"> </spa= n>break;</font></div><div><font face=3D"monospace, monospace"><span style= =3D"white-space:pre"> </span>}</font></div><div><font face=3D"monospace, m= onospace"><span style=3D"white-space:pre"> </span>rc =3D mdb_cursor_next(m= c, key, data, MDB_NEXT_DUP);</font></div><div><font face=3D"monospace, mono= space"><span style=3D"white-space:pre"> </span>if (rc =3D=3D MDB_SUCCESS) = {</font></div><div><font face=3D"monospace, monospace"><span style=3D"white= -space:pre"> </span>if (mc->mc_xcursor->mx_cursor.mc_flags & C_= INITIALIZED) {</font></div><div><font face=3D"monospace, monospace"><span s= tyle=3D"white-space:pre"> </span>MDB_cursor *mx;</font></div><div><font = face=3D"monospace, monospace">fetchm:</font></div><div><font face=3D"monosp= ace, monospace"><span style=3D"white-space:pre"> </span>mx =3D &mc-&= gt;mc_xcursor->mx_cursor;</font></div><div><font face=3D"monospace, mono= space"><span style=3D"white-space:pre"> </span>data->mv_size =3D NUMK= EYS(mx->mc_pg[mx->mc_top]) *</font></div><div><font face=3D"monospace= , monospace"><span style=3D"white-space:pre"> </span>mx->mc_db->m= d_pad;</font></div><div><font face=3D"monospace, monospace"><span style=3D"= white-space:pre"> </span>data->mv_data =3D METADATA(mx->mc_pg[mx-&= gt;mc_top]);</font></div><div><font face=3D"monospace, monospace"><span sty= le=3D"white-space:pre"> </span>mx->mc_ki[mx->mc_top] =3D NUMKEYS(m= x->mc_pg[mx->mc_top])-1;</font></div><div><font face=3D"monospace, mo= nospace"><span style=3D"white-space:pre"> </span>} else {</font></div><di= v><font face=3D"monospace, monospace"><span style=3D"white-space:pre"> <= /span>rc =3D MDB_NOTFOUND;</font></div><div><font face=3D"monospace, monosp= ace"><span style=3D"white-space:pre"> </span>}</font></div><div><font fac= e=3D"monospace, monospace"><span style=3D"white-space:pre"> </span>}</font=
</div><div><font face=3D"monospace, monospace"><span style=3D"white-space:=
pre"> </span>break;</font></div></div><div><br></div></div></div><br><div = class=3D"gmail_quote"><div dir=3D"ltr">On Tue, Aug 28, 2018 at 8:26 PM Howa= rd Chu <<a href=3D"mailto:openldap-its@openldap.org">openldap-its@openld= ap.org</a>> wrote:<br></div><blockquote class=3D"gmail_quote" style=3D"m= argin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">> Full_Nam= e: Karl Waclawek<br> > Version: LMDB 0.9.22<br> > OS: Windows 10<br> > URL: <a href=3D"ftp://ftp.openldap.org/incoming/" rel=3D"noreferrer" t= arget=3D"_blank">ftp://ftp.openldap.org/incoming/</a><br> > Submission from: (NULL) (2607:fea8:7a80:814:3ca9:e8f6:801c:d6f8)<br> > <br> > <br> > The documentation in lmdb.h for MDB_GET_MULTIPLE, MDB_NEXT_MULTIPLE an= d<br> > MDB_PREV_MULTIPLE seems to have two issues:<br> > <br> > 1) The documentation indicates that both, the key and data, are return= ed, 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 cursor. Th= is 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 just<br> returning the same data again.<br> </blockquote></div>
--00000000000018b43a057492d87f--