00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef __DATETIME_H__
00012 #define __DATETIME_H__
00013
00014 #include "stdtp.h"
00015 #include "class.h"
00016
00017 BEGIN_FASTDB_NAMESPACE
00018
00019 class FASTDB_DLL_ENTRY dbDateTime {
00020 int4 stamp;
00021 public:
00022 bool operator == (dbDateTime const& dt) const {
00023 return stamp == dt.stamp;
00024 }
00025 bool operator != (dbDateTime const& dt) const {
00026 return stamp != dt.stamp;
00027 }
00028 bool operator > (dbDateTime const& dt) const {
00029 return stamp > dt.stamp;
00030 }
00031 bool operator >= (dbDateTime const& dt) const {
00032 return stamp >= dt.stamp;
00033 }
00034 bool operator < (dbDateTime const& dt) const {
00035 return stamp < dt.stamp;
00036 }
00037 bool operator <= (dbDateTime const& dt) const {
00038 return stamp <= dt.stamp;
00039 }
00040 int operator - (dbDateTime const& dt) const {
00041 return stamp - dt.stamp;
00042 }
00043 int operator + (dbDateTime const& dt) const {
00044 return stamp + dt.stamp;
00045 }
00046 static dbDateTime current() {
00047 return dbDateTime(time(NULL));
00048 }
00049 dbDateTime(time_t tm) {
00050 stamp = (int4)tm;
00051 }
00052 dbDateTime() {
00053 stamp = -1;
00054 }
00055 bool isValid() const {
00056 return stamp != -1;
00057 }
00058
00059 time_t asTime_t() const { return stamp; }
00060
00061 void clear() { stamp = -1; }
00062
00063 dbDateTime(int year, int month, int day,
00064 int hour=0, int min=0, int sec = 0)
00065 {
00066 struct tm t;
00067 t.tm_year = year > 1900 ? year - 1900 : year;
00068 t.tm_mon = month-1;
00069 t.tm_mday = day;
00070 t.tm_hour = hour;
00071 t.tm_min = min;
00072 t.tm_sec = sec;
00073 t.tm_isdst = -1;
00074 stamp = (int4)mktime(&t);
00075 }
00076 dbDateTime(int hour, int min) {
00077 stamp = (hour*60+min)*60;
00078 }
00079
00080 #if defined(HAVE_LOCALTIME_R) && !defined(NO_PTHREADS)
00081 int year() {
00082 struct tm t;
00083 time_t tt = (nat4)stamp;
00084 return localtime_r(&tt, &t)->tm_year + 1900;
00085 }
00086 int month() {
00087 struct tm t;
00088 time_t tt = (nat4)stamp;
00089 return localtime_r(&tt, &t)->tm_mon + 1;
00090 }
00091 int day() {
00092 struct tm t;
00093 time_t tt = (nat4)stamp;
00094 return localtime_r(&tt, &t)->tm_mday;
00095 }
00096 int dayOfYear() {
00097 struct tm t;
00098 time_t tt = (nat4)stamp;
00099 return localtime_r(&tt, &t)->tm_yday+1;
00100 }
00101 int dayOfWeek() {
00102 struct tm t;
00103 time_t tt = (nat4)stamp;
00104 return localtime_r(&tt, &t)->tm_wday+1;
00105 }
00106 int hour() {
00107 struct tm t;
00108 time_t tt = (nat4)stamp;
00109 return localtime_r(&tt, &t)->tm_hour;
00110 }
00111 int minute() {
00112 struct tm t;
00113 time_t tt = (nat4)stamp;
00114 return localtime_r(&tt, &t)->tm_min;
00115 }
00116 int second() {
00117 struct tm t;
00118 time_t tt = (nat4)stamp;
00119 return localtime_r(&tt, &t)->tm_sec;
00120 }
00121 char* asString(char* buf, int buf_size, char const* format = "%c") const {
00122 struct tm t;
00123 time_t tt = (nat4)stamp;
00124 strftime(buf, buf_size, format, localtime_r(&tt, &t));
00125 return buf;
00126 }
00127 static dbDateTime currentDate() {
00128 struct tm t;
00129 time_t curr = time(NULL);
00130 localtime_r(&curr, &t);
00131 t.tm_hour = 0;
00132 t.tm_min = 0;
00133 t.tm_sec = 0;
00134 return dbDateTime(mktime(&t));
00135 }
00136 #else
00137 int year() {
00138 time_t tt = (nat4)stamp;
00139 return localtime(&tt)->tm_year + 1900;
00140 }
00141 int month() {
00142 time_t tt = (nat4)stamp;
00143 return localtime(&tt)->tm_mon + 1;
00144 }
00145 int day() {
00146 time_t tt = (nat4)stamp;
00147 return localtime(&tt)->tm_mday;
00148 }
00149 int dayOfYear() {
00150 time_t tt = (nat4)stamp;
00151 return localtime(&tt)->tm_yday+1;
00152 }
00153 int dayOfWeek() {
00154 time_t tt = (nat4)stamp;
00155 return localtime(&tt)->tm_wday+1;
00156 }
00157 int hour() {
00158 time_t tt = (nat4)stamp;
00159 return localtime(&tt)->tm_hour;
00160 }
00161 int minute() {
00162 time_t tt = (nat4)stamp;
00163 return localtime(&tt)->tm_min;
00164 }
00165 int second() {
00166 time_t tt = (nat4)stamp;
00167 return localtime(&tt)->tm_sec;
00168 }
00169 char* asString(char* buf, int buf_size, char const* format = "%c") const {
00170 time_t tt = (nat4)stamp;
00171 #ifdef _WINCE
00172 struct tm* t = localtime(&tt);
00173 char cnvBuf[CNV_BUF_SIZE];
00174 sprintf(cnvBuf, "%02d/02d/%40d %02d:%02d:%02d", t->tm_mon, t->tm_yday+1, t->tm_year + 1900,
00175 t->tm_hour, t->tm_min, t->tm_sec);
00176 strncpy(buf, cnvBuf, buf_size);
00177 #else
00178 strftime(buf, buf_size, format, localtime(&tt));
00179 #endif
00180 return buf;
00181 }
00182 static dbDateTime currentDate() {
00183 time_t curr = time(NULL);
00184 struct tm* tp = localtime(&curr);;
00185 tp->tm_hour = 0;
00186 tp->tm_min = 0;
00187 tp->tm_sec = 0;
00188 return dbDateTime(mktime(tp));
00189 }
00190 #endif
00191
00192 CLASS_DESCRIPTOR(dbDateTime,
00193 (KEY(stamp,INDEXED|HASHED),
00194 METHOD(year), METHOD(month), METHOD(day),
00195 METHOD(dayOfYear), METHOD(dayOfWeek),
00196 METHOD(hour), METHOD(minute), METHOD(second)));
00197
00198 dbQueryExpression operator == (char const* field) {
00199 dbQueryExpression expr;
00200 expr = dbComponent(field,"stamp"),"=",stamp;
00201 return expr;
00202 }
00203 dbQueryExpression operator != (char const* field) {
00204 dbQueryExpression expr;
00205 expr = dbComponent(field,"stamp"),"<>",stamp;
00206 return expr;
00207 }
00208 dbQueryExpression operator < (char const* field) {
00209 dbQueryExpression expr;
00210 expr = dbComponent(field,"stamp"),">",stamp;
00211 return expr;
00212 }
00213 dbQueryExpression operator <= (char const* field) {
00214 dbQueryExpression expr;
00215 expr = dbComponent(field,"stamp"),">=",stamp;
00216 return expr;
00217 }
00218 dbQueryExpression operator > (char const* field) {
00219 dbQueryExpression expr;
00220 expr = dbComponent(field,"stamp"),"<",stamp;
00221 return expr;
00222 }
00223 dbQueryExpression operator >= (char const* field) {
00224 dbQueryExpression expr;
00225 expr = dbComponent(field,"stamp"),"<=",stamp;
00226 return expr;
00227 }
00228 friend dbQueryExpression between(char const* field, dbDateTime& from,
00229 dbDateTime& till)
00230 {
00231 dbQueryExpression expr;
00232 expr=dbComponent(field,"stamp"),"between",from.stamp,"and",till.stamp;
00233 return expr;
00234 }
00235
00236 static dbQueryExpression ascent(char const* field) {
00237 dbQueryExpression expr;
00238 expr=dbComponent(field,"stamp");
00239 return expr;
00240 }
00241 static dbQueryExpression descent(char const* field) {
00242 dbQueryExpression expr;
00243 expr=dbComponent(field,"stamp"),"desc";
00244 return expr;
00245 }
00246 };
00247
00248 END_FASTDB_NAMESPACE
00249
00250 #endif