|
|
1.1 root 1: # include <ingres.h>
2: # include <aux.h>
3: # include <tree.h>
4: # include <symbol.h>
5: # include "parser.h"
6: # include <sccs.h>
7:
8: SCCSID(@(#)att_fcn.c 7.1 2/5/81)
9:
10: /*
11: ** fake attribute stash entries for tid nodes (and sid in dist version)
12: ** these are provided by the system to a program only for debugging
13: ** the system source and do not have well defined (over time) meanings.
14: */
15: struct atstash Faketid =
16: {
17: 0, INT, 4, "tid", 0
18: };
19: #ifdef DISTRIB
20: struct atstash Fakesid
21: {
22: 0, INT, 4, "sid", 0
23: };
24: #endif
25:
26: struct atstash Attable[MAXATT];/* attrib stash space, turned into a list later */
27: struct atstash *Freeatt; /* free list of attrib stash */
28:
29: /*
30: ** ATT_FCN.C -- attribute list manipulation routines
31: **
32: ** ATT_FCN ~~ trace flags = 40, 41
33: **
34: ** Defines:
35: ** Attable
36: ** Freeatt
37: ** attinit()
38: ** attlookup()
39: ** attadd()
40: ** attfnd()
41: ** attcheck()
42: ** attfree()
43: ** attalloc()
44: ** attcount()
45: **
46: ** History:
47: ** modified for 6.3 (jiw)
48: */
49:
50: /*
51: ** ATTINIT -- initializes attribute table
52: **
53: ** Parameters:
54: ** none
55: **
56: ** Trace Flags:
57: ** attinit ~~ 40.0
58: */
59:
60: attinit()
61: {
62: register struct atstash *atptr;
63: register int i;
64:
65: # ifdef xPTR3
66: tTfp(40, 0, "attinit");
67: # endif
68:
69: atptr = Attable;
70:
71: for (i = 0; i < MAXATT - 1; i++)
72: {
73: atptr->atbnext = atptr + 1;
74: atptr++;
75: }
76:
77: atptr->atbnext = NULL;
78:
79: Freeatt = Attable; /* the first attribute in chain */
80: }
81:
82: /*
83: ** ATTLOOKUP -- finds attribute entry
84: **
85: ** Attlookup looks up atribute 'attrib' in the att stash
86: ** for range table entry 'slot'. If the attrib is not
87: ** in the stash it is entered.
88: **
89: ** Parameters:
90: ** attrib -- the name of the attribute to find
91: ** slot -- the number of the range variable
92: **
93: ** Returns:
94: ** pointer to the attstash element
95: **
96: ** Trace Flags:
97: ** attlookup ~~ 40.4, 40.5
98: */
99:
100: struct atstash *
101: attlookup(slot, attrib)
102: int slot;
103: char *attrib;
104: {
105: register PARRNG *rptr;
106: register struct atstash *current;
107: int ik;
108: struct attribute tuple;
109: register struct attribute *ktuple;
110: struct attribute ktup;
111: TID tid;
112:
113: extern struct atstash *attfind();
114: extern struct atstash *attadd();
115: extern DESC Attdes;
116: extern PARRNG Parrng[];
117:
118: rptr = &Parrng[slot];
119:
120: ktuple = &ktup;
121: # ifdef xPTR2
122: tTfp(40, 4, "attlookup: att = %s and rel= %s\n", attrib, trim_relname(rptr->vardesc.reldum.relid));
123: # endif
124:
125: /* attribute called "tid" is phantom attribute, use fake */
126: if (sequal("tid", attrib))
127: return (&Faketid);
128: # ifdef DISTRIB
129: if (sequal("sid", attrib))
130: return (&Fakesid);
131: # endif
132:
133: /* check to see if attrib is in stash */
134: if ((current = attfind(slot, attrib)) != NULL)
135: return (current);
136:
137: # ifdef xPTR2
138: tTfp(40, 5, "getting att info from relation\n");
139: # endif
140:
141: /* rel name, owner, attname is unique ident */
142: clearkeys(&Attdes);
143: setkey(&Attdes, ktuple, rptr->vardesc.reldum.relid, ATTRELID);
144: setkey(&Attdes, ktuple, rptr->vardesc.reldum.relowner, ATTOWNER);
145: setkey(&Attdes, ktuple, attrib, ATTNAME);
146: if (!(ik = getequal(&Attdes, ktuple, &tuple, &tid)))
147: {
148: /* put attrib stuff into att stash */
149: current = attadd(slot, &tuple);
150: return (current);
151: }
152:
153: if (ik == 1)
154: /* attribute not in relation */
155: par_error(NOATTRIN, WARN, attrib, trim_relname(rptr->vardesc.reldum.relid), 0);
156: else
157: syserr("fatal error in getequal, ret: %d", ik);
158: }
159:
160: /*
161: ** ATTADD -- add an attribute to the list for a particular range variable
162: **
163: ** Parameters:
164: ** slot -- the number of the range variable to use
165: ** tuple -- the attribute tuple to add
166: **
167: ** Returns:
168: ** pointer to the attribute added
169: **
170: ** Trace Flags:
171: ** attadd ~~ 40.8
172: */
173:
174: struct atstash *
175: attadd(slot, tuple)
176: int slot;
177: struct attribute *tuple;
178: {
179: register struct atstash *current;
180: register struct atstash *aptr;
181: register struct atstash *bptr;
182: PARRNG *rptr;
183: int i;
184:
185: extern struct atstash *attalloc();
186: extern PARRNG Parrng[];
187:
188: # ifdef xPTR3
189: tTfp(40, 8, "attadd slot %d, %12s\n", slot, tuple->attname);
190: # endif
191:
192: rptr = &Parrng[slot];
193:
194: current = attalloc();
195: current->atbid = tuple->attid;
196: current->atbfrmt = tuple->attfrmt;
197: current->atbfrml = tuple->attfrml;
198: bmove(tuple->attname, current->atbname, MAXNAME);
199: for (i = 0; i < MAXNAME; i++)
200: if (current->atbname[i] == ' ')
201: current->atbname[i] = '\0';
202:
203: aptr = rptr->attlist;
204: bptr = 0;
205: while (aptr != 0)
206: {
207: if (aptr->atbid > current->atbid)
208: break;
209: bptr = aptr;
210: aptr = aptr->atbnext;
211: }
212: if (bptr == 0)
213: rptr->attlist = current;
214: else
215: bptr->atbnext = current;
216:
217: current->atbnext = aptr;
218:
219: return (current);
220: }
221:
222: /*
223: ** ATTFIND -- finds attribute in stash
224: **
225: ** Attfind looks in attribute stash to see if attrib info already there
226: ** return pointer to attribute in attribute table else NULL.
227: **
228: ** Parameters:
229: ** slot -- the number of the entry in range table
230: ** attrib -- the attribute name to find
231: **
232: ** Returns:
233: ** pointer to entry or NULL if not in stash
234: **
235: ** Trace Flags:
236: ** attfind ~~ 40.12
237: */
238:
239: struct atstash *
240: attfind(slot, attrib)
241: int slot;
242: register char *attrib;
243: {
244: register struct atstash *aptr;
245:
246: extern PARRNG Parrng[];
247:
248: # ifdef xPTR1
249: tTfp(40, 12, "attadd\n");
250: # endif
251:
252: aptr = Parrng[slot].attlist;
253:
254: while (aptr != NULL)
255: {
256: if (!scompare(attrib, MAXNAME, aptr->atbname, MAXNAME))
257: return (aptr);
258:
259: aptr = aptr->atbnext;
260: }
261: return (NULL);
262: }
263:
264: /*
265: ** ATTCHECK -- checks for conflicts in attributes
266: **
267: ** Attcheck checks for type conflicts in the current query domain and
268: ** attable entry
269: **
270: ** Parameters:
271: ** aptr -- pointer to current atttibute
272: **
273: ** Returns:
274: ** nothing
275: **
276: ** Requires:
277: ** Trfrmt -- for current format
278: **
279: ** Trace Flags:
280: ** attcheck ~~ 41.0
281: */
282:
283: attcheck(aptr)
284: register struct atstash *aptr;
285: {
286: extern char Trfrmt;
287:
288: # ifdef xPTR1
289: tTfp(41, 0, "attcheck\n");
290: # endif
291:
292: if ((Trfrmt == CHAR) != (aptr->atbfrmt == CHAR))
293: /* function type does not match attrib */
294: par_error(RESTYPE, WARN, aptr->atbname, 0);
295: }
296:
297: /*
298: ** ATTFREE -- puts a list of attrib space back on the free list
299: **
300: ** Parameters:
301: ** aptr -- pointer to list of attstash entries
302: **
303: ** Returns:
304: ** nothing
305: **
306: ** Requires:
307: ** Freeatt
308: **
309: ** Trace Flags:
310: ** attfree ~~ 41.4
311: */
312:
313: attfree(aptr)
314: struct atstash *aptr;
315: {
316: register struct atstash *att;
317:
318: # ifdef xPTR1
319: tTfp(41, 4, "attfree\n");
320: # endif
321:
322: if ((att = aptr) == NULL)
323: return;
324:
325: while (att->atbnext != NULL)
326: att = att->atbnext;
327:
328: att->atbnext = Freeatt;
329: Freeatt = aptr;
330: }
331:
332: /*
333: ** ATTALLOC -- returns a pointer to a atstash type structure
334: **
335: ** Attalloc checks the freelist (Freeatt) for attstash entries,
336: ** if some is there, one is removed. If the freelist is empty,
337: ** attstashes are removed from range table entries until an free
338: ** element is found.
339: **
340: ** Parameters:
341: ** none
342: **
343: ** Returns:
344: ** a pointer to an atstash element
345: **
346: ** Requires:
347: ** Rngback
348: ** Freeatt
349: **
350: ** Trace Flags:
351: ** attalloc ~~ 41.8, 41.9
352: */
353:
354: struct atstash *
355: attalloc()
356: {
357: register struct atstash *aptr;
358: register PARRNG *rptr;
359:
360: extern PARRNG *Rngback;
361:
362: # ifdef xPTR3
363: tTfp(41, 8, "attalloc Freeatt %d\n", Freeatt);
364: # endif
365:
366: /* Note: the following loop doesn't happen if Freeatt != NULL */
367:
368: for (rptr = Rngback; Freeatt == NULL; rptr = rptr->frontpt)
369: {
370: /*
371: ** search least recently used vbles for attrib stash space
372: ** until at least one entry is found
373: */
374:
375: # ifdef xPTR3
376: tTfp(41, 9, "attalloc: freeing %12s\n", rptr->vardesc.relvname);
377: # endif
378:
379: if (rptr == NULL)
380: syserr("attalloc: no att space.");
381:
382: Freeatt = rptr->attlist;
383: rptr->attlist = NULL;
384: }
385: aptr = Freeatt;
386: Freeatt = Freeatt->atbnext;
387: aptr->atbnext = NULL;
388:
389: return (aptr);
390: }
391:
392: /*
393: ** ATTCOUNT -- counts atstash elems
394: **
395: ** Attcount returns a count fof the number of attributes already in the
396: ** attrib stash.
397: **
398: ** Parameter:
399: ** slot -- the range table entry to count
400: **
401: ** Returns:
402: ** count of the attributes
403: **
404: ** Trace Flags:
405: ** attcount ~~ 41.12
406: */
407:
408: int
409: attcount(slot)
410: int slot;
411: {
412: register int cntr;
413: register struct atstash *aptr;
414:
415: extern PARRNG Parrng[];
416:
417: # ifdef xPTR1
418: tTfp(41, 12, "attcount\n");
419: # endif
420:
421: cntr = 0;
422: aptr = Parrng[slot].attlist;
423: while (aptr != NULL)
424: {
425: cntr++;
426: aptr = aptr->atbnext;
427: }
428: return (cntr);
429: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.