|
|
1.1 root 1: # include <ingres.h>
2: # include <access.h>
3: # include <sccs.h>
4:
5: SCCSID(@(#)replace.c 7.1 2/5/81)
6:
7: # define SAMETUP 0
8: # define SAMEKEYS 1
9: # define DIFFTUP 2
10:
11: /*
12: ** REPLACE - replace an already existing tuple
13: **
14: ** Replace will replace the tuple specified by TID
15: ** with the new tuple. An attempt is made to not
16: ** move the tuple if at all possible.
17: **
18: ** Three separate conditions are delt with. If the
19: ** new tuple is the same as the old tuple, a return
20: ** of zero occures and the page is not changed.
21: **
22: ** If the keys(if any) are the same and the canonical
23: ** tuple lengths are the same, then the new tuple will
24: ** be placed in the same location.
25: **
26: ** If the lengths or the keys are different, then the
27: ** tuple is deleted and the new tuple inserted
28: **
29: ** Checkdups specifies whether to check for duplicates.
30: ** If the new tuple is a duplicate of one already there,
31: ** then the tuple at TID is deleted
32: **
33: ** Returns:
34: ** <0 fatal error
35: ** 1 new tuple was duplicate of returned tid
36: ** 2 tuple identified by tid has been deleted
37: **
38: ** If replace returns 1 then tid is set to the
39: ** duplicate tuple. This is necessary for updating
40: ** secondary indices.
41: **
42: ** Trace Flags:
43: ** 24.4-7
44: */
45:
46:
47: replace(d, tid, tuple, checkdups)
48: register DESC *d;
49: register TID *tid;
50: char *tuple;
51: int checkdups;
52: {
53: register int i;
54: char oldtuple[MAXTUP];
55: TID primtid;
56: long primpage;
57: int need, same;
58: int len, oldlength;
59: char *new, *old, *oldt;
60: char *getint_tuple();
61:
62: # ifdef xATR1
63: if (tTf(24, 4))
64: {
65: printf("replace: %.14s,", d->reldum.relid);
66: dumptid(tid);
67: printf("replace: ");
68: printup(d, tuple);
69: }
70: # endif
71:
72: /* make tuple canonical */
73: need = canonical(d, tuple);
74:
75: /* if heap, no dup checking */
76: if (abs(d->reldum.relspec) == M_HEAP)
77: checkdups = FALSE;
78:
79: if (i = get_page(d, tid))
80: return (i); /* fatal error */
81:
82: /* check if tid exists */
83: if (i = invalid(tid))
84: return (i); /* already deleted or invalid */
85:
86: oldt = getint_tuple(d, tid, oldtuple);
87: oldlength = tup_len(tid);
88:
89: /* check whether tuples are the same, different lengths, different keys */
90: same = DIFFTUP; /* assume diff lengths or keys */
91: if (oldlength == need)
92: {
93: /* same size. check for same domains */
94: same = SAMETUP; /* assume identical */
95: new = tuple;
96: old = oldt;
97: for (i = 1; i <= d->reldum.relatts; i++)
98: {
99: len = d->relfrml[i] & I1MASK;
100: if (icompare(new, old, d->relfrmt[i], len))
101: {
102: if (d->relxtra[i])
103: {
104: same = DIFFTUP;
105: break;
106: }
107: same = SAMEKEYS;
108: }
109: old += len;
110: new += len;
111: }
112: }
113:
114: # ifdef xATR2
115: if (tTf(24, 5))
116: printf("replace:same=%d\n", same);
117: # endif
118: switch (same)
119: {
120:
121: case SAMETUP:
122: /* new tuple same as old tuple */
123: i = 1; /* flag as duplicate */
124: /* though character strings may compare equal,
125: ** they can look different, so if they do look different
126: ** go ahead and do the replace using put_tuple. */
127: if (!bequal(tuple, oldt, d->reldum.relwid))
128: goto puttuple;
129: break;
130:
131: case SAMEKEYS:
132: /* keys the same, lengths the same, tuples different */
133: if (checkdups)
134: {
135: /* This is either an ISAM or HASH file. If mainpg
136: ** is non-zero, then the primary page=mainpg -1.
137: ** Otherwise, "find" must be called to determine
138: ** the primary page
139: */
140: if (Acc_head->mainpg)
141: {
142: primpage = Acc_head->mainpg -1;
143: stuff_page(&primtid, &primpage);
144: }
145: else
146: {
147: if (i = find(d, FULLKEY, &primtid, &primtid, tuple))
148: return (i); /* fatal error */
149: if (i = get_page(d, tid)) /* restore page for tuple */
150: return (i);
151: }
152:
153: if (i = scan_dups(d, &primtid, tuple))
154: {
155: if (i == 1)
156: {
157: del_tuple(tid, oldlength); /* tuple a duplicate */
158: d->reladds--;
159: /* copy tid of duplicate tuple */
160: bmove(&primtid, tid, sizeof(primtid));
161: }
162: break;
163: }
164: }
165: goto puttuple;
166:
167: case DIFFTUP:
168: /* keys different or lengths different */
169: del_tuple(tid, oldlength);
170:
171: /* find where to put tuple */
172: if (i = findbest(d, tid, tuple, need, checkdups))
173: {
174: d->reladds--;
175: break;
176: }
177:
178: /* place new tuple in page */
179: puttuple:
180: put_tuple(tid, Acctuple, need);
181: i = 0;
182: }
183:
184: # ifdef xATR1
185: if (tTf(24, 6))
186: {
187: printf("replace rets %d,", i);
188: dumptid(tid);
189: }
190: # endif
191:
192: return (i);
193: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.