|
|
1.1 root 1: # include <ingres.h>
2: # include <aux.h>
3: # include <tree.h>
4: # include <symbol.h>
5: # include <sccs.h>
6:
7: SCCSID(@(#)writeqry.c 7.1 2/5/81)
8:
9:
10: /*
11: ** WRITEQRY -- write a whole query
12: **
13: ** An entire query is written, including range table, and so
14: ** forth.
15: **
16: ** Parameters:
17: ** root -- the root of the tree to write.
18: ** wrfn -- the function to do the physical write.
19: ** fnparam -- a parameter to pass to wrfn.
20: **
21: ** Returns:
22: ** none
23: **
24: ** Side Effects:
25: ** none.
26: */
27:
28: writeqry(root, wrfn, fnparam)
29: QTREE *root;
30: int (*wrfn)();
31: char *fnparam;
32: {
33: register int i;
34: struct srcid sid;
35:
36: /* write the query mode */
37: if (Qt.qt_qmode >= 0)
38: writesym(QMODE, 2, (char *) &Qt.qt_qmode, wrfn, fnparam);
39:
40: /* write the range table */
41: for (i = 0; i < MAXRANGE; i++)
42: {
43: if (Qt.qt_rangev[i].rngvmark)
44: {
45: sid.srcvar = i;
46: bmove((char *) Qt.qt_rangev[i].rngvdesc, (char *) &sid.srcdesc, sizeof sid.srcdesc);
47: writesym(SOURCEID, sizeof sid, (char *) &sid, wrfn, fnparam);
48: }
49: }
50:
51: /* write a possible result variable */
52: if (Qt.qt_resvar >= 0)
53: writesym(RESULTVAR, 2, (char *) &Qt.qt_resvar, wrfn, fnparam);
54:
55: /* write the tree */
56: writetree(root, wrfn, fnparam);
57: }
58: /*
59: ** WRITETREE -- write query tree
60: **
61: ** A query tree is written to the down pipe. The parameter is
62: ** the root of the tree to be written.
63: **
64: ** Parameters:
65: ** q1 -- the root of the tree to write.
66: ** wrfn -- the function to call to do physical
67: ** writes.
68: ** fnparam -- a parameter to pass to wrfn.
69: **
70: ** Returns:
71: ** none
72: **
73: ** Side Effects:
74: ** none
75: */
76:
77: writetree(q1, wrfn, fnparam)
78: QTREE *q1;
79: int (*wrfn)();
80: char *fnparam;
81: {
82: register QTREE *q;
83: register int l;
84: register char t;
85:
86: q = q1;
87:
88: /* write the subtrees */
89: if (q->left != NULL)
90: writetree(q->left, wrfn, fnparam);
91: if (q->right != NULL)
92: writetree(q->right, wrfn, fnparam);
93:
94: /* write this node */
95: t = q->sym.type;
96: if (t == AND || t == ROOT || t == AGHEAD)
97: q->sym.len = 0;
98: l = q->sym.len & I1MASK;
99: writesym(q->sym.type, l, (char *) &q->sym.value, wrfn, fnparam);
100: # ifdef xQTR1
101: if (tTf(11, 8))
102: nodepr(q);
103: # endif
104: }
105: /*
106: ** WRITESYM -- write a symbol block
107: **
108: ** A single symbol entry of the is written.
109: ** a 'value' of zero will not be written.
110: */
111:
112: writesym(typ, len, value, wrfn, fnparam)
113: int typ;
114: int len;
115: char *value;
116: int (*wrfn)();
117: char *fnparam;
118: {
119: struct symbol sym;
120: register char *v;
121: register int l;
122:
123: sym.type = typ & I1MASK;
124: sym.len = l = len & I1MASK;
125: (*wrfn)(&sym, 2, fnparam);
126: v = value;
127: if (v != NULL && l > 0)
128: (*wrfn)(v, l, fnparam);
129: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.