|
|
1.1 root 1: # include <ingres.h>
2: # include <aux.h>
3: # include <catalog.h>
4: # include <btree.h>
5: # include <pv.h>
6: # include <sccs.h>
7:
8: SCCSID(@(#)udestroy.c 8.2 1/15/85)
9:
10:
11: /*
12: ** USERDESTROY -- auxiliary cleanup for destroy of a user relation
13: **
14: ** userdestroy is called during the destroy of a non system
15: ** relation. If the relation is indexed or is itself an index
16: ** then the appropriate action is taken. If it is indexed,
17: ** then all secondary indices on the relation are also destroyed.
18: ** If it is a secondary index, then the entry in the indexes relation
19: ** is removed and the "relindxd" bit on the primary relation is
20: ** cleared if this was the last index on the relation.
21: **
22: ** If the relation was a view or had integrity constraints or
23: ** protection constraints on it, then those definitions are
24: ** removed from the appropriate system catalogues.
25: **
26: ** Parameters:
27: ** reltup -- the relation relation tuple.
28: **
29: ** Returns:
30: ** none
31: **
32: ** Side Effects:
33: ** zero or more system catalogues will be updated.
34: **
35: ** Called By:
36: ** destroy
37: */
38:
39: userdestroy(reltup)
40: struct relation *reltup;
41: {
42: register int i;
43: register struct relation *rel;
44: struct tup_id tid, limtid;
45: char newrelname[MAXNAME + 3];
46: extern DESC Reldes, Attdes, Inddes;
47: extern DESC Treedes, Intdes, Prodes;
48: struct relation relt, relk;
49: struct index indk, indt;
50: char btree[MAXNAME + 4];
51: char *trim_relname();
52: PARM pv[2];
53:
54: rel = reltup;
55:
56: /* handle special case of destroying a secondary index */
57: if (rel->relindxd == SECINDEX)
58: {
59: opencatalog("indexes", OR_WRITE);
60: setkey(&Inddes, &indk, rel->relid, IRELIDI);
61: setkey(&Inddes, &indk, rel->relowner, IOWNERP);
62: if ((i = getequal(&Inddes, &indk, &indt, &tid)) != 0)
63: syserr("destroy: geteq(ind,%.12s) %d", rel->relid, i);
64:
65: /* remove entry in INDEX catalog */
66: bmove(indt.irelidp, newrelname, MAXNAME);
67: bmove(indt.iownerp, &newrelname[MAXNAME], 2);
68: if ((i = delete(&Inddes, &tid)) != 0)
69: syserr("DESTROY: delete(ind/%.12s) %d", rel->relid, i);
70: clearkeys(&Inddes);
71: setkey(&Inddes, &indk, newrelname, IRELIDP);
72: setkey(&Inddes, &indk, &newrelname[MAXNAME], IOWNERP);
73:
74: /* reset relindxd field in relation catalog if no other indexes exist on this primary */
75: if (getequal(&Inddes, &indk, &indt, &tid) != 0)
76: {
77: clearkeys(&Reldes);
78: setkey(&Reldes, &relk, newrelname, RELID);
79: setkey(&Reldes, &relk, &newrelname[MAXNAME], RELOWNER);
80: if (i = getequal(&Reldes, &relk, &relt, &tid))
81: syserr("destroy: getequal(rel, %s) %d", newrelname, i);
82: relt.relindxd = 0;
83: if ((i = replace(&Reldes, &tid, &relt, 0)) != 0)
84: syserr("destroy: replace(rel) %d", i);
85: }
86: }
87:
88: if (rel->reldim > 0)
89: {
90: /* remove old B-Tree file */
91: btreename(rel->relid, btree);
92: if (unlink(btree) < 0)
93: syserr("userdestroy: unlink %s", btree);
94: /* remove btreesec file */
95: capital(trim_relname(rel->relid), btree);
96: pv[0].pv_val.pv_str = btree;
97: pv[1].pv_type = PV_EOF;
98: if (destroy(1, pv))
99: syserr("can't destroy btreesec");
100: }
101:
102: /* check special case of destroying primary relation */
103: if (rel->relindxd > 0)
104: {
105: opencatalog("indexes", OR_WRITE);
106: setkey(&Inddes, &indk, rel->relid, IRELIDP);
107: setkey(&Inddes, &indk, rel->relowner, IOWNERP);
108: if (i = find(&Inddes, EXACTKEY, &tid, &limtid, &indk))
109: syserr("destroy: find(ind,%.12s) %d", rel->relid, i);
110: while ((i = get(&Inddes, &tid, &limtid, &indt, TRUE)) == 0)
111: {
112: if (kcompare(&Inddes, &indk, &indt) != 0)
113: continue;
114: if ((i = delete(&Inddes, &tid)) != 0)
115: syserr("DESTROY: delete(ind/%.12s) %d", rel->relid, i);
116: clearkeys(&Reldes);
117: purgetup(&Reldes, indt.irelidi, RELID, indt.iownerp, RELOWNER, 0);
118: if (i = flush_rel(&Reldes, FALSE)) /* flush for recovery & concurrency reasons */
119: syserr("destroy:flush irel %d", i);
120: purgetup(&Attdes, indt.irelidi, ATTRELID, indt.iownerp, ATTOWNER, 0);
121: ingresname(indt.irelidi, indt.iownerp, newrelname);
122: if (unlink(newrelname))
123: syserr("destroy: unlink(%s)", newrelname);
124: }
125: if (i < 0)
126: {
127: syserr("destroy: get(ind) %d", i);
128: }
129: }
130:
131: /* if any integrity constraints exist, remove them */
132: if (rel->relstat & S_INTEG)
133: {
134: opencatalog("integrities", OR_WRITE);
135: purgetup(&Intdes, rel->relid, INTRELID, rel->relowner, INTRELOWNER);
136: }
137:
138: /* if any protection clauses exist, remove them */
139: if (rel->relstat & S_PROTUPS)
140: {
141: opencatalog("protect", OR_WRITE);
142: purgetup(&Prodes, rel->relid, PRORELID, rel->relowner, PRORELOWN);
143: }
144:
145: /* remove any trees associated with the relation */
146: if (rel->relstat & (S_PROTUPS | S_VIEW | S_INTEG))
147: {
148: opencatalog("tree", OR_WRITE);
149: purgetup(&Treedes, rel->relid, TREERELID, rel->relowner, TREEOWNER);
150: }
151: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.