1 /***************************************************************************
2 * Copyright (C) 2007 by www.databasecache.com *
3 * Contact: praba_tuty@databasecache.com *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 ***************************************************************************/
19 #define SmallestValJulDate (1721426)
21 Date::Date(int year
, int month
, int day
)
22 { YMDToJulian(year
, month
, day
, julianDate
); }
23 int Date::set(int year
, int month
, int day
)
24 { return YMDToJulian(year
,month
,day
,julianDate
); }
25 int Date::get(int &year
, int &month
, int &day
) const
26 { return julianToYMD(julianDate
,year
,month
,day
); }
28 int Date::parseFrom(const char *s
) {
31 count
= sscanf(s
,"%d/%d/%d",&year
,&month
,&day
);
32 if (count
< 3) return -1;
34 if (year
< 100) year
+= 1900;
36 if (!isValidDate(year
, month
, day
))
38 return set(year
,month
,day
);
41 int Date::dayOfMonth() const {
46 int Date::month() const {
51 int Date::year() const {
57 int Date::dayOfWeek() const { return dayOfWeek(julianDate
); }
59 const char *Date::dayOfWeekName() const
60 { return dayOfWeekName(dayOfWeek(julianDate
)); }
62 const char *Date::dayOfWeekAbbr() const
63 { return dayOfWeekAbbr(dayOfWeek(julianDate
)); }
65 static const char *day_names
[] = {
66 "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
68 static const char *day_abbrs
[] = {
69 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
72 static const char *month_names
[] = {
73 "January", "February", "March", "April", "May", "June",
74 "July", "August", "September", "October", "November", "December"
76 static const char *month_abbrs
[] = {
77 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
78 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
82 static int daysBeforeMonth
[] = {
83 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365
85 static int days_per_month
[] = {
86 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
89 const char * Date::dayOfWeekName(int day
)
90 { return (day
< 1 || day
> 7) ? 0 : day_names
[day
-1]; }
92 const char * Date::dayOfWeekAbbr(int day
)
93 { return (day
< 1 || day
> 7) ? 0 : day_abbrs
[day
-1]; }
95 const char * Date::monthName() const { return monthName(month()); }
96 const char * Date::monthAbbr() const { return monthAbbr(month()); }
97 const char * Date::monthName(int month
)
98 { return (month
< 1 || month
> 12) ? 0 : month_names
[month
-1]; }
99 const char * Date::monthAbbr(int month
)
100 { return (month
< 1 || month
> 12) ? 0 : month_abbrs
[month
-1]; }
101 Date
operator+(const Date
&d1
, int days
)
102 { return Date(d1
.julianDate
+ days
); }
103 Date
operator+(int days
, const Date
&d1
)
104 { return Date(d1
.julianDate
+ days
); }
105 Date
operator-(const Date
&d1
, int days
)
106 { return Date(d1
.julianDate
- days
); }
108 int operator-(const Date
&d1
, const Date
& d2
)
109 { return d1
.julianDate
- d2
.julianDate
; }
111 int operator<(const Date
&d1
,const Date
&d2
)
112 { return d1
.julianDate
< d2
.julianDate
; }
113 int operator>(const Date
&d1
,const Date
&d2
)
114 { return d1
.julianDate
> d2
.julianDate
; }
115 int operator<=(const Date
&d1
,const Date
&d2
)
116 { return d1
.julianDate
<= d2
.julianDate
; }
117 int operator>=(const Date
&d1
,const Date
&d2
)
118 { return d1
.julianDate
>= d2
.julianDate
; }
119 int operator==(const Date
&d1
,const Date
&d2
)
120 { return d1
.julianDate
== d2
.julianDate
; }
121 int operator!=(const Date
&d1
,const Date
&d2
)
122 { return d1
.julianDate
!= d2
.julianDate
; }
124 bool Date::isValid() const
125 { return julianDate
>= SmallestValJulDate
; }
127 bool Date::isLeapYear(int year
)
129 return (year
% 400 == 0) || ((year
% 4 == 0) && !(year
% 100 == 0));
132 int Date::dayOfYear() const {
135 int tmp
= daysBeforeMonth
[month
-1];
136 if (month
>= 3 && isLeapYear(year
))
141 int Date::daysInMonth(int month
, int year
) {
143 int tmp
= days_per_month
[month
];
144 if (month
== 1 && isLeapYear(year
)) tmp
++;
148 bool Date::isValidDate(int year
, int month
, int day
) {
149 if (year
< 1 || year
> 10000) return false;
150 if (month
< 1 || month
> 12) return false;
151 return (day
>= 1) && (day
<= daysInMonth(month
,year
));
154 // Algorithm Author: Robert G. Tantzen
155 int Date::YMDToJulian(int year
, int mon
, int day
, JulianRep
&jul
) {
156 if (!isValidDate(year
, mon
, day
))
157 { jul
= (JulianRep
)0; return -1; }
159 // year, month, day are assumed to be valid
160 int m
= mon
, d
= day
, y
= year
;
164 else { m
+= 9; --y
; }
167 j
= (146097*c
)/4 + (1461*ya
)/4 + (153*m
+2)/5 + d
+ 1721119;
172 // Julian date converter. Takes a julian date (the number of days since some
173 // distant epoch or other), and returns month, day of month, and year in
174 // integer references.
175 // Algorithm Author: Robert G. Tantzen
176 int Date::dayOfWeek(JulianRep jul
) {
177 return (int)((jul
+1)%7+1);
180 int Date::julianToYMD(JulianRep jul
, int &year
, int &month
, int &day
) {
184 if (j
< SmallestValJulDate
)
185 { year
= month
= day
= 0; return -1; }
188 y
= (4 * j
- 1)/146097;
189 j
= 4 * j
- 1 - 146097 * y
;
191 j
= (4 * d
+ 3)/1461;
192 d
= 4 * d
+ 3 - 1461 * j
;
195 d
= 5 * d
- 3 - 153 * m
;
199 else { m
-= 9; ++y
; }
206 #define MAX_VALID_SECONDS (60 * 60 * 24 -1)
207 Time::Time(int hours
, int mins
, int secs
, int usec
)
208 { set(hours
,mins
,secs
, usec
); }
210 int Time::set(int hours
, int mins
, int secs
, int usec
) {
211 if((hours
| mins
| secs
| usec
) < 0) { timeVal
= -1; return -1; }
212 if(hours
>= 24 | mins
>= 60 | secs
>= 62)
213 { timeVal
= -1; return -1; }
214 timeVal
= secs
+ mins
* 60 + hours
* 3600;
216 if(usec
) timeVal
+= usec
/100;
220 int Time::get(int &hours
, int &mins
, int &secs
) const {
221 if (timeVal
< 0) return -1;
222 int s
= timeVal
/10000;
231 int Time::seconds() const { return (timeVal
/10000) % 60; }
232 int Time::minutes() const { return (timeVal
/(60*10000)) % 60; }
233 int Time::hours() const { return timeVal
/ (3600*10000); }
234 int Time::msec() const { return (timeVal
% 10000) / 10; }
235 int Time::usec() const { return (timeVal
% 10000) * 100; }
237 int Time::setMsec(int ms
) {
238 if(ms
< 0 || ms
>= 1000) return -1;
239 timeVal
= timeVal
+(10*ms
);
242 int Time::setUsec(int us
) {
243 if(us
< 0 || us
>= 1000000) return -1;
244 timeVal
= timeVal
+us
/100;
248 bool Time::isValid() const
249 { return timeVal
>= 0 && timeVal
<= (10000*(MAX_VALID_SECONDS
+1)-1); }
251 bool Time::isValidTime(int hours
, int mins
, int secs
) {
252 return (hours
>= 0 && hours
< 24) &&
253 (mins
>= 0 && mins
< 60) &&
254 (secs
>= 0 && secs
< 60);
257 Time
operator+(const Time
&t1
, int seconds
)
258 { return Time(t1
.timeVal
+ seconds
*10000); }
259 Time
operator+(int seconds
, const Time
&t1
)
260 { return Time(t1
.timeVal
+ seconds
*10000); }
261 Time
operator-(const Time
&t1
, int seconds
)
262 { return Time(t1
.timeVal
- seconds
*10000); }
264 int operator-(const Time
&t1
, const Time
& t2
)
265 { return (t1
.timeVal
- t2
.timeVal
)/10000; }
267 int operator<(const Time
&t1
,const Time
&t2
)
268 { return t1
.timeVal
< t2
.timeVal
; }
269 int operator>(const Time
&t1
,const Time
&t2
)
270 { return t1
.timeVal
> t2
.timeVal
; }
271 int operator<=(const Time
&t1
,const Time
&t2
)
272 { return t1
.timeVal
<= t2
.timeVal
; }
273 int operator>=(const Time
&t1
,const Time
&t2
)
274 { return t1
.timeVal
>= t2
.timeVal
; }
275 int operator==(const Time
&t1
,const Time
&t2
)
276 { return t1
.timeVal
== t2
.timeVal
; }
277 int operator!=(const Time
&t1
,const Time
&t2
)
278 { return t1
.timeVal
!= t2
.timeVal
; }
280 int Time::parseFrom(const char *s
) {
283 count
= sscanf(s
,"%d:%d:%d",&hours
,&mins
,&secs
);
284 if (count
< 2) return -1;
285 if (count
== 2) secs
= 0;
287 if (!isValidTime(hours
,mins
,secs
))
289 return set(hours
,mins
,secs
);
291 int TimeStamp::parseFrom(const char *s
) {
295 count
= sscanf(s
,"%d/%d/%d %d:%d:%d",&year
,&month
,&day
, &hours
, &mins
, &secs
);
296 if (count
< 5) return -1;
297 if (count
== 5) secs
= 0;
299 if (year
< 100) year
+= 1900;
301 if (!date
.isValidDate(year
, month
, day
))
304 setDate(year
,month
,day
);
307 if (!time
.isValidTime(hours
,mins
,secs
))
309 return setTime(hours
,mins
,secs
);
312 int operator< (const TimeStamp
&d1
, const TimeStamp
&d2
)
313 { return (d1
.date
!= d2
.date
) ? d1
.date
< d2
.date
: d1
.time
< d2
.time
; }
314 int operator> (const TimeStamp
&d1
, const TimeStamp
&d2
)
315 { return (d1
.date
!= d2
.date
) ? d1
.date
> d2
.date
: d1
.time
> d2
.time
; }
316 int operator<=(const TimeStamp
&d1
, const TimeStamp
&d2
)
317 { return (d1
.date
!= d2
.date
) ? d1
.date
< d2
.date
: d1
.time
<= d2
.time
; }
318 int operator>=(const TimeStamp
&d1
, const TimeStamp
&d2
)
319 { return (d1
.date
!= d2
.date
) ? d1
.date
> d2
.date
: d1
.time
>= d2
.time
; }
320 int operator==(const TimeStamp
&d1
, const TimeStamp
&d2
)
321 { return d1
.date
== d2
.date
&& d1
.time
== d2
.time
; }
322 int operator!=(const TimeStamp
&d1
, const TimeStamp
&d2
)
323 { return d1
.date
!= d2
.date
&& d1
.time
!= d2
.time
; }
326 long AllDataType::size(DataType type
, int length
)
338 size
= sizeof(long long);
341 size
= sizeof(short);
347 size
= sizeof(double);
350 size
= sizeof(float);
354 //fldDef.length_ = sizeof(long double);
363 size
= sizeof(TimeStamp
);
374 char* AllDataType::getSQLString(DataType type
)
378 case typeInt
: return "INT";
379 case typeLong
: return "INT";
380 case typeLongLong
: return "BIGINT";
381 case typeShort
: return "SMALLINT";
382 case typeByteInt
: return "TINYINT";
383 case typeDouble
: return "REAL";
384 case typeFloat
: return "FLOAT";
385 case typeDate
: return "DATE";
386 case typeTime
: return "TIME";
387 case typeTimeStamp
: return "TIMESTAMP";
388 case typeString
: return "CHAR";
389 default: return "UNKNOWN";
394 SQLSMALLINT
AllDataType::convertToSQLType(DataType type
)
418 return SQL_TYPE_DATE
;
420 return SQL_TYPE_TIME
;
422 return SQL_TYPE_TIMESTAMP
;
428 SQLSMALLINT
AllDataType::convertToSQL_C_Type(DataType type
)
437 return SQL_C_SBIGINT
;
441 return SQL_C_STINYINT
;
450 return SQL_C_TYPE_DATE
;
452 return SQL_C_TYPE_TIME
;
454 return SQL_C_TYPE_TIMESTAMP
;
461 DataType
AllDataType::convertFromSQLType(SQLSMALLINT type
)
478 case SQL_TYPE_TIMESTAMP
:
479 return typeTimeStamp
;
487 void AllDataType::copyVal(void* dest
, void *src
, DataType type
, int length
)
492 *(int*)dest
= *(int*)src
;
495 *(long*)dest
= *(long*)src
;
498 *(long long*)dest
= *(long long*)src
;
501 *(short*)dest
= *(short*)src
;
504 *(char*)dest
= *(char*)src
;
507 *(double*)dest
= *(double*)src
;
510 *(float*)dest
= *(float*)src
;
515 *(Date
*)dest
= *(Date
*)src
;
518 *(Time
*)dest
= *(Time
*)src
;
521 *(TimeStamp
*)dest
= *(TimeStamp
*)src
;
525 strncpy((char*)dest
, (char*)src
, length
);
526 char *d
=(char*)dest
;
531 os::memcpy((char*)dest
, (char*)src
, length
);
538 bool AllDataType::compareVal(void *val1
, void *val2
, ComparisionOp op
,
539 DataType type
, long length
)
545 result
= AllDataType::compareIntVal(val1
, val2
, op
);
548 result
= AllDataType::compareLongVal(val1
, val2
, op
);
551 result
= AllDataType::compareLongLongVal(val1
, val2
, op
);
554 result
= AllDataType::compareShortVal(val1
, val2
, op
);
557 result
= AllDataType::compareByteIntVal(val1
, val2
, op
);
560 result
= AllDataType::compareDoubleVal(val1
, val2
, op
);
563 result
= AllDataType::compareFloatVal(val1
, val2
, op
);
569 result
= AllDataType::compareDateVal(val1
, val2
, op
);
572 result
= AllDataType::compareTimeVal(val1
, val2
, op
);
575 result
= AllDataType::compareTimeStampVal(val1
, val2
, op
);
578 result
= AllDataType::compareStringVal(val1
, val2
, op
);
581 result
= AllDataType::compareBinaryVal(val1
, val2
, op
, length
);
587 bool AllDataType::compareIntVal(void* src1
, void *src2
, ComparisionOp op
)
589 if (src1
== NULL
) printf("src1 is null\n");
590 if (src2
== NULL
) printf("src2 is null\n");
595 if (*(int*)src1
== *(int*)src2
) result
= true;
599 if (*(int*)src1
!= *(int*)src2
) result
= true;
603 if (*(int*)src1
< *(int*)src2
) result
= true;
606 case OpLessThanEquals
:
607 if (*(int*)src1
<= *(int*)src2
) result
= true;
611 if (*(int*)src1
> *(int*)src2
) result
= true;
614 case OpGreaterThanEquals
:
615 if (*(int*)src1
>= *(int*)src2
) result
= true;
622 bool AllDataType::compareLongVal(void* src1
, void *src2
, ComparisionOp op
)
628 if (*(long*)src1
== *(long*)src2
) result
= true;
632 if (*(long*)src1
!= *(long*)src2
) result
= true;
636 if (*(long*)src1
< *(long*)src2
) result
= true;
639 case OpLessThanEquals
:
640 if (*(long*)src1
<= *(long*)src2
) result
= true;
644 if (*(long*)src1
> *(long*)src2
) result
= true;
647 case OpGreaterThanEquals
:
648 if (*(long*)src1
>= *(long*)src2
) result
= true;
655 bool AllDataType::compareLongLongVal(void* src1
, void *src2
,
662 if (*(long long*)src1
== *(long long*)src2
) result
= true;
666 if (*(long long*)src1
!= *(long long*)src2
) result
= true;
670 if (*(long long*)src1
< *(long long*)src2
) result
= true;
673 case OpLessThanEquals
:
674 if (*(long long*)src1
<= *(long long*)src2
) result
= true;
678 if (*(long long*)src1
> *(long long*)src2
) result
= true;
681 case OpGreaterThanEquals
:
682 if (*(long long*)src1
>= *(long long*)src2
) result
= true;
689 bool AllDataType::compareShortVal(void* src1
, void *src2
, ComparisionOp op
)
695 if (*(short*)src1
== *(short*)src2
) result
= true;
699 if (*(short*)src1
!= *(short*)src2
) result
= true;
703 if (*(short*)src1
< *(short*)src2
) result
= true;
706 case OpLessThanEquals
:
707 if (*(short*)src1
<= *(short*)src2
) result
= true;
711 if (*(short*)src1
> *(short*)src2
) result
= true;
714 case OpGreaterThanEquals
:
715 if (*(short*)src1
>= *(short*)src2
) result
= true;
722 bool AllDataType::compareByteIntVal(void* src1
, void *src2
, ComparisionOp op
)
728 if (*(ByteInt
*)src1
== *(ByteInt
*)src2
) result
= true;
732 if (*(ByteInt
*)src1
!= *(ByteInt
*)src2
) result
= true;
736 if (*(ByteInt
*)src1
< *(ByteInt
*)src2
) result
= true;
739 case OpLessThanEquals
:
740 if (*(ByteInt
*)src1
<= *(ByteInt
*)src2
) result
= true;
744 if (*(ByteInt
*)src1
> *(ByteInt
*)src2
) result
= true;
747 case OpGreaterThanEquals
:
748 if (*(ByteInt
*)src1
>= *(ByteInt
*)src2
) result
= true;
755 bool AllDataType::compareDoubleVal(void* src1
, void *src2
, ComparisionOp op
)
761 if (*(double*)src1
== *(double*)src2
) result
= true;
765 if (*(double*)src1
!= *(double*)src2
) result
= true;
769 if (*(double*)src1
< *(double*)src2
) result
= true;
772 case OpLessThanEquals
:
773 if (*(double*)src1
<= *(double*)src2
) result
= true;
777 if (*(double*)src1
> *(double*)src2
) result
= true;
780 case OpGreaterThanEquals
:
781 if (*(double*)src1
>= *(double*)src2
) result
= true;
788 bool AllDataType::compareFloatVal(void* src1
, void *src2
, ComparisionOp op
)
794 if (*(float*)src1
== *(float*)src2
) result
= true;
798 if (*(float*)src1
!= *(float*)src2
) result
= true;
802 if (*(float*)src1
< *(float*)src2
) result
= true;
805 case OpLessThanEquals
:
806 if (*(float*)src1
<= *(float*)src2
) result
= true;
810 if (*(float*)src1
> *(float*)src2
) result
= true;
813 case OpGreaterThanEquals
:
814 if (*(float*)src1
>= *(float*)src2
) result
= true;
821 bool AllDataType::compareDateVal(void* src1
, void *src2
, ComparisionOp op
)
827 if (*(Date
*)src1
== *(Date
*)src2
) result
= true;
831 if (*(Date
*)src1
!= *(Date
*)src2
) result
= true;
835 if (*(Date
*)src1
< *(Date
*)src2
) result
= true;
838 case OpLessThanEquals
:
839 if (*(Date
*)src1
<= *(Date
*)src2
) result
= true;
843 if (*(Date
*)src1
> *(Date
*)src2
) result
= true;
846 case OpGreaterThanEquals
:
847 if (*(Date
*)src1
>= *(Date
*)src2
) result
= true;
854 bool AllDataType::compareTimeVal(void* src1
, void *src2
, ComparisionOp op
)
860 if (*(Time
*)src1
== *(Time
*)src2
) result
= true;
864 if (*(Time
*)src1
!= *(Time
*)src2
) result
= true;
868 if (*(Time
*)src1
< *(Time
*)src2
) result
= true;
871 case OpLessThanEquals
:
872 if (*(Time
*)src1
<= *(Time
*)src2
) result
= true;
876 if (*(Time
*)src1
> *(Time
*)src2
) result
= true;
879 case OpGreaterThanEquals
:
880 if (*(Time
*)src1
>= *(Time
*)src2
) result
= true;
887 bool AllDataType::compareTimeStampVal(void* src1
, void *src2
, ComparisionOp op
)
893 if (*(TimeStamp
*)src1
== *(TimeStamp
*)src2
) result
= true;
897 if (*(TimeStamp
*)src1
!= *(TimeStamp
*)src2
) result
= true;
901 if (*(TimeStamp
*)src1
< *(TimeStamp
*)src2
) result
= true;
904 case OpLessThanEquals
:
905 if (*(TimeStamp
*)src1
<= *(TimeStamp
*)src2
) result
= true;
909 if (*(TimeStamp
*)src1
> *(TimeStamp
*)src2
) result
= true;
912 case OpGreaterThanEquals
:
913 if (*(TimeStamp
*)src1
>= *(TimeStamp
*)src2
) result
= true;
920 bool AllDataType::compareStringVal(void* src1
, void *src2
, ComparisionOp op
)
923 int ret
= strcmp((char*)src1
, (char*)src2
);
927 if (ret
== 0 ) result
= true; else result
= false;
930 if (ret
!= 0 ) result
= true; else result
= false;
933 if (ret
< 0 ) result
= true; else result
= false;
935 case OpLessThanEquals
:
936 printf("Illegal Operator:Not Supported for String\n");
939 if (ret
> 0 ) result
= true; else result
= false;
941 case OpGreaterThanEquals
:
942 printf("Illegal Operator:Not Supported for String\n");
948 bool AllDataType::compareBinaryVal(void* src1
, void *src2
,
949 ComparisionOp op
, int length
)
952 int ret
= os::memcmp(src1
, src2
, length
);
956 if (ret
== 0 ) result
= true; else result
= false;
959 if (ret
!= 0 ) result
= true; else result
= false;
962 if (ret
< 0 ) result
= true; else result
= false;
964 case OpLessThanEquals
:
965 printf("Illegal Operator:Not Supported for Binary\n");
968 if (ret
> 0 ) result
= true; else result
= false;
970 case OpGreaterThanEquals
:
971 printf("Illegal Operator:Not Supported for Binary\n");
979 ComparisionOp
AllDataType::getComparisionOperator(char *str
)
982 if (strcmp(str
, "<=") == 0)
983 op
= OpLessThanEquals
;
984 else if (strcmp(str
, ">=") == 0)
985 op
= OpGreaterThanEquals
;
986 else if (strcmp(str
, "<") == 0)
988 else if (strcmp(str
, ">") == 0)
990 else if (strcmp(str
, "=") == 0)
992 else if (strcmp(str
, "!=") == 0 || strcmp(str
, "<>") == 0 )
995 op
= OpInvalidComparisionOp
;
999 void* AllDataType::alloc(DataType type
, int length
)
1005 dest
= malloc(sizeof(int));
1008 dest
= malloc(sizeof(long));
1011 dest
= malloc(sizeof(long long));
1014 dest
= malloc(sizeof(short));
1017 dest
= malloc(sizeof(char));
1020 dest
= malloc(sizeof(double));
1023 dest
= malloc(sizeof(float));
1027 //fldDef.length_ = sizeof(long double);
1030 if (length
== 0 ) return NULL
;
1031 dest
= malloc(length
);
1034 dest
= malloc(sizeof(Date
));
1037 dest
= malloc(sizeof(Time
));
1040 dest
= malloc(sizeof(TimeStamp
));
1045 void AllDataType::strToValue(void* dest
, char *src
, DataType type
, int length
)
1051 sscanf( src
, "%d", &val
);
1056 sscanf( src
, "%ld", &val
);
1059 case typeLongLong
: {
1061 sscanf( src
, "%lld", &val
);
1062 *(long long*)dest
= val
;
1066 sscanf( src
, "%hd", &val
);
1067 *(short*)dest
= val
;
1071 sscanf( src
, "%c", &val
);
1076 sscanf( src
, "%lg", &val
);
1077 *(double*)dest
= val
;
1081 sscanf( src
, "%f", &val
);
1082 *(float*)dest
= val
;
1087 strncpy((char*)dest
, (char*)src
, length
);
1088 char *d
=(char*)dest
;
1093 res
= sscanf( src
, "%d-%d-%d", &y
, &m
, &d
);
1095 res
= sscanf( src
, "%d/%d/%d", &y
, &m
, &d
);
1098 fprintf(stderr
,"Error reading date. yyyy{-/}mm{-/}dd is the valid format.");
1101 Date
dateObj(y
,m
,d
);
1102 *(Date
*)dest
= dateObj
;
1106 res
= sscanf( src
, "%d:%d:%d", &h
, &m
, &s
);
1109 fprintf(stderr
, "Error reading time, hh:mm:ss is the valid format.");
1112 Time
timeObj(h
,m
,s
);
1113 *(Time
*)dest
= timeObj
;
1115 case typeTimeStamp
: {
1116 int d
,m
,y
, h
,mn
,s
, res
=0;
1117 res
= sscanf( src
, "%d-%d-%d %d:%d:%d", &y
, &m
, &d
, &h
, &mn
, &s
);
1119 res
= sscanf( src
, "%d-%d-%d, %d:%d:%d", &y
, &m
, &d
, &h
, &mn
, &s
);
1121 res
= sscanf( src
, "%d/%d/%d %d:%d:%d", &y
, &m
, &d
, &h
, &mn
, &s
);
1123 res
= sscanf( src
, "%d/%d/%d, %d:%d:%d", &y
, &m
, &d
, &h
, &mn
, &s
);
1126 fprintf(stderr
, "Error reading timestamp, yyyy{-/}mm{-/}dd[,] hh:mm:ss is the valid format.");
1129 TimeStamp
timeStampObj(y
,m
,d
,h
,mn
,s
);
1130 *(TimeStamp
*)dest
= timeStampObj
;
1138 void AllDataType::convert(DataType srcType
, void *src
,
1139 DataType destType
, void *dest
)
1141 switch ((DataType
) destType
)
1143 case typeInt
: convertToInt(dest
, src
, srcType
); break;
1144 case typeLong
: convertToLong(dest
, src
, srcType
); break;
1145 case typeLongLong
: convertToLongLong(dest
, src
, srcType
); break;
1146 case typeShort
: convertToShort(dest
, src
, srcType
); break;
1147 case typeByteInt
: convertToByteInt(dest
, src
, srcType
); break;
1149 case typeFloat
: convertToFloat(dest
, src
, srcType
); break;
1150 case typeDouble
: convertToDouble(dest
, src
, srcType
); break;
1153 case typeDecimal
: convertToDouble(dest
, src
, srcType
); break;
1155 case typeString
: convertToString(dest
, src
, srcType
); break;
1158 case typeDate
: convertToDate(dest
, src
, srcType
); break;
1159 case typeTime
: convertToTime(dest
, src
, srcType
); break;
1160 case typeTimeStamp
: convertToTimeStamp(dest
, src
, srcType
); break;
1165 void AllDataType::convertToInt( void* dest
, void* src
, DataType srcType
)
1169 case typeInt
: *(int *)dest
= *(int *)src
; break;
1170 case typeLong
: *(int *)dest
=(int) *(long *)src
; break;
1171 case typeLongLong
: *(int *)dest
=(int) *(long long *)src
; break;
1172 case typeShort
: *(int *)dest
=(int) *(short *)src
; break;
1173 case typeByteInt
: *(int *)dest
=(int) *(char *)src
; break;
1175 case typeFloat
: *(int *)dest
= (int) *(float *)src
; break;
1176 case typeDouble
: *(int *)dest
=(int) *(double *)src
; break;
1178 case typeString
: sscanf((const char*)src
, "%d", (int*) dest
); break;
1184 default: *(int *)dest
= (int) 0;
1188 void AllDataType::convertToLong( void* dest
, void* src
, DataType srcType
)
1192 case typeInt
: *(long *)dest
=(long) *(int *)src
; break;
1193 case typeLong
: *(long *)dest
= *(long *)src
; break;
1194 case typeLongLong
: *(long *)dest
=(long) *(long long *)src
; break;
1195 case typeShort
: *(long *)dest
=(long) *(short *)src
; break;
1196 case typeByteInt
: *(long *)dest
=(long) *(char *)src
; break;
1198 case typeFloat
: *(long *)dest
= (long) *(float *)src
; break;
1199 case typeDouble
: *(long *)dest
=(long) *(double *)src
; break;
1201 case typeString
: sscanf((const char*)src
, "%ld", (long*) dest
); break;
1207 default: *(long *)dest
= (long) 0;
1212 void AllDataType::convertToLongLong( void* dest
, void* src
, DataType srcType
)
1216 case typeInt
: *(long long *)dest
=(long long) *(int *)src
; break;
1217 case typeLong
: *(long long *)dest
= (long long) *(long *)src
; break;
1218 case typeLongLong
: *(long long *)dest
= *(long long *)src
; break;
1219 case typeShort
: *(long long *)dest
=(long long) *(short *)src
; break;
1220 case typeByteInt
: *(long long *)dest
=(long long) *(char *)src
; break;
1222 case typeFloat
: *(long long *)dest
= (long long) *(float *)src
; break;
1223 case typeDouble
: *(long long *)dest
=(long long) *(double *)src
; break;
1225 case typeString
: sscanf((const char*)src
, "%lld", (long long*) dest
); break;
1231 default: *(long long *)dest
= (long long) 0;
1235 void AllDataType::convertToShort( void* dest
, void* src
, DataType srcType
)
1239 case typeInt
: *(short*)dest
=(short) *(int*)src
; break;
1240 case typeLong
: *(short*)dest
= (short) *(long*)src
; break;
1241 case typeLongLong
: *(short*)dest
= (short) *(long long*)src
; break;
1242 case typeShort
: *(short*)dest
= *(short*)src
; break;
1243 case typeByteInt
: *(short*)dest
=(short) *(char *)src
; break;
1245 case typeFloat
: *(short*)dest
= (short) *(float *)src
; break;
1246 case typeDouble
: *(short*)dest
=(short) *(double *)src
; break;
1248 case typeString
: sscanf((const char*)src
, "%hd", (short*) dest
); break;
1254 default: *(short*)dest
= (short) 0;
1258 void AllDataType::convertToByteInt( void* dest
, void* src
, DataType srcType
)
1262 case typeInt
: *(char*)dest
= (char) *(int*)src
; break;
1263 case typeLong
: *(char*)dest
= (char) *(long*)src
; break;
1264 case typeLongLong
: *(char*)dest
= (char) *(long long*)src
; break;
1265 case typeShort
: *(char*)dest
= (char) *(short*)src
; break;
1266 case typeByteInt
: *(char*)dest
= *(char *)src
; break;
1268 case typeFloat
: *(char*)dest
= (char) *(float *)src
; break;
1269 case typeDouble
: *(char*)dest
=(char) *(double *)src
; break;
1271 case typeString
: sscanf((const char*)src
, "%c", (char*) dest
); break;
1277 default: *(char*)dest
= (char) 0;
1281 void AllDataType::convertToFloat( void* dest
, void* src
, DataType srcType
)
1285 case typeInt
: *(float *)dest
=(float) *(int *)src
; break;
1286 case typeLong
: *(float *)dest
=(float) *(long *)src
; break;
1287 case typeLongLong
: *(float *)dest
=(float) *(long long *)src
; break;
1288 case typeShort
: *(float *)dest
=(float) *(short *)src
; break;
1289 case typeByteInt
: *(float *)dest
=(float) *(char *)src
; break;
1291 case typeFloat
: *(float *)dest
= *(float *)src
; break;
1292 case typeDouble
: *(float *)dest
=(float) *(double *)src
; break;
1294 case typeString
: sscanf((const char*)src
, "%f", (float*) dest
); break;
1300 default: *(float *)dest
= (float) 0;
1304 void AllDataType::convertToDouble( void* dest
, void* src
, DataType srcType
)
1308 case typeInt
: *(double *)dest
=(double) *(int *)src
; break;
1309 case typeLong
: *(double *)dest
=(double) *(long *)src
; break;
1310 case typeLongLong
: *(double *)dest
=(double) *(long long *)src
; break;
1311 case typeShort
: *(double *)dest
=(double) *(short *)src
; break;
1312 case typeByteInt
: *(double *)dest
=(double) *(char *)src
; break;
1314 case typeFloat
: *(double *)dest
=(double) *(float *)src
; break;
1315 case typeDouble
: *(double *)dest
= *(double *)src
; break;
1317 case typeString
: sscanf((const char*)src
, "%lf", (double*) dest
); break;
1323 default: *(double *)dest
= (double) 0;
1327 void AllDataType::convertToString( void* dest
, void* src
, DataType srcType
)
1333 sprintf ((char *)dest
, "%d", *(int *)src
);
1338 sprintf ((char *)dest
, "%ld", *(long *)src
);
1343 sprintf ((char *)dest
, "%lld", *(long long *)src
);
1348 sprintf ((char *)dest
, "%hd", *(short *)src
);
1353 sprintf ((char *)dest
, "%hd", *(char *)src
);
1359 sprintf ((char *)dest
, "%f", *(float *)src
);
1364 sprintf ((char *) dest
, "%lf", *(double *)src
);
1370 strcpy((char*)dest
, (char*)src
);
1375 Date
* dt
= (Date
*)src
;
1376 sprintf((char*) dest
, "%d/%d/%d", dt
->year(),
1377 dt
->month(), dt
->dayOfMonth());
1382 Time
* tm
= (Time
*)src
;
1383 sprintf((char*)dest
,"%d:%d:%d.%d", tm
->hours(), tm
->minutes(), tm
->seconds(), 0);
1388 TimeStamp
* tm
= (TimeStamp
*)src
;
1389 sprintf((char*)dest
, "%d/%d/%d %d:%d:%d.%d", tm
->year(),
1390 tm
->month(), tm
->dayOfMonth(), tm
->hours(),
1391 tm
->minutes(), tm
->seconds(), 0 );
1394 default: ((char*)dest
)[0] = '\0';
1398 void AllDataType::convertToDate( void* dest
, void* src
, DataType srcType
)
1414 Date
*dt
= (Date
*) dest
;
1415 dt
->parseFrom((char*)src
);
1418 default: ((char*)dest
)[0] = '\0';
1422 void AllDataType::convertToTime( void* dest
, void* src
, DataType srcType
)
1438 Time
*dt
= (Time
*) dest
;
1439 dt
->parseFrom((char*)src
);
1442 default: ((char*)dest
)[0] = '\0';
1446 void AllDataType::convertToTimeStamp( void* dest
, void* src
, DataType srcType
)
1462 TimeStamp
*dt
= (TimeStamp
*) dest
;
1463 dt
->parseFrom((char*)src
);
1466 default: ((char*)dest
)[0] = '\0';
1470 void AllDataType::printVal(void* src
, DataType srcType
, int length
)
1476 printf ("%d", *(int *)src
);
1481 printf ("%ld", *(long *)src
);
1486 printf ("%lld", *(long long *)src
);
1491 printf("%hd", *(short *)src
);
1496 printf("%hd", *(char *)src
);
1502 printf("%f", *(float *)src
);
1507 printf("%lf", *(double *)src
);
1513 printf("%s", (char*)src
);
1518 Date
* dt
= (Date
*)src
;
1519 printf("%d/%d/%d", dt
->year(),
1520 dt
->month(), dt
->dayOfMonth());
1525 Time
* tm
= (Time
*)src
;
1526 printf("%d:%d:%d.%d", tm
->hours(), tm
->minutes(), tm
->seconds(), 0);
1531 TimeStamp
* tm
= (TimeStamp
*)src
;
1532 printf("%d/%d/%d %d:%d:%d.%d", tm
->year(),
1533 tm
->month(), tm
->dayOfMonth(), tm
->hours(),
1534 tm
->minutes(), tm
->seconds(), 0 );
1537 default: { printf("DataType not supported\n"); break; }