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