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 <btree.h> 8: # include <sccs.h> 9: 10: SCCSID(@(#)btreeupdate.c 8.3 1/18/85) 11: 12: btreeupdate(r) 13: register DESC *r; 14: { 15: register char *p; 16: register int i; 17: int j, domcnt, mode, dom; 18: long oldtid, newtid; 19: long tupcnt; 20: long uptid; 21: char oldtup[MAXTUP], newtup[MAXTUP]; 22: char oldkey[2 * LIDSIZE], newkey[2 * LIDSIZE]; 23: char dumtup[2 * LIDSIZE]; 24: struct relation rkey, rtup; 25: DESC b_desc; 26: extern DESC Reldes; 27: TID tid, btid; 28: char file[MAXNAME + 4], btree[MAXNAME + 4]; 29: long oldlid[MAXLID], newlid[MAXLID]; 30: struct locator tidpos; 31: long l; 32: extern int Btree_fd; 33: char *tp; 34: long page, t; 35: int lidwid; 36: int dellevel; 37: int compare; 38: 39: # ifdef xZTR1 40: if (tTf(47, 0)) 41: printf("BTREEUPDATE\n"); 42: # endif 43: 44: mode = Batchhd.mode_up; 45: Batch_dirty = FALSE; 46: opencatalog("relation", OR_READ); 47: capital(trim_relname(r->reldum.relid), file); 48: setkey(&Reldes, &rkey, file, RELID); 49: setkey(&Reldes, &rkey, r->reldum.relowner, RELOWNER); 50: 51: if (!getequal(&Reldes, &rkey, &rtup, &tid)) 52: { 53: if (i = openr(&b_desc, OR_WRITE, file)) 54: syserr("btreeupdate:can't openr %.12s %d", file, i); 55: /* reposition batch file to the beginning. */ 56: if ((i = lseek(Batch_fp, 0L, 0)) < 0) 57: syserr("secupdate:seek %d %d", i, Batch_fp); 58: Batch_cnt = BATCHSIZE; 59: getbatch(&Batchhd, sizeof Batchhd); /* reread header */ 60: 61: ingresname(r->reldum.relid, r->reldum.relowner, file); 62: btreename(file, btree); 63: if ((Btree_fd = open(btree, O_RDWR)) < 0) 64: syserr("btreeupdate: can't open %s", btree); 65: 66: /* 67: ** Start reading the batch file and updating 68: ** the secondary indexes. 69: */ 70: l = r->reladds; 71: tupcnt = Batchhd.num_updts; 72: lidwid = LIDSIZE * r->reldum.reldim; 73: dellevel = r->reldum.reldim - 1; 74: for (j = 0; j < r->reldum.reldim; ++j) 75: { 76: if (Repl_cnt[j] > 0) 77: { 78: dellevel = j; 79: break; 80: } 81: } 82: while (tupcnt--) 83: { 84: getbatch(&oldtid, Batchhd.tido_size); 85: getbatch(oldtup, Batchhd.tupo_size); 86: getbatch(newtup, Batchhd.tupn_size); 87: getbatch(&newtid, Batchhd.tidn_size); 88: 89: clearkeys(&b_desc); 90: /* if this is a replace or append form the new key */ 91: if (mode != mdDEL) 92: { 93: if (newtid < 0) 94: continue; 95: tp = newtup + Batchhd.tupn_size - lidwid; 96: bmove(tp, newlid, lidwid); 97: if (mode == mdREPL) 98: { 99: if (newlid[r->reldum.reldim - 1] < 0) 100: continue; 101: tp = oldtup + Batchhd.tupo_size - lidwid; 102: bmove(tp, oldlid, lidwid); 103: compare = 0; 104: for (j = 0; j < r->reldum.reldim; ++j) 105: { 106: if (newlid[j] > oldlid[j]) 107: { 108: compare = 1; 109: } 110: if (newlid[j] != oldlid[j]) 111: break; 112: } 113: if (compare == 1) 114: { 115: for (j = dellevel - 1; j >= 0; --j) 116: { 117: if (newlid[j] != oldlid[j]) 118: { 119: compare = 0; 120: break; 121: } 122: } 123: } 124: if (compare == 1) 125: /* adjust due to deleted lids */ 126: newlid[dellevel] -= Repl_cnt[dellevel]; 127: } 128: page = RT; 129: for (j = 0; j < r->reldum.reldim; ++j) 130: { 131: if (!newlid[j]) 132: newlid[j] = 1; 133: t = get_tid(page, newlid[j], &tidpos); 134: page = t; 135: } 136: if (page != newtid) 137: { 138: /* try linear search of btree */ 139: lin_search(r->reldum.reldim, newtid, &btid, newlid, Batchhd.num_updts); 140: setkey(&b_desc, newkey, &newtid, 1); 141: } 142: else 143: { 144: setkey(&b_desc, newkey, &newtid, 1); 145: stuff_page(&btid, &tidpos.pageno); 146: btid.line_id = tidpos.page.node.leafnode.tid_loc[tidpos.offset]; 147: } 148: setkey(&b_desc, newkey, &btid, 2); 149: # ifdef xZTR1 150: if(tTf(47,0)) 151: { 152: printf("new key\n"); 153: printup(&b_desc, newkey); 154: } 155: # endif 156: } 157: 158: /* if this is delete or replace form the old key */ 159: if (mode != mdAPP) 160: { 161: setkey(&b_desc, oldkey, &oldtid, 1); 162: # ifdef xZTR1 163: if(tTf(47,0)) 164: { 165: printf("old key\n"); 166: printup(&b_desc, oldkey); 167: } 168: # endif 169: } 170: 171: switch (mode) 172: { 173: 174: case mdDEL: 175: if (i = getequal(&b_desc, oldkey, dumtup, &uptid)) 176: { 177: if (i > 0) 178: break; 179: syserr("btreeupdate:getequal %d", i); 180: } 181: if ((i = delete(&b_desc, &uptid)) < 0) 182: syserr("btreeupdate:delete %d", i); 183: break; 184: 185: case mdREPL: 186: /* btree tid not provided */ 187: b_desc.relgiven[2] = 0; 188: if (i = getequal(&b_desc, oldkey, dumtup, &uptid)) 189: { 190: if (Batch_recovery && i > 0) 191: goto btreeinsert; 192: printup(&b_desc, oldkey); 193: syserr("btreeupdate:getequal-repl %d", i); 194: } 195: /* btree tid provided */ 196: b_desc.relgiven[2] = 1; 197: if (i = replace(&b_desc, &uptid, newkey, TRUE)) 198: { 199: /* if newtuple is dup of old, ok */ 200: if (i == 1) 201: break; 202: /* if this is recovery and old tid not there, try an insert */ 203: if (Batch_recovery && i == 2) 204: goto btreeinsert; 205: syserr("secupdate:replace %d", i); 206: } 207: break; 208: 209: case mdAPP: 210: btreeinsert: 211: if ((i = insert(&b_desc, &uptid, newkey, TRUE)) < 0) 212: syserr("secupdate:insert %d", i); 213: } 214: } 215: if (i = closer(&b_desc)) 216: syserr("btreeupdate:closer %.12s %d", file, i); 217: close(Btree_fd); 218: } 219: if (i < 0) 220: syserr("btreeupdate:bad get from indexes %d", i); 221: }