|
|
1.1 root 1: # include <pv.h>
2: # include <ingres.h>
3: # include <access.h>
4: # include <aux.h>
5: # include <lock.h>
6: # include <func.h>
7: # include <catalog.h>
8: # include <btree.h>
9: # include <sccs.h>
10: # include <errors.h>
11:
12: SCCSID(@(#)print.c 8.6 3/20/85)
13:
14: extern short tTdbu[];
15: extern int print();
16: extern int null_fn();
17:
18: struct fn_def PrintFn =
19: {
20: "PRINT",
21: print,
22: null_fn, /* initialization function */
23: null_fn,
24: NULL,
25: 0,
26: tTdbu,
27: 100,
28: 'Z',
29: 0
30: };
31:
32:
33:
34:
35: /*
36: ** PRINT -- print relation
37: **
38: ** Parameters:
39: ** parmv[0] through parmv[parmc -2] contain names
40: ** of relations to be printed on the standard output.
41: ** Note that this calls printatt, so all the output formatting
42: ** features associated with printatt are available here.
43: **
44: ** parmv[parmc - 1].pv_type is PV_INT for other than a "normal"
45: ** print. In this case parmv[parmc - 1] is 0 for headers on
46: ** every page, and 1 for all headers and footers suppressed.
47: ** err_array is set to 0 for a good relation, 1 for no
48: ** relation by that name, and -1 for a view.
49: **
50: ** Returns:
51: ** 0 if no errors else the last error number
52: **
53: ** Trace Flags:
54: ** 40
55: */
56:
57: print(parmc, parmv)
58: int parmc;
59: PARM parmv[];
60: {
61: DESC d;
62: extern DESC Attdes;
63: struct attribute att, katt;
64: char tuple[MAXTUP];
65: TID tid, limtid;
66: TID stid;
67: register int i;
68: register int ern;
69: register char *name;
70: extern struct out_arg Out_arg;
71: int mode;
72: int lineno;
73: int pc;
74: int err_array[PV_MAXPC];
75: char btree[MAXNAME + 4];
76: struct locator tidpos;
77: long page, mtid, t, next;
78: extern DESC Btreesec;
79: extern int Btree_fd;
80: extern HDRINFO *Hdrptr;
81: extern HDRINFO *Fieldwidth;
82: extern int Hdr;
83: HDRINFO *hptr;
84: HDRINFO *tptr;
85: int start;
86:
87: # ifdef xZTR1
88: if (tTf(40, -1))
89: {
90: printf("entering print\n");
91: prvect(parmc, parmv);
92: }
93: # endif
94:
95: if (parmv[parmc - 1].pv_type == PV_INT)
96: mode = parmv[parmc - 1].pv_val.pv_int;
97: else
98: mode = -1;
99:
100: opencatalog("attribute", OR_READ);
101:
102: for (pc = 0; pc <= parmc - 1; pc++)
103: {
104: name = parmv[pc].pv_val.pv_str;
105:
106: ern = openr(&d, OR_READ, name);
107: if (d.reldum.reldim > 0)
108: {
109: bmove(d.relbtree, &Btreesec, sizeof(Btreesec));
110: Btree_fd = d.btree_fd;
111: }
112: if (ern == AMOPNVIEW_ERR)
113: {
114: err_array[pc] = NOPRINTVIEW; /* can't print a view */
115: continue;
116: }
117: if (ern > 0)
118: {
119: err_array[pc] = BADRELNAME; /* cannot open relation */
120: continue;
121: }
122: if (ern < 0)
123: syserr("printr:openr target %s, %d",
124: name, ern);
125: if ((d.reldum.relstat & S_PROTALL) && (d.reldum.relstat & S_PROTRET) &&
126: !bequal(Usercode, d.reldum.relowner, UCODE_SZ))
127: {
128: err_array[pc] = PROTVIOL; /* protection violation */
129: closer(&d);
130: continue;
131: }
132:
133:
134: /* a printable relation */
135: err_array[pc] = 0;
136: # ifdef xZTR2
137: if (tTf(40, 1))
138: printdesc(&d);
139: # endif
140: lineno = Out_arg.linesperpage - 6;
141: if (mode <= 0)
142: {
143: if (mode == 0)
144: putchar('\014'); /* form feed */
145: printf("\n%s relation\n", name);
146: lineno -= 2;
147: }
148:
149: if (!d.reldum.reldim)
150: find(&d, NOKEY, &tid, &limtid);
151:
152: if (Lockrel)
153: setrll(A_SLP, d.reltid.ltid, M_SHARE); /* set shared lock on relation*/
154: for (;;)
155: {
156: if (mode <= 0)
157: {
158: Hdr = TRUE;
159: beginhdr();
160: seq_init(&Attdes, &d);
161: start = 1;
162: for (i = 1; seq_attributes(&Attdes, &d, &att); i++)
163: {
164: if (d.relfrmt[i] == 'c')
165: {
166: tptr = (HDRINFO *) malloc(sizeof(HDRINFO));
167: if (start)
168: {
169: Hdrptr = tptr;
170: Fieldwidth = Hdrptr;
171: start = 0;
172: }
173: else
174: hptr->next = tptr;
175: hptr = tptr;
176: }
177:
178: printhdr(d.relfrmt[i], d.relfrml[i], att.attname);
179: if (d.relfrmt[i] == 'c')
180: {
181: tptr->len = d.relfrml[i];
182: tptr->len &= 0377;
183: tptr->next = NULL;
184: }
185: }
186: printeol();
187: printeh();
188: lineno -= 3;
189: }
190:
191: if (d.reldum.reldim > 0)
192: {
193: btreename(d.reldum.relid, btree);
194: page = RT;
195: for (i = 0; i < d.reldum.reldim -1 ; ++i)
196: {
197: t = get_tid(page, 1, &tidpos);
198: if (t < 0)
199: break; /* lid value doesn't exist */
200: bmove(&t, &page, LIDSIZE);
201: }
202: ern = 1;
203: if (t >= 0)
204: {
205: do
206: {
207: get_node(page, &tidpos.page);
208: next = tidpos.page.nexttree;
209: get_tid(page, 1, &tidpos);
210: page = tidpos.pageno;
211: ern = 0;
212: while (ern == 0)
213: {
214: for (i = 0; i < tidpos.page.nelmts && ern == 0; ++i)
215: {
216: mtid = tidpos.page.node.leafnode.tid_pos[tidpos.page.node.leafnode.tid_loc[i]];
217: ern = get(&d, &mtid, &mtid, tuple, FALSE);
218: printup(&d, tuple);
219:
220: if (mode == 0 && --lineno <= 0)
221: {
222: printf("\n\n\n\n\n\n");
223: lineno = Out_arg.linesperpage - 6;
224: ern = 1;
225: break;
226: }
227: }
228: page = tidpos.page.node.leafnode.nextleaf;
229: if (page == NULL)
230: ern = 1;
231: else
232: get_node(page, &tidpos.page);
233: }
234: } while (page = next);
235: }
236: }
237: else
238: {
239: while ((ern = get(&d, &tid, &limtid, tuple, TRUE)) == 0)
240: {
241: printup(&d, tuple);
242:
243: if (mode == 0 && --lineno <= 0)
244: {
245: printf("\n\n\n\n\n\n");
246: lineno = Out_arg.linesperpage - 6;
247: break;
248: }
249: }
250: }
251: if (ern > 0)
252: break;
253:
254: if (ern < 0)
255: syserr("print: get %d", ern);
256: }
257:
258: if (mode <= 0)
259: {
260: printeh();
261: Hdr = FALSE;
262: }
263: if (Lockrel)
264: unlrl(d.reltid.ltid); /* release relation lock */
265:
266: closer(&d);
267: }
268: /* check for any error messages that should be printed */
269: ern = 0;
270: for (pc = 0; pc <= parmc - 1; pc++)
271: {
272: if (i = err_array[pc])
273: {
274: ern = nferror(i, parmv[pc].pv_val.pv_str, 0);
275: }
276: }
277: return (ern);
278: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.