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

1.1     ! root        1: #include       <btree.h>
        !             2: #include       <sccs.h>
        !             3: 
        !             4: SCCSID(@(#)get_tid.c   8.3     1/31/86)
        !             5: 
        !             6: /*     GET_TID -- BTree retrieval routine
        !             7: **
        !             8: **     Retrieve the tid corresponding to the given lid
        !             9: **
        !            10: **     Parameters :
        !            11: **             tree - BTree filename (I)
        !            12: **             lid - given lid (I)
        !            13: **             tid_id - storage information of location of the tid (O)
        !            14: **
        !            15: **     Returns :
        !            16: **             > 0     tid
        !            17: **             -1      lid corresponds to very last lid in tree
        !            18: **             -2      lid does not exist
        !            19: */
        !            20: 
        !            21: long
        !            22: get_tid(rootpage, lid, tid_id)
        !            23: 
        !            24: long rootpage;
        !            25: long lid;
        !            26: register struct locator *tid_id;
        !            27: {
        !            28:        struct BTreeNode        p;
        !            29:        long                    pgno, sum, k, t;
        !            30:        register int            i;
        !            31: 
        !            32: #      ifdef xATR1
        !            33:        if (tTf(24, 0))
        !            34:                printf("getting btree tid for lid %ld in rootpage %d\n", lid, rootpage);
        !            35: #      endif
        !            36: 
        !            37:        
        !            38:        if (lid <= 0)
        !            39:                return(-2);     /* negative lids nonexistent */
        !            40: 
        !            41:        get_node(rootpage, &p);
        !            42:        pgno = rootpage;
        !            43:        sum = 0;
        !            44:        t = 0;
        !            45: 
        !            46:        /* find the leaf node containing desired tid */
        !            47:        while (p.nodetype != 'L')
        !            48:        {
        !            49:                if (t == -1)
        !            50:                        /* continue along path to very last lid */
        !            51:                        i = p.nelmts - 1;
        !            52:                else
        !            53:                {
        !            54:                        /* find pointer in node which will lead down to proper leaf */
        !            55:                        for (i = 0, k = p.node.intnode.key[0]; sum + k < lid && i < p.nelmts; )
        !            56:                        {
        !            57:                                sum += k;
        !            58:                                ++i;
        !            59:                                if (i < p.nelmts)
        !            60:                                        k = p.node.intnode.key[i];
        !            61:                        }
        !            62:        
        !            63:                        if (i >= p.nelmts)
        !            64:                        {
        !            65:                                if (sum < lid - 1)
        !            66:                                        return(-2);     /* lid doesn't exist */
        !            67:                                else
        !            68:                                {
        !            69:                                        --i;
        !            70:                                        t = -1;
        !            71:                                }
        !            72:                        }
        !            73:                }
        !            74: 
        !            75:                pgno = p.node.intnode.ptr[i];
        !            76:                get_node(pgno, &p);
        !            77:        }
        !            78: 
        !            79:        if (t == -1)
        !            80:                /* new lid is to be inserted at very last leaf position */
        !            81:                tid_id->offset = p.nelmts;
        !            82:        else
        !            83:        {
        !            84:                /* search through the leaf for the proper tid */
        !            85:                for (i = 0, ++sum, t = p.node.leafnode.tid_pos[p.node.leafnode.tid_loc[0]]; sum < lid && i < p.nelmts; )
        !            86:                {
        !            87:                        ++sum;
        !            88:                        ++i;
        !            89:                        if (i < p.nelmts)
        !            90:                                t = p.node.leafnode.tid_pos[p.node.leafnode.tid_loc[i]];
        !            91:                }
        !            92:                if (i >= p.nelmts)
        !            93:                {
        !            94:                        if (sum < lid)
        !            95:                                return(-2);     /* lid doesn't exist */
        !            96:                        else
        !            97:                                t = -1;
        !            98:                }
        !            99:                tid_id->offset = i;
        !           100:        }
        !           101: 
        !           102:        bmove(&p, &tid_id->page, sizeof p);
        !           103:        tid_id->pageno = pgno;
        !           104: 
        !           105: #      ifdef xATR1
        !           106:        if (tTf(24, 0))
        !           107:        {
        !           108:                printf("Main relation tid found in tree:");
        !           109:                dumptid(&t);
        !           110:                printf("Btree tid location:");
        !           111:                dumptid(tid_id);
        !           112:        }
        !           113: #      endif
        !           114: 
        !           115:        return(t);
        !           116: }

unix.superglobalmegacorp.com

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