#include "config.h"
#ifndef lint
static const char sccsid[] = "@(#)bt_curadj.c 10.69 (Sleepycat) 12/2/98";
#endif
#ifndef NO_SYSTEM_INCLUDES
#include <sys/types.h>
#include <stdlib.h>
#endif
#include "db_int.h"
#include "db_page.h"
#include "btree.h"
#ifdef DEBUG
int
__bam_cprint(dbp)
DB *dbp;
{
CURSOR *cp;
DBC *dbc;
DB_THREAD_LOCK(dbp);
for (dbc = TAILQ_FIRST(&dbp->active_queue);
dbc != NULL; dbc = TAILQ_NEXT(dbc, links)) {
cp = (CURSOR *)dbc->internal;
fprintf(stderr,
"%#0x->%#0x: page: %lu index: %lu dpage %lu dindex: %lu recno: %lu",
(u_int)dbc, (u_int)cp, (u_long)cp->pgno, (u_long)cp->indx,
(u_long)cp->dpgno, (u_long)cp->dindx, (u_long)cp->recno);
if (F_ISSET(cp, C_DELETED))
fprintf(stderr, " (deleted)");
fprintf(stderr, "\n");
}
DB_THREAD_UNLOCK(dbp);
return (0);
}
#endif
int
__bam_ca_delete(dbp, pgno, indx, delete)
DB *dbp;
db_pgno_t pgno;
u_int32_t indx;
int delete;
{
DBC *dbc;
CURSOR *cp;
int count;
if (dbp->type == DB_RECNO)
return (0);
DB_THREAD_LOCK(dbp);
for (count = 0, dbc = TAILQ_FIRST(&dbp->active_queue);
dbc != NULL; dbc = TAILQ_NEXT(dbc, links)) {
cp = (CURSOR *)dbc->internal;
if ((cp->pgno == pgno && cp->indx == indx) ||
(cp->dpgno == pgno && cp->dindx == indx)) {
if (delete)
F_SET(cp, C_DELETED);
else
F_CLR(cp, C_DELETED);
++count;
}
}
DB_THREAD_UNLOCK(dbp);
return (count);
}
void
__bam_ca_di(dbp, pgno, indx, adjust)
DB *dbp;
db_pgno_t pgno;
u_int32_t indx;
int adjust;
{
CURSOR *cp;
DBC *dbc;
if (dbp->type == DB_RECNO)
return;
DB_THREAD_LOCK(dbp);
for (dbc = TAILQ_FIRST(&dbp->active_queue);
dbc != NULL; dbc = TAILQ_NEXT(dbc, links)) {
cp = (CURSOR *)dbc->internal;
if (cp->pgno == pgno && cp->indx >= indx)
cp->indx += adjust;
if (cp->dpgno == pgno && cp->dindx >= indx)
cp->dindx += adjust;
}
DB_THREAD_UNLOCK(dbp);
}
void
__bam_ca_dup(dbp, fpgno, first, fi, tpgno, ti)
DB *dbp;
db_pgno_t fpgno, tpgno;
u_int32_t first, fi, ti;
{
CURSOR *cp;
DBC *dbc;
if (dbp->type == DB_RECNO)
return;
DB_THREAD_LOCK(dbp);
for (dbc = TAILQ_FIRST(&dbp->active_queue);
dbc != NULL; dbc = TAILQ_NEXT(dbc, links)) {
cp = (CURSOR *)dbc->internal;
if (cp->dpgno == PGNO_INVALID &&
cp->pgno == fpgno && cp->indx == fi) {
cp->indx = first;
cp->dpgno = tpgno;
cp->dindx = ti;
}
}
DB_THREAD_UNLOCK(dbp);
}
void
__bam_ca_rsplit(dbp, fpgno, tpgno)
DB *dbp;
db_pgno_t fpgno, tpgno;
{
CURSOR *cp;
DBC *dbc;
if (dbp->type == DB_RECNO)
return;
DB_THREAD_LOCK(dbp);
for (dbc = TAILQ_FIRST(&dbp->active_queue);
dbc != NULL; dbc = TAILQ_NEXT(dbc, links)) {
cp = (CURSOR *)dbc->internal;
if (cp->pgno == fpgno)
cp->pgno = tpgno;
}
DB_THREAD_UNLOCK(dbp);
}
void
__bam_ca_split(dbp, ppgno, lpgno, rpgno, split_indx, cleft)
DB *dbp;
db_pgno_t ppgno, lpgno, rpgno;
u_int32_t split_indx;
int cleft;
{
DBC *dbc;
CURSOR *cp;
if (dbp->type == DB_RECNO)
return;
DB_THREAD_LOCK(dbp);
for (dbc = TAILQ_FIRST(&dbp->active_queue);
dbc != NULL; dbc = TAILQ_NEXT(dbc, links)) {
cp = (CURSOR *)dbc->internal;
if (cp->pgno == ppgno)
if (cp->indx < split_indx) {
if (cleft)
cp->pgno = lpgno;
} else {
cp->pgno = rpgno;
cp->indx -= split_indx;
}
if (cp->dpgno == ppgno)
if (cp->dindx < split_indx) {
if (cleft)
cp->dpgno = lpgno;
} else {
cp->dpgno = rpgno;
cp->dindx -= split_indx;
}
}
DB_THREAD_UNLOCK(dbp);
}