Annotation of 42BSD/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      <sccs.h>
        !             9: 
        !            10: SCCSID(@(#)modupdate.c 7.1     2/5/81)
        !            11: 
        !            12: /*
        !            13: ** MODUPDATE
        !            14: **     This routine is used to exicute the updates 
        !            15: **     for modifies so they are recoverable.
        !            16: **     It is also used by restore to complete an aborted modify.
        !            17: **     During a restore the Batch_recover flag should be set to 1;
        !            18: */
        !            19: 
        !            20: 
        !            21: modupdate()
        !            22: {
        !            23:        char                    batchname[MAXNAME + 3];
        !            24:        char                    temprel[MAXNAME+ 3];
        !            25:        char                    relfile[MAXNAME + 3];
        !            26:        register int            i;
        !            27:        register int            j;
        !            28:        struct stat             sbuf;
        !            29:        char                    aflag;
        !            30:        struct tup_id           tid;
        !            31:        DESC                    desx;
        !            32:        struct attribute        atttup;
        !            33:        struct relation         oldreltup;
        !            34:        struct index            ikey, itup;
        !            35:        PARM                    newpv[2];
        !            36:        extern DESC             Inddes, Attdes, Reldes;
        !            37:        register DESC           *desp;
        !            38:        extern char             *trim_relname();
        !            39:        extern int              errno;
        !            40: 
        !            41: 
        !            42:        desp =  &desx;
        !            43:        concat(MODBATCH,Fileset,batchname);
        !            44:        concat(MODTEMP, Fileset, temprel);
        !            45: 
        !            46: #      ifdef xZTR1
        !            47:        if (tTf(34, 8))
        !            48:                printf("Modupdate: %s, %s\n",batchname, temprel);
        !            49: #      endif
        !            50:        if ((Batch_fp = open(batchname, 0)) < 0)
        !            51:                syserr("MODUPDATE:Can't open %s", batchname);
        !            52:        Batch_cnt = BATCHSIZE;
        !            53:        Batch_dirty = FALSE;
        !            54:        getbatch(desp, sizeof *desp);
        !            55:        ingresname(desp->reldum.relid, desp->reldum.relowner, relfile);
        !            56: 
        !            57:        /* don't loose old file before verifying new file */
        !            58:        if (stat(temprel, &sbuf) >= 0)
        !            59:        {
        !            60:                unlink(relfile);        /* Ok if failure */
        !            61:                errno = 0;
        !            62:                if (link(temprel, relfile) == -1)
        !            63:                        syserr("MODUPDATE:Can't link: %s, %s", temprel, relfile);
        !            64:                if (unlink(temprel) < 0)
        !            65:                        syserr("modupdate:unlink(%s)", temprel);
        !            66:        }
        !            67: 
        !            68:        else
        !            69:                if(stat(relfile, &sbuf) < 0 || !Batch_recovery)
        !            70:                        syserr("MODUPDATE:Relation and/or temporary files for %s are missing",
        !            71:                                relfile);
        !            72: 
        !            73: 
        !            74:        /* Update admin if this is relation or atribute relations */
        !            75:        /* Should only happen in Sysmod                           */
        !            76:        if ((aflag = bequal(desp->reldum.relid, "attribute   ", 12)) ||
        !            77:                bequal(desp->reldum.relid, "relation    ", 12))
        !            78:        {
        !            79:                ingresname(desp->reldum.relid, desp->reldum.relowner, temprel);
        !            80:                if ((i = open("admin", 2)) < 0)
        !            81:                        syserr("MODUPDATE:Can't open admin file");
        !            82:                if (lseek(i, (long) sizeof Admin.adhdr, 0) < 0 ||
        !            83:                        (aflag && lseek(i, (long) sizeof *desp, 1) < 0))
        !            84:                        syserr("MODUPDATE:Seek error");
        !            85:                if (write(i, desp, sizeof *desp) != sizeof *desp)
        !            86:                        syserr("MODUPDATE:Write error on admin");
        !            87:                close(i);
        !            88: 
        !            89:                if (aflag)
        !            90:                {
        !            91:                        closer(&Attdes);
        !            92:                        cleanrel(&Admin.adattd);
        !            93:                        close(Admin.adattd.relfp);
        !            94:                        bmove(desp, &Admin.adattd, sizeof *desp);
        !            95:                        ingresname(Admin.adattd.reldum.relid, Admin.adattd.reldum.relowner, temprel);
        !            96:                        if ((Admin.adattd.relfp = open(temprel, 2)) < 0)
        !            97:                                syserr("MODUPDATE: open wr Admin.adattd %d", Admin.adattd.relfp);
        !            98:                        Admin.adattd.relopn = (Admin.adattd.relfp + 1) * -5;
        !            99:                }
        !           100:                else
        !           101:                {
        !           102:                        closer(&Reldes);
        !           103:                        cleanrel(&Admin.adreld);
        !           104:                        close(Admin.adreld.relfp);
        !           105:                        bmove(desp, &Admin.adreld, sizeof *desp);
        !           106:                        if ((Admin.adreld.relfp = open(temprel, 2)) < 0)
        !           107:                                syserr("MODUPDATE: open Admin.adreld %d",
        !           108:                                        Admin.adreld.relfp);
        !           109:                        Admin.adreld.relopn = (Admin.adreld.relfp + 1) * -5;
        !           110:                }
        !           111:        }
        !           112: 
        !           113:        if (i = get(&Admin.adreld, &desp->reltid, &desp->reltid, &oldreltup, FALSE))
        !           114:                syserr("MODUPDATE: get oldrel=%d",i);
        !           115:        /* update relation relation */
        !           116: 
        !           117:        if ((i = replace(&Admin.adreld, &desp->reltid, desp, FALSE)))
        !           118:                if (i < 0 || i == 2)
        !           119:                        syserr("MODUPDATE:Replace error(rel): %d", i);
        !           120:        if (i = cleanrel(&Admin.adreld))
        !           121:                syserr("MODUPDATE:clean rel %d", i);
        !           122: 
        !           123:        /* update attribute relation */
        !           124:        Admin.adattd.relopn = (Admin.adattd.relfp + 1) * -5;
        !           125:        for (i = desp->reldum.relatts; i > 0; i--)
        !           126:        {
        !           127:                getbatch(&tid, sizeof tid);
        !           128:                getbatch(&atttup, sizeof atttup);
        !           129:                if (j = replace(&Admin.adattd, &tid, &atttup, FALSE))
        !           130:                        if (j < 0 || j == 2)
        !           131:                                syserr("MODUPDATE:Replace error(att): %d", j);
        !           132:        }
        !           133: 
        !           134:        if (i = cleanrel(&Admin.adattd))
        !           135:                syserr("MODUPDATE:clean att %d", i);
        !           136: 
        !           137:        /* make the admin readonly */
        !           138:        Admin.adattd.relopn = (Admin.adattd.relfp + 1) * 5;
        !           139: 
        !           140:        close(Batch_fp);
        !           141: 
        !           142:        /* if this is an index, change the relspec in the index catalog */
        !           143:        if (oldreltup.relindxd < 0)
        !           144:        {
        !           145:                opencatalog("indexes", 2);
        !           146:                setkey(&Inddes, &ikey, desp->reldum.relid, IRELIDI);
        !           147:                setkey(&Inddes, &ikey, desp->reldum.relowner, IOWNERP);
        !           148:                if ((i = getequal(&Inddes, &ikey, &itup, &tid)) == 0)
        !           149:                {
        !           150:                        itup.irelspeci = desp->reldum.relspec;
        !           151:                        if ((i = replace(&Inddes, &tid, &itup, 0)) != 0)
        !           152:                                if (i < 0 || i == 2)
        !           153:                                        syserr("MODUPDATE: rep(ix) %d", i);
        !           154:                }
        !           155:        }
        !           156: 
        !           157:        else if(desp->reldum.relindxd > 0)
        !           158:        {
        !           159:                /* destroy any secondary indexes on this primary */
        !           160:                opencatalog("indexes", 2);
        !           161:                setkey(&Inddes, &ikey, desp->reldum.relid, IRELIDP);
        !           162:                setkey(&Inddes, &ikey, desp->reldum.relowner, IOWNERP);
        !           163:                while ((i = getequal(&Inddes, &ikey, &itup, &tid)) == 0)
        !           164:                {
        !           165:                        newpv[0].pv_val.pv_str = itup.irelidi;
        !           166:                        newpv[1].pv_type = PV_EOF;
        !           167:                        printf("destroying secondary index %s\n", trim_relname(itup.irelidi));
        !           168:                        if (destroy(1, newpv))
        !           169:                                syserr("MODUPDATE:Can't destroy %s", itup.irelidi);
        !           170:                }
        !           171:        }
        !           172:        if (i < 0)
        !           173:                syserr("MODUPDATE: geteq(ix)b %d", i);
        !           174: 
        !           175:        /* clean things up and exit */
        !           176:        unlink(batchname);
        !           177: #      ifdef xZTR1
        !           178:        if (tTf(34, 8))
        !           179:                printf("Leaving modupdate\n");
        !           180: #      endif
        !           181:        return (0);
        !           182: }

unix.superglobalmegacorp.com

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