Annotation of 43BSD/ingres/source/parser/control.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.