37 #if defined(LIBC_SCCS) && !defined(lint)
38 static char sccsid[] =
"@(#)bt_put.c 8.8 (Berkeley) 7/26/94";
41 #include <sys/types.h>
48 #include "../include/db.h"
51 static EPG *bt_fast __P((
BTREE *,
const DBT *,
const DBT *,
int *));
67 __bt_put(dbp, key, data, flags)
80 int dflags, exact, status;
81 char *dest, db[NOVFLSIZE], kb[NOVFLSIZE];
86 if (t->bt_pinned != NULL) {
87 mpool_put(t->bt_mp, t->bt_pinned, 0);
92 if (F_ISSET(t, B_RDONLY)) {
106 if (F_ISSET(&t->bt_cursor, CURS_INIT) &&
107 !F_ISSET(&t->bt_cursor,
108 CURS_ACQUIRE | CURS_AFTER | CURS_BEFORE))
125 if (key->size + data->size > t->bt_ovflsize) {
126 if (key->size > t->bt_ovflsize) {
127 storekey:
if (__ovfl_put(t, key, &pg) == RET_ERROR)
130 tkey.size = NOVFLSIZE;
131 memmove(kb, &pg,
sizeof(pgno_t));
132 memmove(kb +
sizeof(pgno_t),
133 &key->size,
sizeof(u_int32_t));
137 if (key->size + data->size > t->bt_ovflsize) {
138 if (__ovfl_put(t, data, &pg) == RET_ERROR)
141 tdata.size = NOVFLSIZE;
142 memmove(db, &pg,
sizeof(pgno_t));
143 memmove(db +
sizeof(pgno_t),
144 &data->size,
sizeof(u_int32_t));
148 if (key->size + data->size > t->bt_ovflsize)
153 if (flags == R_CURSOR) {
154 if ((h = mpool_get(t->bt_mp, t->bt_cursor.pg.pgno, 0)) == NULL)
156 idx = t->bt_cursor.pg.index;
164 if (t->bt_order == NOT || (e = bt_fast(t, key, data, &exact)) == NULL)
165 if ((e = __bt_search(t, key, &exact)) == NULL)
180 mpool_put(t->bt_mp, h, 0);
181 return (RET_SPECIAL);
183 if (!exact || !F_ISSET(t, B_NODUPS))
190 delete:
if (__bt_dleaf(t, key, h, idx) == RET_ERROR) {
191 mpool_put(t->bt_mp, h, 0);
203 nbytes = NBLEAFDBT(key->size, data->size);
204 if ((u_int32_t) (h->upper - h->lower) < nbytes +
sizeof(indx_t)) {
205 if ((status = __bt_split(t, h, key,
206 data, dflags, nbytes, idx)) != RET_SUCCESS)
211 if (idx < (nxtindex = NEXTINDEX(h)))
212 memmove(h->linp + idx + 1, h->linp + idx,
213 (nxtindex - idx) *
sizeof(indx_t));
214 h->lower +=
sizeof(indx_t);
216 h->linp[idx] = h->upper -= nbytes;
217 dest = (
char *)h + h->upper;
218 WR_BLEAF(dest, key, data, dflags);
221 if (F_ISSET(&t->bt_cursor, CURS_INIT) &&
222 !F_ISSET(&t->bt_cursor, CURS_ACQUIRE) &&
223 t->bt_cursor.pg.pgno == h->pgno && t->bt_cursor.pg.index >= idx)
224 ++t->bt_cursor.pg.index;
226 if (t->bt_order == NOT) {
227 if (h->nextpg == P_INVALID) {
228 if (idx == NEXTINDEX(h) - 1) {
229 t->bt_order = FORWARD;
230 t->bt_last.index = idx;
231 t->bt_last.pgno = h->pgno;
233 }
else if (h->prevpg == P_INVALID) {
236 t->bt_last.index = 0;
237 t->bt_last.pgno = h->pgno;
242 mpool_put(t->bt_mp, h, MPOOL_DIRTY);
245 if (flags == R_SETCURSOR)
246 __bt_setcur(t, e->page->pgno, e->index);
248 F_SET(t, B_MODIFIED);
249 return (RET_SUCCESS);
253 u_long bt_cache_hit, bt_cache_miss;
267 bt_fast(t, key, data, exactp)
269 const
DBT *key, *data;
276 if ((h = mpool_get(t->bt_mp, t->bt_last.pgno, 0)) == NULL) {
281 t->bt_cur.index = t->bt_last.index;
287 nbytes = NBLEAFDBT(key->size, data->size);
288 if ((u_int32_t) (h->upper - h->lower) < nbytes +
sizeof(indx_t))
291 if (t->bt_order == FORWARD) {
292 if (t->bt_cur.page->nextpg != P_INVALID)
294 if (t->bt_cur.index != NEXTINDEX(h) - 1)
296 if ((cmp = __bt_cmp(t, key, &t->bt_cur)) < 0)
298 t->bt_last.index = cmp ? ++t->bt_cur.index : t->bt_cur.index;
300 if (t->bt_cur.page->prevpg != P_INVALID)
302 if (t->bt_cur.index != 0)
304 if ((cmp = __bt_cmp(t, key, &t->bt_cur)) > 0)
306 t->bt_last.index = 0;
319 mpool_put(t->bt_mp, h, 0);