• Main Page
  • Classes
  • Files
  • File List

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 #ifdef _WINCE
00069         LPSYSTEMTIME st;
00070         GetSystemTime(&st);
00071         return dbDate(st.wYear, st.wMonth, st.wDay);
00072 #else
00073         time_t now = time(NULL);
00074         struct tm* tp;
00075 #if HAVE_LOCALTIME_R
00076         struct tm t;
00077         tp = localtime_r(&now, &t);
00078 #else
00079         tp = localtime(&now);
00080 #endif
00081         return dbDate(tp->tm_year + 1900, tp->tm_mon + 1, tp->tm_mday);
00082 #endif
00083     }
00084 
00088     dbDate() {
00089         jday = -1;
00090     }
00091     
00095     bool isValid() const {
00096         return jday != -1;
00097     }
00098 
00102     unsigned JulianDay() { return jday; }
00103 
00107     void clear() { jday = -1; }
00108 
00119     dbDate(int year, int month, int day)  {
00120     /*
00121       */
00122         nat4 c, ya;
00123         if (month > 2)
00124             month -= 3;
00125         else {
00126             month += 9;
00127             year--;
00128         } /* else */
00129         c = year / 100;
00130         ya = year - 100*c;
00131         jday = ((146097*c)>>2) + ((1461*ya)>>2) + (153*month + 2)/5 + day + 1721119;
00132     } /* jday */
00133 
00143     void MDY(int& year, int& month, int& day) const {
00144         nat4 j = jday - 1721119;
00145         int m, d, y;
00146         y = (((j<<2) - 1) / 146097);
00147         j = (j<<2) - 1 - 146097*y;
00148         d = (j>>2);
00149         j = ((d<<2) + 3) / 1461;
00150         d = ((d<<2) + 3 - 1461*j);
00151         d = (d + 4)>>2;
00152         m = (5*d - 3)/153;
00153         d = 5*d - 3 - 153*m;
00154         d = (d + 5)/5;
00155         y = (100*y + j);
00156         if (m < 10) {
00157                 m += 3;
00158         } else {
00159                 m -= 9;
00160                 y++;
00161         } /* else */
00162         month = m;
00163         day = d;
00164         year = y;
00165     } /* mdy */
00166 
00171     int day() {
00172         int month, day, year;
00173         MDY(year, month, day);
00174         return day;
00175     }
00176 
00181     int month() {
00182         int month, day, year;
00183         MDY(year, month, day);
00184         return month;
00185     }
00186 
00191     int year() {
00192         int month, day, year;
00193         MDY(year, month, day);
00194         return year;
00195     }
00196 
00201     int dayOfWeek() {
00202         return (jday % 7) + 1;
00203     }
00204 
00219     char_t* asString(char_t* buf, char_t const* format = _T("%d-%M-%Y")) const {
00220         static const char_t* dayName[] = { _T("Mon"), _T("Tue"), _T("Wen"), _T("Thu"), _T("Fri"), _T("Sat"), _T("Sun") };
00221         static const char_t* monthName[] = { _T("Jan"), _T("Feb"), _T("Mar"), _T("Apr"), _T("May"), _T("Jun"), _T("Jul"),
00222                                            _T("Aug"), _T("Sep"), _T("Oct"), _T("Nov"), _T("Dec") };
00223         int month, day, year;
00224         MDY(year, month, day);
00225         char_t ch, *dst = buf;
00226         while ((ch = *format++) != '\0') {
00227             if (ch == '%') {
00228                 ch = *format++;
00229                 switch (ch) {
00230                   case 'd': dst += SPRINTF(dst, _T("%02u"), day ); continue;
00231                   case 'D': dst += SPRINTF(dst, _T("%s"),   dayName[jday % 7]); continue;
00232                   case 'm': dst += SPRINTF(dst, _T("%02u"), month); continue;
00233                   case 'M': dst += SPRINTF(dst, _T("%s"),   monthName[month - 1]); continue;
00234                   case 'y': dst += SPRINTF(dst, _T("%02u"), year - 1900); continue;
00235                   case 'Y': dst += SPRINTF(dst, _T("%04u"), year); continue;
00236                   default: *dst++ = ch;
00237                 }
00238             } else { 
00239                 *dst++ = ch;
00240             }
00241         }
00242         *dst = '\0';
00243         return buf;
00244     }
00245 
00246 
00247     CLASS_DESCRIPTOR(dbDate,
00248                      (KEY(jday,INDEXED|HASHED),
00249                       METHOD(year), METHOD(month), METHOD(day), METHOD(dayOfWeek)));
00250 
00256     dbQueryExpression operator == (char_t const* field) {
00257         dbQueryExpression expr;
00258         expr = dbComponent(field,_T("jday")),_T("="),jday;
00259         return expr;
00260     }
00261 
00267     dbQueryExpression operator != (char_t const* field) {
00268         dbQueryExpression expr;
00269         expr = dbComponent(field,_T("jday")),_T("<>"),jday;
00270         return expr;
00271     }
00272     
00278     dbQueryExpression operator < (char_t const* field) {
00279         dbQueryExpression expr;
00280         expr = dbComponent(field,_T("jday")),_T(">"),jday;
00281         return expr;
00282     }
00283     
00289     dbQueryExpression operator <= (char_t const* field) {
00290         dbQueryExpression expr;
00291         expr = dbComponent(field,_T("jday")),_T(">="),jday;
00292         return expr;
00293     }
00294     
00300     dbQueryExpression operator > (char_t const* field) {
00301         dbQueryExpression expr;
00302         expr = dbComponent(field,_T("jday")),_T("<"),jday;
00303         return expr;
00304     }
00305     
00311     dbQueryExpression operator >= (char_t const* field) {
00312         dbQueryExpression expr;
00313         expr = dbComponent(field,_T("jday")),_T("<="),jday;
00314         return expr;
00315     }
00316     
00324     friend dbQueryExpression between(char_t const* field, dbDate& from,
00325                                      dbDate& till)
00326     {
00327         dbQueryExpression expr;
00328         expr=dbComponent(field,_T("jday")),_T("between"),from.jday,_T("and"),till.jday;
00329         return expr;
00330     }
00331 
00336     static dbQueryExpression ascent(char_t const* field) {
00337         dbQueryExpression expr;
00338         expr=dbComponent(field,_T("jday"));
00339         return expr;
00340     }
00341 
00346     static dbQueryExpression descent(char_t const* field) {
00347         dbQueryExpression expr;
00348         expr=dbComponent(field,_T("jday")),_T("desc");
00349         return expr;
00350     }
00351 };
00352 
00353 END_GIGABASE_NAMESPACE
00354 
00355 #endif

Generated on Mon Aug 23 2010 00:04:01 for GigaBASE by  doxygen 1.7.1