|
|
1.1 root 1: # include <ingres.h>
2: # include <aux.h>
3: # include <tree.h>
4: # include <symbol.h>
5: # include "globs.h"
6: # include <pv.h>
7: # include <lock.h>
8: # include <resp.h>
9: # include <sccs.h>
10:
11: SCCSID(@(#)qryproc.c 7.1 2/5/81)
12:
13: /* Control Module configuration information structure */
14:
15: extern int de_init();
16: extern int de_rubproc();
17: extern int qryproc();
18:
19: struct fn_def DeOvqpFn =
20: {
21: "DECOMP/OVQP",
22: qryproc,
23: de_init,
24: de_rubproc,
25: (char *) &De,
26: sizeof De,
27: tTdecomp,
28: 100,
29: 'D',
30: 0,
31: };
32:
33: /*ARGSUSED*/
34: qryproc(pc, pv)
35: int pc;
36: PARM *pv;
37: {
38: register QTREE *root, *q;
39: register int i;
40: int mode, result_num, retr_uniq;
41: extern long Accuread, Accuwrite, Accusread;
42: extern int derror();
43: char loc_qbuf[QBUFSIZ];
44:
45: # ifdef xDTM
46: if (tTf(90, 1))
47: timtrace(23, 0);
48: # endif
49: # ifdef xDTR1
50: if (tTf(50, 0))
51: {
52: Accuread = 0;
53: Accusread = 0;
54: Accuwrite = 0;
55: }
56: # endif
57:
58: De.de_qbuf = loc_qbuf;
59: initbuf(loc_qbuf, QBUFSIZ, QBUFFULL, derror);
60:
61: /* init various variables in decomp for start of this query */
62: startdecomp();
63:
64: /* Read in query, range table and mode */
65: if (pv[0].pv_type != PV_QTREE)
66: syserr("qryproc: bad parameter");
67: root = pv[0].pv_val.pv_qtree;
68: /* a john fix (below)
69: root->sym.value.sym_root.rootuser = TRUE; */
70: # ifdef xDTR1
71: if (tTf(50, 4))
72: {
73: printf("qryproc\n");
74: treepr(root);
75: }
76: # endif
77:
78: /* initialize qt parameters */
79: mode = De.de_qmode = Qt.qt_qmode;
80: De.de_resultvar = Qt.qt_resvar;
81:
82: /*
83: ** Initialize range table. This code should eventually
84: ** be changed to take advantage of the fact that all
85: ** the openrs are already done by the control module.
86: */
87:
88: for (i = 0; i < MAXRANGE; i++)
89: {
90: if (Qt.qt_rangev[i].rngvdesc != NULL)
91: {
92: De.de_rangev[i].relnum = rnum_assign(Qt.qt_rangev[i].rngvdesc->reldum.relid);
93:
94: }
95: }
96: /* Initialize relation descriptors */
97: initdesc(mode);
98:
99: /* locate pointers to QLEND and TREE nodes */
100: for (q = root->right; q->sym.type != QLEND; q = q->right)
101: continue;
102: De.de_qle = q;
103:
104: for (q = root->left; q->sym.type != TREE; q = q->left)
105: continue;
106: De.de_tr = q;
107:
108:
109: /* map the complete tree */
110: mapvar(root, 0);
111:
112: /* set logical locks */
113: if (Lockrel)
114: lockit(root, De.de_resultvar);
115:
116: /* If there is no result variable then this must be a retrieve to the terminal */
117: De.de_qry_mode = De.de_resultvar < 0 ? mdRETTERM : mode;
118:
119: /* if the mode is retrieve_unique, then make a result rel */
120: retr_uniq = mode == mdRET_UNI;
121: if (retr_uniq)
122: {
123: mk_unique(root);
124: mode = mdRETR;
125: }
126:
127: /* get id of result relation */
128: if (De.de_resultvar < 0)
129: result_num = NORESULT;
130: else
131: result_num = De.de_rangev[De.de_resultvar].relnum;
132:
133: /* evaluate aggregates in query */
134: aggregate(root);
135:
136: /* decompose and process aggregate free query */
137: decomp(root, mode, result_num);
138:
139: /* If this is a retrieve unique, then retrieve results */
140: if (retr_uniq)
141: pr_unique(root, De.de_resultvar);
142:
143: if (mode != mdRETR)
144: i = ACK;
145: else
146: i = NOACK;
147: i = endovqp(i);
148:
149: # ifdef xDTR1
150: if (tTf(50, 1))
151: {
152: printf("DECOMP read %ld pages,", Accuread);
153: printf("%ld catalog pages,", Accusread);
154: printf("wrote %ld pages\n", Accuwrite);
155: }
156: # endif
157:
158: /* call update processor if batch mode */
159: if (i == UPDATE)
160: {
161: initp();
162: call_dbu(mdUPDATE, -1);
163: }
164:
165: # ifdef xDTM
166: if (tTf(90, 1))
167: timtrace(24,0);
168: # endif
169:
170: /* clean decomp */
171: reinit();
172:
173: if (i != UPDATE)
174: Resp.resp_tups = De.ov_tupsfound;
175:
176: return (0);
177: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.