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

Generated on Thu Feb 12 13:04:48 2004 for FastDB by doxygen 1.3.5