|
|
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 <sccs.h>
9:
10: SCCSID(@(#)modupdate.c 7.1 2/5/81)
11:
12: /*
13: ** MODUPDATE
14: ** This routine is used to exicute the updates
15: ** for modifies so they are recoverable.
16: ** It is also used by restore to complete an aborted modify.
17: ** During a restore the Batch_recover flag should be set to 1;
18: */
19:
20:
21: modupdate()
22: {
23: char batchname[MAXNAME + 3];
24: char temprel[MAXNAME+ 3];
25: char relfile[MAXNAME + 3];
26: register int i;
27: register int j;
28: struct stat sbuf;
29: char aflag;
30: struct tup_id tid;
31: DESC desx;
32: struct attribute atttup;
33: struct relation oldreltup;
34: struct index ikey, itup;
35: PARM newpv[2];
36: extern DESC Inddes, Attdes, Reldes;
37: register DESC *desp;
38: extern char *trim_relname();
39: extern int errno;
40:
41:
42: desp = &desx;
43: concat(MODBATCH,Fileset,batchname);
44: concat(MODTEMP, Fileset, temprel);
45:
46: # ifdef xZTR1
47: if (tTf(34, 8))
48: printf("Modupdate: %s, %s\n",batchname, temprel);
49: # endif
50: if ((Batch_fp = open(batchname, 0)) < 0)
51: syserr("MODUPDATE:Can't open %s", batchname);
52: Batch_cnt = BATCHSIZE;
53: Batch_dirty = FALSE;
54: getbatch(desp, sizeof *desp);
55: ingresname(desp->reldum.relid, desp->reldum.relowner, relfile);
56:
57: /* don't loose old file before verifying new file */
58: if (stat(temprel, &sbuf) >= 0)
59: {
60: unlink(relfile); /* Ok if failure */
61: errno = 0;
62: if (link(temprel, relfile) == -1)
63: syserr("MODUPDATE:Can't link: %s, %s", temprel, relfile);
64: if (unlink(temprel) < 0)
65: syserr("modupdate:unlink(%s)", temprel);
66: }
67:
68: else
69: if(stat(relfile, &sbuf) < 0 || !Batch_recovery)
70: syserr("MODUPDATE:Relation and/or temporary files for %s are missing",
71: relfile);
72:
73:
74: /* Update admin if this is relation or atribute relations */
75: /* Should only happen in Sysmod */
76: if ((aflag = bequal(desp->reldum.relid, "attribute ", 12)) ||
77: bequal(desp->reldum.relid, "relation ", 12))
78: {
79: ingresname(desp->reldum.relid, desp->reldum.relowner, temprel);
80: if ((i = open("admin", 2)) < 0)
81: syserr("MODUPDATE:Can't open admin file");
82: if (lseek(i, (long) sizeof Admin.adhdr, 0) < 0 ||
83: (aflag && lseek(i, (long) sizeof *desp, 1) < 0))
84: syserr("MODUPDATE:Seek error");
85: if (write(i, desp, sizeof *desp) != sizeof *desp)
86: syserr("MODUPDATE:Write error on admin");
87: close(i);
88:
89: if (aflag)
90: {
91: closer(&Attdes);
92: cleanrel(&Admin.adattd);
93: close(Admin.adattd.relfp);
94: bmove(desp, &Admin.adattd, sizeof *desp);
95: ingresname(Admin.adattd.reldum.relid, Admin.adattd.reldum.relowner, temprel);
96: if ((Admin.adattd.relfp = open(temprel, 2)) < 0)
97: syserr("MODUPDATE: open wr Admin.adattd %d", Admin.adattd.relfp);
98: Admin.adattd.relopn = (Admin.adattd.relfp + 1) * -5;
99: }
100: else
101: {
102: closer(&Reldes);
103: cleanrel(&Admin.adreld);
104: close(Admin.adreld.relfp);
105: bmove(desp, &Admin.adreld, sizeof *desp);
106: if ((Admin.adreld.relfp = open(temprel, 2)) < 0)
107: syserr("MODUPDATE: open Admin.adreld %d",
108: Admin.adreld.relfp);
109: Admin.adreld.relopn = (Admin.adreld.relfp + 1) * -5;
110: }
111: }
112:
113: if (i = get(&Admin.adreld, &desp->reltid, &desp->reltid, &oldreltup, FALSE))
114: syserr("MODUPDATE: get oldrel=%d",i);
115: /* update relation relation */
116:
117: if ((i = replace(&Admin.adreld, &desp->reltid, desp, FALSE)))
118: if (i < 0 || i == 2)
119: syserr("MODUPDATE:Replace error(rel): %d", i);
120: if (i = cleanrel(&Admin.adreld))
121: syserr("MODUPDATE:clean rel %d", i);
122:
123: /* update attribute relation */
124: Admin.adattd.relopn = (Admin.adattd.relfp + 1) * -5;
125: for (i = desp->reldum.relatts; i > 0; i--)
126: {
127: getbatch(&tid, sizeof tid);
128: getbatch(&atttup, sizeof atttup);
129: if (j = replace(&Admin.adattd, &tid, &atttup, FALSE))
130: if (j < 0 || j == 2)
131: syserr("MODUPDATE:Replace error(att): %d", j);
132: }
133:
134: if (i = cleanrel(&Admin.adattd))
135: syserr("MODUPDATE:clean att %d", i);
136:
137: /* make the admin readonly */
138: Admin.adattd.relopn = (Admin.adattd.relfp + 1) * 5;
139:
140: close(Batch_fp);
141:
142: /* if this is an index, change the relspec in the index catalog */
143: if (oldreltup.relindxd < 0)
144: {
145: opencatalog("indexes", 2);
146: setkey(&Inddes, &ikey, desp->reldum.relid, IRELIDI);
147: setkey(&Inddes, &ikey, desp->reldum.relowner, IOWNERP);
148: if ((i = getequal(&Inddes, &ikey, &itup, &tid)) == 0)
149: {
150: itup.irelspeci = desp->reldum.relspec;
151: if ((i = replace(&Inddes, &tid, &itup, 0)) != 0)
152: if (i < 0 || i == 2)
153: syserr("MODUPDATE: rep(ix) %d", i);
154: }
155: }
156:
157: else if(desp->reldum.relindxd > 0)
158: {
159: /* destroy any secondary indexes on this primary */
160: opencatalog("indexes", 2);
161: setkey(&Inddes, &ikey, desp->reldum.relid, IRELIDP);
162: setkey(&Inddes, &ikey, desp->reldum.relowner, IOWNERP);
163: while ((i = getequal(&Inddes, &ikey, &itup, &tid)) == 0)
164: {
165: newpv[0].pv_val.pv_str = itup.irelidi;
166: newpv[1].pv_type = PV_EOF;
167: printf("destroying secondary index %s\n", trim_relname(itup.irelidi));
168: if (destroy(1, newpv))
169: syserr("MODUPDATE:Can't destroy %s", itup.irelidi);
170: }
171: }
172: if (i < 0)
173: syserr("MODUPDATE: geteq(ix)b %d", i);
174:
175: /* clean things up and exit */
176: unlink(batchname);
177: # ifdef xZTR1
178: if (tTf(34, 8))
179: printf("Leaving modupdate\n");
180: # endif
181: return (0);
182: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.