Annotation of 42BSD/ingres/source/dbu/modupdate.c, revision 1.1.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.