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