Annotation of 42BSD/ingres/source/decomp/openrs.c, revision 1.1

1.1     ! root        1: # include      <ingres.h>
        !             2: # include      <aux.h>
        !             3: # include      <tree.h>
        !             4: # include      <symbol.h>
        !             5: # include      "globs.h"
        !             6: # include      <sccs.h>
        !             7: 
        !             8: SCCSID(@(#)openrs.c    7.1     2/5/81)
        !             9: 
        !            10: 
        !            11: 
        !            12: 
        !            13: /* Defined constants for dtmode field above */
        !            14: # define       DTALLOC         0       /* descriptor allocated */
        !            15: # define       DTREL           1       /* has been openr'd -1 */
        !            16: # define       DTATTS          2       /* has rel+atts but not opened */
        !            17: # define       DTREAD          3       /* currently open for reading */
        !            18: # define       DTWRITE         4       /* currently open for writing */
        !            19: 
        !            20: 
        !            21: 
        !            22: /* Allocation of descriptors */
        !            23: 
        !            24: /* Globals which count #files open and maximum # of files which can be open */
        !            25: 
        !            26: 
        !            27: /*
        !            28: ** OPENRS -- routines associated with maintaining the range table for decomp
        !            29: **
        !            30: **     openrs(root) -- fill range table info about each relation.
        !            31: **
        !            32: **     closers() -- close all variables in range table.
        !            33: **
        !            34: **     openr1(varno) -- fill range table for a particular relation.
        !            35: **
        !            36: **     closer1(varno) -- close a particular relation.
        !            37: **
        !            38: **     readopen(varno) -- open a variable for reading. returns descriptor.
        !            39: **
        !            40: **     writeopen(varno) -- open a variable for writing. returns descriptor.
        !            41: **
        !            42: **     initdesc()      -- initialize the descriptor cache.
        !            43: **
        !            44: **     reldescrip(varno) -- returns descriptor for var (has rel/atts
        !            45: **             but might not be open).
        !            46: **
        !            47: **     desc_get(relnum, flag) -- finds a desc_tab & alloctes it for relnum.
        !            48: **
        !            49: **     desc_lru()  -- returns least recently used desc_tab.
        !            50: **
        !            51: **     desc_top(desc_tab) -- makes desc_tab most recently used.
        !            52: **
        !            53: **     desc_last(desc_tab) -- makes desc_tab the least recently used.
        !            54: **
        !            55: **     Trace Flags:
        !            56: **             62
        !            57: */
        !            58: /*
        !            59: ** Initdesc -- initialize descriptors for range table
        !            60: */
        !            61: 
        !            62: initdesc(mode)
        !            63: int    mode;
        !            64: {
        !            65:        register struct desc_tab        *dt;
        !            66:        register int                    i;
        !            67:        extern int                      Equel;
        !            68: 
        !            69: 
        !            70:        for (dt = De.de_desc, i = 0; dt <= &De.de_desc[MAXRELN - 1]; dt++, i++)
        !            71:        {
        !            72:                dt->dtmode = DTALLOC;
        !            73:                dt->relnum = -2;        /* unused relnum value */
        !            74:                dt->dtpos = i;          /* lru order */
        !            75:        }
        !            76: 
        !            77:        /*
        !            78:        ** Determine number of available file descriptors.
        !            79:        **      av_files gives number of files that are def. open
        !            80:        **      for users.  if we will need to open a batch file,
        !            81:        **      get rid of that also.
        !            82:        */
        !            83: 
        !            84:        De.de_dfiles = av_files();
        !            85:        if (mode != mdRETR)
        !            86:                De.de_dfiles--;
        !            87:        De.de_dopnfiles = 0;
        !            88: }
        !            89: /*
        !            90: **     Openrs -- open source relations for query. Fill values
        !            91: **             in range table.
        !            92: */
        !            93: 
        !            94: openrs(root)
        !            95: QTREE  *root;
        !            96: {
        !            97:        register QTREE  *r;
        !            98:        register int    map, i;
        !            99:        DESC            *openr1();
        !           100: 
        !           101:        r = root;
        !           102:        map = r->sym.value.sym_root.lvarm | r->sym.value.sym_root.rvarm;
        !           103: 
        !           104: #      ifdef xDTR1
        !           105:        if (tTf(62, 0))
        !           106:                printf("OPENRS-root:%x,map:%o\n", r, map);
        !           107: #      endif
        !           108: 
        !           109:        for (i = 0; i < MAXRANGE; i++)
        !           110:                if (map & (01 << i))
        !           111:                        openr1(i);
        !           112: 
        !           113: }
        !           114: /*
        !           115: **     Close all open relations.
        !           116: **     If any relations were created but never
        !           117: **     opened, destroy them. The only
        !           118: **     situation under which that can occur
        !           119: **     is when a rub-out occurs at an
        !           120: **     in opportune moment or when an error
        !           121: **     occurs in ovqp.
        !           122: */
        !           123: 
        !           124: closers()
        !           125: {
        !           126:        register int                    i;
        !           127:        register struct desc_tab        *dt;
        !           128:        bool                            dstr_flag;
        !           129: 
        !           130: 
        !           131:        for (dt = De.de_desc; dt <= &De.de_desc[MAXRELN - 1]; dt++)
        !           132:                desc_close(dt);
        !           133: 
        !           134:        /* destroy any temps */
        !           135:        initp();        /* init parameters vector for destroys */
        !           136:        dstr_flag = FALSE;
        !           137:        while (i = rnum_last())
        !           138:        {
        !           139:                dstr_flag |= dstr_mark(i); /* indicate that there are relations to be destroyed */
        !           140:        }
        !           141: 
        !           142:        if (dstr_flag)
        !           143:                call_dbu(mdDESTROY, TRUE);
        !           144:        else
        !           145:                resetp();
        !           146: }
        !           147: /*
        !           148: **     Openr1 -- open relation to get relation relation tuple
        !           149: **
        !           150: **     This will not open the relation for reading -- only
        !           151: **     for getting the first part of the descriptor filled
        !           152: */
        !           153: 
        !           154: DESC *
        !           155: openr1(var)
        !           156: int    var;
        !           157: {
        !           158:        register struct desc_tab        *dt;
        !           159:        register struct rang_tab        *rp;
        !           160:        register DESC   *d;
        !           161:        int                             i;
        !           162:        struct desc_tab                 *desc_get();
        !           163:        extern char                     *rnum_convert();
        !           164: 
        !           165:        rp = &De.de_rangev[var];
        !           166: 
        !           167: #      ifdef xDTR1
        !           168:        if (tTf(62, 2))
        !           169:                printf("openr1: var %d (%s)\t", var, rnum_convert(rp->relnum));
        !           170: #      endif
        !           171: 
        !           172:        dt = desc_get(rp->relnum, TRUE);
        !           173: 
        !           174:        if (dt->dtmode == DTALLOC)
        !           175:        {
        !           176:                if (i = openr(&dt->desc, -1, rnum_convert(rp->relnum)))
        !           177:                        syserr("openr1 open %d %s", i, rnum_convert(rp->relnum));
        !           178:                dt->dtmode = DTREL;
        !           179:        }
        !           180: 
        !           181: #      ifdef xDTR1
        !           182:        if (tTf(62, 2))
        !           183:                printf("tups=%ld\n", dt->desc.reldum.reltups);
        !           184: #      endif
        !           185: 
        !           186:        d = &dt->desc;
        !           187: 
        !           188:        rp->rtspec = d->reldum.relspec;
        !           189:        rp->rtstat = d->reldum.relstat;
        !           190:        rp->rtwid = d->reldum.relwid;
        !           191:        rp->rtcnt = d->reldum.reltups;
        !           192: 
        !           193:        return (d);
        !           194: }
        !           195: /*
        !           196: **  CLOSER1
        !           197: */
        !           198: 
        !           199: closer1(var)
        !           200: int    var;
        !           201: {
        !           202:        register struct desc_tab        *dt;
        !           203:        register struct rang_tab        *rp;
        !           204:        register int                    i;
        !           205:        struct desc_tab                 *desc_get();
        !           206:        struct desc_tab                 *desc_last();
        !           207: 
        !           208:        i = var;
        !           209:        rp = &De.de_rangev[i];
        !           210: 
        !           211: #      ifdef xDTR1
        !           212:        if (tTf(62, 4))
        !           213:                printf("closer1:var %d (%s)\n", i, rnum_convert(rp->relnum));
        !           214: #      endif
        !           215:        if (dt = desc_get(rp->relnum, FALSE))
        !           216:        {
        !           217: 
        !           218:                /* currently a descriptor for rel */
        !           219:                desc_close(dt);
        !           220: 
        !           221:                dt->relnum = -2;
        !           222:                desc_last(dt);
        !           223: 
        !           224:        }
        !           225: }
        !           226: /*
        !           227: **  READOPEN
        !           228: */
        !           229: 
        !           230: DESC *
        !           231: readopen(var)
        !           232: int    var;
        !           233: {
        !           234:        register struct desc_tab        *dt;
        !           235:        struct desc_tab                 *desc_get();
        !           236: 
        !           237:        /* get descv for the relation */
        !           238:        dt = desc_get(De.de_rangev[var].relnum, TRUE);
        !           239: 
        !           240:        if (!(dt->dtmode == DTREAD || dt->dtmode == DTWRITE))
        !           241:        {
        !           242:                /* not open for reading or writing */
        !           243:                openup(dt, var, 0);     /* open for reading */
        !           244:        }
        !           245: 
        !           246:        return (&dt->desc);
        !           247: }
        !           248: /*
        !           249: **  WRITEOPEN
        !           250: */
        !           251: 
        !           252: DESC *
        !           253: writeopen(var)
        !           254: int    var;
        !           255: {
        !           256:        register struct desc_tab        *dt;
        !           257: 
        !           258:        /* get descv for the relation */
        !           259:        dt = desc_get(De.de_rangev[var].relnum, TRUE);
        !           260: 
        !           261:        if (dt->dtmode != DTWRITE)
        !           262:        {
        !           263:                /* not open for writing */
        !           264:                openup(dt, var, 2);     /* open for reading */
        !           265:        }
        !           266: 
        !           267:        return (&dt->desc);
        !           268: }
        !           269: /*
        !           270: **  SPECOPEN -- open for writing not associated with any variable
        !           271: */
        !           272: 
        !           273: DESC *
        !           274: specopen(relnum)
        !           275: int    relnum;
        !           276: {
        !           277:        register struct desc_tab        *dt;
        !           278:        struct desc_tab                 *desc_get();
        !           279: 
        !           280:        dt = desc_get(relnum, TRUE);
        !           281: 
        !           282:        if (dt->dtmode != DTWRITE)
        !           283:                openup(dt, -1, 2);
        !           284: 
        !           285:        return (&dt->desc);
        !           286: }
        !           287: /*
        !           288: **  SPECCLOSE
        !           289: */
        !           290: 
        !           291: specclose(relnum)
        !           292: int    relnum;
        !           293: {
        !           294:        register struct desc_tab        *dt;
        !           295:        struct desc_tab                 *desc_get();
        !           296:        struct desc_tab                 *desc_last();
        !           297: 
        !           298:        if (dt = desc_get(relnum, FALSE))
        !           299:        {
        !           300:                desc_close(dt);
        !           301:                desc_last(dt);
        !           302:                dt->relnum = -2;
        !           303:        }
        !           304: }
        !           305: /*
        !           306: **     Openup -- make sure that the given descriptor is open
        !           307: **             suitably for reading or writing.
        !           308: */
        !           309: 
        !           310: openup(dt1, varno, mode)
        !           311: struct desc_tab        *dt1;
        !           312: int            varno;
        !           313: int            mode;
        !           314: {
        !           315:        register struct desc_tab        *dt;
        !           316:        register int                    md, openmd;
        !           317:        int                             i;
        !           318:        extern char                     *rnum_convert();
        !           319:        char                            rnam_tmp[MAXNAME+3];
        !           320: 
        !           321:        /* quick check to handle typical case of rel being already open */
        !           322:        md = mode;
        !           323:        dt = dt1;
        !           324:        if ((md != 2 && dt->dtmode == DTREAD) || dt->dtmode == DTWRITE)
        !           325:                return;
        !           326: 
        !           327:        /* relation not opened correctly */
        !           328:        switch (dt->dtmode)
        !           329:        {
        !           330: 
        !           331:          case DTALLOC:
        !           332:                /*
        !           333:                ** Descriptor allocated but nothing else. If this
        !           334:                ** is for a variable then use openr1 to get range table
        !           335:                ** info. Else open directly.
        !           336:                */
        !           337:                if (varno < 0)
        !           338:                {
        !           339:                        /* open unassociated with a range table variable */
        !           340:                        openmd = md ? 2 : 0;
        !           341:                        bmove(rnum_convert(dt->relnum), dt->desc.reldum.relid, MAXNAME);
        !           342:                        break;
        !           343:                }
        !           344: 
        !           345:                /* open for range table variable */
        !           346:                openr1(varno);
        !           347: 
        !           348:                /* now fall through to DTREL case */
        !           349: 
        !           350:          case DTREL:
        !           351:                /* relation relation tuple present but nothing else */
        !           352:                openmd = md ? -3 : -2;  /* open -2 for read, -3 for write */
        !           353:                break;
        !           354: 
        !           355:          case DTATTS:
        !           356:                /* relation & attributes filled but relation closed */
        !           357:                openmd = md ? -5 : -4;
        !           358:                break;
        !           359:          case DTREAD:
        !           360:                /* relation open for reading but we need to write */
        !           361:                desc_close(dt);
        !           362: 
        !           363:                openmd = -5;
        !           364:                break;
        !           365: 
        !           366:          default:
        !           367:                syserr("openup:bad md %d", dt->dtmode);
        !           368:        }
        !           369: 
        !           370:        /* close a previous file if necessary */
        !           371:        if (De.de_dopnfiles == De.de_dfiles)
        !           372:                desc_victum();  /* close oldest file */
        !           373: 
        !           374:        /* now open relation */
        !           375:        bmove(dt->desc.reldum.relid, rnam_tmp, MAXNAME + 3);
        !           376:        if (i = openr(&dt->desc, openmd, rnam_tmp))
        !           377:                syserr("openup:openr %d,%d,%.12s,%s", i, openmd, rnam_tmp, rnum_convert(dt->relnum));
        !           378:        De.de_dopnfiles++;
        !           379: 
        !           380:        /* update mode of descriptor */
        !           381:        dt->dtmode = md ? DTWRITE : DTREAD;
        !           382: }
        !           383: /*
        !           384: **  DESC_GET
        !           385: */
        !           386: 
        !           387: struct desc_tab *
        !           388: desc_get(relnum, flag)
        !           389: int    relnum;
        !           390: bool   flag;
        !           391: {
        !           392:        register struct desc_tab        *dt, *ret;
        !           393:        struct desc_tab                 *desc_lru();
        !           394: 
        !           395:        ret = NULL;
        !           396: 
        !           397:        /* search for one currently allocated */
        !           398:        for (dt = &De.de_desc[0]; dt <= &De.de_desc[MAXRELN-1]; dt++)
        !           399:        {
        !           400:                if (dt->relnum == relnum)
        !           401:                {
        !           402:                        ret = dt;
        !           403: #                      ifdef xDTR1
        !           404:                        if (tTf(62, 3))
        !           405:                                printf("found desc for %d\n", relnum);
        !           406: #                      endif
        !           407:                        break;
        !           408:                }
        !           409:        }
        !           410: 
        !           411:        if (ret == NULL && flag)
        !           412:        {
        !           413:                /* get a victim and deallocate desc */
        !           414:                ret = desc_lru();
        !           415: 
        !           416:                /* deallocate */
        !           417: #              ifdef xDTR1
        !           418:                if (tTf(62, 5))
        !           419:                        printf("trading %d for %d\n", ret->relnum, relnum);
        !           420: #              endif
        !           421:                desc_close(ret);
        !           422: 
        !           423:                /* allocate */
        !           424:                ret->relnum = relnum;
        !           425:                ret->dtmode = DTALLOC;
        !           426:        }
        !           427: 
        !           428:        if (ret != NULL)
        !           429:                desc_top(ret);
        !           430: 
        !           431:        return (ret);
        !           432: }
        !           433: /*
        !           434: **     For text space reasons only, the close relation routine varies
        !           435: **     between decomp and decomp70. In decomp, the relation is opened
        !           436: **     only for reading and never for writing thus inpcloser() can be
        !           437: **     called. For decomp70 closer() must be called. If there were no
        !           438: **     text space shortage, then closer() could always be called.
        !           439: **     The routine init_decomp() assigned the value to Des_closefunc.
        !           440: */
        !           441: 
        !           442: extern int     (*Des_closefunc)();     /* either &inpcloser or &closer */
        !           443: 
        !           444: desc_close(dt1)
        !           445: struct desc_tab        *dt1;
        !           446: {
        !           447:        register struct desc_tab        *dt;
        !           448:        register int                    i;
        !           449: 
        !           450:        dt = dt1;
        !           451: 
        !           452:        if (dt->dtmode == DTREAD || dt->dtmode == DTWRITE)
        !           453:        {
        !           454:                if (i = (*Des_closefunc)(&dt->desc))
        !           455:                        syserr("desc_close:closer %d,%.12s", i, dt->desc.reldum.relid);
        !           456:                De.de_dopnfiles--;
        !           457:                dt->dtmode = DTATTS;
        !           458:        }
        !           459: }
        !           460: /*
        !           461: ** Desc_top -- make the desc_tab entry "dtx" the most recently used.
        !           462: */
        !           463: 
        !           464: desc_top(dt1)
        !           465: struct desc_tab        *dt1;
        !           466: {
        !           467:        register struct desc_tab        *dt, *dx;
        !           468:        register int                    oldpos;
        !           469: 
        !           470:        dt = dt1;
        !           471: 
        !           472:        if ((oldpos = dt->dtpos) != 0)
        !           473:        {
        !           474:                /* descriptor isn't currently top */
        !           475:                for (dx = De.de_desc; dx <= &De.de_desc[MAXRELN-1]; dx++)
        !           476:                        if (dx->dtpos < oldpos)
        !           477:                                dx->dtpos++;
        !           478: 
        !           479:                /* make descriptor first */
        !           480:                dt->dtpos = 0;
        !           481:        }
        !           482: }
        !           483: /*
        !           484: ** Desc_last -- make the desc_tab entry "dt" the least recently used.
        !           485: */
        !           486: 
        !           487: struct desc_tab *
        !           488: desc_last(dt)
        !           489: register struct desc_tab       *dt;
        !           490: {
        !           491:        register int                    oldpos;
        !           492:        register struct desc_tab        *dx;
        !           493: 
        !           494:        oldpos = dt->dtpos;
        !           495:        for (dx = De.de_desc; dx <= &De.de_desc[MAXRELN-1]; dx++)
        !           496:                if (dx->dtpos > oldpos)
        !           497:                        dx->dtpos--;
        !           498: 
        !           499:        /* make descriptor last */
        !           500:        dt->dtpos = MAXRELN - 1;
        !           501: }
        !           502: /*
        !           503: ** Desc_lru -- return least recently used descriptor
        !           504: */
        !           505: 
        !           506: struct desc_tab *
        !           507: desc_lru()
        !           508: {
        !           509:        register struct desc_tab        *dx;
        !           510: 
        !           511:        for (dx = De.de_desc; dx <= &De.de_desc[MAXRELN-1]; dx++)
        !           512:        {
        !           513:                if (dx->dtpos == MAXRELN - 1)
        !           514:                        return (dx);
        !           515:        }
        !           516:        syserr("desc_lru:no lru");
        !           517:        /*NOTREACHED*/
        !           518: }
        !           519: 
        !           520: 
        !           521: desc_victum()
        !           522: {
        !           523:        register struct desc_tab        *dt, *old;
        !           524: 
        !           525:        old = NULL;
        !           526:        for (dt = &De.de_desc[0]; dt <= &De.de_desc[MAXRELN-1]; dt++)
        !           527:        {
        !           528:                if (dt->dtmode == DTWRITE || dt->dtmode == DTREAD)
        !           529:                {
        !           530:                        if (old == NULL || dt->dtpos > old->dtpos)
        !           531:                                old = dt;
        !           532:                }
        !           533:        }
        !           534: 
        !           535:        if (old == NULL)
        !           536:                syserr("desc_victum:no victum %d,%d", De.de_dopnfiles, De.de_dfiles);
        !           537:        desc_close(old);
        !           538: }

unix.superglobalmegacorp.com

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