1: # include "../ingres.h" 2: # include "../symbol.h" 3: # include "../access.h" 4: # include "../lock.h" 5: 6: scan_dups(d, tidx, tuple) 7: struct descriptor *d; 8: struct tup_id *tidx; 9: char *tuple; 10: 11: /* 12: ** Scan for duplicates. Start with the page 13: ** specified by tid and 14: ** continue until there are no more pages 15: ** 16: ** Scan_dups guarantees that the same page will 17: ** be in the buffer on entry and exit 18: ** 19: ** returns: 20: ** <0 if fatal error 21: ** 0 if not duplicate 22: ** 1 if duplicate 23: */ 24: 25: { 26: register int dup, pagerr; 27: register struct tup_id *tid; 28: struct tup_id savetid; 29: 30: tid = tidx; 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: 56: dup_check(dx, tid, tuple1) 57: struct descriptor *dx; 58: struct tup_id *tid; 59: char *tuple1; 60: 61: /* 62: ** Check current page for a duplicate of tuple; 63: ** 64: ** returns: 65: ** 0 if not duplicate 66: ** 1 if duplicate 67: */ 68: 69: { 70: register struct descriptor *d; 71: register int i, dom; 72: int *lp, len, lastline, tups_equal; 73: char *tup1, *tup2; 74: char tuple2[MAXTUP]; 75: char *getint_tuple(); 76: 77: d = dx; 78: 79: 80: /* determine starting and ending points */ 81: lastline = Acc_head->nxtlino; 82: lp = &Acc_head->linetab[0]; 83: 84: /* check each tuple for duplication */ 85: for (i = 0; i < lastline; i++) 86: { 87: 88: /* is this line used? */ 89: if (*lp--) 90: { 91: /* yes. get tuple and check it */ 92: tid->line_id = i; 93: tup2 = getint_tuple(d, tid, tuple2); 94: tup1 = tuple1; 95: tups_equal = TRUE; /* assume equal */ 96: 97: /* now check each domain for duplication */ 98: for (dom = 1; dom <= d->relatts; dom++) 99: { 100: len = d->relfrml[dom] & I1MASK; 101: if (d->relfrmt[dom] == CHAR) 102: tups_equal = scompare(tup1, len, tup2, len) == 0; 103: else 104: tups_equal = bequal(tup1, tup2, len); 105: if (!tups_equal) 106: { 107: /* not duplicates */ 108: break; 109: } 110: tup1 += len; 111: tup2 += len; 112: } 113: if (tups_equal) 114: return (1); /* duplicate */ 115: } 116: } 117: return (0); /* no duplicate */ 118: }