Main Page   Class Hierarchy   Compound List   File List   Compound Members  

date.h

00001 //-< DATE.H >--------------------------------------------------------*--------*
00002 // FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *
00003 // (Main Memory Database Management System)                          *   /\|  *
00004 //                                                                   *  /  \  *
00005 //                          Created:     30-Apr-2000  K.A. Knizhnik  * / [] \ *
00006 //                          Last update: 30-Apr-2000  K.A. Knizhnik  * GARRET *
00007 //-------------------------------------------------------------------*--------*
00008 // Date field type
00009 //-------------------------------------------------------------------*--------*
00010 
00011 #ifndef __DATE_H__
00012 #define __DATE_H__
00013 
00014 #include <time.h>
00015 #include "stdtp.h"
00016 #include "class.h"
00017 
00018 #if !defined(NO_PTHREADS) && !defined(_WIN32)
00019 #define USE_REENTRANT_LIBRARY
00020 #endif
00021 
00022 class FASTDB_DLL_ENTRY dbDate { 
00023     int4 jday;
00024   public:
00025     bool operator == (dbDate const& dt) { 
00026         return jday == dt.jday;
00027     }
00028     bool operator != (dbDate const& dt) { 
00029         return jday != dt.jday;
00030     }
00031     bool operator > (dbDate const& dt) { 
00032         return jday > dt.jday;
00033     }
00034     bool operator >= (dbDate const& dt) { 
00035         return jday >= dt.jday;
00036     }
00037     bool operator < (dbDate const& dt) { 
00038         return jday < dt.jday;
00039     }
00040     bool operator <= (dbDate const& dt) { 
00041         return jday <= dt.jday;
00042     }
00043     int operator - (dbDate const& dt) { 
00044         return jday - dt.jday;
00045     }
00046     int operator + (int days) { 
00047         return jday + days;
00048     }
00049     static dbDate current() { 
00050         time_t now = time(NULL);
00051         struct tm* tp;
00052 #ifdef USE_REENTRANT_LIBRARY
00053         struct tm t;
00054         tp = localtime_r(&now, &t);
00055 #else 
00056         tp = localtime(&now);
00057 #endif
00058         return dbDate(tp->tm_year + 1900, tp->tm_mon + 1, tp->tm_mday);
00059     }
00060 
00061     dbDate() { 
00062         jday = -1;
00063     } 
00064     bool isValid() { 
00065         return jday != -1;
00066     }
00067 
00068     unsigned JulianDay() { return jday; }
00069 
00070     void clear() { jday = -1; }
00071 
00072     dbDate(int year, int month, int day)  {
00073     /*
00074       Convert Gregorian calendar date to the corresponding Julian day number
00075       j.  Algorithm 199 from Communications of the ACM, Volume 6, No. 8,
00076       (Aug. 1963), p. 444.  Gregorian calendar started on Sep. 14, 1752.
00077       This function not valid before that.
00078       */
00079         nat4 c, ya;
00080         if (month > 2)
00081             month -= 3;
00082         else {
00083             month += 9;
00084             year--;
00085         } /* else */
00086         c = year / 100;
00087         ya = year - 100*c;
00088         jday = ((146097*c)>>2) + ((1461*ya)>>2) + (153*month + 2)/5 + day + 1721119;
00089     } /* jday */
00090 
00091     void MDY(int& year, int& month, int& day) const { 
00092     /*
00093       Convert a Julian day number to its corresponding Gregorian calendar
00094       date.  Algorithm 199 from Communications of the ACM, Volume 6, No. 8,
00095       (Aug. 1963), p. 444.  Gregorian calendar started on Sep. 14, 1752.
00096       This function not valid before that.
00097      */
00098         nat4 j = jday - 1721119;
00099         int m, d, y;
00100         y = (((j<<2) - 1) / 146097);
00101         j = (j<<2) - 1 - 146097*y;
00102         d = (j>>2);
00103         j = ((d<<2) + 3) / 1461;
00104         d = ((d<<2) + 3 - 1461*j);
00105         d = (d + 4)>>2;
00106         m = (5*d - 3)/153;
00107         d = 5*d - 3 - 153*m;
00108         d = (d + 5)/5;
00109         y = (100*y + j);
00110         if (m < 10) { 
00111                 m += 3;
00112         } else {
00113                 m -= 9;
00114                 y++;
00115         } /* else */
00116         month = m;
00117         day = d;
00118         year = y;
00119     } /* mdy */
00120 
00121     int day() {
00122         int month, day, year;
00123         MDY(year, month, day);
00124         return day;
00125     }
00126 
00127     int month() {
00128         int month, day, year;
00129         MDY(year, month, day);
00130         return month;
00131     }
00132 
00133     int year() {
00134         int month, day, year;
00135         MDY(year, month, day);
00136         return year;
00137     }
00138 
00139     int dayOfWeek() { 
00140         return (jday % 7) + 1;
00141     }
00142 
00143     char* asString(char* buf, char const* format = "%d-%M-%Y") const { 
00144         static const char* dayName[] = { "Mon", "Tue", "Wen", "Thu", "Fri", "Sat", "Sun" };
00145         static const char* monthName[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
00146                                            "Aug", "Sep", "Oct", "Nov", "Dec" };
00147         int month, day, year;
00148         MDY(year, month, day);
00149         char ch, *dst = buf;
00150         while ((ch = *format++) != '\0') { 
00151             if (ch == '%') {
00152                 ch = *format++;
00153                 switch (ch) { 
00154                   case 'd': dst += sprintf(dst, "%02u", day ); continue;
00155                   case 'D': dst += sprintf(dst, "%s",   dayName[jday % 7]); continue;
00156                   case 'm': dst += sprintf(dst, "%02u", month); continue;
00157                   case 'M': dst += sprintf(dst, "%s",   monthName[month - 1]); continue;
00158                   case 'y': dst += sprintf(dst, "%02u", year - 1900); continue;
00159                   case 'Y': dst += sprintf(dst, "%04u", year); continue;
00160                   default: *dst++ = ch;
00161                 }
00162             } else { 
00163                 *dst++ = ch;
00164             }
00165         }
00166         *dst = '\0';
00167         return buf;
00168     }
00169 
00170 
00171     CLASS_DESCRIPTOR(dbDate, 
00172                      (KEY(jday,INDEXED|HASHED), 
00173                       METHOD(year), METHOD(month), METHOD(day), METHOD(dayOfWeek)));
00174 
00175     dbQueryExpression operator == (char const* field) { 
00176         dbQueryExpression expr;
00177         expr = dbComponent(field,"jday"),"=",jday;
00178         return expr;
00179     }
00180     dbQueryExpression operator != (char const* field) { 
00181         dbQueryExpression expr;
00182         expr = dbComponent(field,"jday"),"<>",jday;
00183         return expr;
00184     }
00185     dbQueryExpression operator < (char const* field) { 
00186         dbQueryExpression expr;
00187         expr = dbComponent(field,"jday"),">",jday;
00188         return expr;
00189     }
00190     dbQueryExpression operator <= (char const* field) { 
00191         dbQueryExpression expr;
00192         expr = dbComponent(field,"jday"),">=",jday;
00193         return expr;
00194     }
00195     dbQueryExpression operator > (char const* field) { 
00196         dbQueryExpression expr;
00197         expr = dbComponent(field,"jday"),"<",jday;
00198         return expr;
00199     }
00200     dbQueryExpression operator >= (char const* field) { 
00201         dbQueryExpression expr;
00202         expr = dbComponent(field,"jday"),"<=",jday;
00203         return expr;
00204     }
00205     friend dbQueryExpression between(char const* field, dbDate& from,
00206                                      dbDate& till)
00207     { 
00208         dbQueryExpression expr;
00209         expr=dbComponent(field,"jday"),"between",from.jday,"and",till.jday;
00210         return expr;
00211     }
00212 
00213     static dbQueryExpression ascent(char const* field) { 
00214         dbQueryExpression expr;
00215         expr=dbComponent(field,"jday");
00216         return expr;
00217     }   
00218     static dbQueryExpression descent(char const* field) { 
00219         dbQueryExpression expr;
00220         expr=dbComponent(field,"jday"),"desc";
00221         return expr;
00222     }   
00223 };
00224 
00225 #endif

Generated on Fri Nov 15 21:06:28 2002 for FastDB by doxygen1.2.15