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

Re: (ITS#6507) backglue and paged results issue



> Ah yes, just saw this. Sorry, my email seems to be slow today (weird).
>
> Similar to my patch, but I'm unsure about the second part:
>
> } else if ( op->o_bd != gi->gi_n[0].gn_be ) {
>      /* if cookie not empty, it's again this database's turn */
>      op->o_conn->c_pagedresults_state.ps_be = op->o_bd;
> }
>
> If the cookie is not empty, then it should again be this database's
> turn, even it this is this last database.
>
> This makes a search that stops in the middle of results from last
> database with a valid cookie fall back to the first database on
> continuation, and thus loop forever.
>
> Would you consider removing the else if?

Well, it's not that simple.  The fact is that paged results state is being
handled in two ways: when the database is back-bdb/hdb, the cookie is an
ID, and it's stored in ps_cookie; otherwise (e.g. back-ldap), it's a
berval, stored in ps_cookieval.  I need to handle both cases.  I think I
made it.

Now, ps_cookie in c_pagedresults_state is initialized to NOID; back-bdb
will set it to 0 first, and then to whatever value it needs.  Other
backends, that use ps_cookieval, will not touch it.  So when ps_cookie ==
NOID one needs to look at ps_cookieval (and parse it as needed), otherwise
ps_cookie suffices.  You'll need to update backglue.c, controls.c and
back-bdb/search.c.

Now it passes all cases I checked, both with local glued databases and
with back-null/back-ldap as in your example.

p.