1: # include <ingres.h> 2: # include <access.h> 3: # include <sccs.h> 4: 5: SCCSID(@(#)getequal.c 8.1 12/31/84) 6: 7: 8: /* 9: ** getequal - get the first tuple equal to the provided key 10: ** 11: ** GETEQUAL is used to do a keyed retrieval of a single 12: ** tuple in cases where the calling program knows the key to 13: ** be unique. SETKEY must be called first to set all desired 14: ** domain values. GETEQUAL will return the first tuple with 15: ** equality on all of the specified domains. 16: ** The tuple is returned in TUPLE. 17: ** 18: ** NOTE: 19: ** This function used to call get() for the scan, I have exploded the 20: ** call for efficency reasons. I also call get_page only when we leave a 21: ** page boundary. 22: ** 23: ** function values: 24: ** 25: ** <0 fatal error 26: ** 0 success 27: ** 1 no match 28: ** 29: ** Trace Flags: 30: ** 23.8-15 31: */ 32: 33: 34: getequal(d, keyval, tupleval, tid) 35: register DESC *d; 36: char keyval[MAXTUP]; 37: char tupleval[MAXTUP]; 38: register TID *tid; 39: { 40: auto long lpageid,pageid; 41: TID limtid; 42: register char *tuple; 43: register char *key; 44: register int i; 45: 46: key = keyval; 47: tuple = tupleval; 48: 49: # ifdef xATR1 50: if (tTf(23, 8)) 51: { 52: printf("getequal: %.14s,", d->reldum.relid); 53: printdesc(d); 54: printup(d, key); 55: } 56: # endif 57: if (i = find(d, EXACTKEY, tid, &limtid, key)) 58: return (i); 59: 60: pluck_page(&limtid,&lpageid); 61: if (i = get_page(d, tid)) 62: return ( i ); 63: 64: for (;;) 65: { 66: 67: do 68: { 69: while (((++(tid->line_id)) & I1MASK) >= Acc_head->nxtlino) 70: { 71: tid->line_id = -1; 72: pageid = Acc_head->ovflopg; 73: stuff_page(tid, &pageid); 74: if (pageid == 0) 75: { 76: pageid = Acc_head->mainpg; 77: stuff_page(tid, &pageid); 78: if (pageid == 0 || pageid == lpageid + 1) 79: return (1); 80: } 81: if (i = resetacc(Acc_head)) 82: return (i); 83: if (i = get_page(d, tid)) 84: return (i); 85: } 86: } while (!Acc_head->linetab[-(tid->line_id & I1MASK)]); 87: 88: get_tuple(d,tid,tuple); 89: 90: if (!kcompare(d, key, tuple)) 91: { 92: # ifdef xATR2 93: if (tTf(23, 9)) 94: { 95: printf("getequal: "); 96: dumptid(tid); 97: printf("getequal: "); 98: printup(d, tuple); 99: } 100: # endif 101: return (0); 102: } 103: } 104: }