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 8.1 12/31/84) 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: }