|
|
1.1 root 1: # include <pv.h>
2: # include <ingres.h>
3: # include <aux.h>
4: # include <catalog.h>
5: # include <access.h>
6: # include <batch.h>
7: # include <opsys.h>
8: # include <btree.h>
9: # include <symbol.h>
10: # include <sccs.h>
11:
12: SCCSID(@(#)modupdate.c 8.4 1/18/85)
13:
14: /*
15: ** MODUPDATE
16: ** This routine is used to exicute the updates
17: ** for modifies so they are recoverable.
18: ** It is also used by restore to complete an aborted modify.
19: ** During a restore the Batch_recover flag should be set to 1;
20: */
21:
22:
23: modupdate()
24: {
25: char batchname[MAXNAME + 3];
26: char temprel[MAXNAME+ 3];
27: char relfile[MAXNAME + 3];
28: char btreesec[MAXNAME + 3];
29: register int i;
30: register int j;
31: struct stat sbuf;
32: char aflag;
33: struct tup_id tid;
34: DESC desx;
35: struct attribute attkey, atttup;
36: struct relation oldreltup;
37: struct index ikey, itup;
38: PARM newpv[2];
39: extern DESC Inddes, Attdes, Reldes;
40: register DESC *desp;
41: extern char *trim_relname();
42: extern int errno;
43: char btree[MAXNAME + 4], temp_btree[MAXNAME + 4];
44: int numatts, key;
45: extern int NLidKeys;
46:
47: desp = &desx;
48: concat(MODBATCH,Fileset,batchname);
49: concat(MODTEMP, Fileset, temprel);
50:
51: # ifdef xZTR1
52: if (tTf(34, 8))
53: printf("Modupdate: %s, %s\n",batchname, temprel);
54: # endif
55: if ((Batch_fp = open(batchname, O_RDONLY)) < 0)
56: syserr("MODUPDATE:Can't open %s", batchname);
57: Batch_cnt = BATCHSIZE;
58: Batch_dirty = FALSE;
59: getbatch(desp, sizeof *desp);
60: ingresname(desp->reldum.relid, desp->reldum.relowner, relfile);
61:
62: if (!desp->reldum.reldim || NLidKeys > 0)
63: {
64: /* don't loose old file before verifying new file */
65: if (stat(temprel, &sbuf) >= 0)
66: {
67: unlink(relfile); /* Ok if failure */
68: errno = 0;
69: if (link(temprel, relfile) == -1)
70: syserr("MODUPDATE:Can't link: %s, %s", temprel, relfile);
71: if (unlink(temprel) < 0)
72: syserr("modupdate:unlink(%s)", temprel);
73: }
74:
75: else
76: if(stat(relfile, &sbuf) < 0 || !Batch_recovery)
77: syserr("MODUPDATE:Relation and/or temporary files for %s are missing",
78: relfile);
79: }
80:
81: /* Update admin if this is relation or atribute relations */
82: /* Should only happen in Sysmod */
83: if ((aflag = bequal(desp->reldum.relid, "attribute ", MAXNAME)) ||
84: bequal(desp->reldum.relid, "relation ", MAXNAME))
85: {
86: ingresname(desp->reldum.relid, desp->reldum.relowner, temprel);
87: if ((i = open("admin", O_RDWR)) < 0)
88: syserr("MODUPDATE:Can't open admin file");
89: if (lseek(i, (long) sizeof Admin.adhdr, 0) < 0 ||
90: (aflag && lseek(i, (long) sizeof *desp, 1) < 0))
91: syserr("MODUPDATE:Seek error");
92: if (write(i, desp, sizeof *desp) != sizeof *desp)
93: syserr("MODUPDATE:Write error on admin");
94: close(i);
95:
96: if (aflag)
97: {
98: closer(&Attdes);
99: cleanrel(&Admin.adattd);
100: close(Admin.adattd.relfp);
101: bmove(desp, &Admin.adattd, sizeof *desp);
102: ingresname(Admin.adattd.reldum.relid, Admin.adattd.reldum.relowner, temprel);
103: if ((Admin.adattd.relfp = open(temprel, O_RDWR)) < 0)
104: syserr("MODUPDATE: open wr Admin.adattd %d", Admin.adattd.relfp);
105: Admin.adattd.relopn = (Admin.adattd.relfp + 1) * -5;
106: }
107: else
108: {
109: closer(&Reldes);
110: cleanrel(&Admin.adreld);
111: close(Admin.adreld.relfp);
112: bmove(desp, &Admin.adreld, sizeof *desp);
113: if ((Admin.adreld.relfp = open(temprel, O_RDWR)) < 0)
114: syserr("MODUPDATE: open Admin.adreld %d",
115: Admin.adreld.relfp);
116: Admin.adreld.relopn = (Admin.adreld.relfp + 1) * -5;
117: }
118: }
119:
120: if (i = get(&Admin.adreld, &desp->reltid, &desp->reltid, &oldreltup, FALSE))
121: syserr("MODUPDATE: get oldrel=%d",i);
122:
123: btreename(desp->reldum.relid, btree);
124: if (oldreltup.reldim > 0)
125: /* relation formerly ordered */
126: {
127: capital(trim_relname(desp->reldum.relid), btreesec);
128: newpv[0].pv_val.pv_str = btreesec;
129: newpv[1].pv_type = PV_EOF;
130: if (destroy(1, newpv))
131: syserr("can't destroy btreesec");
132: unlink(btree);
133:
134: /* remove tuple corresponding to LID field from attribute
135: ** relation
136: */
137: setkey(&Admin.adattd, &attkey, desp->reldum.relid, ATTRELID);
138: setkey(&Admin.adattd, &attkey, desp->reldum.relowner, ATTOWNER);
139: numatts = oldreltup.relatts - oldreltup.reldim + 1;
140: for (i = oldreltup.reldim; i > 0; i--, numatts++)
141: {
142: setkey(&Admin.adattd, &attkey, &numatts, ATTID);
143: if (getequal(&Admin.adattd, &attkey, &atttup, &tid) == 0)
144: if (delete(&Admin.adattd, &tid) < 0)
145: syserr("MODUPDATE: Can't delete LID field from attribute relation");
146: }
147: }
148:
149: /* update attribute relation */
150:
151: Admin.adattd.relopn = (Admin.adattd.relfp + 1) * -5;
152: numatts = desp->reldum.relatts - desp->reldum.reldim;
153: for (i = numatts; i > 0; i--)
154: {
155: getbatch(&tid, sizeof tid);
156: getbatch(&atttup, sizeof atttup);
157: if (j = replace(&Admin.adattd, &tid, &atttup, FALSE))
158: if (j < 0 || j == 2)
159: syserr("MODUPDATE:Replace error(att): %d", j);
160: }
161:
162: for (i = desp->reldum.reldim; i > 0; i--)
163: {
164: /* insert tuple corresponding to LID field into attribute relation */
165: getbatch(&atttup, sizeof atttup);
166: if ((j = insert(&Admin.adattd, &tid, &atttup, FALSE) < 0))
167: syserr("MODUPDATE: Insert error (att): %d", j);
168: }
169:
170: unlink(batchname);
171:
172: if (i = cleanrel(&Admin.adattd))
173: syserr("MODUPDATE:clean att %d", i);
174:
175: /* update relation relation */
176:
177: if ((i = replace(&Admin.adreld, &desp->reltid, desp, FALSE)))
178: if (i < 0 || i == 2)
179: syserr("MODUPDATE:Replace error(rel): %d", i);
180:
181: if (i = cleanrel(&Admin.adreld))
182: syserr("MODUPDATE:clean rel %d", i);
183:
184: if (desp->reldum.reldim > 0)
185: /* link temporary BTree file to permanent storage */
186: {
187: concat(BTREE, Fileset, temp_btree);
188: if (link(temp_btree, btree) == -1)
189: syserr("MODUPDATE: can't link: %s, %s", temp_btree, btree);
190: if (unlink(temp_btree) < 0)
191: syserr("modupdate: unlink %s", temp_btree);
192: }
193:
194: /* make the admin readonly */
195: Admin.adattd.relopn = (Admin.adattd.relfp + 1) * 5;
196:
197: close(Batch_fp);
198:
199: /* if this is an index, change the relspec in the index catalog */
200: if (oldreltup.relindxd == SECINDEX)
201: {
202: opencatalog("indexes", OR_WRITE);
203: setkey(&Inddes, &ikey, desp->reldum.relid, IRELIDI);
204: setkey(&Inddes, &ikey, desp->reldum.relowner, IOWNERP);
205: if ((i = getequal(&Inddes, &ikey, &itup, &tid)) == 0)
206: {
207: itup.irelspeci = desp->reldum.relspec;
208: if ((i = replace(&Inddes, &tid, &itup, 0)) != 0)
209: if (i < 0 || i == 2)
210: syserr("MODUPDATE: rep(ix) %d", i);
211: }
212: }
213:
214: else if (desp->reldum.relindxd == SECBASE)
215: {
216: /* destroy any secondary indexes on this primary */
217: opencatalog("indexes", OR_WRITE);
218: setkey(&Inddes, &ikey, desp->reldum.relid, IRELIDP);
219: setkey(&Inddes, &ikey, desp->reldum.relowner, IOWNERP);
220: while ((i = getequal(&Inddes, &ikey, &itup, &tid)) == 0)
221: {
222: newpv[0].pv_val.pv_str = itup.irelidi;
223: newpv[1].pv_type = PV_EOF;
224: printf("destroying secondary index %s\n", trim_relname(itup.irelidi));
225: if (destroy(1, newpv))
226: syserr("MODUPDATE:Can't destroy %s", itup.irelidi);
227: }
228: }
229: if (i < 0)
230: syserr("MODUPDATE: geteq(ix)b %d", i);
231:
232: /* clean things up and exit */
233: # ifdef xZTR1
234: if (tTf(34, 8))
235: printf("Leaving modupdate\n");
236: # endif
237: return (0);
238: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.