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

Generated on Mon Oct 23 13:23:58 2006 for FastDB by doxygen1.2.18