diff options
Diffstat (limited to 'bdb/db/db_dup.c')
-rw-r--r-- | bdb/db/db_dup.c | 118 |
1 files changed, 62 insertions, 56 deletions
diff --git a/bdb/db/db_dup.c b/bdb/db/db_dup.c index 6d8b2df9518..2d33d79153f 100644 --- a/bdb/db/db_dup.c +++ b/bdb/db/db_dup.c @@ -1,14 +1,14 @@ /*- * See the file LICENSE for redistribution information. * - * Copyright (c) 1996, 1997, 1998, 1999, 2000 + * Copyright (c) 1996-2002 * Sleepycat Software. All rights reserved. */ #include "db_config.h" #ifndef lint -static const char revid[] = "$Id: db_dup.c,v 11.18 2000/11/30 00:58:32 ubell Exp $"; +static const char revid[] = "$Id: db_dup.c,v 11.32 2002/08/08 03:57:47 bostic Exp $"; #endif /* not lint */ #ifndef NO_SYSTEM_INCLUDES @@ -18,12 +18,10 @@ static const char revid[] = "$Id: db_dup.c,v 11.18 2000/11/30 00:58:32 ubell Exp #endif #include "db_int.h" -#include "db_page.h" -#include "db_shash.h" -#include "btree.h" -#include "hash.h" -#include "lock.h" -#include "db_am.h" +#include "dbinc/db_page.h" +#include "dbinc/db_shash.h" +#include "dbinc/lock.h" +#include "dbinc/db_am.h" /* * __db_ditem -- @@ -39,19 +37,20 @@ __db_ditem(dbc, pagep, indx, nbytes) { DB *dbp; DBT ldbt; - db_indx_t cnt, offset; + db_indx_t cnt, *inp, offset; int ret; u_int8_t *from; dbp = dbc->dbp; - if (DB_LOGGING(dbc)) { - ldbt.data = P_ENTRY(pagep, indx); + if (DBC_LOGGING(dbc)) { + ldbt.data = P_ENTRY(dbp, pagep, indx); ldbt.size = nbytes; - if ((ret = __db_addrem_log(dbp->dbenv, dbc->txn, - &LSN(pagep), 0, DB_REM_DUP, dbp->log_fileid, PGNO(pagep), + if ((ret = __db_addrem_log(dbp, dbc->txn, + &LSN(pagep), 0, DB_REM_DUP, PGNO(pagep), (u_int32_t)indx, nbytes, &ldbt, NULL, &LSN(pagep))) != 0) return (ret); - } + } else + LSN_NOT_LOGGED(LSN(pagep)); /* * If there's only a single item on the page, we don't have to @@ -63,24 +62,26 @@ __db_ditem(dbc, pagep, indx, nbytes) return (0); } + inp = P_INP(dbp, pagep); /* * Pack the remaining key/data items at the end of the page. Use * memmove(3), the regions may overlap. */ from = (u_int8_t *)pagep + HOFFSET(pagep); - memmove(from + nbytes, from, pagep->inp[indx] - HOFFSET(pagep)); + DB_ASSERT((int)inp[indx] - HOFFSET(pagep) >= 0); + memmove(from + nbytes, from, inp[indx] - HOFFSET(pagep)); HOFFSET(pagep) += nbytes; /* Adjust the indices' offsets. */ - offset = pagep->inp[indx]; + offset = inp[indx]; for (cnt = 0; cnt < NUM_ENT(pagep); ++cnt) - if (pagep->inp[cnt] < offset) - pagep->inp[cnt] += nbytes; + if (inp[cnt] < offset) + inp[cnt] += nbytes; /* Shift the indices down. */ --NUM_ENT(pagep); if (indx != NUM_ENT(pagep)) - memmove(&pagep->inp[indx], &pagep->inp[indx + 1], + memmove(&inp[indx], &inp[indx + 1], sizeof(db_indx_t) * (NUM_ENT(pagep) - indx)); return (0); @@ -104,11 +105,13 @@ __db_pitem(dbc, pagep, indx, nbytes, hdr, data) DB *dbp; BKEYDATA bk; DBT thdr; + db_indx_t *inp; int ret; u_int8_t *p; - if (nbytes > P_FREESPACE(pagep)) { - DB_ASSERT(nbytes <= P_FREESPACE(pagep)); + dbp = dbc->dbp; + if (nbytes > P_FREESPACE(dbp, pagep)) { + DB_ASSERT(nbytes <= P_FREESPACE(dbp, pagep)); return (EINVAL); } /* @@ -128,12 +131,13 @@ __db_pitem(dbc, pagep, indx, nbytes, hdr, data) * the passed in header sizes must be adjusted for the structure's * placeholder for the trailing variable-length data field. */ - dbp = dbc->dbp; - if (DB_LOGGING(dbc)) - if ((ret = __db_addrem_log(dbp->dbenv, dbc->txn, - &LSN(pagep), 0, DB_ADD_DUP, dbp->log_fileid, PGNO(pagep), + if (DBC_LOGGING(dbc)) { + if ((ret = __db_addrem_log(dbp, dbc->txn, + &LSN(pagep), 0, DB_ADD_DUP, PGNO(pagep), (u_int32_t)indx, nbytes, hdr, data, &LSN(pagep))) != 0) return (ret); + } else + LSN_NOT_LOGGED(LSN(pagep)); if (hdr == NULL) { B_TSET(bk.type, B_KEYDATA, 0); @@ -143,16 +147,17 @@ __db_pitem(dbc, pagep, indx, nbytes, hdr, data) thdr.size = SSZA(BKEYDATA, data); hdr = &thdr; } + inp = P_INP(dbp, pagep); /* Adjust the index table, then put the item on the page. */ if (indx != NUM_ENT(pagep)) - memmove(&pagep->inp[indx + 1], &pagep->inp[indx], + memmove(&inp[indx + 1], &inp[indx], sizeof(db_indx_t) * (NUM_ENT(pagep) - indx)); HOFFSET(pagep) -= nbytes; - pagep->inp[indx] = HOFFSET(pagep); + inp[indx] = HOFFSET(pagep); ++NUM_ENT(pagep); - p = P_ENTRY(pagep, indx); + p = P_ENTRY(dbp, pagep, indx); memcpy(p, hdr->data, hdr->size); if (data != NULL) memcpy(p + hdr->size, data->data, data->size); @@ -177,13 +182,16 @@ __db_relink(dbc, add_rem, pagep, new_next, needlock) PAGE *np, *pp; DB_LOCK npl, ppl; DB_LSN *nlsnp, *plsnp, ret_lsn; + DB_MPOOLFILE *mpf; int ret; - ret = 0; + dbp = dbc->dbp; np = pp = NULL; - npl.off = ppl.off = LOCK_INVALID; + LOCK_INIT(npl); + LOCK_INIT(ppl); nlsnp = plsnp = NULL; - dbp = dbc->dbp; + mpf = dbp->mpf; + ret = 0; /* * Retrieve and lock the one/two pages. For a remove, we may need @@ -194,9 +202,8 @@ __db_relink(dbc, add_rem, pagep, new_next, needlock) if (needlock && (ret = __db_lget(dbc, 0, pagep->next_pgno, DB_LOCK_WRITE, 0, &npl)) != 0) goto err; - if ((ret = memp_fget(dbp->mpf, - &pagep->next_pgno, 0, &np)) != 0) { - (void)__db_pgerr(dbp, pagep->next_pgno); + if ((ret = mpf->get(mpf, &pagep->next_pgno, 0, &np)) != 0) { + __db_pgerr(dbp, pagep->next_pgno, ret); goto err; } nlsnp = &np->lsn; @@ -205,28 +212,27 @@ __db_relink(dbc, add_rem, pagep, new_next, needlock) if (needlock && (ret = __db_lget(dbc, 0, pagep->prev_pgno, DB_LOCK_WRITE, 0, &ppl)) != 0) goto err; - if ((ret = memp_fget(dbp->mpf, - &pagep->prev_pgno, 0, &pp)) != 0) { - (void)__db_pgerr(dbp, pagep->next_pgno); + if ((ret = mpf->get(mpf, &pagep->prev_pgno, 0, &pp)) != 0) { + __db_pgerr(dbp, pagep->next_pgno, ret); goto err; } plsnp = &pp->lsn; } /* Log the change. */ - if (DB_LOGGING(dbc)) { - if ((ret = __db_relink_log(dbp->dbenv, dbc->txn, - &ret_lsn, 0, add_rem, dbp->log_fileid, - pagep->pgno, &pagep->lsn, - pagep->prev_pgno, plsnp, pagep->next_pgno, nlsnp)) != 0) + if (DBC_LOGGING(dbc)) { + if ((ret = __db_relink_log(dbp, dbc->txn, &ret_lsn, 0, add_rem, + pagep->pgno, &pagep->lsn, pagep->prev_pgno, plsnp, + pagep->next_pgno, nlsnp)) != 0) goto err; - if (np != NULL) - np->lsn = ret_lsn; - if (pp != NULL) - pp->lsn = ret_lsn; - if (add_rem == DB_REM_PAGE) - pagep->lsn = ret_lsn; - } + } else + LSN_NOT_LOGGED(ret_lsn); + if (np != NULL) + np->lsn = ret_lsn; + if (pp != NULL) + pp->lsn = ret_lsn; + if (add_rem == DB_REM_PAGE) + pagep->lsn = ret_lsn; /* * Modify and release the two pages. @@ -242,10 +248,10 @@ __db_relink(dbc, add_rem, pagep, new_next, needlock) else np->prev_pgno = pagep->prev_pgno; if (new_next == NULL) - ret = memp_fput(dbp->mpf, np, DB_MPOOL_DIRTY); + ret = mpf->put(mpf, np, DB_MPOOL_DIRTY); else { *new_next = np; - ret = memp_fset(dbp->mpf, np, DB_MPOOL_DIRTY); + ret = mpf->set(mpf, np, DB_MPOOL_DIRTY); } if (ret != 0) goto err; @@ -256,7 +262,7 @@ __db_relink(dbc, add_rem, pagep, new_next, needlock) if (pp != NULL) { pp->next_pgno = pagep->next_pgno; - if ((ret = memp_fput(dbp->mpf, pp, DB_MPOOL_DIRTY)) != 0) + if ((ret = mpf->put(mpf, pp, DB_MPOOL_DIRTY)) != 0) goto err; if (needlock) (void)__TLPUT(dbc, ppl); @@ -264,12 +270,12 @@ __db_relink(dbc, add_rem, pagep, new_next, needlock) return (0); err: if (np != NULL) - (void)memp_fput(dbp->mpf, np, 0); - if (needlock && npl.off != LOCK_INVALID) + (void)mpf->put(mpf, np, 0); + if (needlock) (void)__TLPUT(dbc, npl); if (pp != NULL) - (void)memp_fput(dbp->mpf, pp, 0); - if (needlock && ppl.off != LOCK_INVALID) + (void)mpf->put(mpf, pp, 0); + if (needlock) (void)__TLPUT(dbc, ppl); return (ret); } |