1: # include "../ingres.h" 2: # include "../aux.h" 3: # include "../access.h" 4: 5: /* 6: noclose - update system catalogs for a relation 7: DESCRIPTION 8: 9: 10: function values: 11: 12: <0 fatal error 13: 0 success 14: 1 relation was not open 15: */ 16: 17: 18: noclose(d) 19: struct descriptor *d; 20: { 21: char name[MAXNAME + 4]; 22: register struct descriptor *dx; 23: register int i; 24: register struct accbuf *b; 25: struct relation rel; 26: 27: dx = d; 28: # ifdef xATR1 29: if (tTf(90, 8)) 30: printf("noclose: %.14s,%s\n", dx->relid, locv(dx->reladds)); 31: # endif 32: 33: /* make sure relation relation is read/write mode */ 34: if (abs(dx->relopn) != (dx->relfp + 1) * 5) 35: return (1); 36: 37: /* flush all pages associated with relation */ 38: /* if system catalog, reset all the buffers so they can't be reused */ 39: i = flush_rel(dx, dx->relstat & S_CATALOG); 40: 41: /* check to see if number of tuples has changed */ 42: if (dx->reladds != 0) 43: { 44: /* yes, update the system catalogs */ 45: /* get tuple from relation relation */ 46: Admin.adreld.relopn = (Admin.adreld.relfp + 1) * -5; 47: if (i = get_page(&Admin.adreld, &dx->reltid)) 48: return (i); /* fatal error */ 49: 50: /* get the actual tuple */ 51: get_tuple(&Admin.adreld, &dx->reltid, &rel); 52: 53: /* update the reltups field */ 54: rel.reltups += dx->reladds; 55: dx->reltups = rel.reltups; 56: 57: /* put the tuple back */ 58: put_tuple(&dx->reltid, &rel, sizeof rel); 59: i = resetacc(Acc_head); 60: dx->reladds = 0; 61: } 62: return (i); 63: }