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