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_GIGABASE_NAMESPACE
00018
00019
00023 class GIGABASE_DLL_ENTRY dbDateTime {
00024 int4 stamp;
00025 public:
00026 bool operator == (dbDateTime const& dt) const {
00027 return stamp == dt.stamp;
00028 }
00029 bool operator != (dbDateTime const& dt) const {
00030 return stamp != dt.stamp;
00031 }
00032 bool operator > (dbDateTime const& dt) const {
00033 return stamp > dt.stamp;
00034 }
00035 bool operator >= (dbDateTime const& dt) const {
00036 return stamp >= dt.stamp;
00037 }
00038 bool operator < (dbDateTime const& dt) const {
00039 return stamp < dt.stamp;
00040 }
00041 bool operator <= (dbDateTime const& dt) const {
00042 return stamp <= dt.stamp;
00043 }
00044 int operator - (dbDateTime const& dt) const {
00045 return stamp - dt.stamp;
00046 }
00047 int operator + (dbDateTime const& dt) const {
00048 return stamp + dt.stamp;
00049 }
00050
00054 static dbDateTime current() {
00055 return dbDateTime(time(NULL));
00056 }
00057
00061 dbDateTime(time_t t) {
00062 stamp = (int4)t;
00063 }
00064
00068 dbDateTime() {
00069 stamp = -1;
00070 }
00071
00075 bool isValid() const {
00076 return stamp != -1;
00077 }
00078
00082 time_t asTime_t() const { return stamp; }
00083
00087 void clear() { stamp = -1; }
00088
00098 dbDateTime(int year, int month, int day,
00099 int hour=0, int min=0, int sec = 0)
00100 {
00101 struct tm t;
00102 t.tm_year = year > 1900 ? year - 1900 : year;
00103 t.tm_mon = month-1;
00104 t.tm_mday = day;
00105 t.tm_hour = hour;
00106 t.tm_min = min;
00107 t.tm_sec = sec;
00108 t.tm_isdst = -1;
00109 stamp = (int4)mktime(&t);
00110 }
00111
00115 dbDateTime(int hour, int min) {
00116 stamp = (hour*60+min)*60;
00117 }
00118
00119 #if defined(HAVE_LOCALTIME_R) && !defined(NO_PTHREADS)
00120
00123 int year() {
00124 struct tm t;
00125 time_t tt = (nat4)stamp;
00126 return localtime_r(&tt, &t)->tm_year + 1900;
00127 }
00131 int month() {
00132 struct tm t;
00133 time_t tt = (nat4)stamp;
00134 return localtime_r(&tt, &t)->tm_mon + 1;
00135 }
00139 int day() {
00140 struct tm t;
00141 time_t tt = (nat4)stamp;
00142 return localtime_r(&tt, &t)->tm_mday;
00143 }
00147 int dayOfYear() {
00148 struct tm t;
00149 time_t tt = (nat4)stamp;
00150 return localtime_r(&tt, &t)->tm_yday+1;
00151 }
00155 int dayOfWeek() {
00156 struct tm t;
00157 time_t tt = (nat4)stamp;
00158 return localtime_r(&tt, &t)->tm_wday+1;
00159 }
00163 int hour() {
00164 struct tm t;
00165 time_t tt = (nat4)stamp;
00166 return localtime_r(&tt, &t)->tm_hour;
00167 }
00171 int minute() {
00172 struct tm t;
00173 time_t tt = (nat4)stamp;
00174 return localtime_r(&tt, &t)->tm_min;
00175 }
00179 int second() {
00180 struct tm t;
00181 time_t tt = (nat4)stamp;
00182 return localtime_r(&tt, &t)->tm_sec;
00183 }
00191 char_t* asString(char* buf, int buf_size, char_t const* format = "%c") const {
00192 struct tm t;
00193 time_t tt = (nat4)stamp;
00194 strftime(buf, buf_size, format, localtime_r(&tt, &t));
00195 return buf;
00196 }
00200 static dbDateTime currentDate() {
00201 struct tm t;
00202 time_t curr = time(NULL);
00203 localtime_r(&curr, &t);;
00204 t.tm_hour = 0;
00205 t.tm_min = 0;
00206 t.tm_sec = 0;
00207 return dbDateTime(mktime(&t));
00208 }
00209 #else
00210
00213 int year() {
00214 time_t tt = (nat4)stamp;
00215 return localtime(&tt)->tm_year + 1900;
00216 }
00220 int month() {
00221 time_t tt = (nat4)stamp;
00222 return localtime(&tt)->tm_mon + 1;
00223 }
00227 int day() {
00228 time_t tt = (nat4)stamp;
00229 return localtime(&tt)->tm_mday;
00230 }
00234 int dayOfYear() {
00235 time_t tt = (nat4)stamp;
00236 return localtime(&tt)->tm_yday+1;
00237 }
00241 int dayOfWeek() {
00242 time_t tt = (nat4)stamp;
00243 return localtime(&tt)->tm_wday+1;
00244 }
00248 int hour() {
00249 time_t tt = (nat4)stamp;
00250 return localtime(&tt)->tm_hour;
00251 }
00255 int minute() {
00256 time_t tt = (nat4)stamp;
00257 return localtime(&tt)->tm_min;
00258 }
00262 int second() {
00263 time_t tt = (nat4)stamp;
00264 return localtime(&tt)->tm_sec;
00265 }
00273 char_t* asString(char_t* buf, int buf_size, char_t const* format = _T("%c")) const {
00274 time_t tt = (nat4)stamp;
00275 #ifdef _WINCE
00276 struct tm* t = localtime(&tt);
00277 wchar_t cnvBuf[256];
00278 wsprintf(cnvBuf, _T("%02d/02d/%40d %02d:%02d:%02d"), t->tm_mon, t->tm_yday+1, t->tm_year + 1900,
00279 t->tm_hour, t->tm_min, t->tm_sec);
00280 wsprintf(buf, _T("%.*s"), buf_size, cnvBuf);
00281 #else
00282 STRFTIME(buf, buf_size, format, localtime(&tt));
00283 #endif
00284 return buf;
00285 }
00289 static dbDateTime currentDate() {
00290 time_t curr = time(NULL);
00291 struct tm* tp = localtime(&curr);;
00292 tp->tm_hour = 0;
00293 tp->tm_min = 0;
00294 tp->tm_sec = 0;
00295 return dbDateTime(mktime(tp));
00296 }
00297 #endif
00298
00299 CLASS_DESCRIPTOR(dbDateTime,
00300 (KEY(stamp,INDEXED|HASHED),
00301 METHOD(year), METHOD(month), METHOD(day),
00302 METHOD(dayOfYear), METHOD(dayOfWeek),
00303 METHOD(hour), METHOD(minute), METHOD(second)));
00304
00310 dbQueryExpression operator == (char_t const* field) {
00311 dbQueryExpression expr;
00312 expr = dbComponent(field,_T("stamp")),_T("="),stamp;
00313 return expr;
00314 }
00320 dbQueryExpression operator != (char_t const* field) {
00321 dbQueryExpression expr;
00322 expr = dbComponent(field,_T("stamp")),_T("<>"),stamp;
00323 return expr;
00324 }
00330 dbQueryExpression operator < (char_t const* field) {
00331 dbQueryExpression expr;
00332 expr = dbComponent(field,_T("stamp")),_T(">"),stamp;
00333 return expr;
00334 }
00340 dbQueryExpression operator <= (char_t const* field) {
00341 dbQueryExpression expr;
00342 expr = dbComponent(field,_T("stamp")),_T(">="),stamp;
00343 return expr;
00344 }
00350 dbQueryExpression operator > (char_t const* field) {
00351 dbQueryExpression expr;
00352 expr = dbComponent(field,_T("stamp")),_T("<"),stamp;
00353 return expr;
00354 }
00360 dbQueryExpression operator >= (char_t const* field) {
00361 dbQueryExpression expr;
00362 expr = dbComponent(field,_T("stamp")),_T("<="),stamp;
00363 return expr;
00364 }
00372 friend dbQueryExpression between(char_t const* field, dbDateTime& from,
00373 dbDateTime& till)
00374 {
00375 dbQueryExpression expr;
00376 expr=dbComponent(field,_T("stamp")),_T("between"),from.stamp,_T("and"),till.stamp;
00377 return expr;
00378 }
00379
00384 static dbQueryExpression ascent(char_t const* field) {
00385 dbQueryExpression expr;
00386 expr=dbComponent(field,_T("stamp"));
00387 return expr;
00388 }
00393 static dbQueryExpression descent(char_t const* field) {
00394 dbQueryExpression expr;
00395 expr=dbComponent(field,_T("stamp")),_T("desc");
00396 return expr;
00397 }
00398 };
00399
00400 END_GIGABASE_NAMESPACE
00401
00402 #endif
00403
00404
00405
00406
00407
00408
00409