P8000/WEGA/contrib/ingres/dbs/src/access/scan_dups.c

111 lines
2.3 KiB
C

# include "gen.h"
# include "../h/dbs.h"
# include "../h/symbol.h"
# include "../h/access.h"
# include "../h/lock.h"
/*
** Scan for duplicates. Start with the page
** specified by tid and
** continue until there are no more pages
**
** AAscan_dups guarantees that the same page will
** be in the buffer on entry and exit
**
** returns:
** <0 if fatal error
** 0 if not duplicate
** 1 if duplicate
*/
AAscan_dups(d, tid, tuple)
register DESC *d;
register struct tup_id *tid;
char *tuple;
{
register int dup;
register int pagerr;
struct tup_id savetid;
AAstuff_page(&savetid, &AAcc_head->thispage);
AAcclock = FALSE; /* turn concurrency off */
dup = 0; /* assume success */
do
{
if (pagerr = AAgetpage(d, tid))
break; /* fatal error */
if (dup = AAdup_check(d, tid, tuple))
break; /* found duplicate */
AAstuff_page(tid, &AAcc_head->ovflopg);
} while (AAcc_head->ovflopg);
if (pagerr || (pagerr = AAgetpage(d, &savetid)))
dup = pagerr; /* return fatal page error */
AAcclock = TRUE; /* turn concurency on */
return (dup);
}
/*
** Check current page for a duplicate of tuple;
**
** returns:
** 0 if not duplicate
** 1 if duplicate
*/
AAdup_check(d, tid, tuple1)
register DESC *d;
struct tup_id *tid;
char *tuple1;
{
register int i;
register short *lp;
int tups_equal;
register int dom;
register int len;
register int lastline;
char *tup1;
char *tup2;
char tuple2[MAXTUP];
extern char *AAgetint_tuple();
/* determine starting and ending points */
lastline = AAcc_head->nxtlino;
lp = &AAcc_head->linetab[LINETAB(0)];
/* check each tuple for duplication */
for (i = 0; i < lastline; i++)
{
/* is this line used? */
if (*lp--)
{
/* yes. get tuple and check it */
tid->line_id = i;
tup2 = AAgetint_tuple(d, tid, tuple2);
tup1 = tuple1;
tups_equal = TRUE; /* assume equal */
/* now check each domain for duplication */
for (dom = 1; dom <= d->reldum.relatts; dom++)
{
len = ctou(d->relfrml[dom]);
if (d->relfrmt[dom] == CHAR)
tups_equal = !AAscompare(tup1, len, tup2, len);
else
tups_equal = AAbequal(tup1, tup2, len);
if (!tups_equal) /* not duplicates */
break;
tup1 += len;
tup2 += len;
}
if (tups_equal)
return (1); /* duplicate */
}
}
return (0); /* no duplicate */
}