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) {
00027 return stamp == dt.stamp;
00028 }
00029 bool operator != (dbDateTime const& dt) {
00030 return stamp != dt.stamp;
00031 }
00032 bool operator > (dbDateTime const& dt) {
00033 return stamp > dt.stamp;
00034 }
00035 bool operator >= (dbDateTime const& dt) {
00036 return stamp >= dt.stamp;
00037 }
00038 bool operator < (dbDateTime const& dt) {
00039 return stamp < dt.stamp;
00040 }
00041 bool operator <= (dbDateTime const& dt) {
00042 return stamp <= dt.stamp;
00043 }
00044 int operator - (dbDateTime const& dt) {
00045 return stamp - dt.stamp;
00046 }
00047 int operator + (dbDateTime const& dt) {
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 = 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 = mktime(&t);
00110 }
00111
00115 dbDateTime(int hour, int min) {
00116 stamp = (hour*60+min)*60;
00117 }
00118
00119 #if HAVE_LOCALTIME_R && !defined(NO_PTHREADS)
00120
00123 int year() {
00124 struct tm t;
00125 return localtime_r((time_t*)&stamp, &t)->tm_year + 1900;
00126 }
00130 int month() {
00131 struct tm t;
00132 return localtime_r((time_t*)&stamp, &t)->tm_mon + 1;
00133 }
00137 int day() {
00138 struct tm t;
00139 return localtime_r((time_t*)&stamp, &t)->tm_mday;
00140 }
00144 int dayOfYear() {
00145 struct tm t;
00146 return localtime_r((time_t*)&stamp, &t)->tm_yday+1;
00147 }
00151 int dayOfWeek() {
00152 struct tm t;
00153 return localtime_r((time_t*)&stamp, &t)->tm_wday+1;
00154 }
00158 int hour() {
00159 struct tm t;
00160 return localtime_r((time_t*)&stamp, &t)->tm_hour;
00161 }
00165 int minute() {
00166 struct tm t;
00167 return localtime_r((time_t*)&stamp, &t)->tm_min;
00168 }
00172 int second() {
00173 struct tm t;
00174 return localtime_r((time_t*)&stamp, &t)->tm_sec;
00175 }
00183 char_t* asString(char* buf, int buf_size, char_t const* format = "%c") const {
00184 struct tm t;
00185 strftime(buf, buf_size, format, localtime_r((time_t*)&stamp, &t));
00186 return buf;
00187 }
00191 static dbDateTime currentDate() {
00192 struct tm t;
00193 time_t curr = time(NULL);
00194 localtime_r(&curr, &t);;
00195 t.tm_hour = 0;
00196 t.tm_min = 0;
00197 t.tm_sec = 0;
00198 return dbDateTime(mktime(&t));
00199 }
00200 #else
00201
00204 int year() {
00205 return localtime((time_t*)&stamp)->tm_year + 1900;
00206 }
00210 int month() {
00211 return localtime((time_t*)&stamp)->tm_mon + 1;
00212 }
00216 int day() {
00217 return localtime((time_t*)&stamp)->tm_mday;
00218 }
00222 int dayOfYear() {
00223 return localtime((time_t*)&stamp)->tm_yday+1;
00224 }
00228 int dayOfWeek() {
00229 return localtime((time_t*)&stamp)->tm_wday+1;
00230 }
00234 int hour() {
00235 return localtime((time_t*)&stamp)->tm_hour;
00236 }
00240 int minute() {
00241 return localtime((time_t*)&stamp)->tm_min;
00242 }
00246 int second() {
00247 return localtime((time_t*)&stamp)->tm_sec;
00248 }
00256 char_t* asString(char_t* buf, int buf_size, char_t const* format = _T("%c")) const {
00257 STRFTIME(buf, buf_size, format, localtime((time_t*)&stamp));
00258 return buf;
00259 }
00263 static dbDateTime currentDate() {
00264 time_t curr = time(NULL);
00265 struct tm* tp = localtime(&curr);;
00266 tp->tm_hour = 0;
00267 tp->tm_min = 0;
00268 tp->tm_sec = 0;
00269 return dbDateTime(mktime(tp));
00270 }
00271 #endif
00272
00273 CLASS_DESCRIPTOR(dbDateTime,
00274 (KEY(stamp,INDEXED|HASHED),
00275 METHOD(year), METHOD(month), METHOD(day),
00276 METHOD(dayOfYear), METHOD(dayOfWeek),
00277 METHOD(hour), METHOD(minute), METHOD(second)));
00278
00284 dbQueryExpression operator == (char_t const* field) {
00285 dbQueryExpression expr;
00286 expr = dbComponent(field,_T("stamp")),_T("="),stamp;
00287 return expr;
00288 }
00294 dbQueryExpression operator != (char_t const* field) {
00295 dbQueryExpression expr;
00296 expr = dbComponent(field,_T("stamp")),_T("<>"),stamp;
00297 return expr;
00298 }
00304 dbQueryExpression operator < (char_t const* field) {
00305 dbQueryExpression expr;
00306 expr = dbComponent(field,_T("stamp")),_T(">"),stamp;
00307 return expr;
00308 }
00314 dbQueryExpression operator <= (char_t const* field) {
00315 dbQueryExpression expr;
00316 expr = dbComponent(field,_T("stamp")),_T(">="),stamp;
00317 return expr;
00318 }
00324 dbQueryExpression operator > (char_t const* field) {
00325 dbQueryExpression expr;
00326 expr = dbComponent(field,_T("stamp")),_T("<"),stamp;
00327 return expr;
00328 }
00334 dbQueryExpression operator >= (char_t const* field) {
00335 dbQueryExpression expr;
00336 expr = dbComponent(field,_T("stamp")),_T("<="),stamp;
00337 return expr;
00338 }
00346 friend dbQueryExpression between(char_t const* field, dbDateTime& from,
00347 dbDateTime& till)
00348 {
00349 dbQueryExpression expr;
00350 expr=dbComponent(field,_T("stamp")),_T("between"),from.stamp,_T("and"),till.stamp;
00351 return expr;
00352 }
00353
00358 static dbQueryExpression ascent(char_t const* field) {
00359 dbQueryExpression expr;
00360 expr=dbComponent(field,_T("stamp"));
00361 return expr;
00362 }
00367 static dbQueryExpression descent(char_t const* field) {
00368 dbQueryExpression expr;
00369 expr=dbComponent(field,_T("stamp")),_T("desc");
00370 return expr;
00371 }
00372 };
00373
00374 END_GIGABASE_NAMESPACE
00375
00376 #endif
00377
00378
00379
00380
00381
00382
00383