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