|
|
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 <sccs.h> ! 8: ! 9: SCCSID(@(#)secupdate.c 8.3 2/8/85) ! 10: ! 11: /* ! 12: ** SECUPDATE - updates secondary indexes ! 13: ** ! 14: ** ! 15: ** Parameters: ! 16: ** rel - relation being updated ! 17: ** ! 18: ** Return Codes: ! 19: ** 0 ! 20: ** ! 21: ** Trace Flags: ! 22: ** Z49, 49.7 49.8 49.15 ! 23: ** ! 24: ** Called by: ! 25: ** update() ! 26: ** ! 27: */ ! 28: secupdate(r) ! 29: register DESC *r; ! 30: { ! 31: register char *p; ! 32: register int i; ! 33: int j, domcnt, mode, dom; ! 34: long tupcnt; ! 35: long oldtid, newtid; ! 36: long lotid, hitid, uptid; ! 37: char oldtup[MAXTUP], newtup[MAXTUP]; ! 38: char oldkey[MAXTUP], newkey[MAXTUP]; ! 39: char dumtup[MAXTUP]; ! 40: struct index itup; ! 41: DESC si_desc; ! 42: extern DESC Inddes; ! 43: struct key_pt ! 44: { ! 45: char *pt_old; ! 46: char *pt_new; ! 47: }; ! 48: struct key_pt keys[MAXKEYS+1]; ! 49: ! 50: mode = Batchhd.mode_up; ! 51: Batch_dirty = FALSE; ! 52: # ifdef xZTR1 ! 53: if (tTf(49, -1)) ! 54: printf("SECUPDATE\n"); ! 55: # endif ! 56: opencatalog("indexes", OR_READ); ! 57: setkey(&Inddes, &itup, r->reldum.relid, IRELIDP); ! 58: setkey(&Inddes, &itup, r->reldum.relowner, IOWNERP); ! 59: if (i = find(&Inddes, EXACTKEY, &lotid, &hitid, &itup)) ! 60: syserr("secupdate:find indexes %d", i); ! 61: ! 62: /* update each secondary index */ ! 63: while(!(i = get(&Inddes, &lotid, &hitid, &itup, TRUE))) ! 64: { ! 65: /* check if the index is on the right relation */ ! 66: # ifdef xZTR1 ! 67: if (tTf(49, 7)) ! 68: printup(&Inddes, &itup); ! 69: # endif ! 70: if (!bequal(itup.irelidp, r->reldum.relid, MAXNAME) || ! 71: !bequal(itup.iownerp, r->reldum.relowner, 2)) ! 72: continue; ! 73: ! 74: if (i = openr(&si_desc, OR_WRITE, itup.irelidi)) ! 75: syserr("secupdate:can't openr %.12s %d", itup.irelidi, i); ! 76: /* reposition batch file to the beginning. */ ! 77: if ((i = lseek(Batch_fp, 0L, 0)) < 0) ! 78: syserr("secupdate:seek %d %d", i, Batch_fp); ! 79: Batch_cnt = BATCHSIZE; ! 80: getbatch(&Batchhd, sizeof Batchhd); /* reread header */ ! 81: ! 82: /* set up the key structure */ ! 83: p = itup.idom; ! 84: for (domcnt = 0; domcnt < MAXKEYS; domcnt++) ! 85: { ! 86: if ((dom = *p++) == 0) ! 87: break; /* no more key domains */ ! 88: # ifdef xZTR1 ! 89: if (tTf(49, 15)) ! 90: ! 91: printf("dom %d,tupo_off %d\n", dom, Batchhd.si[dom].tupo_off); ! 92: # endif ! 93: keys[domcnt].pt_old = &oldtup[Batchhd.si[dom].tupo_off]; ! 94: keys[domcnt].pt_new = &newtup[r->reloff[dom]]; ! 95: } ! 96: ! 97: /* the last domain is the "tidp" field */ ! 98: keys[domcnt].pt_old = (char *) &oldtid; ! 99: keys[domcnt].pt_new = (char *) &newtid; ! 100: ! 101: /* ! 102: ** Start reading the batch file and updating ! 103: ** the secondary indexes. ! 104: */ ! 105: tupcnt = Batchhd.num_updts; ! 106: while (tupcnt--) ! 107: { ! 108: getbatch(&oldtid, Batchhd.tido_size); ! 109: getbatch(oldtup, Batchhd.tupo_size); ! 110: getbatch(newtup, Batchhd.tupn_size); ! 111: getbatch(&newtid, Batchhd.tidn_size); ! 112: ! 113: /* if this is a replace or append form the new key */ ! 114: if (mode != mdDEL) ! 115: { ! 116: for (j = 0; j <= domcnt; j++) ! 117: setkey(&si_desc, newkey, keys[j].pt_new, j+1); ! 118: # ifdef xZTR1 ! 119: if (tTf(49, 7)) ! 120: printup(&si_desc, newkey); ! 121: # endif ! 122: } ! 123: ! 124: /* if this is delete or replace form the old key */ ! 125: if (mode != mdAPP) ! 126: { ! 127: for (j = 0; j <= domcnt; j++) ! 128: setkey(&si_desc, oldkey, keys[j].pt_old, j+1); ! 129: # ifdef xZTR1 ! 130: if (tTf(49, 8)) ! 131: printup(&si_desc, oldkey); ! 132: # endif ! 133: } ! 134: ! 135: switch (mode) ! 136: { ! 137: ! 138: case mdDEL: ! 139: if (i = getequal(&si_desc, oldkey, dumtup, &uptid)) ! 140: { ! 141: if (i > 0) ! 142: break; ! 143: syserr("secupdate:getequal %d", i); ! 144: } ! 145: if ((i = delete(&si_desc, &uptid)) < 0) ! 146: syserr("secupdate:delete %d", i); ! 147: break; ! 148: ! 149: case mdREPL: ! 150: /* if the newtup = oldtup then do nothing */ ! 151: if (bequal(oldkey, newkey, si_desc.reldum.relwid)) ! 152: break; ! 153: if (i = getequal(&si_desc, oldkey, dumtup, &uptid)) ! 154: { ! 155: if (Batch_recovery && i > 0) ! 156: goto secinsert; ! 157: syserr("secupdate:getequal-repl %d", i); ! 158: } ! 159: if (i = replace(&si_desc, &uptid, newkey, TRUE)) ! 160: { ! 161: /* if newtuple is dup of old, ok */ ! 162: if (i == 1) ! 163: break; ! 164: /* if this is recovery and old tid not there, try an insert */ ! 165: if (Batch_recovery && i == 2) ! 166: goto secinsert; ! 167: syserr("secupdate:replace %d", i); ! 168: } ! 169: break; ! 170: ! 171: case mdAPP: ! 172: secinsert: ! 173: if ((i = insert(&si_desc, &uptid, newkey, TRUE)) < 0) ! 174: syserr("secupdate:insert %d", i); ! 175: } ! 176: } ! 177: if (i = closer(&si_desc)) ! 178: syserr("secupdate:closer %.12s %d", si_desc.reldum.relid, i); ! 179: } ! 180: if (i < 0) ! 181: syserr("secupdate:bad get from indexes %d", i); ! 182: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.