|
|
1.1 ! root 1: # include <ingres.h> ! 2: # include <aux.h> ! 3: # include <symbol.h> ! 4: # include <tree.h> ! 5: # include "parser.h" ! 6: # include <pv.h> ! 7: # include "scanner.h" ! 8: # include <sccs.h> ! 9: # include <../ovqp/ovqp.h> ! 10: # include <errors.h> ! 11: ! 12: SCCSID(@(#)control.c 8.3 2/8/85) ! 13: ! 14: /* ! 15: ** CONTROL.C -- -- collection of control functions for the parser ! 16: ** ! 17: ** These routines administrate the operation of the parser for internal ! 18: ** sequencing. There are 2 pairs of routines, one pair for each ! 19: ** quel statement, and one for each go-block, and there is one ! 20: ** routine to finish retrieve statements. ! 21: ** ! 22: ** Defines: ! 23: ** startgo -- initialize for a go-block ! 24: ** init_quelst -- initialize for a quel statement ! 25: ** endquelst -- clean up after a quel statement ! 26: ** endretrieve -- clean up after a retrieve ! 27: ** endgo -- clean up after a go-block ! 28: ** ! 29: ** Trace Flags: ! 30: ** control.c ~~ 48, 49 ! 31: ** ! 32: ** History: ! 33: ** 6 Jun 80 (jiw) modified and redocumented for 6.3 ! 34: ** 15 Jan 79 (rick) collected and documented more ! 35: ** ancient history ! 36: */ ! 37: ! 38: /* ! 39: ** INIT_QUELST -- set vbles for default mode before each quel statement ! 40: ** ! 41: ** Parameters: ! 42: ** none ! 43: ** ! 44: ** Returns: ! 45: ** nothing ! 46: ** ! 47: ** Trace Flags: ! 48: ** init_quelst ~~ 48.0 ! 49: */ ! 50: ! 51: int ! 52: init_quelst() ! 53: { ! 54: extern int neederr(); ! 55: extern ack_err(); ! 56: extern int Err_current; ! 57: extern int Pars; ! 58: extern int Lcase; ! 59: extern int Dcase; ! 60: extern int Agflag; ! 61: extern int Opflag; ! 62: extern int Resrng; ! 63: extern int Qlflag; ! 64: ! 65: # ifdef xPTR3 ! 66: tTfp(48, 0, "Init_quelst\n"); ! 67: # endif ! 68: ! 69: Err_current = 0; /* no error yet */ ! 70: Pars = 1; /* set scanner into "parser" mode */ ! 71: Lcase = Dcase; /* set case mapping to default */ ! 72: Agflag = 0; /* reset aggregate flag */ ! 73: Opflag = 0; /* reset qmode flag */ ! 74: Resrng = -1; /* reset result relation slot */ ! 75: Qlflag = 0; /* reset qualification flag */ ! 76: ! 77: initp(); /* initialize parameter vector */ ! 78: init_qt(); /* assume we have qrytree */ ! 79: ! 80: freesym(); /* free symbol table space */ ! 81: rngreset(); /* reset used bits in range tbl */ ! 82: ! 83: return (1); ! 84: } ! 85: ! 86: /* ! 87: ** ENDQUELST -- finish command checking and processing for each quel statement ! 88: ** ! 89: ** Parameters: ! 90: ** op -- the type of query to finish up ! 91: ** ! 92: ** Returns: ! 93: ** nothing ! 94: ** ! 95: ** Trace Flags: ! 96: ** endquelst ~~ 48.4, 48.5 ! 97: */ ! 98: ! 99: int ! 100: endquelst(op) ! 101: register int op; ! 102: { ! 103: register int i; ! 104: char ibuf[2]; /* two char buffer for index keys */ ! 105: ! 106: extern char *Indexspec; ! 107: extern char *Indexname; ! 108: extern int Equel; ! 109: extern int Agflag; ! 110: ! 111: extern struct lasttok *Lasttok; ! 112: ! 113: extern int yyerrflag; ! 114: extern int Err_current; ! 115: extern int Ingerr; ! 116: extern int Err_fnd; ! 117: ! 118: extern DESC Attdes; ! 119: extern DESC Reldesc; ! 120: extern int Rsdmno; ! 121: extern PARRNG Parrng[]; ! 122: extern int Resrng; ! 123: ! 124: extern int printtrail(); ! 125: ! 126: # ifdef xPTR3 ! 127: if (tTf(48, 4)) ! 128: prvect(0, getp()); ! 129: # endif ! 130: ! 131: /* check next token for GOVAL if the next token has been read */ ! 132: if (!Err_current && !yyerrflag) ! 133: switch (op) ! 134: { ! 135: case mdSAVE: ! 136: case mdCOPY: ! 137: case mdCREATE: ! 138: ! 139: # ifdef DISTRIB ! 140: case mdDCREATE: ! 141: # endif ! 142: ! 143: case mdINDEX: ! 144: case mdRANGE: ! 145: case mdSTOP: ! 146: break; ! 147: ! 148: default: ! 149: /* has vble ending and therefore must detect valid end of command */ ! 150: # ifdef xPTR3 ! 151: tTfp(48, 5, "before NXTCMDERR\n"); ! 152: # endif ! 153: if (Lastok.tokop != GOVAL) ! 154: /* next token not start of command */ ! 155: par_error(NXTCMDERR, WARN, 0); ! 156: break; ! 157: } ! 158: ! 159: if (Agflag >= MAXAGG) ! 160: /* too many aggregates */ ! 161: par_error(AGGXTRA, WARN, 0); ! 162: ! 163: /* command ok so far, finish up */ ! 164: if (!Err_fnd) ! 165: { ! 166: switch (op) ! 167: { ! 168: case mdINDEX: ! 169: if (tTf(48, 5)) ! 170: printf("mdINDEX\n"); ! 171: if (call(op, NULL) < 0) ! 172: ack_err(); ! 173: if (tTf(48, 5)) ! 174: printf("after call to call\n"); ! 175: ! 176: if (Ingerr) ! 177: { ! 178: if (tTf(48, 5)) ! 179: printf("Ingerr = %d\n", Ingerr); ! 180: ! 181: endgo(); ! 182: ! 183: return (-1); ! 184: } ! 185: ! 186: if (Indexspec) ! 187: { ! 188: initp(); ! 189: setp(PV_STR, Indexname); /* type */ ! 190: setp(PV_STR, Indexspec); /* specs */ ! 191: setp(PV_STR, "num"); ! 192: for (i = 1; i <= Rsdmno; i++) ! 193: { ! 194: ibuf[0] = i & I1MASK; ! 195: ibuf[1] = '\0'; ! 196: setp(PV_STR, ibuf); ! 197: } ! 198: if (call(mdMODIFY, NULL) < 0) ! 199: ack_err(); ! 200: } ! 201: break; ! 202: ! 203: case mdRETR: ! 204: case mdRET_UNI: ! 205: case mdVIEW: ! 206: if (Resrng >= 0) /* implies result reln */ ! 207: { ! 208: if (calln(mdCREATE, NULL) < 0) ! 209: ack_err(); ! 210: ! 211: cleanrel(&Attdes); ! 212: ! 213: if ((i = openr(&Reldesc, OR_RELTID, trim_relname(Parrng[Resrng].vardesc.reldum.relid))) < 0) ! 214: syserr("result reln: error in openr '%d'", i); ! 215: ! 216: rngent(R_INTERNAL, "", &Reldesc); ! 217: } ! 218: else if (!Equel) ! 219: /* need to print header */ ! 220: header(getp()); ! 221: ! 222: if (Ingerr) ! 223: { ! 224: /* ! 225: ** might be nice to back out the create already done ! 226: ** by this point so that the user doesn't need to ! 227: */ ! 228: resetp(); ! 229: ! 230: endgo(); /* abort rest of go-block */ ! 231: ! 232: return (-1); ! 233: } ! 234: initp(); ! 235: /* fall through */ ! 236: ! 237: case mdAPP: ! 238: case mdDEL: ! 239: case mdREPL: ! 240: if (op != mdVIEW) ! 241: { ! 242: call_tree(op, mdQRY, ack_err); ! 243: ! 244: if (op == mdRETR || op == mdRET_UNI) ! 245: endretrieve(ack_err); ! 246: ! 247: Patnum = 0; ! 248: for (i = 0; i < PATNUM; i++) ! 249: if (Pats[i].string) ! 250: { ! 251: free(Pats[i].string); ! 252: Pats[i].string = NULL; ! 253: Pats[i].len = 0; ! 254: } ! 255: break; ! 256: } ! 257: ! 258: # ifdef DISTRIB ! 259: case mdDISTRIB: ! 260: op = mdVIEW; ! 261: # endif ! 262: /* else, do VIEW */ ! 263: setp(PV_STR, trim_relname(Parrng[Resrng].vardesc.reldum.relid)); ! 264: ! 265: case mdINTEG: ! 266: case mdPROT: ! 267: call_tree(op, op, ack_err); ! 268: break; ! 269: ! 270: case mdCREATE: ! 271: ! 272: # ifdef DISTRIB ! 273: case mdDCREATE: ! 274: # endif ! 275: ! 276: case mdDESTROY: ! 277: case mdMODIFY: ! 278: # ifdef V6POINT3COMPAT ! 279: /* in this case, if an error in the dbu's will not */ ! 280: /* cause other processing to halt */ ! 281: call(op, NULL); ! 282: # else ! 283: if (call(op, NULL) < 0) ! 284: ack_err(); ! 285: # endif ! 286: cleanrel(&Attdes); ! 287: break; ! 288: ! 289: case mdCOPY: ! 290: case mdHELP: ! 291: case mdPRINT: ! 292: case mdSAVE: ! 293: case mdDISPLAY: ! 294: case mdREMQM: ! 295: # ifdef V6POINT3COMPAT ! 296: call(op, NULL); ! 297: # else ! 298: if (call(op, NULL) < 0) ! 299: ack_err(); ! 300: # endif ! 301: break; ! 302: ! 303: case mdSTOP: ! 304: case mdRANGE: ! 305: break; ! 306: ! 307: default: ! 308: syserr("Endquelst: bad op %d", op); ! 309: } ! 310: } ! 311: ! 312: /* refresh relstat bits if necessary */ ! 313: rngfresh(op); ! 314: if (init_quelst() < 0) ! 315: return (-1); ! 316: ! 317: return (1); ! 318: } ! 319: ! 320: /* ! 321: ** STARTGO -- do whatever needs doing to set up a go-block ! 322: ** ! 323: ** Parameters: ! 324: ** none ! 325: ** ! 326: ** Returns: ! 327: ** nothing ! 328: ** ! 329: ** Trace Flags: ! 330: ** startgo ~~ 48.8 ! 331: */ ! 332: ! 333: startgo() ! 334: { ! 335: extern int Err_fnd; ! 336: extern int Ing_err; ! 337: extern int yyline; ! 338: ! 339: # ifdef xPTR3 ! 340: tTfp(48, 8, "startgo\n"); ! 341: # endif ! 342: ! 343: /* initialize for go-block */ ! 344: get_scan(PRIME); /* prime the scanner input */ ! 345: Err_fnd = 0; /* no errors have been found yet */ ! 346: Ingerr = 0; ! 347: ! 348: if (init_quelst() < 0) /* most other init's are done for each statement */ ! 349: return (-1); ! 350: ! 351: yyline = 1; /* reset line counter */ ! 352: ! 353: return (1); ! 354: } ! 355: ! 356: /* ! 357: ** ENDGO -- do whatever needs doing to clean up after a go block ! 358: ** ! 359: ** Parameters: ! 360: ** none ! 361: ** ! 362: ** Returns: ! 363: ** nothing ! 364: ** ! 365: ** Trace Flags: ! 366: ** endgo ~~ 48.12 ! 367: */ ! 368: ! 369: endgo() ! 370: { ! 371: # ifdef xPTR3 ! 372: tTfp(48, 12, "endgo\n"); ! 373: # endif ! 374: ! 375: if (!Equel && Err_fnd > 1) ! 376: error(SUMMARY, iocv(Err_fnd), 0); ! 377: ! 378: get_scan(SYNC); ! 379: ! 380: resetp(); ! 381: } ! 382: ! 383: /* ! 384: ** ENDRETRIEVE -- finishes any sort of retrieve ! 385: ** ! 386: ** Endretrieve either creates a result relation or prints a trailer ! 387: ** ! 388: ** Parameters: ! 389: ** err_fcn -- function to pass to call ! 390: ** ! 391: ** Returns: ! 392: ** nothing ! 393: ** ! 394: ** Trace Flags: ! 395: ** endretrieve ~~ 48.14 ! 396: ** ! 397: ** History: ! 398: ** June '80 -- (jiw) broken off from call_tree ! 399: */ ! 400: ! 401: endretrieve(err_fcn) ! 402: int (*err_fcn)(); ! 403: { ! 404: extern int Resrng; ! 405: extern char *Relspec; ! 406: extern PARRNG Parrng[]; ! 407: extern int Equel; ! 408: extern int Hdr; ! 409: ! 410: if (Resrng >= 0) ! 411: { ! 412: if (Relspec) ! 413: { ! 414: initp(); ! 415: ! 416: setp(PV_STR, trim_relname(Parrng[Resrng].vardesc.reldum.relid)); ! 417: setp(PV_STR, Relspec); ! 418: if (call(mdMODIFY, err_fcn) < 0) ! 419: (*err_fcn)(); ! 420: } ! 421: } ! 422: else if (!Equel) ! 423: { ! 424: printeh(); ! 425: Hdr = FALSE; ! 426: } ! 427: } ! 428: ! 429: printtrail() ! 430: { ! 431: extern int Equel; ! 432: ! 433: if (!Equel) ! 434: printeh(); ! 435: ! 436: return (-1); ! 437: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.