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

1.1     ! root        1: # include      <btree.h>
        !             2: # include      <ingres.h>
        !             3: # include      <batch.h>
        !             4: # include      <symbol.h>
        !             5: # include      <sccs.h>
        !             6: 
        !             7: SCCSID(@(#)insert_btree.c      8.1     12/31/84)
        !             8: 
        !             9: /*     INSERT_BTREE -- BTree insertion routine
        !            10: **
        !            11: **     Insert a tid into the BTree at the position corresponding to its lid.
        !            12: **     Split the leaf if necessary and adjust all values up the tree.
        !            13: **
        !            14: **     Parameters :
        !            15: **             tree - BTree filename (I)
        !            16: **             lid - given lid (I)
        !            17: **             tid - tid to be inserted into BTree leaf (I)
        !            18: **             tidpos - location where tid was inserted (O)
        !            19: **
        !            20: **     Returns :
        !            21: **             -1      lid position does not exist
        !            22: **             0       successful insertion
        !            23: */
        !            24: 
        !            25: insert_btree(tree, rootpage, lid, tid, tidpos, create)
        !            26: 
        !            27: char *tree;
        !            28: long rootpage;
        !            29: long lid;
        !            30: long *tid;
        !            31: register TID *tidpos;
        !            32: char create;
        !            33: {
        !            34:        register int            i, j, start;
        !            35:        struct locator          block, p;
        !            36:        struct BTreeNode        newblock, temp, newroot;
        !            37:        short                   rblock, tline;
        !            38:        long                    newpage, tpage;
        !            39:        long                    get_tid(), new_page();
        !            40:        int                     save;
        !            41:        char                    replbatch[MAXNAME + 4];
        !            42:        FILE                    *fp;
        !            43:        TID                     oldtid, newtid;
        !            44:        long                    count, page, childpage;
        !            45:        extern char             *Fileset;
        !            46:        extern DESC             Btreesec;
        !            47: 
        !            48: #      ifdef xATR1
        !            49:        if (tTf(24,0))
        !            50:                printf("inserting lid %ld into btree at rootpage %d", lid, rootpage);
        !            51: #      endif
        !            52: 
        !            53:        /* find location of desired lid in B-Tree */
        !            54:        if (get_tid(rootpage, lid, &block) < -1)
        !            55:                return(-1);
        !            56: 
        !            57:        if (newroot.depth = create)
        !            58:        {
        !            59:                if (save = block.offset)
        !            60:                        newroot.prevtree = block.page.node.leafnode.tid_pos[block.page.node.leafnode.tid_loc[save -1]];
        !            61:                else
        !            62:                {
        !            63:                        if (!block.page.prevtree)
        !            64:                                newroot.prevtree = 0;
        !            65:                        else
        !            66:                        {
        !            67:                                get_node(block.page.prevtree, &temp);
        !            68:                                newroot.prevtree = temp.node.leafnode.tid_pos[temp.node.leafnode.tid_loc[temp.nelmts - 1]];
        !            69:                        }
        !            70:                }
        !            71:                if  (save <= block.page.nelmts - 1 && block.page.nelmts)
        !            72:                        newroot.nexttree = block.page.node.leafnode.tid_pos[block.page.node.leafnode.tid_loc[save]];
        !            73:                else
        !            74:                {
        !            75:                        if (!block.page.nexttree)
        !            76:                                newroot.nexttree = 0;
        !            77:                        else
        !            78:                        {
        !            79:                                get_node(block.page.nexttree, &temp);
        !            80:                                newroot.nexttree = temp.node.leafnode.tid_pos[temp.node.leafnode.tid_loc[0]];
        !            81:                        }
        !            82:                }
        !            83:                *tid = new_page(tree);
        !            84:                if (block.pageno == RT)
        !            85:                        get_node(RT, &block.page);
        !            86:                if (newroot.prevtree)
        !            87:                {
        !            88:                        get_node(newroot.prevtree, &temp);
        !            89:                        temp.nexttree = *tid;
        !            90:                        write_node(newroot.prevtree, &temp);
        !            91:                }
        !            92:                if (newroot.nexttree)
        !            93:                {
        !            94:                        get_node(newroot.nexttree, &temp);
        !            95:                        temp.prevtree = *tid;
        !            96:                        write_node(newroot.nexttree, &temp);
        !            97:                }
        !            98:                stuff_page(&newroot.prttree, &block.pageno);
        !            99:                newroot.nodetype = 'L';
        !           100:                newroot.nelmts = 0;
        !           101:                newroot.parent = 0;
        !           102:                newroot.node.leafnode.prevleaf = 0;
        !           103:                newroot.node.leafnode.nextleaf = 0;
        !           104:                for (i = 0; i < MAXLEAVES; ++i)
        !           105:                        newroot.node.leafnode.tid_loc[i] = newroot.node.leafnode.back_ptr[i] = i;
        !           106:        }
        !           107: 
        !           108:        if (block.page.nelmts != MAXLEAVES)
        !           109:        /* insert tid into its proper position in leaf */
        !           110:        {
        !           111:                save = block.page.node.leafnode.tid_loc[block.page.nelmts];
        !           112:                /* move other tids down to make room for new tid */
        !           113:                for (i = block.page.nelmts - 1; i >= block.offset; --i)
        !           114:                {
        !           115:                        block.page.node.leafnode.tid_loc[i + 1] =
        !           116:                                block.page.node.leafnode.tid_loc[i];
        !           117:                        block.page.node.leafnode.back_ptr[block.page.node.leafnode.tid_loc[i]] = i + 1;
        !           118:                }
        !           119:                block.page.node.leafnode.tid_loc[block.offset] = save;
        !           120:                block.page.node.leafnode.tid_pos[save] = *tid;
        !           121:                block.page.node.leafnode.back_ptr[save] = block.offset;
        !           122:                ++block.page.nelmts;
        !           123:                write_node(block.pageno, &block.page);
        !           124:                if (create)
        !           125:                        newroot.prttree.line_id = save;
        !           126: 
        !           127:                /* trace up B-Tree, incrementing key values */
        !           128:                tracepath(rootpage, &block, 1);
        !           129: 
        !           130:                tpage = block.pageno;
        !           131:                tline = save;
        !           132:        }
        !           133: 
        !           134:        else
        !           135:        /* leaf is full, must be split */
        !           136:        {
        !           137:                /* determine where to split leaf */
        !           138:                start = MAXLEAVES / 2;
        !           139:                rblock = 0;
        !           140: 
        !           141:                if (block.offset > start)
        !           142:                /* new tid will be inserted in the new leaf */
        !           143:                {               
        !           144:                        ++start;
        !           145:                        rblock = 1;
        !           146:                }
        !           147: 
        !           148:                /* readjust all values in the old leaf and assign them for
        !           149:                ** the new leaf */
        !           150: 
        !           151:                block.page.nelmts = start;      /* assume new tid will be
        !           152:                                                ** inserted into new leaf */
        !           153:                newpage = new_page(tree);
        !           154:                newblock.nodetype = 'L';
        !           155:                for (i = 0; i < MAXLEAVES; ++i)
        !           156:                        newblock.node.leafnode.tid_loc[i] = newblock.node.leafnode.back_ptr[i] = i;
        !           157:                newblock.nelmts = MAXLEAVES + 1 - start;
        !           158:                newblock.parent = block.page.parent;
        !           159:                newblock.depth = 0;
        !           160: 
        !           161:                if (newblock.node.leafnode.nextleaf = block.page.node.leafnode.nextleaf)
        !           162:                {
        !           163:                        get_node(newblock.node.leafnode.nextleaf, &temp);
        !           164:                        temp.node.leafnode.prevleaf = newpage;
        !           165:                        write_node(newblock.node.leafnode.nextleaf, &temp);
        !           166:                }
        !           167:                block.page.node.leafnode.nextleaf = newpage;
        !           168:                newblock.node.leafnode.prevleaf = block.pageno;
        !           169: 
        !           170:                /* create file for storing tids that must be replaced in btree
        !           171:                ** secondary relation
        !           172:                */
        !           173:                if (!bequal("_SYS", tree, 4) && !create)
        !           174:                {
        !           175:                        concat(REPL_IN, Fileset, replbatch);
        !           176:                        if ((fp = fopen(replbatch, "w")) == NULL)
        !           177:                                syserr("can't open batch file in insert_btree");
        !           178:                        count = 0;
        !           179:                        stuff_page(&oldtid, &block.pageno);
        !           180:                        stuff_page(&newtid, &newpage);
        !           181:                }
        !           182: 
        !           183:                /* copy the right half of the old leaf onto the new leaf */
        !           184:                for (i = 0, j = start; j < MAXLEAVES || rblock == 1; ++i)
        !           185:                {
        !           186:                        if (j == block.offset && rblock == 1)
        !           187:                        /* current position in new leaf corresponds to position
        !           188:                        ** of new tid */
        !           189:                        {
        !           190:                                newblock.node.leafnode.tid_pos[newblock.node.leafnode.tid_loc[i]] = *tid;
        !           191:                                tline = newblock.node.leafnode.tid_loc[i];
        !           192:                                /* indicate that tid has been inserted */
        !           193:                                rblock = -1;
        !           194:                        }
        !           195:                        else
        !           196:                        {
        !           197:                                childpage = newblock.node.leafnode.tid_pos[newblock.node.leafnode.tid_loc[i]] =
        !           198:                                        block.page.node.leafnode.tid_pos[block.page.node.leafnode.tid_loc[j]];
        !           199:                                if (create)
        !           200:                                {
        !           201:                                        get_node(childpage, &temp);
        !           202:                                        stuff_page(&temp.prttree, &newpage);
        !           203:                                        temp.prttree.line_id = newblock.node.leafnode.tid_loc[i];
        !           204:                                        write_node(childpage, &temp);
        !           205:                                }
        !           206:                                if (!bequal("_SYS", tree, 4) && !create)
        !           207:                                {
        !           208:                                        oldtid.line_id = block.page.node.leafnode.tid_loc[j];
        !           209:                                        newtid.line_id = newblock.node.leafnode.tid_loc[i];
        !           210:                                        if (fwrite(&oldtid, 1, LIDSIZE, fp) != LIDSIZE)
        !           211:                                                syserr("write error in insert_btree");
        !           212:                                        if (fwrite(&newtid, 1, LIDSIZE, fp) != LIDSIZE)
        !           213:                                                syserr("write error in insert_btree");
        !           214:                                        ++count;
        !           215:                                }
        !           216:                                ++j;
        !           217:                        }
        !           218:                }
        !           219:                if (!bequal("_SYS", tree, 4) && !create)
        !           220:                {
        !           221:                        fclose(fp);
        !           222:                        repl_btree(replbatch, count);
        !           223:                }
        !           224: 
        !           225:                if (!rblock)
        !           226:                /* new tid belongs in old leaf, insert it into its proper 
        !           227:                ** position */
        !           228:                {
        !           229:                        save = block.page.node.leafnode.tid_loc[block.page.nelmts];
        !           230:                        for (i = block.page.nelmts - 1; i >= block.offset; --i)
        !           231:                        {
        !           232:                                block.page.node.leafnode.tid_loc[i + 1] =
        !           233:                                        block.page.node.leafnode.tid_loc[i];
        !           234:                                block.page.node.leafnode.back_ptr[block.page.node.leafnode.tid_loc[i]] = i + 1;
        !           235:                        }
        !           236:                        block.page.node.leafnode.tid_loc[block.offset] = save;
        !           237:                        block.page.node.leafnode.tid_pos[save] = *tid;
        !           238:                        block.page.node.leafnode.back_ptr[save] = block.offset;
        !           239:                        tline = save;
        !           240:                        /* readjust element counts to reflect that tid has been
        !           241:                        ** placed in the old leaf */
        !           242:                        ++block.page.nelmts;
        !           243:                        --newblock.nelmts;
        !           244:                }
        !           245: 
        !           246:                if (block.pageno == rootpage)
        !           247:                {
        !           248:                        /* split leaf was the root, a new level to the B-Tree
        !           249:                        ** must be added */
        !           250:                        rootsplit(tree, rootpage, &block, newpage, block.page.nelmts, newblock.nelmts);
        !           251:                        newblock.parent = rootpage;
        !           252:                        write_node(block.pageno, &block.page);
        !           253:                        newblock.node.leafnode.prevleaf = block.pageno;
        !           254:                        write_node(newpage, &newblock);
        !           255: 
        !           256:                        if (create)
        !           257:                        {
        !           258:                                for (i = 0; i < block.page.nelmts; ++ i)
        !           259:                                {
        !           260:                                        get_node(block.page.node.leafnode.tid_pos[block.page.node.leafnode.tid_loc[i]], &temp);
        !           261:                                        stuff_page(&temp.prttree, &block.pageno);
        !           262:                                        write_node(block.page.node.leafnode.tid_pos[block.page.node.leafnode.tid_loc[i]], &temp);
        !           263:                                }
        !           264:                        }
        !           265:                        /* btree page has changed */
        !           266:                        if (!bequal("_SYS", tree, 4) && !create)
        !           267:                        {
        !           268:                                concat(REPL_IN, Fileset, replbatch);
        !           269:                                if ((fp = fopen(replbatch, "w")) == NULL)
        !           270:                                        syserr("can't open batch file in insert_btree");
        !           271:                                count = 0;
        !           272:                                page = 0l;
        !           273:                                stuff_page(&oldtid, &page);
        !           274:                                stuff_page(&newtid, &block.pageno);
        !           275:                                for (i = 0; i < block.page.nelmts; ++i)
        !           276:                                {
        !           277:                                        if (rblock || block.page.node.leafnode.tid_loc[i] != tline)
        !           278:                                        {
        !           279:                                                oldtid.line_id = newtid.line_id = block.page.node.leafnode.tid_loc[i];
        !           280:                                                if (fwrite(&oldtid, 1, LIDSIZE, fp) != LIDSIZE)
        !           281:                                                        syserr("write error in insert_btree");
        !           282:                                                if (fwrite(&newtid, 1, LIDSIZE, fp) != LIDSIZE)
        !           283:                                                        syserr("write error in insert_btree");
        !           284:                                                ++count;
        !           285:                                        }
        !           286:                                }
        !           287:                                fclose(fp);
        !           288:                                repl_btree(replbatch, count);
        !           289:                        }
        !           290:                }
        !           291:                else
        !           292:                /* insert the pointer and key associated with new leaf into the
        !           293:                ** parent of the old leaf */
        !           294:                {
        !           295:                        write_node(block.pageno, &block.page);
        !           296:                        write_node(newpage, &newblock);
        !           297:                        p.pageno = block.page.parent;
        !           298:                        parentkey(block.pageno, &p);
        !           299:                        p.page.node.intnode.key[p.offset] = block.page.nelmts;
        !           300:                        insert_key(tree, rootpage, newpage, newblock.nelmts, &p);
        !           301:                }
        !           302:                tpage = (rblock) ? newpage : block.pageno;
        !           303:        }
        !           304:        stuff_page(tidpos, &tpage);
        !           305:        tidpos->line_id = tline;
        !           306: 
        !           307:        if (create)
        !           308:                write_node(*tid, &newroot);
        !           309: 
        !           310: }
        !           311: 
        !           312: /*
        !           313: **     Takes a pair of tids from a file and sequentially replaces the
        !           314: **     old tid with the new tid in the secondary btree relation
        !           315: */
        !           316: 
        !           317: repl_btree(replbatch, count)
        !           318: register char *replbatch;
        !           319: long count;
        !           320: {
        !           321:        register int    i, j;
        !           322:        TID             uptid;
        !           323:        DESC            d;
        !           324:        char            tids[2 * LIDSIZE], key[2 * LIDSIZE], newkey[2 * LIDSIZE];
        !           325:        extern DESC     Btreesec;
        !           326: 
        !           327:        if (count > 0)
        !           328:        {
        !           329:                /* set up descriptor for sort */
        !           330:                d.reloff[1] = 0;
        !           331:                d.reloff[2] = LIDSIZE;
        !           332:                d.relfrmt[1] = d.relfrmt[2] = INT;
        !           333:                d.relfrml[1] = d.relfrml[2] = LIDSIZE;
        !           334:                d.relgiven[1] = 1;
        !           335:                d.relgiven[2] = 2;
        !           336:                d.reldum.relspec = M_ORDER;
        !           337:                d.reldum.relatts = 2;
        !           338:                d.reldum.relwid = 2 * LIDSIZE;
        !           339:                sortfile(replbatch, &d, FALSE);
        !           340:                if ((Repl_outfp = fopen(ztack(REPL_OUT, Fileset), "r")) == NULL)
        !           341:                        syserr("can't open replace file after sort in insertbtreee\n");
        !           342:                clearkeys(&Btreesec);
        !           343:                for (i = 0; i < count; ++i)
        !           344:                {
        !           345:                        if (fread(tids, 1, 2 * LIDSIZE, Repl_outfp) != 2 * LIDSIZE)
        !           346:                                syserr("read error in insert_btree");
        !           347:                        setkey(&Btreesec, key, tids, 2);
        !           348:                        if (getequal(&Btreesec, key, newkey, &uptid))
        !           349:                        {
        !           350:                                printup(&Btreesec, key);
        !           351:                                syserr("getequal error in insert_btree");
        !           352:                        }
        !           353:                        /* place new tid in place */
        !           354:                        setkey(&Btreesec, newkey, tids + LIDSIZE, 2);
        !           355:                        if (j = replace(&Btreesec, &uptid, newkey, TRUE))
        !           356:                                if (j == 1)
        !           357:                                        continue;
        !           358:                                else
        !           359:                                        syserr("bad replace in insert_btree");
        !           360:                }
        !           361:                fclose(Repl_outfp);
        !           362:                unlink(replbatch);
        !           363:                unlink(ztack(REPL_OUT, Fileset));
        !           364:        }
        !           365: }
        !           366: 
        !           367: /*     Insert a key/ptr pair into a node, splitting nodes if necessary and
        !           368: **     adjusting values up the tree.
        !           369: **
        !           370: **     Parameters :
        !           371: **             tree - BTree filename (I)
        !           372: **             p - page number of newly formed node (I)
        !           373: **             k - key value of newly formed node (I)
        !           374: **             pkey - information about the node whose ptr/key pair is to
        !           375: **                    be inserted (I, O)
        !           376: */
        !           377: 
        !           378: insert_key(tree, rootpage, p, k, pkey)
        !           379: 
        !           380: char *tree;
        !           381: long rootpage;
        !           382: long p, k;
        !           383: register struct locator *pkey;
        !           384: {
        !           385:        register int            i, j, start;
        !           386:        struct BTreeNode        newblock, temp;
        !           387:        long                    newpage, oldkey, newkey;
        !           388:        struct locator          prt;
        !           389:        short                   rblock;
        !           390:        long                    new_page();
        !           391: 
        !           392:        if (pkey->page.nelmts != MAXPTRS)
        !           393:        /* insert pointer/key pair into proper position in node by moving
        !           394:        ** other pairs down node */
        !           395:        {
        !           396:                for (i = pkey->page.nelmts - 1; i >= pkey->offset + 1; --i)
        !           397:                {
        !           398:                        pkey->page.node.intnode.ptr[i + 1] =
        !           399:                                pkey->page.node.intnode.ptr[i];
        !           400:                        pkey->page.node.intnode.key[i + 1] =
        !           401:                                pkey->page.node.intnode.key[i];
        !           402:                }
        !           403:                ++pkey->page.nelmts;
        !           404:                pkey->page.node.intnode.ptr[pkey->offset + 1] = p;
        !           405:                pkey->page.node.intnode.key[pkey->offset + 1] = k;
        !           406: 
        !           407:                write_node(pkey->pageno, &pkey->page);
        !           408: 
        !           409:                /* trace up B-Tree incrementing keys */ 
        !           410:                tracepath(rootpage, pkey, 1);
        !           411:        }
        !           412: 
        !           413:        else
        !           414:        /* node is full, must be split */
        !           415:        {
        !           416:                /* determine where split will be made */
        !           417:                start = MAXPTRS / 2;
        !           418:                rblock = 0;
        !           419: 
        !           420:                if (pkey->offset + 1 > start)
        !           421:                /* ptr/key pair will be inserted in new node */
        !           422:                {
        !           423:                        ++start;
        !           424:                        rblock = 1;
        !           425:                }
        !           426: 
        !           427:                /* readjust old node values and create new node values */
        !           428:                pkey->page.nelmts = start;
        !           429:                newpage = new_page(tree);
        !           430:                newblock.nodetype = 'I';
        !           431:                newblock.nelmts = MAXPTRS + 1 - start;
        !           432:                newblock.parent = pkey->page.parent;
        !           433:                newblock.depth = 0;
        !           434: 
        !           435:                /* copy right side of old node into new node */
        !           436: 
        !           437:                for (i = 0, j = start; j < MAXPTRS || rblock == 1; ++i)
        !           438:                {
        !           439:                        if (j == pkey->offset + 1 && rblock == 1)
        !           440:                        /* node position corresponds to that of new ptr/key pair */
        !           441:                        {
        !           442:                                newblock.node.intnode.ptr[i] = p;
        !           443:                                newblock.node.intnode.key[i] = k;
        !           444:                                /* make sure children of newblock have proper
        !           445:                                ** parent */
        !           446:                                get_node(p, &temp);
        !           447:                                temp.parent = newpage;
        !           448:                                write_node(p, &temp);
        !           449: 
        !           450:                                rblock = -1;
        !           451:                        }
        !           452:                        else
        !           453:                        {
        !           454:                                newblock.node.intnode.ptr[i] =
        !           455:                                        pkey->page.node.intnode.ptr[j];
        !           456:                                newblock.node.intnode.key[i] =
        !           457:                                        pkey->page.node.intnode.key[j];
        !           458:                                /* make sure children of newblock have proper
        !           459:                                ** parent */
        !           460:                                get_node(newblock.node.intnode.ptr[i], &temp);
        !           461:                                temp.parent = newpage;
        !           462:                                write_node(newblock.node.intnode.ptr[i], &temp);
        !           463:                                ++j;
        !           464:                        }
        !           465:                }
        !           466: 
        !           467:                if (!rblock)
        !           468:                /* insert new ptr/key pair into proper position in old node */
        !           469:                {
        !           470:                        for (i = pkey->page.nelmts - 1; i >= pkey->offset + 1; --i)
        !           471:                        {
        !           472:                                pkey->page.node.intnode.ptr[i + 1] =
        !           473:                                        pkey->page.node.intnode.ptr[i];
        !           474:                                pkey->page.node.intnode.key[i + 1] =
        !           475:                                        pkey->page.node.intnode.key[i];
        !           476:                        }
        !           477:                        pkey->page.node.intnode.ptr[pkey->offset + 1] = p;
        !           478:                        pkey->page.node.intnode.key[pkey->offset + 1] = k;
        !           479:                        ++pkey->page.nelmts;
        !           480:                        --newblock.nelmts;
        !           481:                }
        !           482: 
        !           483:                /* calculate the key values of the old and new nodes */
        !           484:                oldkey = 0;
        !           485:                for (i = 0; i < pkey->page.nelmts; ++i)
        !           486:                        oldkey += pkey->page.node.intnode.key[i];
        !           487:                newkey = 0;
        !           488:                for (i = 0; i < newblock.nelmts; ++i)
        !           489:                        newkey += newblock.node.intnode.key[i];
        !           490: 
        !           491:                if (pkey->pageno == rootpage)
        !           492:                {
        !           493:                        /* split node was root, add a new level to B-Tree */
        !           494:                        rootsplit(tree, rootpage, pkey, newpage, oldkey, newkey);
        !           495:                        newblock.parent = rootpage;
        !           496:                        write_node(pkey->pageno, &pkey->page);
        !           497:                        write_node(newpage, &newblock);
        !           498:                }
        !           499: 
        !           500:                else
        !           501:                /* recursively add ptr/key pair corresponding to new node into
        !           502:                ** the parent of the old node */
        !           503:                {
        !           504:                        write_node(pkey->pageno, &pkey->page);
        !           505:                        write_node(newpage, &newblock);
        !           506:                        prt.pageno = pkey->page.parent;
        !           507:                        parentkey(pkey->pageno, &prt);
        !           508:                        prt.page.node.intnode.key[prt.offset] = oldkey;
        !           509:                        insert_key(tree, rootpage, newpage, newkey, &prt);
        !           510:                }
        !           511:        }
        !           512: }
        !           513: 
        !           514: /*     Form a new root with two children since the old root was split.
        !           515: **
        !           516: **     Parameters :
        !           517: **             tree - BTree filename (I)
        !           518: **             oldroot - split root (I, O)
        !           519: **             rpageno - page number of new root's right child (I)
        !           520: **             rkey - key of new root's right child (I)
        !           521: */
        !           522: 
        !           523: rootsplit(tree, rootpage, oldroot, rpageno, lkey, rkey)
        !           524: 
        !           525: char *tree;
        !           526: long rootpage;
        !           527: register struct locator *oldroot;
        !           528: long rpageno, lkey, rkey;
        !           529: {
        !           530:        struct BTreeNode        newroot, temp;
        !           531:        long                    i;
        !           532: 
        !           533:        /* get a new page for the former root */
        !           534:        oldroot->pageno = new_page(tree);
        !           535: 
        !           536:        newroot.depth = oldroot->page.depth;
        !           537:        newroot.prevtree = oldroot->page.prevtree;
        !           538:        newroot.nexttree = oldroot->page.nexttree;
        !           539:        bmove(&oldroot->page.prttree, &newroot.prttree, LIDSIZE);
        !           540:        newroot.nodetype = 'I';
        !           541:        newroot.nelmts = 2;
        !           542:        newroot.parent = oldroot->page.parent;
        !           543:        oldroot->page.parent = rootpage;
        !           544:        oldroot->page.depth = 0;
        !           545:        newroot.node.intnode.key[0] = lkey;
        !           546:        newroot.node.intnode.ptr[0] = oldroot->pageno;
        !           547:        newroot.node.intnode.key[1] = rkey;
        !           548:        newroot.node.intnode.ptr[1] = rpageno;
        !           549: 
        !           550:        write_node(rootpage, &newroot);
        !           551: 
        !           552:        if (oldroot->page.nodetype == 'I')
        !           553:                /* make sure the children of the oldroot have the correct parent */
        !           554:                for (i = 0; i < oldroot->page.nelmts; ++i)
        !           555:                {
        !           556:                        get_node(oldroot->page.node.intnode.ptr[i], &temp);
        !           557:                        temp.parent = oldroot->pageno;
        !           558:                        write_node(oldroot->page.node.intnode.ptr[i], &temp);
        !           559:                }
        !           560: }

unix.superglobalmegacorp.com

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