|
|
1.1 ! root 1: # include <ingres.h> ! 2: # include <aux.h> ! 3: # include <catalog.h> ! 4: # include <sccs.h> ! 5: ! 6: SCCSID(@(#)udestroy.c 7.1 2/5/81) ! 7: ! 8: ! 9: /* ! 10: ** USERDESTROY -- auxiliary cleanup for destroy of a user relation ! 11: ** ! 12: ** userdestroy is called during the destroy of a non system ! 13: ** relation. If the relation is indexed or is itself an index ! 14: ** then the appropriate action is taken. If it is indexed, ! 15: ** then all secondary indices on the relation are also destroyed. ! 16: ** If it is a secondary index, then the entry in the indexes relation ! 17: ** is removed and the "relindxd" bit on the primary relation is ! 18: ** cleared if this was the last index on the relation. ! 19: ** ! 20: ** If the relation was a view or had integrity constraints or ! 21: ** protection constraints on it, then those definitions are ! 22: ** removed from the appropriate system catalogues. ! 23: ** ! 24: ** Parameters: ! 25: ** reltup -- the relation relation tuple. ! 26: ** ! 27: ** Returns: ! 28: ** none ! 29: ** ! 30: ** Side Effects: ! 31: ** zero or more system catalogues will be updated. ! 32: ** ! 33: ** Called By: ! 34: ** destroy ! 35: */ ! 36: ! 37: userdestroy(reltup) ! 38: struct relation *reltup; ! 39: { ! 40: register int i; ! 41: register struct relation *rel; ! 42: struct tup_id tid, limtid; ! 43: char newrelname[MAXNAME + 3]; ! 44: extern DESC Reldes, Attdes, Inddes; ! 45: extern DESC Treedes, Intdes, Prodes; ! 46: struct relation relt, relk; ! 47: struct index indk, indt; ! 48: ! 49: rel = reltup; ! 50: ! 51: /* handle special case of destroying a secondary index */ ! 52: if (rel->relindxd < 0) ! 53: { ! 54: opencatalog("indexes", 2); ! 55: setkey(&Inddes, &indk, rel->relid, IRELIDI); ! 56: setkey(&Inddes, &indk, rel->relowner, IOWNERP); ! 57: if ((i = getequal(&Inddes, &indk, &indt, &tid)) != 0) ! 58: syserr("destroy: geteq(ind,%.12s) %d", rel->relid, i); ! 59: ! 60: /* remove entry in INDEX catalog */ ! 61: bmove(indt.irelidp, newrelname, MAXNAME); ! 62: bmove(indt.iownerp, &newrelname[MAXNAME], 2); ! 63: if ((i = delete(&Inddes, &tid)) != 0) ! 64: syserr("DESTROY: delete(ind/%.12s) %d", rel->relid, i); ! 65: clearkeys(&Inddes); ! 66: setkey(&Inddes, &indk, newrelname, IRELIDP); ! 67: setkey(&Inddes, &indk, &newrelname[MAXNAME], IOWNERP); ! 68: ! 69: /* reset relindxd field in relation catalog if no other indexes exist on this primary */ ! 70: if (getequal(&Inddes, &indk, &indt, &tid) != 0) ! 71: { ! 72: clearkeys(&Reldes); ! 73: setkey(&Reldes, &relk, newrelname, RELID); ! 74: setkey(&Reldes, &relk, &newrelname[MAXNAME], RELOWNER); ! 75: if (i = getequal(&Reldes, &relk, &relt, &tid)) ! 76: syserr("destroy: getequal(rel, %s) %d", newrelname, i); ! 77: relt.relindxd = 0; ! 78: if ((i = replace(&Reldes, &tid, &relt, 0)) != 0) ! 79: syserr("destroy: replace(rel) %d", i); ! 80: } ! 81: } ! 82: ! 83: /* check special case of destroying primary relation */ ! 84: if (rel->relindxd > 0) ! 85: { ! 86: opencatalog("indexes", 2); ! 87: setkey(&Inddes, &indk, rel->relid, IRELIDP); ! 88: setkey(&Inddes, &indk, rel->relowner, IOWNERP); ! 89: if (i = find(&Inddes, EXACTKEY, &tid, &limtid, &indk)) ! 90: syserr("destroy: find(ind,%.12s) %d", rel->relid, i); ! 91: while ((i = get(&Inddes, &tid, &limtid, &indt, TRUE)) == 0) ! 92: { ! 93: if (kcompare(&Inddes, &indk, &indt) != 0) ! 94: continue; ! 95: if ((i = delete(&Inddes, &tid)) != 0) ! 96: syserr("DESTROY: delete(ind/%.12s) %d", rel->relid, i); ! 97: clearkeys(&Reldes); ! 98: purgetup(&Reldes, indt.irelidi, RELID, indt.iownerp, RELOWNER, 0); ! 99: if (i = flush_rel(&Reldes, FALSE)) /* flush for recovery & concurrency reasons */ ! 100: syserr("destroy:flush irel %d", i); ! 101: purgetup(&Attdes, indt.irelidi, ATTRELID, indt.iownerp, ATTOWNER, 0); ! 102: ingresname(indt.irelidi, indt.iownerp, newrelname); ! 103: if (unlink(newrelname)) ! 104: syserr("destroy: unlink(%s)", newrelname); ! 105: } ! 106: if (i < 0) ! 107: { ! 108: syserr("destroy: get(ind) %d", i); ! 109: } ! 110: } ! 111: ! 112: /* if any integrity constraints exist, remove them */ ! 113: if (rel->relstat & S_INTEG) ! 114: { ! 115: opencatalog("integrities", 2); ! 116: purgetup(&Intdes, rel->relid, INTRELID, rel->relowner, INTRELOWNER); ! 117: } ! 118: ! 119: /* if any protection clauses exist, remove them */ ! 120: if (rel->relstat & S_PROTUPS) ! 121: { ! 122: opencatalog("protect", 2); ! 123: purgetup(&Prodes, rel->relid, PRORELID, rel->relowner, PRORELOWN); ! 124: } ! 125: ! 126: /* remove any trees associated with the relation */ ! 127: if (rel->relstat & (S_PROTUPS | S_VIEW | S_INTEG)) ! 128: { ! 129: opencatalog("tree", 2); ! 130: purgetup(&Treedes, rel->relid, TREERELID, rel->relowner, TREEOWNER); ! 131: } ! 132: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.