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