Annotation of 43BSD/ingres/source/dbu/ksort.c, revision 1.1.1.1

1.1       root        1: # include      <stdio.h>
                      2: # include      <ingres.h>
                      3: # include      <aux.h>
                      4: # include      <symbol.h>
                      5: # include      <access.h>
                      6: # include      <func.h>
                      7: # include      <batch.h>
                      8: # include      <catalog.h>
                      9: # include      <pv.h>
                     10: # include      <sccs.h>
                     11: 
                     12: SCCSID(@(#)ksort.c     8.4     12/8/85)
                     13: 
                     14: # define       N       7
                     15: # define       MEM     (32768 - 2)
                     16: # define       BUCKETSIZE      4
                     17: # define       ENDKEY  MAXDOM + 1
                     18: 
                     19: 
                     20: 
                     21: /*
                     22: **     Parameters:
                     23: **
                     24: **             pv[0]:          Fileset
                     25: **             pv[1]:          Infile from which reln is read
                     26: **             pv[2]:          Outfile to which reln is written
                     27: **             pv[3...]:       the desc of the new relation
                     28: **
                     29: **     Trace Flag:     Z37
                     30: */
                     31: 
                     32: extern short   tTdbu[100];
                     33: extern int     ksort();
                     34: extern int     null_fn();
                     35: 
                     36: struct fn_def KsortFn =
                     37: {
                     38:        "KSORT",
                     39:        ksort,
                     40:        null_fn,
                     41:        null_fn,
                     42:        NULL,
                     43:        0,
                     44:        tTdbu,
                     45:        100,
                     46:        'Z',
                     47:        0
                     48: };
                     49: 
                     50: static char            *Infile;
                     51: static char            *Outfile;
                     52: static DESC            Desc;
                     53: static char            Descsort[MAXDOM+1];
                     54: static FILE            *Oiop;
                     55: static int             Tupsize;
                     56: static int             Bucket;
                     57: static char            File[15];
                     58: static char            *Fileset;
                     59: static char            *Filep;
                     60: static int             Nlines;
                     61: static long            Ccount;
                     62: static char            **Lspace;
                     63: static char            *Tspace;
                     64: extern int             cmpa();
                     65: static long            Tupsout;
                     66: static int             firstime        = 1;
                     67: static FILE            *Btree_fp;
                     68: DESC                   Btreesec;
                     69: int                    Btree_fd;
                     70: int                    Nfiles;
                     71: 
                     72: ksort(pc, pv)
                     73: int    pc;
                     74: PARM   *pv;
                     75: {
                     76:        extern char     *Proc_name;
                     77:        register int    i;
                     78:        register int    j;
                     79:        unsigned int    mem;
                     80:        char            *start;
                     81:        int             maxkey, rev;
                     82:        extern char     *malloc();
                     83: 
                     84: # ifdef xZTR1
                     85:        if (tTf(37,0))
                     86:        {
                     87:                lprintf("entering ksort\n");
                     88:                prvect(pc,pv);
                     89:        }
                     90: # endif
                     91: 
                     92:        Nfiles = 1;
                     93:        Fileset = pv[0].pv_val.pv_str;
                     94: 
                     95:        /* first, the struct relation reldum */
                     96:        strcpy(Desc.reldum.relid, pv[3].pv_val.pv_str);
                     97:        strcpy(Desc.reldum.relowner, pv[4].pv_val.pv_str);
                     98:        Desc.reldum.relspec = pv[5].pv_val.pv_int;
                     99:        Desc.reldum.relindxd = pv[6].pv_val.pv_int;
                    100:        Desc.reldum.relstat2 = pv[7].pv_val.pv_int;
                    101:        Desc.reldum.relstat = pv[8].pv_val.pv_int;
                    102:        Desc.reldum.relsave = (long) pv[9].pv_val.pv_int;
                    103:        Desc.reldum.reltups = (long) pv[10].pv_val.pv_int;
                    104:        Desc.reldum.relatts = pv[11].pv_val.pv_int;
                    105:        Desc.reldum.relwid = pv[12].pv_val.pv_int;
                    106:        Desc.reldum.relprim = (long) pv[13].pv_val.pv_int;
                    107:        Desc.reldum.relfree = (long) pv[14].pv_val.pv_int;
                    108:        Desc.reldum.relstamp = (long) pv[15].pv_val.pv_int;
                    109:        Desc.reldum.reldim = pv[16].pv_val.pv_int;
                    110: 
                    111:        strcpy(Desc.relvname, pv[17].pv_val.pv_str);
                    112:        Desc.relfp = pv[18].pv_val.pv_int;
                    113:        Desc.relopn = pv[19].pv_val.pv_int;
                    114:        Desc.reladds = (long) pv[20].pv_val.pv_int;
                    115:        Desc.reltid.ltid = pv[21].pv_val.pv_int;
                    116:        j = 22;
                    117:        for (i = 0; i <= Desc.reldum.relatts; ++i)
                    118:        {
                    119:                Desc.reloff[i] = pv[j++].pv_val.pv_int;
                    120:                Desc.relfrmt[i] = pv[j++].pv_val.pv_int;
                    121:                Desc.relfrml[i] = pv[j++].pv_val.pv_int;
                    122:                Desc.relxtra[i] = pv[j++].pv_val.pv_int;
                    123:                Desc.relgiven[i] = pv[j++].pv_val.pv_int;
                    124:        }
                    125: 
                    126:        if (Desc.reldum.reldim > 0)
                    127:        {
                    128:                if ((Desc.relbtree = (DESC *) calloc(1, sizeof(DESC))) == NULL)
                    129:                        syserr("bad calloc in ksort");
                    130:                /* first, the struct relation reldum */
                    131:                strcpy(Desc.relbtree->reldum.relid, pv[j++].pv_val.pv_str);
                    132:                strcpy(Desc.relbtree->reldum.relowner, pv[j++].pv_val.pv_str);
                    133:                Desc.relbtree->reldum.relspec = pv[j++].pv_val.pv_int;
                    134:                Desc.relbtree->reldum.relindxd = pv[j++].pv_val.pv_int;
                    135:                Desc.relbtree->reldum.relstat2 = pv[j++].pv_val.pv_int;
                    136:                Desc.relbtree->reldum.relstat = pv[j++].pv_val.pv_int;
                    137:                Desc.relbtree->reldum.relsave = pv[j++].pv_val.pv_int;
                    138:                Desc.relbtree->reldum.reltups = pv[j++].pv_val.pv_int;
                    139:                Desc.relbtree->reldum.relatts = pv[j++].pv_val.pv_int;
                    140:                Desc.relbtree->reldum.relwid = pv[j++].pv_val.pv_int;
                    141:                Desc.relbtree->reldum.relprim = pv[j++].pv_val.pv_int;
                    142:                Desc.relbtree->reldum.relfree = pv[j++].pv_val.pv_int;
                    143:                Desc.relbtree->reldum.relstamp = pv[j++].pv_val.pv_int;
                    144:                Desc.relbtree->reldum.reldim = pv[j++].pv_val.pv_int;
                    145: 
                    146:                strcpy(Desc.relbtree->relvname, pv[j++].pv_val.pv_str);
                    147:                Desc.relbtree->relfp = pv[j++].pv_val.pv_int;
                    148:                Desc.relbtree->relopn = pv[j++].pv_val.pv_int;
                    149:                Desc.relbtree->reladds = pv[j++].pv_val.pv_int;
                    150:                Desc.relbtree->reltid.ltid = pv[j++].pv_val.pv_int;
                    151: 
                    152:                for (i = 0; i <= Desc.relbtree->reldum.relatts; ++i)
                    153:                {
                    154:                        Desc.relbtree->reloff[i] = pv[j++].pv_val.pv_int;
                    155:                        Desc.relbtree->relfrmt[i] = pv[j++].pv_val.pv_int;
                    156:                        Desc.relbtree->relfrml[i] = pv[j++].pv_val.pv_int;
                    157:                        Desc.relbtree->relxtra[i] = pv[j++].pv_val.pv_int;
                    158:                        Desc.relbtree->relgiven[i] = pv[j++].pv_val.pv_int;
                    159:                }
                    160:        }
                    161: 
                    162: # ifdef xZTR1
                    163:        if (tTf(37,0))
                    164:        {
                    165:                lprintf(" Desc read in \n");
                    166:                printdesc(&Desc);
                    167:        }
                    168: #endif
                    169: 
                    170:        /* set up Descsort to indicate the sort order for tuple */
                    171:        /* if domain zero is given prepare to generate "hash bucket"
                    172:        ** value for tuple */
                    173: 
                    174:        maxkey = 0;
                    175:        for (i = 0; i <= Desc.reldum.relatts; i++)
                    176:                if (j = Desc.relgiven[i])
                    177:                {
                    178:                        if ((rev = j) < 0)
                    179:                                j = -j;
                    180:                        if (maxkey < j)
                    181:                                maxkey = j;
                    182:                        Descsort[--j] = rev < 0 ? -i : i;
                    183:                }
                    184: 
                    185:        Descsort[maxkey] = ENDKEY;      /* mark end of list */
                    186: 
                    187:        Tupsize = Desc.reldum.relwid;
                    188: 
                    189:        if (Bucket = (Descsort[0] == 0))
                    190:        {
                    191:                /* we will be generating hash bucket */
                    192:                Tupsize += BUCKETSIZE;
                    193:                Desc.relfrml[0] = BUCKETSIZE;
                    194:                Desc.relfrmt[0] = INT;
                    195:                Desc.reloff[0] = Desc.reldum.relwid;
                    196:        }
                    197: 
                    198: # ifdef xZTR1
                    199:        if (tTf(37,0))
                    200:        {
                    201:                lprintf("ksort: reldum.relatts is %d\n", Desc.reldum.relatts);
                    202:                lprintf("Bucket is %d,Sort is:\n", Bucket);
                    203:                for (i = 0; (j = Descsort[i]) != ENDKEY; i++)
                    204:                        lprintf("Descsort[%d]=%d\n", i, j);
                    205:        }
                    206: # endif
                    207:        if (i = (maxkey - Bucket - Desc.reldum.relatts))
                    208:        {
                    209:                lprintf("MAXKEY=%d\n", maxkey);
                    210:                lprintf("ATTS=%d\n", Desc.reldum.relatts);
                    211:                syserr("%d domains missing\n", -i);
                    212:        }
                    213:        Infile = pv[1].pv_val.pv_str;
                    214:        Outfile = pv[2].pv_val.pv_str;
                    215: 
                    216:        /* get up to 2**15 - 1 bytes of memory for buffers */
                    217:        /* note that mem must end up positive so that Nlines computation is right */
                    218:        mem = MEM;      /* take at most 2**15 - 1 bytes */
                    219:        if (firstime)
                    220:        {
                    221:                while ((Lspace = (char **) malloc(mem)) == NULL)
                    222:                        mem -= 1024;
                    223:                firstime = 0;
                    224:        }
                    225: 
                    226:        /* compute pointers and sizes into buffer memory */
                    227:        Nlines = mem / (Tupsize + sizeof(char *));
                    228:        Tspace = (char *) (Lspace + Nlines);
                    229: # ifdef xZTR1
                    230:        if (tTf(37,0))
                    231:                lprintf("Tspace=%x,Lspace=%x,Nlines=%x,mem=%d\n",
                    232:                        Tspace, Lspace, Nlines, mem);
                    233: # endif
                    234: 
                    235:        /* set up temp files */
                    236:        concat(ztack("_SYSS", Fileset), "Xaa", File);
                    237:        Filep = File;
                    238:        while (*Filep != 'X')
                    239:                Filep++;
                    240:        Filep++;
                    241: 
                    242:        if (abs(Desc.reldum.relspec) == M_ORDER)
                    243:                if ((Btree_fp = fopen(Infile, "r")) == NULL)
                    244:                        syserr("can't open %s", Infile);
                    245: 
                    246:        /* sort stage -- create a bunch of temporaries */
                    247:        Ccount = 0;
                    248: # ifdef xZTR1
                    249:        if (tTf(37,0))
                    250:                lprintf("sorting\n");
                    251: # endif
                    252:        sort();
                    253: # ifdef xZTR1
                    254:        if (tTf(37,0))
                    255:        {
                    256:                lprintf("done sorting\n%ld tuples written to %d files\n", Tupsout, Nfiles - 1);
                    257:                lprintf("sort required %ld compares\n", Ccount);
                    258:        }
                    259: # endif
                    260: 
                    261:        /* merge stage -- merge up to N temps into a new temp */
                    262:        Ccount = 0;
                    263:        for (i = 1; i + N < Nfiles; i += N) 
                    264:        {
                    265:                newfile();
                    266:                merge(i, i + N);
                    267:        }
                    268: 
                    269:        /* merge last set of temps into target file */
                    270:        if (i != Nfiles) 
                    271:        {
                    272:                oldfile();
                    273:                merge(i, Nfiles);
                    274:        }
                    275: # ifdef xZTR1
                    276:        if (tTf(37,0))
                    277:        {
                    278:                lprintf("%ld tuples in out file\n", Tupsout);
                    279:                lprintf("merge required %ld compares\n", Ccount);
                    280:        }
                    281: # endif
                    282:        term(0);
                    283: }
                    284: /*
                    285: **  SORT
                    286: */
                    287: 
                    288: sort()
                    289: {
                    290:        register char   *cp;
                    291:        register char   **lp;
                    292:        register int    i;
                    293:        int             done;
                    294:        long            ntups;
                    295:        struct tup_id   tid, ltid;
                    296:        char            *xp;
                    297:        long            pageid;
                    298:        long            rhash();
                    299:        char            btree[MAXNAME + 4], btreefile[MAXNAME + 4];
                    300:        char            relfile[MAXNAME + 4], btreestruct[MAXNAME + 4];
                    301: 
                    302:        done = 0;
                    303:        ntups = 0;
                    304:        Tupsout = 0;
                    305:        if (abs(Desc.reldum.relspec) != M_ORDER)
                    306:        {
                    307:                if ((Desc.relfp = open(Infile, O_RDONLY)) < 0)
                    308:                        cant(Infile);
                    309:                Desc.relopn = (Desc.relfp + 1) * 5;
                    310:        }
                    311:        if (Desc.reldum.reldim > 0 && abs(Desc.reldum.relspec != M_ORDER))
                    312:        /* open all needed btree files */
                    313:        {
                    314:                capital(Desc.reldum.relid, btree);
                    315:                ingresname(btree, Desc.reldum.relowner, btreefile);
                    316:                if ((Desc.relbtree->relfp = open(btreefile, O_RDONLY)) < 0)
                    317:                        cant(btreefile);
                    318:                Desc.relbtree->relopn = (Desc.relbtree->relfp + 1) * 5;
                    319:                ingresname(Desc.reldum.relid, Desc.reldum.relowner, relfile);
                    320:                btreename(relfile, btreestruct);
                    321:                if ((Desc.btree_fd = open(btreestruct, O_RDWR)) < 0)
                    322:                        cant(btreestruct);
                    323:        }
                    324: 
                    325:        /* initialize tids for full scan */
                    326:        pageid = 0;
                    327:        tid.line_id = -1;
                    328:        stuff_page(&tid, &pageid);
                    329:        pageid = -1;
                    330:        ltid.line_id = -1;
                    331:        stuff_page(&ltid, &pageid);
                    332: 
                    333:        do 
                    334:        {
                    335:                cp = Tspace;
                    336:                lp = Lspace;
                    337:                while (lp < Lspace + Nlines)
                    338:                {
                    339:                        if (abs(Desc.reldum.relspec) == M_ORDER)
                    340:                        {
                    341:                                /* not reading from a relation */
                    342:                                if ((i = fread(cp, 1, Desc.reldum.relwid, Btree_fp)) != Desc.reldum.relwid)
                    343:                                {
                    344:                                        if (i != 0)
                    345:                                                syserr("read error %d", i);
                    346:                                        fclose(Btree_fp);
                    347:                                        done++;
                    348:                                        break;
                    349:                                }
                    350:                        }
                    351:                        else if ((i = kget(&Desc, &tid, &ltid, cp, TRUE)) != 0)
                    352:                        {
                    353:                                if (i < 0)
                    354:                                        syserr("get %d", i);
                    355:                                close(Desc.relfp);
                    356:                                Desc.relopn = 0;
                    357:                                done++;
                    358:                                break;
                    359:                        }
                    360: # ifdef xZTR1
                    361:                        if (tTf(37,0))
                    362:                                printup(&Desc, cp);
                    363: # endif
                    364:                        if (Bucket)
                    365:                        {
                    366:                                /* compute hash bucket and insert at end */
                    367:                                pageid = rhash(&Desc, cp);
                    368:                                bmove(&pageid, cp + Desc.reldum.relwid, BUCKETSIZE);
                    369:                        }
                    370:                        *lp++ = cp;
                    371:                        cp += Tupsize;
                    372:                        ntups++;
                    373:                }
                    374:                qsort(Lspace, lp - Lspace, sizeof(char *), cmpa);
                    375:                if (done == 0 || Nfiles != 1)
                    376:                        newfile();
                    377:                else
                    378:                        oldfile();
                    379:                while (lp > Lspace) 
                    380:                {
                    381:                        cp = *--lp;
                    382:                        xp = cp;
                    383:                        if ((lp == Lspace) || (i = abs(cmpa(&xp, &lp[-1]))) != 0 || (i == 0 && abs(Desc.reldum.relspec) == M_ORDER))
                    384:                        {
                    385: # ifdef xZTR1
                    386:                                if (tTf(37,0))
                    387:                                {
                    388:                                        lprintf("writing ");
                    389:                                        printup(&Desc, cp);
                    390:                                }
                    391: # endif
                    392:                                if ((i = fwrite(cp, 1, Tupsize, Oiop)) != Tupsize)
                    393:                                        syserr("cant write outfile %d (%d)", i, Nfiles);
                    394:                                Tupsout++;
                    395:                        }
                    396:                }
                    397:                fclose(Oiop);
                    398:        } while (done == 0);
                    399:        if (Desc.reldum.reldim > 0 && Desc.reldum.relspec != M_ORDER)
                    400:        {
                    401:                close(Desc.relbtree->relfp);
                    402:                Desc.relbtree->relopn = 0;
                    403:                close(Desc.btree_fd);
                    404:        }
                    405: # ifdef xZTR1
                    406:        if (tTf(37,0))
                    407:                lprintf("%ld tuples in\n", ntups);
                    408: # endif
                    409: }
                    410: /*
                    411: **  MERGE
                    412: */
                    413: 
                    414: struct merg
                    415: {
                    416:        char            tup[MAXTUP+BUCKETSIZE];
                    417:        int             filedes;
                    418:        FILE            *fiop;
                    419: };
                    420: 
                    421: merge(a, b)
                    422: int    a;
                    423: int    b;
                    424: {
                    425:        register struct merg    *merg;
                    426:        register int            i, j;
                    427:        char                    *f, *yesno;
                    428:        struct merg             *mbuf[N + 1];
                    429:        char                    *setfil();
                    430: 
                    431: # ifdef xZTR1
                    432:        if (tTf(37,0))
                    433:                lprintf("merge %d to %d\n", a, b);
                    434: # endif
                    435:        merg = (struct merg *) Lspace;
                    436:        j = 0;
                    437:        for (i = a; i < b; i++) 
                    438:        {
                    439:                f = setfil(i);
                    440:                mbuf[j] = merg;
                    441:                merg->filedes = i;
                    442:                if ((merg->fiop = fopen(f, "r")) == NULL)
                    443:                        cant(f);
                    444:                if (!rline(merg))
                    445:                        j++;
                    446:                merg++;
                    447:        }
                    448: 
                    449:        i = j - 1;
                    450: # ifdef xZTR1
                    451:        if (tTf(37,0))
                    452:                lprintf("start merg with %d\n", i);
                    453: # endif
                    454:        while (i >= 0) 
                    455:        {
                    456: # ifdef xZTR1
                    457:                if (tTf(37,0))
                    458:                        lprintf("mintup %d\n", i);
                    459: # endif
                    460:                if (mintup(mbuf, i, cmpa))
                    461:                {
                    462:                        if (fwrite(mbuf[i]->tup, 1, Tupsize, Oiop) != Tupsize)
                    463:                                syserr("cant write merge output");
                    464:                        Tupsout++;
                    465:                }
                    466:                merg = mbuf[i];
                    467:                if (rline(merg))
                    468:                {
                    469:                        yesno = "not ";
                    470: # ifdef xZTR1
                    471:                        if (!tTf(37,0))
                    472:                        {
                    473:                                /* truncate temporary files to zero length */
                    474:                                yesno = "";
                    475:                                close(creat(setfil(merg->filedes), 0600));
                    476:                        }
                    477: # endif
                    478: # ifdef xZTR1
                    479:                        if (tTf(37,0))
                    480:                                lprintf("dropping and %struncating %s\n", yesno, setfil(merg->filedes));
                    481: # endif
                    482:                        i--;
                    483:                }
                    484:        }
                    485: 
                    486:        fclose(Oiop);
                    487: }
                    488: /*
                    489: **     Mintup puts the smallest tuple in mbuf[cnt-1].
                    490: **     If the tuple is a duplicate of another then
                    491: **     mintup returns 0, else 1.
                    492: **
                    493: **     Cnt is the number of compares to make; i.e.
                    494: **     mbuf[cnt] is the last element.
                    495: */
                    496: 
                    497: mintup(mbuf, cnt, cmpfunc)
                    498: struct merg    *mbuf[];
                    499: int            cnt;
                    500: int            (*cmpfunc)();
                    501: {
                    502:        register struct merg    **next, **last;
                    503:        struct merg             *temp;
                    504:        register int            nodup;
                    505:        int                     j;
                    506: 
                    507:        nodup = TRUE;
                    508:        next = mbuf;
                    509:        last = &next[cnt];
                    510: 
                    511:        while (cnt--)
                    512:        {
                    513:                if (j = (*cmpfunc)(last, next))
                    514:                {
                    515:                        /* tuples not equal. keep smallest */
                    516:                        if (j < 0)
                    517:                        {
                    518:                                /* exchange */
                    519:                                temp = *last;
                    520:                                *last = *next;
                    521:                                *next = temp;
                    522:                                nodup = TRUE;
                    523:                        }
                    524:                }
                    525:                else
                    526:                        nodup = FALSE;
                    527: 
                    528:                next++;
                    529:        }
                    530:        return (nodup);
                    531: }
                    532: 
                    533: 
                    534: rline(mp)
                    535: struct merg    *mp;
                    536: {
                    537:        register struct merg    *merg;
                    538:        register int            i;
                    539: 
                    540:        merg = mp;
                    541:        if ((i = fread(merg->tup, 1, Tupsize, merg->fiop)) != Tupsize)
                    542:        {
                    543:                if (i == 0)
                    544:                {
                    545:                        fclose(merg->fiop);
                    546:                        return (1);
                    547:                }
                    548:                syserr("rd err %d on %s", i, setfil(merg->filedes));
                    549:        }
                    550:        return (0);
                    551: }
                    552: 
                    553: newfile()
                    554: {
                    555:        char    *setfil();
                    556: 
                    557:        makfile(setfil(Nfiles));
                    558:        Nfiles++;
                    559: }
                    560: /*
                    561: **     Convert the number i to a char
                    562: **     sequence aa, ab, ..., az, ba, etc.
                    563: */
                    564: 
                    565: char *
                    566: setfil(i)
                    567: int    i;
                    568: {
                    569:        register int    j;
                    570: 
                    571:        j = i;
                    572:        j--;
                    573:        Filep[0] = j/26 + 'a';
                    574:        Filep[1] = j%26 + 'a';
                    575:        return (File);
                    576: }
                    577: 
                    578: oldfile()
                    579: {
                    580:        makfile(Outfile);
                    581:        Tupsout = 0;
                    582: }
                    583: /*
                    584: **     Create a file by the name "name"
                    585: **     and place its fio pointer in Oiop
                    586: */
                    587: 
                    588: makfile(name)
                    589: char   *name;
                    590: {
                    591:        if ((Oiop = fopen(name, "w")) == NULL)
                    592:                cant(name);
                    593: }
                    594: 
                    595: cant(f)
                    596: char   *f;
                    597: {
                    598:        syserr("open %s", f);
                    599: }
                    600: 
                    601: term(error)
                    602: int    error;
                    603: {
                    604:        register int    i;
                    605: 
                    606:        if (Nfiles == 1)
                    607:                Nfiles++;
                    608: # ifdef xZTR1
                    609:        if (tTf(37,0))
                    610:                lprintf("temp files not removed\n");
                    611:        else
                    612: # endif
                    613:                for (i = 1; i < Nfiles; i++) 
                    614:                {
                    615:                        unlink(setfil(i));
                    616:                }
                    617:        return(error);
                    618: }
                    619: /*
                    620: **  CMPA -- compare tuples
                    621: */
                    622: 
                    623: cmpa(a, b)
                    624: char   **a;
                    625: char   **b;
                    626: {
                    627:        int                     af[4];
                    628:        int                     bf[4];
                    629:        char                    *pa, *pb;
                    630:        register union anytype  *tupa, *tupb;
                    631:        int                     dom;
                    632:        register int            frml;
                    633:        int                     frmt;
                    634:        int                     off;
                    635:        int                     temp;
                    636:        int                     rt;
                    637:        char                    *dp;
                    638: 
                    639:        pa = *a;
                    640:        pb = *b;
                    641:        Ccount++;
                    642:        dp = Descsort;
                    643:        while ((temp = *dp++) != ENDKEY)
                    644:        {
                    645:                if ((dom = temp) < 0)
                    646:                        dom = -temp;
                    647:                frml = Desc.relfrml[dom];
                    648:                frmt = Desc.relfrmt[dom];
                    649:                off = Desc.reloff[dom];
                    650:                tupa = (union anytype *) &pa[off];
                    651:                tupb = (union anytype *) &pb[off];
                    652:                if (temp < 0)
                    653:                {
                    654:                        tupb = tupa;
                    655:                        tupa = (union anytype *) &pb[off];
                    656:                }
                    657:                if (frmt == CHAR)
                    658:                {
                    659:                        frml &= I1MASK;
                    660:                        if (rt = scompare(tupb, frml, tupa, frml))
                    661:                                return (rt);
                    662:                        continue;
                    663:                }
                    664: 
                    665:                /* domain is a numeric type */
                    666:                if (bequal(tupa, tupb, frml))
                    667:                        continue;
                    668:                /* copy to even word boundary */
                    669:                bmove(tupa, af, frml);
                    670:                bmove(tupb, bf, frml);
                    671:                tupa = (union anytype *) af;
                    672:                tupb = (union anytype *) bf;
                    673: 
                    674:                switch (frmt)
                    675:                {
                    676: 
                    677:                  case INT:
                    678:                        switch (frml)
                    679:                        {
                    680: 
                    681:                          case 1:
                    682:                                return (tupa->i1type > tupb->i1type ? -1 : 1);
                    683: 
                    684:                          case 2:
                    685:                                return (tupa->i2type > tupb->i2type ? -1 : 1);
                    686: 
                    687:                          case 4:
                    688:                                return (tupa->i4type > tupb->i4type ? -1 : 1);
                    689:                        }
                    690: 
                    691:                  case FLOAT:
                    692:                        switch (frml)
                    693:                        {
                    694: 
                    695:                          case 4:
                    696:                                return (tupa->f4type > tupb->f4type ? -1 : 1);
                    697: 
                    698:                          case 8:
                    699:                                return (tupa->f8type > tupb->f8type ? -1 : 1);
                    700:                        }
                    701:                }
                    702:        }
                    703:        return (0);
                    704: }
                    705: /*
                    706: **     KGET_PAGE
                    707: **     Replacement for access method routine get_page();
                    708: **     and associated globals and routines.
                    709: */
                    710: 
                    711: long           Accuread, Accuwrite;
                    712: 
                    713: kget_page(d, tid)
                    714: register DESC  *d;
                    715: struct tup_id  *tid;
                    716: {
                    717:        register int            i;
                    718:        long                    pageid;
                    719:        register struct accbuf  *b;
                    720:        extern struct accbuf    *choose_buf();
                    721: 
                    722: # ifdef xZTR1
                    723:        if (tTf(37,0))
                    724:        {
                    725:                lprintf("kget_page: %.14s,", d->reldum.relid);
                    726:                dumptid(tid);
                    727:        }
                    728: # endif
                    729:        pluck_page(tid, &pageid);
                    730:        if ((b = choose_buf(d, pageid)) == NULL)
                    731:        {
                    732: # ifdef xZTR1
                    733:                if (tTf(37,0))
                    734:                        lprintf(" choose_buf: buffer not avail \n");
                    735: # endif
                    736:                return(-1);
                    737:        }
                    738:        top_acc(b);
                    739: 
                    740:        i = 0;
                    741:        if (b->thispage != pageid)
                    742:        {
                    743: # ifdef xZTR1
                    744:                if (tTf(37,0))
                    745:                        lprintf("kget_page: rdg pg %ld\n", pageid);
                    746: # endif
                    747:                b->thispage = pageid;
                    748:                if ((lseek(d->relfp, pageid * PGSIZE, 0) < 0) ||
                    749:                    ((read(d->relfp, b, PGSIZE)) != PGSIZE))
                    750:                {
                    751:                        i = AMREAD_ERR;
                    752:                }
                    753:                Accuread++;
                    754:        }
                    755:        return (i);
                    756: }
                    757: 
                    758: /*
                    759: **  KGET - get a single tuple
                    760: **
                    761: **     Get either gets the next sequencial tuple after
                    762: **     "tid" or else gets the tuple specified by tid.
                    763: **
                    764: **     If getnxt == TRUE, then tid is incremented to the next
                    765: **     tuple after tid. If there are no more, then get returns
                    766: **     1. Otherwise get returns 0 and "tid" is set to the tid of
                    767: **     the returned tuple.
                    768: **
                    769: **     Under getnxt mode, the previous page is reset before
                    770: **     the next page is read. This is done to prevent the previous
                    771: **     page from hanging around in the am's buffers when we "know"
                    772: **     that it will not be referenced again.
                    773: **
                    774: **     If getnxt == FALSE then the tuple specified by tid is
                    775: **     returned. If the tuple was deleted previously,
                    776: **     get retuns 2 else get returns 0.
                    777: **
                    778: **     If getnxt is true, limtid holds the the page number
                    779: **     of the first page past the end point. Limtid and the
                    780: **     initial value of tid are set by calls to FIND.
                    781: **
                    782: **     returns:
                    783: **             <0  fatal error
                    784: **             0   success
                    785: **             1   end of scan (getnxt=TRUE only)
                    786: **             2   tuple deleted (getnxt=FALSE only)
                    787: */
                    788: 
                    789: 
                    790: kget(d, tid, limtid, tuple, getnxt)
                    791: register DESC  *d;
                    792: register TID   *tid;
                    793: TID            *limtid;
                    794: int            getnxt;
                    795: char           *tuple;
                    796: {
                    797:        register int    i;
                    798:        long            pageid, lpageid;
                    799: 
                    800: #      ifdef xATR1
                    801:        if (tTf(23, 0) || tTf(37,0))
                    802:        {
                    803:                lprintf("kget: %.14s,", d->reldum.relid);
                    804:                dumptid(tid);
                    805:                lprintf("kget: lim");
                    806:                dumptid(limtid);
                    807:        }
                    808: #      endif
                    809:        if (kget_page(d, tid))
                    810:        {
                    811:                return (-1);
                    812:        }
                    813:        if (getnxt)
                    814:        {
                    815:                pluck_page(limtid, &lpageid);
                    816:                do
                    817:                {
                    818:                        while (((++(tid->line_id)) & I1MASK) >= Acc_head->nxtlino)
                    819:                        {
                    820:                                tid->line_id = -1;
                    821:                                pageid = Acc_head->ovflopg;
                    822:                                stuff_page(tid, &pageid);
                    823:                                if (pageid == 0)
                    824:                                {
                    825:                                        pageid = Acc_head->mainpg;
                    826:                                        stuff_page(tid, &pageid);
                    827:                                        if (pageid == 0 || pageid == lpageid + 1)
                    828:                                                return (1);
                    829:                                }
                    830:                                if (i = resetacc(Acc_head))
                    831:                                        return (i);
                    832:                                if (i = get_page(d, tid))
                    833:                                        return (i);
                    834:                        }
                    835:                } while (!Acc_head->linetab[-(tid->line_id & I1MASK)]);
                    836:        }
                    837:        else
                    838:        {
                    839:                if (i = invalid(tid))
                    840:                        return (i);
                    841:        }
                    842:        get_tuple(d, tid, tuple);
                    843: #      ifdef xATR2
                    844:        if (tTf(23, 1) || tTf(37,0))
                    845:        {
                    846:                printf("kget: ");
                    847:                printup(d, tuple);
                    848:        }
                    849: #      endif
                    850:        return (0);
                    851: }

unix.superglobalmegacorp.com

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