|
|
1.1 ! root 1: # include <pv.h> ! 2: # include <ingres.h> ! 3: # include <aux.h> ! 4: # include <func.h> ! 5: # include <opsys.h> ! 6: # ifdef xV7_UNIX ! 7: # include <sys/timeb.h> ! 8: # endif xV7_UNIX ! 9: # include <sccs.h> ! 10: # include <errors.h> ! 11: ! 12: SCCSID(@(#)save.c 8.3 2/8/85) ! 13: ! 14: extern short tTdbu[]; ! 15: extern int save(); ! 16: extern int null_fn(); ! 17: ! 18: struct fn_def SaveFn = ! 19: { ! 20: "SAVE", ! 21: save, ! 22: null_fn, /* initialization function */ ! 23: null_fn, ! 24: NULL, ! 25: 0, ! 26: tTdbu, ! 27: 100, ! 28: 'Z', ! 29: 0 ! 30: }; ! 31: /* ! 32: ** SAVE RELATION UNTIL DATE ! 33: ** ! 34: ** This function arranges to save a named relation until a ! 35: ** specified date. ! 36: ** ! 37: ** Parameters: (pv_type is PV_STR for all of them) ! 38: ** 0 -- relation name ! 39: ** 1 -- month (1 -> 12 or "jan" -> "dec" or a variety of other codes) ! 40: ** 2 -- day (1 -> 31) ! 41: ** 3 -- year (1970 -> ?) ! 42: ** ! 43: ** Uses trace flag 44 ! 44: ** Uses error messages 56xx ! 45: */ ! 46: ! 47: int DmSize[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; ! 48: ! 49: save(parmc, parmv) ! 50: int parmc; ! 51: PARM parmv[]; ! 52: { ! 53: long date; ! 54: register int i; ! 55: extern DESC Reldes; ! 56: TID tid; ! 57: extern char *Usercode; ! 58: struct relation relk, relt; ! 59: int day, month, year; ! 60: # ifdef xV7_UNIX ! 61: struct timeb timeb; ! 62: # else xV7_UNIX ! 63: extern int timezone; /* defined by ctime(3) */ ! 64: # endif xV7_UNIX ! 65: extern int dysize(); /* ditto */ ! 66: ! 67: /* ! 68: ** Validate parameters. ! 69: ** ! 70: ** According to my pocket calculator, a 31 bit number will ! 71: ** hold 70 years of accuracy -- hence the 2035 cutoff. If ! 72: ** this code is still around in 2035, I apologize in ! 73: ** advance. ! 74: */ ! 75: ! 76: year = atoi(parmv[3].pv_val.pv_str); ! 77: if (year < 1970 || year > 2035) ! 78: return (error(BADYEAR, parmv[3].pv_val.pv_str, 0)); /* bad year */ ! 79: if (monthcheck(parmv[1].pv_val.pv_str, &month)) ! 80: return (error(BADMONTH, parmv[1].pv_val.pv_str, 0)); /* bad month */ ! 81: day = atoi(parmv[2].pv_val.pv_str); ! 82: if (day < 1 || day > monthsize(--month, year)) ! 83: return (error(BADDAY, parmv[2].pv_val.pv_str, 0)); /* bad day */ ! 84: ! 85: /* convert date */ ! 86: /* "date" will be # of days from 1970 for a while */ ! 87: date = 0; ! 88: ! 89: /* do year conversion */ ! 90: for (i = 1970; i < year; i++) ! 91: { ! 92: date += dysize(i); ! 93: } ! 94: ! 95: /* do month conversion */ ! 96: for (i = 0; i < month; i++) ! 97: date += DmSize[i]; ! 98: /* once again, allow for leapyears */ ! 99: if (month >= 2 && year % 4 == 0 && year % 100 != 0) ! 100: date += 1; ! 101: ! 102: /* do day conversion */ ! 103: date += day - 1; ! 104: ! 105: /* we now convert date to be the # of hours since 1970 */ ! 106: date *= 24; ! 107: ! 108: /* do daylight savings computations */ ! 109: /* <<<<< none now >>>>> */ ! 110: ! 111: /* convert to seconds */ ! 112: date *= 60 * 60; ! 113: ! 114: /* adjust to local time */ ! 115: # ifdef xV7_UNIX ! 116: ftime(&timeb); ! 117: date += ((long) timeb.timezone) * 60; ! 118: # else xV7_UNIX ! 119: date += timezone; ! 120: # endif xV7_UNIX ! 121: ! 122: # ifdef xZTR1 ! 123: if (tTf(45, 1)) ! 124: printf("%s", ctime(&date)); ! 125: # endif ! 126: ! 127: /* let's check and see if the relation exists */ ! 128: opencatalog("relation", OR_WRITE); ! 129: clearkeys(&Reldes); ! 130: setkey(&Reldes, &relk, parmv[0].pv_val.pv_str, RELID); ! 131: setkey(&Reldes, &relk, Usercode, RELOWNER); ! 132: if (getequal(&Reldes, &relk, &relt, &tid)) ! 133: { ! 134: return (error(RELNOTFOUND, parmv[0].pv_val.pv_str, 0)); /* relation not found */ ! 135: } ! 136: ! 137: /* check that it is not a system catalog */ ! 138: if (relt.relstat & S_CATALOG) ! 139: return (error(NOSAVESYSREL, parmv[0].pv_val.pv_str, 0)); /* cannot save sys rel */ ! 140: /* got it; lets change the date */ ! 141: relt.relsave = date; ! 142: ! 143: # ifdef xZTR2 ! 144: if (tTf(45, 2)) ! 145: { ! 146: printup(&Reldes, &relt); ! 147: } ! 148: # endif ! 149: ! 150: if ((i = replace(&Reldes, &tid, &relt, 0)) < 0) ! 151: syserr("SAVE: replace %d", i); ! 152: ! 153: /* that's all folks.... */ ! 154: return (0); ! 155: } ! 156: /* ! 157: ** MONTHCHECK ! 158: */ ! 159: ! 160: struct monthtab ! 161: { ! 162: char *code; ! 163: int month; ! 164: }; ! 165: ! 166: struct monthtab Monthtab[] = ! 167: { ! 168: "jan", 1, ! 169: "feb", 2, ! 170: "mar", 3, ! 171: "apr", 4, ! 172: "may", 5, ! 173: "jun", 6, ! 174: "jul", 7, ! 175: "aug", 8, ! 176: "sep", 9, ! 177: "oct", 10, ! 178: "nov", 11, ! 179: "dec", 12, ! 180: "january", 1, ! 181: "february", 2, ! 182: "march", 3, ! 183: "april", 4, ! 184: "june", 6, ! 185: "july", 7, ! 186: "august", 8, ! 187: "september", 9, ! 188: "october", 10, ! 189: "november", 11, ! 190: "december", 12, ! 191: 0 ! 192: }; ! 193: ! 194: monthcheck(input, output) ! 195: char *input; ! 196: int *output; ! 197: { ! 198: register struct monthtab *p; ! 199: int month; ! 200: ! 201: /* month can be an integer, or an alphanumeric code */ ! 202: month = atoi(input); ! 203: if (month != 0) ! 204: { ! 205: *output = month; ! 206: return (month < 1 || month > 12); ! 207: } ! 208: for (p = Monthtab; p->code; p++) ! 209: { ! 210: if (sequal(input, p->code)) ! 211: { ! 212: *output = p->month; ! 213: return (0); ! 214: } ! 215: } ! 216: return (1); ! 217: } ! 218: /* ! 219: ** MONTHSIZE -- determine size of a particular month ! 220: */ ! 221: ! 222: monthsize(month, year) ! 223: int month; ! 224: int year; ! 225: { ! 226: register int size; ! 227: extern int dysize(); /* defined in ctime */ ! 228: ! 229: size = DmSize[month]; ! 230: if (month == 1 && dysize(year) == 366) ! 231: /* This is February of a leap year */ ! 232: size++; ! 233: ! 234: return (size); ! 235: ! 236: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.