Main Page | Class Hierarchy | Class List | File List | Class 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 "stdtp.h"
00015 #include "class.h"
00016 
00017 BEGIN_GIGABASE_NAMESPACE
00018 
00022 class GIGABASE_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 
00050     int operator + (int days) {
00051         return jday + days;
00052     }
00053 
00054     dbDate& operator += (int days) { 
00055         jday += days;
00056         return *this;
00057     }
00058 
00059     dbDate& operator -= (int days) { 
00060         jday -= days;
00061         return *this;
00062     }
00063 
00067     static dbDate current() {
00068         time_t now = time(NULL);
00069         struct tm* tp;
00070 #if HAVE_LOCALTIME_R
00071         struct tm t;
00072         tp = localtime_r(&now, &t);
00073 #else
00074         tp = localtime(&now);
00075 #endif
00076         return dbDate(tp->tm_year + 1900, tp->tm_mon + 1, tp->tm_mday);
00077     }
00078 
00082     dbDate() {
00083         jday = -1;
00084     }
00085     
00089     bool isValid() const {
00090         return jday != -1;
00091     }
00092 
00096     unsigned JulianDay() { return jday; }
00097 
00101     void clear() { jday = -1; }
00102 
00113     dbDate(int year, int month, int day)  {
00114     /*
00115       */
00116         nat4 c, ya;
00117         if (month > 2)
00118             month -= 3;
00119         else {
00120             month += 9;
00121             year--;
00122         } /* else */
00123         c = year / 100;
00124         ya = year - 100*c;
00125         jday = ((146097*c)>>2) + ((1461*ya)>>2) + (153*month + 2)/5 + day + 1721119;
00126     } /* jday */
00127 
00137     void MDY(int& year, int& month, int& day) const {
00138         nat4 j = jday - 1721119;
00139         int m, d, y;
00140         y = (((j<<2) - 1) / 146097);
00141         j = (j<<2) - 1 - 146097*y;
00142         d = (j>>2);
00143         j = ((d<<2) + 3) / 1461;
00144         d = ((d<<2) + 3 - 1461*j);
00145         d = (d + 4)>>2;
00146         m = (5*d - 3)/153;
00147         d = 5*d - 3 - 153*m;
00148         d = (d + 5)/5;
00149         y = (100*y + j);
00150         if (m < 10) {
00151                 m += 3;
00152         } else {
00153                 m -= 9;
00154                 y++;
00155         } /* else */
00156         month = m;
00157         day = d;
00158         year = y;
00159     } /* mdy */
00160 
00165     int day() {
00166         int month, day, year;
00167         MDY(year, month, day);
00168         return day;
00169     }
00170 
00175     int month() {
00176         int month, day, year;
00177         MDY(year, month, day);
00178         return month;
00179     }
00180 
00185     int year() {
00186         int month, day, year;
00187         MDY(year, month, day);
00188         return year;
00189     }
00190 
00195     int dayOfWeek() {
00196         return (jday % 7) + 1;
00197     }
00198 
00213     char* asString(char* buf, char const* format = "%d-%M-%Y") const {
00214         static const char* dayName[] = { "Mon", "Tue", "Wen", "Thu", "Fri", "Sat", "Sun" };
00215         static const char* monthName[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
00216                                            "Aug", "Sep", "Oct", "Nov", "Dec" };
00217         int month, day, year;
00218         MDY(year, month, day);
00219         char ch, *dst = buf;
00220         while ((ch = *format++) != '\0') {
00221             if (ch == '%') {
00222                 ch = *format++;
00223                 switch (ch) {
00224                   case 'd': dst += sprintf(dst, "%02u", day ); continue;
00225                   case 'D': dst += sprintf(dst, "%s",   dayName[jday % 7]); continue;
00226                   case 'm': dst += sprintf(dst, "%02u", month); continue;
00227                   case 'M': dst += sprintf(dst, "%s",   monthName[month - 1]); continue;
00228                   case 'y': dst += sprintf(dst, "%02u", year - 1900); continue;
00229                   case 'Y': dst += sprintf(dst, "%04u", year); continue;
00230                   default: *dst++ = ch;
00231                 }
00232             } else { 
00233                 *dst++ = ch;
00234             }
00235         }
00236         *dst = '\0';
00237         return buf;
00238     }
00239 
00240 
00241     CLASS_DESCRIPTOR(dbDate,
00242                      (KEY(jday,INDEXED|HASHED),
00243                       METHOD(year), METHOD(month), METHOD(day), METHOD(dayOfWeek)));
00244 
00250     dbQueryExpression operator == (char const* field) {
00251         dbQueryExpression expr;
00252         expr = dbComponent(field,"jday"),"=",jday;
00253         return expr;
00254     }
00255 
00261     dbQueryExpression operator != (char const* field) {
00262         dbQueryExpression expr;
00263         expr = dbComponent(field,"jday"),"<>",jday;
00264         return expr;
00265     }
00266     
00272     dbQueryExpression operator < (char const* field) {
00273         dbQueryExpression expr;
00274         expr = dbComponent(field,"jday"),">",jday;
00275         return expr;
00276     }
00277     
00283     dbQueryExpression operator <= (char const* field) {
00284         dbQueryExpression expr;
00285         expr = dbComponent(field,"jday"),">=",jday;
00286         return expr;
00287     }
00288     
00294     dbQueryExpression operator > (char const* field) {
00295         dbQueryExpression expr;
00296         expr = dbComponent(field,"jday"),"<",jday;
00297         return expr;
00298     }
00299     
00305     dbQueryExpression operator >= (char const* field) {
00306         dbQueryExpression expr;
00307         expr = dbComponent(field,"jday"),"<=",jday;
00308         return expr;
00309     }
00310     
00318     friend dbQueryExpression between(char const* field, dbDate& from,
00319                                      dbDate& till)
00320     {
00321         dbQueryExpression expr;
00322         expr=dbComponent(field,"jday"),"between",from.jday,"and",till.jday;
00323         return expr;
00324     }
00325 
00330     static dbQueryExpression ascent(char const* field) {
00331         dbQueryExpression expr;
00332         expr=dbComponent(field,"jday");
00333         return expr;
00334     }
00335 
00340     static dbQueryExpression descent(char const* field) {
00341         dbQueryExpression expr;
00342         expr=dbComponent(field,"jday"),"desc";
00343         return expr;
00344     }
00345 };
00346 
00347 END_GIGABASE_NAMESPACE
00348 
00349 #endif

Generated on Thu Nov 24 23:14:29 2005 for GigaBASE by doxygen 1.3.5