]> andersk Git - moira.git/blame - gen/moddiff.dc
support type MUL filesystems
[moira.git] / gen / moddiff.dc
CommitLineData
f852c398 1/* $Header$
2 *
3 * (c) Copyright 1990 by the Massachusetts Institute of Technology.
4 * For copying and distribution information, please see the file
5 * <mit-copyright.h>.
6 */
7
8#include <mit-copyright.h>
9#include <stdio.h>
10#include <sys/types.h>
11#include <sys/stat.h>
12#include <sys/time.h>
13#include <moira.h>
14#include <moira_site.h>
15EXEC SQL INCLUDE sqlca;
16
17static char * MONTHNAMES[] = {"january", "february", "march", "april", "may",
18 "june", "july", "august", "september",
19 "october", "november", "december"};
20
21static int MONTHDAYS[] = {0,0,31,59,90,120,151,181,212,243,273,304,334};
22
23
24/****************************************************************/
25/** Return the difference between the modtime & table modtime **/
26/** in flag variable. Return 0 if success, else errno. **/
27/****************************************************************/
28
29int ModDiff (flag, tbl, ModTime)
30int *flag;
31char *tbl;
32time_t ModTime;
33{
34 int filetimeno;
35 EXEC SQL BEGIN DECLARE SECTION;
36 char filetime[29], *tbl_name;
37 EXEC SQL END DECLARE SECTION;
38
39 *flag = 0;
40 tbl_name = tbl;
41 EXEC SQL SELECT MODTIME INTO :filetime FROM tblstats WHERE tbl = :tbl_name;
42 if (Date2Sec (filetime, &filetimeno)) {
43 fprintf(stderr,"Unable to parse mod. date for file %s\n", tbl);
44 return(MR_DATE);
45 }
46 *flag = (filetimeno - ModTime);
47 return(0);
48}
49
50
51/***************************************************/
52/** convert Unix-time (# of seconds since 1970) **/
53/** from a date-time string **/
54/** Return 1 if failure, 0 if success **/
55/***************************************************/
56
57Date2Sec(DS, UTime)
58char *DS;
59struct timeval *UTime;
60{
61 int Day, Month, Year, Hour, Minute, Sec, Err, TotalDays, Iter;
62
63 Err = ParseDateString (DS, &Day, &Month, &Year, &Hour, &Minute,&Sec);
64 if (Err) return (Err);
65 if (Year < 1970) {
66 for (TotalDays = 0, Iter = 1969; Iter > Year; Iter--) {
67 TotalDays += NumdaysY(Iter);}
68#ifdef DEBUG
69 printf("Days in years : %d\n", TotalDays);
70#endif
71 TotalDays += (NumdaysY(Year) - NumdaysM(Month, Year) - Day);
72#ifdef DEBUG
73 printf("Days after months & days: %d\n", TotalDays);
74#endif
75 UTime->tv_sec = -((((24 * TotalDays) + 24 - Hour) * 60 - Minute) * 60 -
76 Sec);
77 UTime->tv_usec = 0;
78 return (0);
79 } else {
80 for (TotalDays = 0, Iter = 1970; Iter < Year; Iter++) {
81 TotalDays += NumdaysY(Iter);}
82#ifdef DEBUG
83 printf("Days in years : %d\n", TotalDays);
84#endif
85 TotalDays += NumdaysM(Month, Year);
86#ifdef DEBUG
87 printf("Days after months: %d\n", TotalDays);
88#endif
89 TotalDays += (Day - 1);
90#ifdef DEBUG
91 printf("Days after Days : %d\n", TotalDays);
92#endif
93 UTime->tv_sec = (((24 * TotalDays) + Hour) * 60 + Minute) * 60 + Sec;
94 UTime->tv_usec = 0;
95 return (0);
96 }
97}
98
99
100/*****************************************/
101/** Return the # of days in the Year **/
102/*****************************************/
103
104static int NumdaysY(Year)
105int Year;
106{
107 return (365 + Leapyear(Year));
108}
109
110
111/*****************************************/
112/** Return the # of days in the Month **/
113/*****************************************/
114
115static int NumdaysM(Month, Year)
116int Month, Year;
117{
118 if ((Month > 2) && (Leapyear (Year)))
119 return (MONTHDAYS[Month] + 1);
120 else
121 return (MONTHDAYS[Month]);
122}
123
124
125/*****************************************/
126/** Return 1 if a leapyear, else 0 **/
127/*****************************************/
128
129static int Leapyear (Year)
130int Year;
131{
132 if ((Year % 4) && (!(Year % 100) || (Year % 1000)))
133 return (0);
134 else
135 return (1);
136}
137
138
139/************************************************/
140/** Compute numeric breakdown of date string **/
141/** Return 0 if success, 1 if failure **/
142/************************************************/
143
144static int ParseDateString (DS, Day, Month, Year, Hour, Minute, Sec)
145char *DS;
146int *Day, *Month, *Year, *Hour, *Minute, *Sec;
147{
148 int Gotten;
149 char *M, *D, *Temp;
150 int Y=0, H=0, Min=0, S=0, DayNum=0, MonthNum=0;
151
152 M = (char *)malloc(strlen(DS));
153 D = (char *)malloc(strlen(DS));
154 if (!(M && D)) return (0);
155 Gotten = sscanf (DS, "%[^-]-%[^-]-%d %d:%d:%d", D, M, &Y, &H, &Min, &S);
156 if (Gotten < 3)
157 Gotten = sscanf (DS, "%[^/]/%[^/]/%d %d:%d:%d", D, M, &Y, &H, &Min, &S);
158 if (Gotten < 3)
159 Gotten = sscanf (DS, "%s %[^,], %d %d:%d:%d", M, D, &Y, &H, &Min, &S);
160#ifdef DEBUG
161 printf ("Month = %s\nDay = %s\nYear = %d\n", M, D, Y);
162 printf ("Hour = %d\nMin= %d\nSec = %d\n", H, Min, S);
163#endif
164 if ((Gotten < 3) || !(D && M && Y)) {
165 free(M);
166 free(D);
167 return (1);} /* Couldn't scan in a date */
168 if (atoi(M)) { /* Month not text, so M/D/Y not D/M/Y */
169 Temp = M;
170 M = D;
171 D = Temp;}
172 DayNum = atoi(D);
173 MonthNum = MonthNo(M);
174 free(M);
175 free(D);
176#ifdef DEBUG
177 printf ("Month = %d\nDay = %d\nYear = %d\n", MonthNum, DayNum, Y);
178#endif
179 if ((DayNum < 1) || (DayNum > 31))
180 return (1); /* Bad Day */
181 if (!MonthNum)
182 return (1); /* Bad Month */
183 if ((Y < 1) || (Y > 10000))
184 return (1); /* Bad Year */
185 if (Gotten == 4)
186 return(1); /* Bad Time (Hour only) */
187 if ((Gotten > 4) && (H < 0) || (H > 24))
188 return(1); /* Bad Hour */
189 if ((Gotten > 4) && ((Min < 0) || (Min > 59)))
190 return(1); /* Bad Minute */
191 if ((Gotten > 5) && ((S < 0) || (S > 59)))
192 return(1); /* Bad Second */
193 *Day = DayNum;
194 *Month = MonthNum;
195 if (Y < 100) /* For abreviations like 90 for 1990 */
196 Y += 1900; /* (Yes, it will be wrong in 2000) */
197 *Year = Y;
198 if (Gotten > 4) {
199 *Hour = H;
200 *Minute = Min;
201 }
202 else {
203 *Hour = 0;
204 *Minute = 0;}
205 if (Gotten > 5)
206 *Sec = S;
207 else
208 *Sec = 0;
209 return(0);
210}
211
212
213/***********************************************************/
214/** Return the Month number of a Month number or string **/
215/***********************************************************/
216
217static int MonthNo (M)
218char *M;
219{
220 int Count;
221 if (atoi(M)) {
222 if ((atoi(M) > 0) && (atoi(M) < 13))
223 return (atoi(M));
224 else
225 return (0);
226 }
227 for (Count = 0; Count < 12; Count++) {
228 if (!strcasecmp (M, MONTHNAMES[Count])
229 || !strncasecmp(M, MONTHNAMES[Count], 3))
230 return (Count + 1);
231 }
232 return (0);
233}
This page took 0.07546 seconds and 5 git commands to generate.