|
|
1.1 root 1: # include <ingres.h>
2: # include <aux.h>
3: # include <catalog.h>
4: # include <symbol.h>
5: # include <access.h>
6: # include <batch.h>
7: # include <sccs.h>
8:
9: SCCSID(@(#)secupdate.c 7.1 2/5/81)
10:
11: secupdate(r)
12: register DESC *r;
13: {
14: register char *p;
15: register int i;
16: int j, domcnt, mode, dom;
17: long tupcnt;
18: long oldtid, newtid;
19: long lotid, hitid, uptid;
20: char oldtup[MAXTUP], newtup[MAXTUP];
21: char oldkey[MAXTUP], newkey[MAXTUP];
22: char dumtup[MAXTUP];
23: struct index itup;
24: DESC si_desc;
25: extern DESC Inddes;
26: struct key_pt
27: {
28: char *pt_old;
29: char *pt_new;
30: };
31: struct key_pt keys[MAXKEYS+1];
32:
33: mode = Batchhd.mode_up;
34: Batch_dirty = FALSE;
35: # ifdef xZTR1
36: if (tTf(49, -1))
37: printf("SECUPDATE\n");
38: # endif
39: opencatalog("indexes", 0);
40: setkey(&Inddes, &itup, r->reldum.relid, IRELIDP);
41: setkey(&Inddes, &itup, r->reldum.relowner, IOWNERP);
42: if (i = find(&Inddes, EXACTKEY, &lotid, &hitid, &itup))
43: syserr("secupdate:find indexes %d", i);
44:
45: /* update each secondary index */
46: while(!(i = get(&Inddes, &lotid, &hitid, &itup, TRUE)))
47: {
48: /* check if the index is on the right relation */
49: # ifdef xZTR1
50: if (tTf(49, 7))
51: printup(&Inddes, &itup);
52: # endif
53: if (!bequal(itup.irelidp, r->reldum.relid, MAXNAME) ||
54: !bequal(itup.iownerp, r->reldum.relowner, 2))
55: continue;
56:
57: if (i = openr(&si_desc, 1, itup.irelidi))
58: syserr("secupdate:can't openr %.12s %d", itup.irelidi, i);
59: /* reposition batch file to the beginning. */
60: if ((i = lseek(Batch_fp, 0L, 0)) < 0)
61: syserr("secupdate:seek %d %d", i, Batch_fp);
62: Batch_cnt = BATCHSIZE;
63: getbatch(&Batchhd, sizeof Batchhd); /* reread header */
64:
65: /* set up the key structure */
66: p = itup.idom;
67: for (domcnt = 0; domcnt < MAXKEYS; domcnt++)
68: {
69: if ((dom = *p++) == 0)
70: break; /* no more key domains */
71: # ifdef xZTR1
72: if (tTf(49, 15))
73:
74: printf("dom %d,tupo_off %d\n", dom, Batchhd.si[dom].tupo_off);
75: # endif
76: keys[domcnt].pt_old = &oldtup[Batchhd.si[dom].tupo_off];
77: keys[domcnt].pt_new = &newtup[r->reloff[dom]];
78: }
79:
80: /* the last domain is the "tidp" field */
81: keys[domcnt].pt_old = (char *) &oldtid;
82: keys[domcnt].pt_new = (char *) &newtid;
83:
84: /*
85: ** Start reading the batch file and updating
86: ** the secondary indexes.
87: */
88: tupcnt = Batchhd.num_updts;
89: while (tupcnt--)
90: {
91: getbatch(&oldtid, Batchhd.tido_size);
92: getbatch(oldtup, Batchhd.tupo_size);
93: getbatch(newtup, Batchhd.tupn_size);
94: getbatch(&newtid, Batchhd.tidn_size);
95:
96: /* if this is a replace or append form the new key */
97: if (mode != mdDEL)
98: {
99: for (j = 0; j <= domcnt; j++)
100: setkey(&si_desc, newkey, keys[j].pt_new, j+1);
101: # ifdef xZTR1
102: if (tTf(49, 7))
103: printup(&si_desc, newkey);
104: # endif
105: }
106:
107: /* if this is delete or replace form the old key */
108: if (mode != mdAPP)
109: {
110: for (j = 0; j <= domcnt; j++)
111: setkey(&si_desc, oldkey, keys[j].pt_old, j+1);
112: # ifdef xZTR1
113: if (tTf(49, 8))
114: printup(&si_desc, oldkey);
115: # endif
116: }
117:
118: switch (mode)
119: {
120:
121: case mdDEL:
122: if (i = getequal(&si_desc, oldkey, dumtup, &uptid))
123: {
124: if (i > 0)
125: break;
126: syserr("secupdate:getequal %d", i);
127: }
128: if ((i = delete(&si_desc, &uptid)) < 0)
129: syserr("secupdate:delete %d", i);
130: break;
131:
132: case mdREPL:
133: /* if the newtup = oldtup then do nothing */
134: if (bequal(oldkey, newkey, si_desc.reldum.relwid))
135: break;
136: if (i = getequal(&si_desc, oldkey, dumtup, &uptid))
137: {
138: if (Batch_recovery && i > 0)
139: goto secinsert;
140: syserr("secupdate:getequal-repl %d", i);
141: }
142: if (i = replace(&si_desc, &uptid, newkey, TRUE))
143: {
144: /* if newtuple is dup of old, ok */
145: if (i == 1)
146: break;
147: /* if this is recovery and old tid not there, try an insert */
148: if (Batch_recovery && i == 2)
149: goto secinsert;
150: syserr("secupdate:replace %d", i);
151: }
152: break;
153:
154: case mdAPP:
155: secinsert:
156: if ((i = insert(&si_desc, &uptid, newkey, TRUE)) < 0)
157: syserr("secupdate:insert %d", i);
158: }
159: }
160: if (i = closer(&si_desc))
161: syserr("secupdate:closer %.12s %d", si_desc.reldum.relid, i);
162: }
163: if (i < 0)
164: syserr("secupdate:bad get from indexes %d", i);
165: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.