1: # include <ingres.h> 2: # include <symbol.h> 3: # include "globs.h" 4: # include <sccs.h> 5: 6: SCCSID(@(#)rangetable.c 8.1 12/31/84) 7: 8: /* 9: ** Allocation of range table. 10: ** The size of the range table for decomp is 11: ** MAXRANGE plus 2; 1 for a free aggregate slot and 1 for 12: ** a free secondary index slot. 13: ** 14: ** Trace Flags: 15: ** 63 16: */ 17: 18: 19: 20: initrange() 21: { 22: register struct rang_tab *rt; 23: 24: for (rt = De.de_rangev; rt <= &De.de_rangev[MAXRANGE+1]; rt++) 25: rt->relnum = -1; 26: } 27: /* 28: ** Save the entry for var in the range table. 29: */ 30: 31: savrang(locrang, var) 32: int locrang[]; 33: int var; 34: { 35: register int i; 36: 37: i = var; 38: locrang[i] = De.de_rangev[i].relnum; 39: } 40: /* 41: ** Restore the entry for var from the local range 42: ** table locrang. 43: */ 44: 45: rstrang(locrang, var) 46: int locrang[]; 47: int var; 48: { 49: register int i; 50: 51: i = var; 52: De.de_rangev[i].relnum = locrang[i]; 53: } 54: /* 55: ** Update the range name. It is up to 56: ** the calling routine to openr the new rel. 57: */ 58: 59: new_range(var, relnum) 60: int var; 61: int relnum; 62: { 63: register int i, old; 64: 65: i = var; 66: 67: old = De.de_rangev[i].relnum; 68: De.de_rangev[i].relnum = relnum; 69: 70: return (old); 71: } 72: /* 73: ** Make a copy of the current range table. 74: */ 75: 76: newquery(locrang) 77: int locrang[]; 78: { 79: register struct rang_tab *rp; 80: register int *ip, i; 81: 82: ip = locrang; 83: rp = De.de_rangev; 84: 85: for (i = 0; i < MAXRANGE; i++) 86: *ip++ = (rp++)->relnum; 87: } 88: /* 89: ** Check the range table to see if any 90: ** relations changed since the last call 91: ** to newquery. If so, they were caused 92: ** by reformat. Restore back the orig relation 93: ** Reopen it if reopen == TRUE. 94: */ 95: 96: endquery(locrang, reopen) 97: int locrang[]; 98: int reopen; 99: { 100: register struct rang_tab *rp; 101: register int *ip, i; 102: int old; 103: bool dstr_flag; 104: extern DESC *openr1(); 105: 106: rp = De.de_rangev; 107: ip = locrang; 108: 109: dstr_flag = FALSE; 110: initp(); 111: for (i = 0; i < MAXRANGE; i++) 112: { 113: if (rp->relnum != *ip) 114: { 115: # ifdef xDTR1 116: if (tTf(63, -1)) 117: printf("reformat or reduct changed var %d (%d,%d)\n", i, *ip, rp->relnum); 118: # endif 119: 120: old = new_range(i, *ip); 121: dstr_flag |= dstr_mark(old); 122: if (reopen) 123: openr1(i); 124: } 125: 126: ip++; 127: rp++; 128: } 129: 130: if (dstr_flag) 131: call_dbu(mdDESTROY, FALSE); 132: else 133: resetp(); 134: } 135: /* 136: ** Return the name of the variable "var" 137: ** in the range table 138: */ 139: 140: char * 141: rangename(var) 142: int var; 143: { 144: extern char *rnum_convert(); 145: 146: return (rnum_convert(De.de_rangev[var].relnum)); 147: }