|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.