Annotation of src/lib/libc/db/recno/rec_seq.c, Revision 1.14
1.14 ! joerg 1: /* $NetBSD: rec_seq.c,v 1.13 2008/09/10 17:52:36 joerg Exp $ */
1.6 cgd 2:
1.1 cgd 3: /*-
1.7 cgd 4: * Copyright (c) 1991, 1993, 1994
1.1 cgd 5: * The Regents of the University of California. All rights reserved.
6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions
9: * are met:
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. Redistributions in binary form must reproduce the above copyright
13: * notice, this list of conditions and the following disclaimer in the
14: * documentation and/or other materials provided with the distribution.
1.11 agc 15: * 3. Neither the name of the University nor the names of its contributors
1.1 cgd 16: * may be used to endorse or promote products derived from this software
17: * without specific prior written permission.
18: *
19: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29: * SUCH DAMAGE.
30: */
31:
1.14 ! joerg 32: #if HAVE_NBTOOL_CONFIG_H
! 33: #include "nbtool_config.h"
! 34: #endif
! 35:
1.8 christos 36: #include <sys/cdefs.h>
1.14 ! joerg 37: __RCSID("$NetBSD: rec_seq.c,v 1.13 2008/09/10 17:52:36 joerg Exp $");
1.1 cgd 38:
1.9 jtc 39: #include "namespace.h"
1.1 cgd 40: #include <sys/types.h>
41:
1.12 christos 42: #include <assert.h>
1.1 cgd 43: #include <errno.h>
44: #include <limits.h>
45: #include <stdio.h>
46: #include <string.h>
47:
48: #include <db.h>
49: #include "recno.h"
50:
51: /*
52: * __REC_SEQ -- Recno sequential scan interface.
53: *
54: * Parameters:
55: * dbp: pointer to access method
56: * key: key for positioning and return value
57: * data: data return value
58: * flags: R_CURSOR, R_FIRST, R_LAST, R_NEXT, R_PREV.
59: *
60: * Returns:
61: * RET_ERROR, RET_SUCCESS or RET_SPECIAL if there's no next key.
62: */
63: int
1.12 christos 64: __rec_seq(const DB *dbp, DBT *key, DBT *data, u_int flags)
1.1 cgd 65: {
66: BTREE *t;
67: EPG *e;
68: recno_t nrec;
69: int status;
70:
71: t = dbp->internal;
1.4 cgd 72:
73: /* Toss any page pinned across calls. */
74: if (t->bt_pinned != NULL) {
75: mpool_put(t->bt_mp, t->bt_pinned, 0);
76: t->bt_pinned = NULL;
77: }
78:
1.1 cgd 79: switch(flags) {
80: case R_CURSOR:
81: if ((nrec = *(recno_t *)key->data) == 0)
82: goto einval;
83: break;
84: case R_NEXT:
1.7 cgd 85: if (F_ISSET(&t->bt_cursor, CURS_INIT)) {
86: nrec = t->bt_cursor.rcursor + 1;
1.1 cgd 87: break;
88: }
89: /* FALLTHROUGH */
90: case R_FIRST:
91: nrec = 1;
92: break;
93: case R_PREV:
1.7 cgd 94: if (F_ISSET(&t->bt_cursor, CURS_INIT)) {
95: if ((nrec = t->bt_cursor.rcursor - 1) == 0)
1.1 cgd 96: return (RET_SPECIAL);
97: break;
98: }
99: /* FALLTHROUGH */
100: case R_LAST:
1.7 cgd 101: if (!F_ISSET(t, R_EOF | R_INMEM) &&
1.1 cgd 102: t->bt_irec(t, MAX_REC_NUMBER) == RET_ERROR)
103: return (RET_ERROR);
104: nrec = t->bt_nrecs;
105: break;
106: default:
107: einval: errno = EINVAL;
108: return (RET_ERROR);
109: }
110:
111: if (t->bt_nrecs == 0 || nrec > t->bt_nrecs) {
1.7 cgd 112: if (!F_ISSET(t, R_EOF | R_INMEM) &&
1.1 cgd 113: (status = t->bt_irec(t, nrec)) != RET_SUCCESS)
114: return (status);
115: if (t->bt_nrecs == 0 || nrec > t->bt_nrecs)
116: return (RET_SPECIAL);
117: }
118:
119: if ((e = __rec_search(t, nrec - 1, SEARCH)) == NULL)
120: return (RET_ERROR);
121:
1.7 cgd 122: F_SET(&t->bt_cursor, CURS_INIT);
123: t->bt_cursor.rcursor = nrec;
1.1 cgd 124:
125: status = __rec_ret(t, e, nrec, key, data);
1.7 cgd 126: if (F_ISSET(t, B_DB_LOCK))
1.4 cgd 127: mpool_put(t->bt_mp, e->page, 0);
128: else
129: t->bt_pinned = e->page;
1.1 cgd 130: return (status);
131: }
CVSweb <webmaster@jp.NetBSD.org>