[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: (ITS#8908) LMDB Documentation for MDB_XXX_MULTIPLE



--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:
> >
> > 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.
>

--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-&gt;mc_flags &amp; 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-&gt;mc_db-&gt;md_flags &amp; 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-&gt;mc_xcursor-&gt;mx_cursor.mc_flags &amp; C_INITIALI=
ZED) ||</font></div><div><font face=3D"monospace, monospace"><span style=3D=
"white-space:pre">			</span>(mc-&gt;mc_xcursor-&gt;mx_cursor.mc_flags &amp;=
 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-&gt;mc_db-&gt;md_flags &amp; 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-&gt;mc_xcursor-&gt;mx_cursor.mc_flags &amp; 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 &amp;mc-&=
gt;mc_xcursor-&gt;mx_cursor;</font></div><div><font face=3D"monospace, mono=
space"><span style=3D"white-space:pre">				</span>data-&gt;mv_size =3D NUMK=
EYS(mx-&gt;mc_pg[mx-&gt;mc_top]) *</font></div><div><font face=3D"monospace=
, monospace"><span style=3D"white-space:pre">					</span>mx-&gt;mc_db-&gt;m=
d_pad;</font></div><div><font face=3D"monospace, monospace"><span style=3D"=
white-space:pre">				</span>data-&gt;mv_data =3D METADATA(mx-&gt;mc_pg[mx-&=
gt;mc_top]);</font></div><div><font face=3D"monospace, monospace"><span sty=
le=3D"white-space:pre">				</span>mx-&gt;mc_ki[mx-&gt;mc_top] =3D NUMKEYS(m=
x-&gt;mc_pg[mx-&gt;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 &lt;<a href=3D"mailto:openldap-its@openldap.org";>openldap-its@openld=
ap.org</a>&gt; wrote:<br></div><blockquote class=3D"gmail_quote" style=3D"m=
argin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">&gt; Full_Nam=
e: Karl Waclawek<br>
&gt; Version: LMDB 0.9.22<br>
&gt; OS: Windows 10<br>
&gt; URL: <a href=3D"ftp://ftp.openldap.org/incoming/"; rel=3D"noreferrer" t=
arget=3D"_blank">ftp://ftp.openldap.org/incoming/</a><br>
&gt; Submission from: (NULL) (2607:fea8:7a80:814:3ca9:e8f6:801c:d6f8)<br>
&gt; <br>
&gt; <br>
&gt; The documentation in lmdb.h for MDB_GET_MULTIPLE, MDB_NEXT_MULTIPLE an=
d<br>
&gt; MDB_PREV_MULTIPLE seems to have two issues:<br>
&gt; <br>
&gt; 1) The documentation indicates that both, the key and data, are return=
ed, but<br>
in<br>
&gt; reality only the data is returned.<br>
<br>
Looks like you&#39;re right. Since these are DUPs the key would be the same=
<br>
every time so there&#39;s no need to return it on each call.<br>
Doc fixed in git mdb.master.<br>
<br>
&gt; 2) The documentation states that MDB_GET_MULTIPLE moves the cursor. Th=
is does<br>
&gt; 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--