|
|
1.1 root 1: # include <ingres.h>
2: # include <aux.h>
3: # include <catalog.h>
4: # include <tree.h>
5: # include <symbol.h>
6: # include <access.h>
7: # include <func.h>
8: # include <pv.h>
9: # include <sccs.h>
10: # include <errors.h>
11:
12: SCCSID(@(#)display.c 8.3 2/8/85)
13:
14: /*
15: ** DISPLAY -- display query corresponding to view, permission,
16: ** or intgerity declaration
17: */
18:
19:
20:
21:
22: extern short tTdbu[];
23: extern int display();
24: extern int null_fn();
25:
26: struct fn_def DsplayFn =
27: {
28: "DISPLAY",
29: display,
30: null_fn,
31: null_fn,
32: NULL,
33: 0,
34: tTdbu,
35: 100,
36: 'Z',
37: 0
38: };
39: /*
40: ** DISPLAY -- display query
41: **
42: ** Parameters:
43: ** pc -- number of args in pv
44: ** pv -- pv[i] == 4 for VIEW, 5 for PERMIT, 6 for INTEGRITY
45: ** where i % 2 == 0
46: ** pv[i] -- relation names for which pv[i-1] is mode
47: ** where i%2==1
48: **
49: ** Returns:
50: ** 0 -- total success
51: ** err -- error number of last error
52: **
53: ** Side Effects:
54: ** prints out definition of appropriate characteristic of relation
55: **
56: ** Trace Flags:
57: ** 33, -1
58: */
59:
60:
61: display(pc, pv)
62: int pc;
63: PARM pv[];
64: {
65: register int ac;
66: register PARM *av;
67: extern DESC Treedes;
68: register int i;
69: int err;
70: char err_array[PV_MAXPC];
71: auto int mode;
72:
73: # ifdef xZTR1
74: if (tTf(50, -1))
75: {
76: printf("display: ");
77: prvect(pc, pv);
78: }
79: # endif
80:
81: err = 0;
82: if (pc % 2 != 0)
83: syserr("display: bad param count %d", pc);
84: opencatalog("tree", OR_READ);
85:
86: for (ac = 0, av = pv; ac < pc; av++, ac++)
87: {
88: mode = atoi(av->pv_val.pv_str);
89: av++;
90: err_array[ac++] = 0;
91: err_array[ac] = disp(av->pv_val.pv_str, mode);
92: }
93: for (ac = 0, av = pv; ac < pc; av++, ac++)
94: {
95: if (err_array[ac])
96: err = error(DISPERRBASE + err_array[ac], (av->pv_val).pv_str, 0);
97: }
98: return (err);
99: }
100: /*
101: ** DISP -- display integrity, permit, or define query on a relation
102: **
103: ** Finds a relation owned by the user or the DBA and passes
104: ** the name and owner to the appropritae routine depending on
105: ** mode.
106: **
107: ** Parameters:
108: ** relation -- relation on which query is to be printed
109: ** mode -- the print mode:
110: ** 4 -- view
111: ** 5 -- permit
112: ** 6 -- integrity
113: **
114: ** Returns:
115: ** 0 -- success
116: ** 1 -- no such relation, or none seeable by the user.
117: ** 3 -- VIEW mode and relation not a view
118: ** 4 -- PERMIT and no permissions on relation
119: ** 5 -- INTEGRITY mode and no integrity constraints
120: **
121: ** Trace Flags:
122: ** 33, 8
123: */
124:
125: disp(relation, mode)
126: char *relation;
127: int mode;
128: {
129: DESC d;
130: register int i;
131: extern char *Resrel;
132:
133: # ifdef xZTR1
134: if (tTf(50, 8))
135: printf("disp: relation %s\n", relation);
136: # endif
137:
138: Resrel = relation;
139: i = openr(&d, OR_RELTID, relation);
140: if (i > 0)
141: return (1);
142: else if (i < 0)
143: syserr("disp: openr(%s) ret %d", relation, i);
144: switch (mode)
145: {
146: case 4: /* View query */
147: if (d.reldum.relstat & S_VIEW)
148: pr_def(relation, d.reldum.relowner);
149: else
150: return (3);
151: break;
152:
153: case 5:
154: if (pr_prot(relation, &d))
155: return (4);
156: break;
157:
158: case 6:
159: if (d.reldum.relstat & S_INTEG)
160: pr_integrity(relation, d.reldum.relowner);
161: else
162: return (5);
163: break;
164:
165: default:
166: syserr("disp: mode == %d", mode);
167: }
168: return (0);
169: }
170: /*
171: ** PR_DEF -- Print "define view" query of a view
172: **
173: ** Parameters:
174: ** relation -- relation in question
175: ** owner -- relowner
176: **
177: ** Returns:
178: ** none
179: **
180: ** Side Effects:
181: ** reads a tree, clears range table
182: **
183: ** Trace Flags:
184: ** 33, 9
185: */
186:
187: pr_def(relation, owner)
188: char *relation;
189: char *owner;
190: {
191: register QTREE *t;
192: QTREE *gettree();
193:
194: # ifdef xZTR1
195: if (tTf(50, 9))
196: printf("pr_def(relation=\"%s\", owner=%s)\n", relation, owner);
197: # endif
198:
199: printf("View %s defined:\n\n", relation);
200: clrrange();
201:
202: /* Treeid == 0 because views have only one definition */
203: t = gettree(relation, owner, mdVIEW, 0,FALSE);
204: pr_range();
205: printf("define view ");
206: pr_tree(t);
207: }
208: /*
209: ** PR_INTEGRITY -- print out integrity constraints on a relation
210: **
211: ** Finds all integrity tuples for this unique relation, and
212: ** calls pr_int() to print a query from them.
213: **
214: ** Parameters:
215: ** relid -- rel name
216: ** relowner -- 2 byte owner id
217: **
218: ** Returns:
219: ** none
220: **
221: ** Side Effects:
222: ** file activity, query printing
223: **
224: ** Trace Flags:
225: ** 33, 9
226: */
227:
228: pr_integrity(relid, relowner)
229: char *relid;
230: char *relowner;
231: {
232: extern DESC Intdes;
233: TID hitid, lotid;
234: struct integrity key, tuple;
235: register int i;
236:
237:
238: # ifdef xZTR1
239: if (tTf(50, 9))
240: printf("pr_integrity(relid =%s, relowner=%s)\n",
241: relid, relowner);
242: # endif
243:
244: printf("Integrity constraints on %s are:\n\n", relid);
245: opencatalog("integrities", OR_READ);
246:
247: /* get integrities tuples for relid, relowner */
248: clearkeys(&Intdes);
249: setkey(&Intdes, &key, relid, INTRELID);
250: setkey(&Intdes, &key, relowner, INTRELOWNER);
251: if (i = find(&Intdes, EXACTKEY, &lotid, &hitid, &key))
252: syserr("pr_integrity: find %d", i);
253: for ( ; ; )
254: {
255: if (i = get(&Intdes, &lotid, &hitid, &tuple, TRUE))
256: break;
257: if (kcompare(&Intdes, &tuple, &key) == 0)
258: pr_int(&tuple, relid);
259: }
260: if (i != 1)
261: syserr("pr_integrity: get %d", i);
262: }
263: /*
264: ** PR_INT -- print an integrity definition given a integrities tuple
265: **
266: ** Parameters:
267: ** i -- integrity tuple
268: **
269: ** Returns:
270: ** none
271: **
272: ** Side Effects:
273: ** prints a query
274: ** reads a tree
275: */
276:
277: pr_int(i, relid)
278: register struct integrity *i;
279: char *relid;
280: {
281: register QTREE *t;
282: QTREE *gettree();
283:
284: clrrange();
285: t = gettree(i->intrelid, i->intrelowner, mdINTEG, i->inttree);
286: printf("Integrity constraint %d -\n\n", i->inttree);
287: pr_range();
288:
289: printf("define integrity on ");
290: pr_rv(Qt.qt_resvar = i->intresvar);
291: printf(" is ");
292: pr_qual(t->right);
293: printf("\n\n\n");
294:
295: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.