Annotation of 43BSD/ingres/source/dbu/btreeupdate.c, revision 1.1

1.1     ! root        1: # include      <ingres.h>
        !             2: # include      <aux.h>
        !             3: # include      <catalog.h>
        !             4: # include      <symbol.h>
        !             5: # include      <access.h>
        !             6: # include      <batch.h>
        !             7: # include      <btree.h>
        !             8: # include      <sccs.h>
        !             9: 
        !            10: SCCSID(@(#)btreeupdate.c       8.3     1/18/85)
        !            11: 
        !            12: btreeupdate(r)
        !            13: register DESC  *r;
        !            14: {
        !            15:        register char   *p;
        !            16:        register int    i;
        !            17:        int             j, domcnt, mode, dom;
        !            18:        long            oldtid, newtid;
        !            19:        long            tupcnt;
        !            20:        long            uptid;
        !            21:        char            oldtup[MAXTUP], newtup[MAXTUP];
        !            22:        char            oldkey[2 * LIDSIZE], newkey[2 * LIDSIZE];
        !            23:        char            dumtup[2 * LIDSIZE];
        !            24:        struct relation rkey, rtup;
        !            25:        DESC            b_desc;
        !            26:        extern DESC     Reldes;
        !            27:        TID             tid, btid;
        !            28:        char            file[MAXNAME + 4], btree[MAXNAME + 4];
        !            29:        long            oldlid[MAXLID], newlid[MAXLID];
        !            30:        struct locator  tidpos;
        !            31:        long            l;
        !            32:        extern int      Btree_fd;
        !            33:        char            *tp;
        !            34:        long            page, t;
        !            35:        int             lidwid;
        !            36:        int             dellevel;
        !            37:        int             compare;
        !            38: 
        !            39: #      ifdef xZTR1
        !            40:        if (tTf(47, 0))
        !            41:                printf("BTREEUPDATE\n");
        !            42: #      endif
        !            43: 
        !            44:        mode = Batchhd.mode_up;
        !            45:        Batch_dirty = FALSE;
        !            46:        opencatalog("relation", OR_READ);
        !            47:        capital(trim_relname(r->reldum.relid), file);
        !            48:        setkey(&Reldes, &rkey, file, RELID);
        !            49:        setkey(&Reldes, &rkey, r->reldum.relowner, RELOWNER);
        !            50: 
        !            51:        if (!getequal(&Reldes, &rkey, &rtup, &tid))
        !            52:        {
        !            53:                if (i = openr(&b_desc, OR_WRITE, file))
        !            54:                        syserr("btreeupdate:can't openr %.12s %d", file, i);
        !            55:                /* reposition batch file to the beginning. */
        !            56:                if ((i = lseek(Batch_fp, 0L, 0)) < 0)
        !            57:                        syserr("secupdate:seek %d %d", i, Batch_fp);
        !            58:                Batch_cnt = BATCHSIZE;
        !            59:                getbatch(&Batchhd, sizeof Batchhd);     /* reread header */
        !            60: 
        !            61:                ingresname(r->reldum.relid, r->reldum.relowner, file);
        !            62:                btreename(file, btree);
        !            63:                if ((Btree_fd = open(btree, O_RDWR)) < 0)
        !            64:                        syserr("btreeupdate: can't open %s", btree);
        !            65: 
        !            66:                /*
        !            67:                ** Start reading the batch file and updating
        !            68:                ** the secondary indexes.
        !            69:                */
        !            70:                l = r->reladds;
        !            71:                tupcnt = Batchhd.num_updts;
        !            72:                lidwid = LIDSIZE * r->reldum.reldim;
        !            73:                dellevel = r->reldum.reldim - 1;
        !            74:                for (j = 0; j < r->reldum.reldim; ++j)
        !            75:                {
        !            76:                        if (Repl_cnt[j] > 0)
        !            77:                        {
        !            78:                                dellevel = j;
        !            79:                                break;
        !            80:                        }
        !            81:                }
        !            82:                while (tupcnt--)
        !            83:                {
        !            84:                        getbatch(&oldtid, Batchhd.tido_size);
        !            85:                        getbatch(oldtup, Batchhd.tupo_size);
        !            86:                        getbatch(newtup, Batchhd.tupn_size);
        !            87:                        getbatch(&newtid, Batchhd.tidn_size);
        !            88: 
        !            89:                        clearkeys(&b_desc);
        !            90:                        /* if this is a replace or append form the new key */
        !            91:                        if (mode != mdDEL)
        !            92:                        {
        !            93:                                if (newtid < 0)
        !            94:                                        continue;
        !            95:                                tp = newtup + Batchhd.tupn_size - lidwid;
        !            96:                                bmove(tp, newlid, lidwid);
        !            97:                                if (mode == mdREPL)
        !            98:                                {
        !            99:                                        if (newlid[r->reldum.reldim - 1] < 0)
        !           100:                                                continue;
        !           101:                                        tp = oldtup + Batchhd.tupo_size - lidwid;
        !           102:                                        bmove(tp, oldlid, lidwid);
        !           103:                                        compare = 0;
        !           104:                                        for (j = 0; j < r->reldum.reldim; ++j)
        !           105:                                        {
        !           106:                                                if (newlid[j] > oldlid[j])
        !           107:                                                {
        !           108:                                                        compare = 1;
        !           109:                                                }
        !           110:                                                if (newlid[j] != oldlid[j])
        !           111:                                                        break;
        !           112:                                        }
        !           113:                                        if (compare == 1)
        !           114:                                        {
        !           115:                                                for (j = dellevel - 1; j >= 0; --j)
        !           116:                                                {
        !           117:                                                        if (newlid[j] != oldlid[j])
        !           118:                                                        {
        !           119:                                                                compare = 0;
        !           120:                                                                break;
        !           121:                                                        }
        !           122:                                                }
        !           123:                                        }
        !           124:                                        if (compare == 1)
        !           125:                                                /* adjust due to deleted lids */
        !           126:                                                newlid[dellevel] -= Repl_cnt[dellevel];
        !           127:                                }
        !           128:                                page  =  RT;
        !           129:                                for (j = 0; j < r->reldum.reldim; ++j)
        !           130:                                {
        !           131:                                        if (!newlid[j])
        !           132:                                                newlid[j] = 1;
        !           133:                                        t = get_tid(page, newlid[j], &tidpos);
        !           134:                                        page = t;
        !           135:                                }
        !           136:                                if (page != newtid)
        !           137:                                {
        !           138:                                        /* try linear search of btree */
        !           139:                                        lin_search(r->reldum.reldim, newtid, &btid, newlid, Batchhd.num_updts);
        !           140:                                        setkey(&b_desc, newkey, &newtid, 1);
        !           141:                                }
        !           142:                                else
        !           143:                                {
        !           144:                                        setkey(&b_desc, newkey, &newtid, 1);
        !           145:                                        stuff_page(&btid, &tidpos.pageno);
        !           146:                                        btid.line_id = tidpos.page.node.leafnode.tid_loc[tidpos.offset];
        !           147:                                }
        !           148:                                setkey(&b_desc, newkey, &btid, 2);
        !           149: #                              ifdef xZTR1
        !           150:                                if(tTf(47,0))
        !           151:                                {
        !           152:                                        printf("new key\n");
        !           153:                                        printup(&b_desc, newkey);
        !           154:                                }
        !           155: #                              endif
        !           156:                        }
        !           157: 
        !           158:                        /* if this is delete or replace form the old key */
        !           159:                        if (mode != mdAPP)
        !           160:                        {
        !           161:                                setkey(&b_desc, oldkey, &oldtid, 1);
        !           162: #                              ifdef xZTR1
        !           163:                                if(tTf(47,0))
        !           164:                                {
        !           165:                                        printf("old key\n");
        !           166:                                        printup(&b_desc, oldkey);
        !           167:                                }
        !           168: #                              endif
        !           169:                        }
        !           170: 
        !           171:                        switch (mode)
        !           172:                        {
        !           173: 
        !           174:                          case mdDEL:
        !           175:                                if (i = getequal(&b_desc, oldkey, dumtup, &uptid))
        !           176:                                {
        !           177:                                        if (i > 0)
        !           178:                                                break;
        !           179:                                        syserr("btreeupdate:getequal %d", i);
        !           180:                                }
        !           181:                                if ((i = delete(&b_desc, &uptid)) < 0)
        !           182:                                        syserr("btreeupdate:delete %d", i);
        !           183:                                break;
        !           184: 
        !           185:                          case mdREPL:
        !           186:                                /* btree tid not provided */
        !           187:                                b_desc.relgiven[2] = 0;
        !           188:                                if (i = getequal(&b_desc, oldkey, dumtup, &uptid))
        !           189:                                {
        !           190:                                        if (Batch_recovery && i > 0)
        !           191:                                                goto btreeinsert;
        !           192:                                        printup(&b_desc, oldkey);
        !           193:                                        syserr("btreeupdate:getequal-repl %d", i);
        !           194:                                }
        !           195:                                /* btree tid provided */
        !           196:                                b_desc.relgiven[2] = 1;
        !           197:                                if (i = replace(&b_desc, &uptid, newkey, TRUE))
        !           198:                                {
        !           199:                                        /* if newtuple is dup of old, ok */
        !           200:                                        if (i == 1)
        !           201:                                                break;
        !           202:                                        /* if this is recovery and old tid not there, try an insert */
        !           203:                                        if (Batch_recovery && i == 2)
        !           204:                                                goto btreeinsert;
        !           205:                                        syserr("secupdate:replace %d", i);
        !           206:                                }
        !           207:                                break;
        !           208: 
        !           209:                          case mdAPP:
        !           210:                          btreeinsert:
        !           211:                                if ((i = insert(&b_desc, &uptid, newkey, TRUE)) < 0)
        !           212:                                        syserr("secupdate:insert %d", i);
        !           213:                        }
        !           214:                }
        !           215:                if (i = closer(&b_desc))
        !           216:                        syserr("btreeupdate:closer %.12s %d", file, i);
        !           217:                close(Btree_fd);
        !           218:        }
        !           219:        if (i < 0)
        !           220:                syserr("btreeupdate:bad get from indexes %d", i);
        !           221: }

unix.superglobalmegacorp.com

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