|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.