Annotation of 43BSD/ingres/source/iutil/get_tuple.c, revision 1.1

1.1     ! root        1: # include      <ingres.h>
        !             2: # include      <access.h>
        !             3: # include      <symbol.h>
        !             4: # include      <catalog.h>
        !             5: # include      <btree.h>
        !             6: # include      <sccs.h>
        !             7: 
        !             8: SCCSID(@(#)get_tuple.c 8.2     2/8/85)
        !             9: 
        !            10: /*
        !            11: **     Routine associated with getting a tuple out of
        !            12: **     the current buffer.
        !            13: */
        !            14: 
        !            15: 
        !            16: /*
        !            17: **     Get_tuple - take the tuple specified
        !            18: **     by tid and move it to "tuple"
        !            19: */
        !            20: 
        !            21: get_tuple(d, tid, tuple)
        !            22: register DESC  *d;
        !            23: TID            *tid;
        !            24: char           *tuple;
        !            25: {
        !            26:        register char   *cp;
        !            27:        char            *get_addr();
        !            28:        TID             tidloc;
        !            29:        char            lid[MAXLID * LIDSIZE];
        !            30:        extern DESC     Btreesec;
        !            31:        extern int      Btree_fd;
        !            32: 
        !            33:        cp = get_addr(tid);
        !            34: 
        !            35:        if (d->reldum.relspec < 0)
        !            36:                uncomp_tup(d, cp, tuple);       /* compressed tuple */
        !            37:        else
        !            38:        {
        !            39:                if (d->reldum.reldim == 0)
        !            40:                        bmove(cp, tuple, d->reldum.relwid);     /* uncompressed tuple */
        !            41:                else
        !            42:                        /* ignore lid field for now */
        !            43:                        bmove(cp, tuple, d->reldum.relwid - d->reldum.reldim * LIDSIZE);
        !            44:        }
        !            45: 
        !            46:        if (d->reldum.reldim > 0)
        !            47:        /* find corresponding lid value given main relation tid */
        !            48:        {
        !            49:                bmove(d->relbtree, &Btreesec, sizeof(Btreesec));
        !            50:                Btree_fd = d->btree_fd;
        !            51:                search_btree(*tid, &tidloc);
        !            52:                get_lid(&tidloc, lid);
        !            53:                /* attach lid value to end of tuple */
        !            54:                cp = tuple + d->reldum.relwid - d->reldum.reldim * LIDSIZE;
        !            55:                bmove(lid, cp, d->reldum.reldim * LIDSIZE);
        !            56:        }
        !            57: }
        !            58: /*
        !            59: **     Getint_tuple - get the tuple specified by
        !            60: **     tid. If possible avoid moving the tuple.
        !            61: **     Return value is address of tuple.
        !            62: */
        !            63: 
        !            64: char *
        !            65: getint_tuple(d, tid, tuple)
        !            66: register DESC  *d;
        !            67: TID            *tid;
        !            68: char           *tuple;
        !            69: {
        !            70:        register char   *cp, *ret;
        !            71:        extern char     *get_addr();
        !            72:        TID             tidloc;
        !            73:        char            lid[MAXLID * LIDSIZE];
        !            74:        extern DESC     Btreesec;
        !            75:        extern int      Btree_fd;
        !            76: 
        !            77:        cp = get_addr(tid);
        !            78: 
        !            79:        if (d->reldum.relspec < 0)
        !            80:        {
        !            81:                ret = tuple;
        !            82:                uncomp_tup(d, cp, ret); /* compressed tuple */
        !            83:        }
        !            84:        else if (d->reldum.reldim == 0)
        !            85:                ret = cp;                       /* uncompressed tuple */
        !            86:        else
        !            87:        {
        !            88:                /* ignore lid field for now */
        !            89:                ret = tuple;
        !            90:                bmove(cp, tuple, d->reldum.relwid - d->reldum.reldim * LIDSIZE);
        !            91:        }
        !            92:        if (d->reldum.reldim > 0)
        !            93:        {
        !            94:                bmove(d->relbtree, &Btreesec, sizeof(Btreesec));
        !            95:                Btree_fd = d->btree_fd;
        !            96:                /* find corresponding lid value */
        !            97:                search_btree(*tid, &tidloc);
        !            98:                get_lid(&tidloc, lid);
        !            99:                /* attach lid value to end of tuple */
        !           100:                cp = ret + d->reldum.relwid - d->reldum.reldim * LIDSIZE;
        !           101:                bmove(lid, cp, d->reldum.reldim * LIDSIZE);
        !           102:        }
        !           103:        return (ret);
        !           104: }
        !           105: /*
        !           106: **     Routine to compute the address of a tuple
        !           107: **     within the current buffer.
        !           108: **     Syserr if specified tuple deleted.
        !           109: */
        !           110: 
        !           111: char *
        !           112: get_addr(tid)
        !           113: register TID   *tid;
        !           114: {
        !           115:        register int    offset;
        !           116: 
        !           117:        offset = Acc_head->linetab[-(tid->line_id & I1MASK)];
        !           118:        if (offset == 0)
        !           119:        {
        !           120:                syserr("get_addr rel=%ld tid=%ld", Acc_head->rel_tupid, *(long *)tid);
        !           121:        }
        !           122: #      ifdef xATR3
        !           123:        if (offset < 0 || offset > PGSIZE)
        !           124:                syserr("get_addr: offset=%d\n");
        !           125: #      endif
        !           126:        return (((char *) Acc_head) + offset);
        !           127: }
        !           128: /*
        !           129: **     Uncompress - decompress the tuple at address cp
        !           130: **     according to descriptor.
        !           131: */
        !           132: 
        !           133: uncomp_tup(d, cp, tuple)
        !           134: register DESC  *d;
        !           135: char           *cp;
        !           136: char           *tuple;
        !           137: {
        !           138:        register char   *src, *dst;
        !           139:        int             i, j, numatts;
        !           140: 
        !           141:        dst = tuple;
        !           142:        src = cp;
        !           143: 
        !           144:        /* for each domain, copy and blank pad if char */
        !           145:        /* ignore lid field */
        !           146:        numatts = d->reldum.relatts - d->reldum.reldim;
        !           147:        for (i = 1; i <= numatts; i++)
        !           148:        {
        !           149:                j = d->relfrml[i] & I1MASK;
        !           150:                if (d->relfrmt[i] == CHAR)
        !           151:                {
        !           152:                        while (j--)
        !           153:                        {
        !           154:                                if ((*dst++ = *src++) == NULL)
        !           155:                                {
        !           156:                                        /* back up one */
        !           157:                                        dst--;
        !           158:                                        j++;
        !           159:                                        break;
        !           160:                                }
        !           161:                        }
        !           162: 
        !           163:                        /* blank pad if necessary */
        !           164:                        while (j-- > 0)
        !           165:                                *dst++ = ' ';
        !           166:                }
        !           167:                else
        !           168:                {
        !           169:                        while (j--)
        !           170:                                *dst++ = *src++;
        !           171:                }
        !           172:        }
        !           173: }
        !           174: /*
        !           175: **     Check if a line number is valid.
        !           176: **     If linenumber is illegal return AMINVL_ERR
        !           177: **     if Line has been deleted return DELTUP
        !           178: **     else return 0
        !           179: */
        !           180: 
        !           181: invalid(tid)
        !           182: register TID   *tid;
        !           183: {
        !           184:        register int    i;
        !           185: 
        !           186:        i = tid->line_id & I1MASK;
        !           187: 
        !           188:        if (i >= Acc_head->nxtlino)
        !           189:                return (acc_err(AMINVL_ERR));
        !           190: 
        !           191:        if (Acc_head->linetab[-i] == 0)
        !           192:                return (DELTUP);
        !           193: 
        !           194:        return (0);
        !           195: }

unix.superglobalmegacorp.com

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