Annotation of 42BSD/ingres/source/iutil/scan_dups.c, revision 1.1.1.1

1.1       root        1: # include      <ingres.h>
                      2: # include      <symbol.h>
                      3: # include      <access.h>
                      4: # include      <lock.h>
                      5: # include      <sccs.h>
                      6: 
                      7: SCCSID(@(#)scan_dups.c 7.1     2/5/81)
                      8: 
                      9: 
                     10: /*
                     11: **     Scan for duplicates. Start with the page
                     12: **     specified by tid and
                     13: **     continue until there are no more pages
                     14: **
                     15: **     Scan_dups guarantees that the same page will
                     16: **     be in the buffer on entry and exit
                     17: **
                     18: **     returns:
                     19: **             <0 if fatal error
                     20: **             0  if not duplicate
                     21: **             1  if duplicate
                     22: */
                     23: 
                     24: scan_dups(d, tid, tuple)
                     25: DESC           *d;
                     26: register TID   *tid;
                     27: char           *tuple;
                     28: {
                     29:        register int    dup, pagerr;
                     30:        TID             savetid;
                     31: 
                     32:        stuff_page(&savetid, &Acc_head->thispage);
                     33: 
                     34:        Acclock = FALSE;        /* turn concurrency off */
                     35:        dup = 0;        /* assume success */
                     36: 
                     37:        do
                     38:        {
                     39:                if (pagerr = get_page(d, tid))
                     40:                        break;  /* fatal error */
                     41: 
                     42:                if (dup = dup_check(d, tid, tuple))
                     43:                        break;  /* found duplicate */
                     44: 
                     45:                stuff_page(tid, &Acc_head->ovflopg);
                     46:        } while (Acc_head->ovflopg);
                     47: 
                     48:        if (pagerr || (pagerr = get_page(d, &savetid)))
                     49:                dup = pagerr;   /* return fatal page error */
                     50: 
                     51:        Acclock = TRUE;         /* turn concurency on */
                     52:        return (dup);
                     53: }
                     54: /*
                     55: **  DUP_CHECK -- check current page for a duplicate of tuple;
                     56: **
                     57: **     returns:
                     58: **             0 if not duplicate
                     59: **             1 if duplicate
                     60: */
                     61: 
                     62: dup_check(d, tid, tuple1)
                     63: register DESC  *d;
                     64: TID            *tid;
                     65: char           *tuple1;
                     66: {
                     67:        register int    i, dom;
                     68:        short           *lp;
                     69:        int             len, lastline, tups_equal;
                     70:        char            *tup1, *tup2;
                     71:        char            tuple2[MAXTUP];
                     72:        char            *getint_tuple();
                     73: 
                     74:        /* determine starting and ending points */
                     75:        lastline = Acc_head->nxtlino;
                     76:        lp = Acc_head->linetab;
                     77: 
                     78:        /* check each tuple for duplication */
                     79:        for (i = 0; i < lastline; i++)
                     80:        {
                     81:                /* is this line used? */
                     82:                if (*lp--)
                     83:                {
                     84:                        /* yes. get tuple and check it */
                     85:                        tid->line_id = i;
                     86:                        tup2 = getint_tuple(d, tid, tuple2);
                     87:                        tup1 = tuple1;
                     88:                        tups_equal = TRUE;      /* assume equal */
                     89: 
                     90:                        /* now check each domain for duplication */
                     91:                        for (dom = 1; dom <= d->reldum.relatts; dom++)
                     92:                        {
                     93:                                len = d->relfrml[dom] & I1MASK;
                     94:                                if (d->relfrmt[dom] == CHAR)
                     95:                                        tups_equal = scompare(tup1, len, tup2, len) == 0;
                     96:                                else
                     97:                                        tups_equal = bequal(tup1, tup2, len);
                     98:                                if (!tups_equal)
                     99:                                {
                    100:                                        /* not duplicates */
                    101:                                        break;
                    102:                                }
                    103:                                tup1 += len;
                    104:                                tup2 += len;
                    105:                        }
                    106:                        if (tups_equal)
                    107:                                return (1);     /* duplicate */
                    108:                }
                    109:        }
                    110:        return (0);     /* no duplicate */
                    111: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.