|
|
1.1 root 1: # include <pv.h>
2: # include <ingres.h>
3: # include <aux.h>
4: # include <catalog.h>
5: # include <func.h>
6: # include <sccs.h>
7:
8: SCCSID(@(#)destroy.c 7.1 2/5/81)
9:
10: extern short tTdbu[];
11: extern int destroy();
12: extern int null_fn();
13:
14: struct fn_def DstroyFn =
15: {
16: "DESTROY",
17: destroy,
18: null_fn,
19: null_fn,
20: NULL,
21: 0,
22: tTdbu,
23: 100,
24: 'Z',
25: 0
26: };
27:
28:
29: /*
30: ** DESTROY RELATION
31: **
32: ** The relations in pv are destroyed. This involves three steps:
33: ** 1 - remove tuple from relation relation
34: ** 2 - remove tuples from attribute relation
35: ** 3 - unlink physical file
36: **
37: ** If the relation is a secondary index, the entry is removed
38: ** from the index relation, and the primary relation is set to
39: ** be "not indexed" (unless there is another index on it).
40: **
41: ** If the relation has an index, all its indexes are also
42: ** destroyed.
43: **
44: ** If any errors occured while destroying the relations,
45: ** then the last error number is returned, otherwise
46: ** 0 is returned.
47: **
48: ** If any query modification was defined on the relation,
49: ** the qrymod catalogues are updated.
50: **
51: ** Trace Flags:
52: ** 32
53: */
54:
55: destroy(pc, pv)
56: int pc;
57: PARM *pv;
58: {
59: register int i, ret;
60: register char *name;
61:
62: opencatalog("relation", 2);
63: opencatalog("attribute", 2);
64:
65: for (ret = 0; pc-- > 0; )
66: {
67: name = ((pv++)->pv_val).pv_str;
68: if (i = des(name))
69: ret = i;
70: }
71: return (ret);
72: }
73:
74:
75: des(name)
76: char *name;
77: {
78: register int i;
79: register char *relname;
80: struct tup_id tid;
81: char newrelname[MAXNAME + 3];
82: extern DESC Reldes, Attdes, Inddes, Treedes;
83: struct relation relt, relk;
84:
85: relname = name;
86: # ifdef xZTR1
87: tTfp(32, -1, "destroy: %s\n", relname);
88: # endif
89:
90: newrelname[MAXNAME + 2] = 0;
91:
92: /* get the tuple from relation relation */
93: setkey(&Reldes, &relk, relname, RELID);
94: setkey(&Reldes, &relk, Usercode, RELOWNER);
95: if ((i = getequal(&Reldes, &relk, &relt, &tid)) != 0)
96: {
97: if (i < 0)
98: syserr("DESTROY: geteq(rel/%s) %d", relname, i);
99: return (nferror(5202, relname, 0)); /* nonexistant relation */
100: }
101:
102: /* don't allow a system relation to be destroyed */
103: if (relt.relstat & S_CATALOG)
104: return (nferror(5201, relname, 0)); /* attempt to destroy system catalog */
105:
106: if ((i = delete(&Reldes, &tid)) != 0)
107: syserr("DESTROY: delete(rel) %d", i);
108:
109: /*
110: ** for concurrency reasons, flush the relation-relation page
111: ** where the tuple was just deleted. This will prevent anyone
112: ** from being able to "openr" the relation while it is being
113: ** destroyed. It also allows recovery to finish the destroy
114: ** it the system crashes during this destroy.
115: */
116: if (i = flush_rel(&Reldes, FALSE))
117: syserr("destroy:flush rel %d", i);
118:
119: purgetup(&Attdes, relt.relid, ATTRELID, relt.relowner, ATTOWNER, 0);
120:
121: /*
122: ** If this is a user relation, then additional processing
123: ** might be needed to clean up indicies, protection constraints
124: ** etc.
125: */
126: if ((relt.relstat & S_CATALOG) == 0)
127: userdestroy(&relt);
128:
129: if ((relt.relstat & S_VIEW) == 0)
130: {
131: ingresname(relname, Usercode, newrelname);
132: if (unlink(newrelname) < 0)
133: syserr("destroy: unlink(%.14s)", newrelname);
134: }
135: return (0);
136:
137: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.