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

1.1     ! root        1: # include      <pv.h>
        !             2: # include      <ingres.h>
        !             3: # include      <aux.h>
        !             4: # include      <catalog.h>
        !             5: # include      <access.h>
        !             6: # include      <batch.h>
        !             7: # include      <opsys.h>
        !             8: # include      <btree.h>
        !             9: # include      <symbol.h>
        !            10: # include      <sccs.h>
        !            11: 
        !            12: SCCSID(@(#)modupdate.c 8.4     1/18/85)
        !            13: 
        !            14: /*
        !            15: ** MODUPDATE
        !            16: **     This routine is used to exicute the updates 
        !            17: **     for modifies so they are recoverable.
        !            18: **     It is also used by restore to complete an aborted modify.
        !            19: **     During a restore the Batch_recover flag should be set to 1;
        !            20: */
        !            21: 
        !            22: 
        !            23: modupdate()
        !            24: {
        !            25:        char                    batchname[MAXNAME + 3];
        !            26:        char                    temprel[MAXNAME+ 3];
        !            27:        char                    relfile[MAXNAME + 3];
        !            28:        char                    btreesec[MAXNAME + 3];
        !            29:        register int            i;
        !            30:        register int            j;
        !            31:        struct stat             sbuf;
        !            32:        char                    aflag;
        !            33:        struct tup_id           tid;
        !            34:        DESC                    desx;
        !            35:        struct attribute        attkey, atttup;
        !            36:        struct relation         oldreltup;
        !            37:        struct index            ikey, itup;
        !            38:        PARM                    newpv[2];
        !            39:        extern DESC             Inddes, Attdes, Reldes;
        !            40:        register DESC           *desp;
        !            41:        extern char             *trim_relname();
        !            42:        extern int              errno;
        !            43:        char                    btree[MAXNAME + 4], temp_btree[MAXNAME + 4];
        !            44:        int                     numatts, key;
        !            45:        extern int              NLidKeys;
        !            46: 
        !            47:        desp =  &desx;
        !            48:        concat(MODBATCH,Fileset,batchname);
        !            49:        concat(MODTEMP, Fileset, temprel);
        !            50: 
        !            51: #      ifdef xZTR1
        !            52:        if (tTf(34, 8))
        !            53:                printf("Modupdate: %s, %s\n",batchname, temprel);
        !            54: #      endif
        !            55:        if ((Batch_fp = open(batchname, O_RDONLY)) < 0)
        !            56:                syserr("MODUPDATE:Can't open %s", batchname);
        !            57:        Batch_cnt = BATCHSIZE;
        !            58:        Batch_dirty = FALSE;
        !            59:        getbatch(desp, sizeof *desp);
        !            60:        ingresname(desp->reldum.relid, desp->reldum.relowner, relfile);
        !            61: 
        !            62:        if (!desp->reldum.reldim || NLidKeys > 0)
        !            63:        {
        !            64:                /* don't loose old file before verifying new file */
        !            65:                if (stat(temprel, &sbuf) >= 0)
        !            66:                {
        !            67:                        unlink(relfile);        /* Ok if failure */
        !            68:                        errno = 0;
        !            69:                        if (link(temprel, relfile) == -1)
        !            70:                                syserr("MODUPDATE:Can't link: %s, %s", temprel, relfile);
        !            71:                        if (unlink(temprel) < 0)
        !            72:                                syserr("modupdate:unlink(%s)", temprel);
        !            73:                }
        !            74:        
        !            75:                else
        !            76:                        if(stat(relfile, &sbuf) < 0 || !Batch_recovery)
        !            77:                                syserr("MODUPDATE:Relation and/or temporary files for %s are missing",
        !            78:                                        relfile);
        !            79:        }
        !            80: 
        !            81:        /* Update admin if this is relation or atribute relations */
        !            82:        /* Should only happen in Sysmod                           */
        !            83:        if ((aflag = bequal(desp->reldum.relid, "attribute   ", MAXNAME)) ||
        !            84:                bequal(desp->reldum.relid, "relation    ", MAXNAME))
        !            85:        {
        !            86:                ingresname(desp->reldum.relid, desp->reldum.relowner, temprel);
        !            87:                if ((i = open("admin", O_RDWR)) < 0)
        !            88:                        syserr("MODUPDATE:Can't open admin file");
        !            89:                if (lseek(i, (long) sizeof Admin.adhdr, 0) < 0 ||
        !            90:                        (aflag && lseek(i, (long) sizeof *desp, 1) < 0))
        !            91:                        syserr("MODUPDATE:Seek error");
        !            92:                if (write(i, desp, sizeof *desp) != sizeof *desp)
        !            93:                        syserr("MODUPDATE:Write error on admin");
        !            94:                close(i);
        !            95: 
        !            96:                if (aflag)
        !            97:                {
        !            98:                        closer(&Attdes);
        !            99:                        cleanrel(&Admin.adattd);
        !           100:                        close(Admin.adattd.relfp);
        !           101:                        bmove(desp, &Admin.adattd, sizeof *desp);
        !           102:                        ingresname(Admin.adattd.reldum.relid, Admin.adattd.reldum.relowner, temprel);
        !           103:                        if ((Admin.adattd.relfp = open(temprel, O_RDWR)) < 0)
        !           104:                                syserr("MODUPDATE: open wr Admin.adattd %d", Admin.adattd.relfp);
        !           105:                        Admin.adattd.relopn = (Admin.adattd.relfp + 1) * -5;
        !           106:                }
        !           107:                else
        !           108:                {
        !           109:                        closer(&Reldes);
        !           110:                        cleanrel(&Admin.adreld);
        !           111:                        close(Admin.adreld.relfp);
        !           112:                        bmove(desp, &Admin.adreld, sizeof *desp);
        !           113:                        if ((Admin.adreld.relfp = open(temprel, O_RDWR)) < 0)
        !           114:                                syserr("MODUPDATE: open Admin.adreld %d",
        !           115:                                        Admin.adreld.relfp);
        !           116:                        Admin.adreld.relopn = (Admin.adreld.relfp + 1) * -5;
        !           117:                }
        !           118:        }
        !           119: 
        !           120:        if (i = get(&Admin.adreld, &desp->reltid, &desp->reltid, &oldreltup, FALSE))
        !           121:                syserr("MODUPDATE: get oldrel=%d",i);
        !           122: 
        !           123:        btreename(desp->reldum.relid, btree);
        !           124:        if (oldreltup.reldim > 0)
        !           125:        /* relation formerly ordered */
        !           126:        {
        !           127:                capital(trim_relname(desp->reldum.relid), btreesec);
        !           128:                newpv[0].pv_val.pv_str = btreesec;
        !           129:                newpv[1].pv_type = PV_EOF;
        !           130:                if (destroy(1, newpv))
        !           131:                        syserr("can't destroy btreesec");
        !           132:                unlink(btree);
        !           133: 
        !           134:                /* remove tuple corresponding to LID field from attribute
        !           135:                ** relation
        !           136:                */
        !           137:                setkey(&Admin.adattd, &attkey, desp->reldum.relid, ATTRELID);
        !           138:                setkey(&Admin.adattd, &attkey, desp->reldum.relowner, ATTOWNER);
        !           139:                numatts = oldreltup.relatts - oldreltup.reldim + 1;
        !           140:                for (i = oldreltup.reldim; i > 0; i--, numatts++)
        !           141:                {
        !           142:                        setkey(&Admin.adattd, &attkey, &numatts, ATTID);
        !           143:                        if (getequal(&Admin.adattd, &attkey, &atttup, &tid) == 0)
        !           144:                                if (delete(&Admin.adattd, &tid) < 0)
        !           145:                                        syserr("MODUPDATE: Can't delete LID field from attribute relation");
        !           146:                }
        !           147:        }
        !           148: 
        !           149:        /* update attribute relation */
        !           150: 
        !           151:        Admin.adattd.relopn = (Admin.adattd.relfp + 1) * -5;
        !           152:        numatts = desp->reldum.relatts - desp->reldum.reldim;
        !           153:        for (i = numatts; i > 0; i--)
        !           154:        {
        !           155:                getbatch(&tid, sizeof tid);
        !           156:                getbatch(&atttup, sizeof atttup);
        !           157:                if (j = replace(&Admin.adattd, &tid, &atttup, FALSE))
        !           158:                        if (j < 0 || j == 2)
        !           159:                                syserr("MODUPDATE:Replace error(att): %d", j);
        !           160:        }
        !           161: 
        !           162:        for (i = desp->reldum.reldim; i > 0; i--)
        !           163:        {
        !           164:                /* insert tuple corresponding to LID field into attribute relation */
        !           165:                getbatch(&atttup, sizeof atttup);
        !           166:                if ((j = insert(&Admin.adattd, &tid, &atttup, FALSE) < 0))
        !           167:                        syserr("MODUPDATE: Insert error (att): %d", j);
        !           168:        }
        !           169: 
        !           170:        unlink(batchname);
        !           171: 
        !           172:        if (i = cleanrel(&Admin.adattd))
        !           173:                syserr("MODUPDATE:clean att %d", i);
        !           174: 
        !           175:        /* update relation relation */
        !           176: 
        !           177:        if ((i = replace(&Admin.adreld, &desp->reltid, desp, FALSE)))
        !           178:                if (i < 0 || i == 2)
        !           179:                        syserr("MODUPDATE:Replace error(rel): %d", i);
        !           180: 
        !           181:        if (i = cleanrel(&Admin.adreld))
        !           182:                syserr("MODUPDATE:clean rel %d", i);
        !           183: 
        !           184:        if (desp->reldum.reldim > 0)
        !           185:        /* link temporary BTree file to permanent storage */
        !           186:        {
        !           187:                concat(BTREE, Fileset, temp_btree);
        !           188:                if (link(temp_btree, btree) == -1)
        !           189:                        syserr("MODUPDATE: can't link: %s, %s", temp_btree, btree);
        !           190:                if (unlink(temp_btree) < 0)
        !           191:                        syserr("modupdate: unlink %s", temp_btree);
        !           192:        }
        !           193: 
        !           194:        /* make the admin readonly */
        !           195:        Admin.adattd.relopn = (Admin.adattd.relfp + 1) * 5;
        !           196: 
        !           197:        close(Batch_fp);
        !           198: 
        !           199:        /* if this is an index, change the relspec in the index catalog */
        !           200:        if (oldreltup.relindxd == SECINDEX)
        !           201:        {
        !           202:                opencatalog("indexes", OR_WRITE);
        !           203:                setkey(&Inddes, &ikey, desp->reldum.relid, IRELIDI);
        !           204:                setkey(&Inddes, &ikey, desp->reldum.relowner, IOWNERP);
        !           205:                if ((i = getequal(&Inddes, &ikey, &itup, &tid)) == 0)
        !           206:                {
        !           207:                        itup.irelspeci = desp->reldum.relspec;
        !           208:                        if ((i = replace(&Inddes, &tid, &itup, 0)) != 0)
        !           209:                                if (i < 0 || i == 2)
        !           210:                                        syserr("MODUPDATE: rep(ix) %d", i);
        !           211:                }
        !           212:        }
        !           213: 
        !           214:        else if (desp->reldum.relindxd == SECBASE)
        !           215:        {
        !           216:                /* destroy any secondary indexes on this primary */
        !           217:                opencatalog("indexes", OR_WRITE);
        !           218:                setkey(&Inddes, &ikey, desp->reldum.relid, IRELIDP);
        !           219:                setkey(&Inddes, &ikey, desp->reldum.relowner, IOWNERP);
        !           220:                while ((i = getequal(&Inddes, &ikey, &itup, &tid)) == 0)
        !           221:                {
        !           222:                        newpv[0].pv_val.pv_str = itup.irelidi;
        !           223:                        newpv[1].pv_type = PV_EOF;
        !           224:                        printf("destroying secondary index %s\n", trim_relname(itup.irelidi));
        !           225:                        if (destroy(1, newpv))
        !           226:                                syserr("MODUPDATE:Can't destroy %s", itup.irelidi);
        !           227:                }
        !           228:        }
        !           229:        if (i < 0)
        !           230:                syserr("MODUPDATE: geteq(ix)b %d", i);
        !           231: 
        !           232:        /* clean things up and exit */
        !           233: #      ifdef xZTR1
        !           234:        if (tTf(34, 8))
        !           235:                printf("Leaving modupdate\n");
        !           236: #      endif
        !           237:        return (0);
        !           238: }

unix.superglobalmegacorp.com

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