37 #if defined(LIBC_SCCS) && !defined(lint)
38 static char sccsid[] =
"@(#)rec_delete.c 8.7 (Berkeley) 7/14/94";
41 #include <sys/types.h>
47 #include "../include/db.h"
50 static int rec_rdelete __P((
BTREE *, recno_t));
64 __rec_delete(dbp, key, flags)
76 if (t->bt_pinned != NULL) {
77 mpool_put(t->bt_mp, t->bt_pinned, 0);
83 if ((nrec = *(recno_t *)key->data) == 0)
85 if (nrec > t->bt_nrecs)
88 status = rec_rdelete(t, nrec);
91 if (!F_ISSET(&t->bt_cursor, CURS_INIT))
95 status = rec_rdelete(t, t->bt_cursor.rcursor - 1);
96 if (status == RET_SUCCESS)
97 --t->bt_cursor.rcursor;
100 einval: errno = EINVAL;
104 if (status == RET_SUCCESS)
105 F_SET(t, B_MODIFIED | R_MODIFIED);
129 if ((e = __rec_search(t, nrec, SDELETE)) == NULL)
134 status = __rec_dleaf(t, h, e->index);
135 if (status != RET_SUCCESS) {
136 mpool_put(t->bt_mp, h, 0);
139 mpool_put(t->bt_mp, h, MPOOL_DIRTY);
140 return (RET_SUCCESS);
154 __rec_dleaf(t, h, idx)
160 indx_t *ip, cnt, offset;
175 to = rl = GETRLEAF(h, idx);
176 if (rl->flags & P_BIGDATA && __ovfl_delete(t, rl->bytes) == RET_ERROR)
184 from = (
char *)h + h->upper;
185 memmove(from + nbytes, from, (
char *)to - from);
188 offset = h->linp[idx];
189 for (cnt = &h->linp[idx] - (ip = &h->linp[0]); cnt--; ++ip)
192 for (cnt = &h->linp[NEXTINDEX(h)] - ip; --cnt; ++ip)
193 ip[0] = ip[1] < offset ? ip[1] + nbytes : ip[1];
194 h->lower -=
sizeof(indx_t);
196 return (RET_SUCCESS);