37 #if defined(LIBC_SCCS) && !defined(lint)
38 static char sccsid[] =
"@(#)bt_seq.c 8.7 (Berkeley) 7/20/94";
41 #include <sys/types.h>
48 #include "../include/db.h"
51 static int __bt_first __P((
BTREE *,
const DBT *,
EPG *,
int *));
52 static int __bt_seqadv __P((
BTREE *,
EPG *,
int));
53 static int __bt_seqset __P((
BTREE *,
EPG *,
DBT *,
int));
77 __bt_seq(dbp, key, data, flags)
89 if (t->bt_pinned != NULL) {
90 mpool_put(t->bt_mp, t->bt_pinned, 0);
102 if (F_ISSET(&t->bt_cursor, CURS_INIT)) {
103 status = __bt_seqadv(t, &e, flags);
110 status = __bt_seqset(t, &e, key, flags);
117 if (status == RET_SUCCESS) {
118 __bt_setcur(t, e.page->pgno, e.index);
121 __bt_ret(t, &e, key, &t->bt_rkey, data, &t->bt_rdata, 0);
127 if (F_ISSET(t, B_DB_LOCK))
128 mpool_put(t->bt_mp, e.page, 0);
130 t->bt_pinned = e.page;
152 __bt_seqset(t, ep, key, flags)
173 if (key->data == NULL || key->size == 0) {
177 return (__bt_first(t, key, ep, &exact));
181 for (pg = P_ROOT;;) {
182 if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
186 if (NEXTINDEX(h) == 0) {
187 mpool_put(t->bt_mp, h, 0);
188 return (RET_SPECIAL);
191 if (h->flags & (P_BLEAF | P_RLEAF))
193 pg = GETBINTERNAL(h, 0)->pgno;
194 mpool_put(t->bt_mp, h, 0);
202 for (pg = P_ROOT;;) {
203 if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
207 if (NEXTINDEX(h) == 0) {
208 mpool_put(t->bt_mp, h, 0);
209 return (RET_SPECIAL);
212 if (h->flags & (P_BLEAF | P_RLEAF))
214 pg = GETBINTERNAL(h, NEXTINDEX(h) - 1)->pgno;
215 mpool_put(t->bt_mp, h, 0);
219 ep->index = NEXTINDEX(h) - 1;
222 return (RET_SUCCESS);
240 __bt_seqadv(t, ep, flags)
265 if (F_ISSET(c, CURS_ACQUIRE))
266 return (__bt_first(t, &c->key, ep, &exact));
269 if ((h = mpool_get(t->bt_mp, c->pg.pgno, 0)) == NULL)
283 if (F_ISSET(c, CURS_AFTER))
286 if (++index == NEXTINDEX(h)) {
288 mpool_put(t->bt_mp, h, 0);
290 return (RET_SPECIAL);
291 if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
302 if (F_ISSET(c, CURS_BEFORE)) {
303 usecurrent: F_CLR(c, CURS_AFTER | CURS_BEFORE);
305 ep->index = c->pg.index;
306 return (RET_SUCCESS);
311 mpool_put(t->bt_mp, h, 0);
313 return (RET_SPECIAL);
314 if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
316 index = NEXTINDEX(h) - 1;
324 return (RET_SUCCESS);
342 __bt_first(t, key, erval, exactp)
360 if ((ep = __bt_search(t, key, exactp)) == NULL)
361 return (RET_SPECIAL);
363 if (F_ISSET(t, B_NODUPS)) {
365 return (RET_SUCCESS);
376 if (save.page->pgno != ep->page->pgno) {
377 mpool_put(t->bt_mp, save.page, 0);
380 save.index = ep->index;
387 if (ep->index == 0) {
388 if (h->prevpg == P_INVALID)
390 if (h->pgno != save.page->pgno)
391 mpool_put(t->bt_mp, h, 0);
392 if ((h = mpool_get(t->bt_mp,
393 h->prevpg, 0)) == NULL) {
394 if (h->pgno == save.page->pgno)
400 ep->index = NEXTINDEX(h);
403 }
while (__bt_cmp(t, key, ep) == 0);
410 if (h->pgno != save.page->pgno)
411 mpool_put(t->bt_mp, h, 0);
414 return (RET_SUCCESS);
418 if (ep->index == NEXTINDEX(ep->page)) {
421 mpool_put(t->bt_mp, h, 0);
423 return (RET_SPECIAL);
424 if ((h = mpool_get(t->bt_mp, pg, 0)) == NULL)
430 return (RET_SUCCESS);
443 __bt_setcur(t, pgno, index)
449 if (t->bt_cursor.key.data != NULL) {
450 free(t->bt_cursor.key.data);
451 t->bt_cursor.key.size = 0;
452 t->bt_cursor.key.data = NULL;
454 F_CLR(&t->bt_cursor, CURS_ACQUIRE | CURS_AFTER | CURS_BEFORE);
457 t->bt_cursor.pg.pgno = pgno;
458 t->bt_cursor.pg.index = index;
459 F_SET(&t->bt_cursor, CURS_INIT);