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 ***************************************************************************/
20 #define SmallestValJulDate (1721426)
22 Date::Date(int year
, int month
, int day
)
23 { YMDToJulian(year
, month
, day
, julianDate
); }
24 int Date::set(int year
, int month
, int day
)
25 { return YMDToJulian(year
,month
,day
,julianDate
); }
26 int Date::get(int &year
, int &month
, int &day
) const
27 { return julianToYMD(julianDate
,year
,month
,day
); }
29 int Date::parseFrom(const char *s
) {
32 count
= sscanf(s
,"%d/%d/%d",&year
,&month
,&day
);
33 if (count
< 3) return -1;
35 if (year
< 100) year
+= 1900;
37 if (!isValidDate(year
, month
, day
))
39 return set(year
,month
,day
);
42 int Date::dayOfMonth() const {
47 int Date::month() const {
52 int Date::year() const {
58 int Date::dayOfWeek() const { return dayOfWeek(julianDate
); }
60 const char *Date::dayOfWeekName() const
61 { return dayOfWeekName(dayOfWeek(julianDate
)); }
63 const char *Date::dayOfWeekAbbr() const
64 { return dayOfWeekAbbr(dayOfWeek(julianDate
)); }
66 static const char *day_names
[] = {
67 "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
69 static const char *day_abbrs
[] = {
70 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
73 static const char *month_names
[] = {
74 "January", "February", "March", "April", "May", "June",
75 "July", "August", "September", "October", "November", "December"
77 static const char *month_abbrs
[] = {
78 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
79 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
83 static int daysBeforeMonth
[] = {
84 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365
86 static int days_per_month
[] = {
87 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
90 const char * Date::dayOfWeekName(int day
)
91 { return (day
< 1 || day
> 7) ? 0 : day_names
[day
-1]; }
93 const char * Date::dayOfWeekAbbr(int day
)
94 { return (day
< 1 || day
> 7) ? 0 : day_abbrs
[day
-1]; }
96 const char * Date::monthName() const { return monthName(month()); }
97 const char * Date::monthAbbr() const { return monthAbbr(month()); }
98 const char * Date::monthName(int month
)
99 { return (month
< 1 || month
> 12) ? 0 : month_names
[month
-1]; }
100 const char * Date::monthAbbr(int month
)
101 { return (month
< 1 || month
> 12) ? 0 : month_abbrs
[month
-1]; }
102 Date
operator+(const Date
&d1
, int days
)
103 { return Date(d1
.julianDate
+ days
); }
104 Date
operator+(int days
, const Date
&d1
)
105 { return Date(d1
.julianDate
+ days
); }
106 Date
operator-(const Date
&d1
, int days
)
107 { return Date(d1
.julianDate
- days
); }
109 int operator-(const Date
&d1
, const Date
& d2
)
110 { return d1
.julianDate
- d2
.julianDate
; }
112 int operator<(const Date
&d1
,const Date
&d2
)
113 { return d1
.julianDate
< d2
.julianDate
; }
114 int operator>(const Date
&d1
,const Date
&d2
)
115 { return d1
.julianDate
> d2
.julianDate
; }
116 int operator<=(const Date
&d1
,const Date
&d2
)
117 { return d1
.julianDate
<= d2
.julianDate
; }
118 int operator>=(const Date
&d1
,const Date
&d2
)
119 { return d1
.julianDate
>= d2
.julianDate
; }
120 int operator==(const Date
&d1
,const Date
&d2
)
121 { return d1
.julianDate
== d2
.julianDate
; }
122 int operator!=(const Date
&d1
,const Date
&d2
)
123 { return d1
.julianDate
!= d2
.julianDate
; }
125 bool Date::isValid() const
126 { return julianDate
>= SmallestValJulDate
; }
128 bool Date::isLeapYear(int year
)
130 return (year
% 400 == 0) || ((year
% 4 == 0) && !(year
% 100 == 0));
133 int Date::dayOfYear() const {
136 int tmp
= daysBeforeMonth
[month
-1];
137 if (month
>= 3 && isLeapYear(year
))
142 int Date::daysInMonth(int month
, int year
) {
144 int tmp
= days_per_month
[month
];
145 if (month
== 1 && isLeapYear(year
)) tmp
++;
149 bool Date::isValidDate(int year
, int month
, int day
) {
150 if (year
< 1 || year
> 10000) return false;
151 if (month
< 1 || month
> 12) return false;
152 return (day
>= 1) && (day
<= daysInMonth(month
,year
));
155 // Algorithm Author: Robert G. Tantzen
156 int Date::YMDToJulian(int year
, int mon
, int day
, JulianRep
&jul
) {
157 if (!isValidDate(year
, mon
, day
))
158 { jul
= (JulianRep
)0; return -1; }
160 // year, month, day are assumed to be valid
161 int m
= mon
, d
= day
, y
= year
;
165 else { m
+= 9; --y
; }
168 j
= (146097*c
)/4 + (1461*ya
)/4 + (153*m
+2)/5 + d
+ 1721119;
173 // Julian date converter. Takes a julian date (the number of days since some
174 // distant epoch or other), and returns month, day of month, and year in
175 // integer references.
176 // Algorithm Author: Robert G. Tantzen
177 int Date::dayOfWeek(JulianRep jul
) {
178 return (int)((jul
+1)%7+1);
181 int Date::julianToYMD(JulianRep jul
, int &year
, int &month
, int &day
) {
185 if (j
< SmallestValJulDate
)
186 { year
= month
= day
= 0; return -1; }
189 y
= (4 * j
- 1)/146097;
190 j
= 4 * j
- 1 - 146097 * y
;
192 j
= (4 * d
+ 3)/1461;
193 d
= 4 * d
+ 3 - 1461 * j
;
196 d
= 5 * d
- 3 - 153 * m
;
200 else { m
-= 9; ++y
; }
207 #define MAX_VALID_SECONDS (60 * 60 * 24 -1)
208 Time::Time(int hours
, int mins
, int secs
, int usec
)
209 { set(hours
,mins
,secs
, usec
); }
211 int Time::set(int hours
, int mins
, int secs
, int usec
) {
212 if((hours
| mins
| secs
| usec
) < 0) { timeVal
= -1; return -1; }
213 if(hours
>= 24 | mins
>= 60 | secs
>= 62)
214 { timeVal
= -1; return -1; }
215 timeVal
= secs
+ mins
* 60 + hours
* 3600;
217 if(usec
) timeVal
+= usec
/100;
221 int Time::get(int &hours
, int &mins
, int &secs
) const {
222 if (timeVal
< 0) return -1;
223 int s
= timeVal
/10000;
232 int Time::seconds() const { return (timeVal
/10000) % 60; }
233 int Time::minutes() const { return (timeVal
/(60*10000)) % 60; }
234 int Time::hours() const { return timeVal
/ (3600*10000); }
235 int Time::msec() const { return (timeVal
% 10000) / 10; }
236 int Time::usec() const { return (timeVal
% 10000) * 100; }
238 int Time::setMsec(int ms
) {
239 if(ms
< 0 || ms
>= 1000) return -1;
240 timeVal
= timeVal
+(10*ms
);
243 int Time::setUsec(int us
) {
244 if(us
< 0 || us
>= 1000000) return -1;
245 timeVal
= timeVal
+us
/100;
249 bool Time::isValid() const
250 { return timeVal
>= 0 && timeVal
<= (10000*(MAX_VALID_SECONDS
+1)-1); }
252 bool Time::isValidTime(int hours
, int mins
, int secs
) {
253 return (hours
>= 0 && hours
< 24) &&
254 (mins
>= 0 && mins
< 60) &&
255 (secs
>= 0 && secs
< 60);
258 Time
operator+(const Time
&t1
, int seconds
)
259 { return Time(t1
.timeVal
+ seconds
*10000); }
260 Time
operator+(int seconds
, const Time
&t1
)
261 { return Time(t1
.timeVal
+ seconds
*10000); }
262 Time
operator-(const Time
&t1
, int seconds
)
263 { return Time(t1
.timeVal
- seconds
*10000); }
265 int operator-(const Time
&t1
, const Time
& t2
)
266 { return (t1
.timeVal
- t2
.timeVal
)/10000; }
268 int operator<(const Time
&t1
,const Time
&t2
)
269 { return t1
.timeVal
< t2
.timeVal
; }
270 int operator>(const Time
&t1
,const Time
&t2
)
271 { return t1
.timeVal
> t2
.timeVal
; }
272 int operator<=(const Time
&t1
,const Time
&t2
)
273 { return t1
.timeVal
<= t2
.timeVal
; }
274 int operator>=(const Time
&t1
,const Time
&t2
)
275 { return t1
.timeVal
>= t2
.timeVal
; }
276 int operator==(const Time
&t1
,const Time
&t2
)
277 { return t1
.timeVal
== t2
.timeVal
; }
278 int operator!=(const Time
&t1
,const Time
&t2
)
279 { return t1
.timeVal
!= t2
.timeVal
; }
281 int Time::parseFrom(const char *s
) {
284 count
= sscanf(s
,"%d:%d:%d",&hours
,&mins
,&secs
);
285 if (count
< 2) return -1;
286 if (count
== 2) secs
= 0;
288 if (!isValidTime(hours
,mins
,secs
))
290 return set(hours
,mins
,secs
);
292 int TimeStamp::parseFrom(const char *s
) {
296 count
= sscanf(s
,"%d/%d/%d %d:%d:%d",&year
,&month
,&day
, &hours
, &mins
, &secs
);
297 if (count
< 5) return -1;
298 if (count
== 5) secs
= 0;
300 if (year
< 100) year
+= 1900;
302 if (!date
.isValidDate(year
, month
, day
))
305 setDate(year
,month
,day
);
308 if (!time
.isValidTime(hours
,mins
,secs
))
310 return setTime(hours
,mins
,secs
);
313 int operator< (const TimeStamp
&d1
, const TimeStamp
&d2
)
314 { return (d1
.date
!= d2
.date
) ? d1
.date
< d2
.date
: d1
.time
< d2
.time
; }
315 int operator> (const TimeStamp
&d1
, const TimeStamp
&d2
)
316 { return (d1
.date
!= d2
.date
) ? d1
.date
> d2
.date
: d1
.time
> d2
.time
; }
317 int operator<=(const TimeStamp
&d1
, const TimeStamp
&d2
)
318 { return (d1
.date
!= d2
.date
) ? d1
.date
< d2
.date
: d1
.time
<= d2
.time
; }
319 int operator>=(const TimeStamp
&d1
, const TimeStamp
&d2
)
320 { return (d1
.date
!= d2
.date
) ? d1
.date
> d2
.date
: d1
.time
>= d2
.time
; }
321 int operator==(const TimeStamp
&d1
, const TimeStamp
&d2
)
322 { return d1
.date
== d2
.date
&& d1
.time
== d2
.time
; }
323 int operator!=(const TimeStamp
&d1
, const TimeStamp
&d2
)
324 { return d1
.date
!= d2
.date
&& d1
.time
!= d2
.time
; }
327 /*long AllDataType::size(DataType type, int length )
329 if (type == typeInt) return sizeof(int);
330 else if (type == typeString) return length;
342 size = sizeof(long long);
345 size = sizeof(short);
351 size = sizeof(double);
354 size = sizeof(float);
358 //fldDef.length_ = sizeof(long double);
367 size = sizeof(TimeStamp);
381 char* AllDataType::getSQLString(DataType type
)
385 case typeInt
: return "INT";
386 case typeLong
: return "INT";
387 case typeLongLong
: return "BIGINT";
388 case typeShort
: return "SMALLINT";
389 case typeByteInt
: return "TINYINT";
390 case typeDouble
: return "REAL";
391 case typeFloat
: return "FLOAT";
392 case typeDate
: return "DATE";
393 case typeTime
: return "TIME";
394 case typeTimeStamp
: return "TIMESTAMP";
395 case typeString
: return "CHAR";
396 case typeBinary
: return "BINARY";
397 default: return "UNKNOWN";
402 SQLSMALLINT
AllDataType::convertToSQLType(DataType type
)
426 return SQL_TYPE_DATE
;
428 return SQL_TYPE_TIME
;
430 return SQL_TYPE_TIMESTAMP
;
438 SQLSMALLINT
AllDataType::convertToSQL_C_Type(DataType type
)
447 return SQL_C_SBIGINT
;
451 return SQL_C_STINYINT
;
460 return SQL_C_TYPE_DATE
;
462 return SQL_C_TYPE_TIME
;
464 return SQL_C_TYPE_TIMESTAMP
;
473 DataType
AllDataType::convertFromSQLType(SQLSMALLINT type
)
490 case SQL_TYPE_TIMESTAMP
:
491 return typeTimeStamp
;
502 void AllDataType::copyVal(void* dest, void *src, DataType type, int length)
504 //Performance optimization. putting likely case first
505 if (typeInt == type )
507 *(int*)dest = *(int*)src;
509 }else if (typeString == type)
511 //null is always put at the last byte by insert
512 //so using strcpy is safe
513 strcpy((char*)dest, (char*)src);
514 //strncpy((char*)dest, (char*)src, length);
515 //char *d =(char*)dest;
516 //d[length-1] = '\0';
518 }else if (typeShort == type) {
519 *(short*)dest = *(short*)src;
520 }else if (typeDouble == type) {
521 *(double*)dest = *(double*)src;
522 }else if (typeTimeStamp == type) {
523 *(TimeStamp*)dest = *(TimeStamp*)src;
524 }else if (typeDate == type) {
525 *(Date*)dest = *(Date*)src;
526 }else if (typeFloat == type) {
527 *(float*)dest = *(float*)src;
528 }else if (typeTime == type) {
529 *(Time*)dest = *(Time*)src;
530 }else if (typeLong == type) {
531 *(long*)dest = *(long*)src;
532 }else if (typeLongLong == type) {
533 *(long long*)dest = *(long long*)src;
534 }else if (typeByteInt == type) {
535 *(char*)dest = *(char*)src;
536 }else if (typeBinary == type) {
537 os::memcpy(dest, src, length);
538 }else if (typeComposite == type) {
539 os::memcpy(dest, src, length);
544 void AllDataType::addVal(void* dest, void *src, DataType type)
548 *(int*)dest = *(int*)dest + *(int*)src;
554 *(int*)dest = *(int*)dest + *(int*)src;
557 *(long*)dest = *(long*)dest + *(long*)src;
560 *(long long*)dest = *(long long*)dest + *(long long*)src;
563 *(short*)dest = *(short*)dest + *(short*)src;
566 *(char*)dest = *(char*)dest + *(char*)src;
569 *(double*)dest = *(double*)dest + *(double*)src;
572 *(float*)dest = *(float*)dest + *(float*)src;
586 void AllDataType::subVal(void* dest
, void *src
, DataType type
)
591 *(int*)dest
= *(int*)dest
- *(int*)src
;
594 *(long*)dest
= *(long*)dest
- *(long*)src
;
597 *(long long*)dest
= *(long long*)dest
- *(long long*)src
;
600 *(short*)dest
= *(short*)dest
- *(short*)src
;
603 *(char*)dest
= *(char*)dest
- *(char*)src
;
606 *(double*)dest
= *(double*)dest
- *(double*)src
;
609 *(float*)dest
= *(float*)dest
- *(float*)src
;
621 void AllDataType::mulVal(void* dest
, void *src
, DataType type
)
626 *(int*)dest
= *(int*)dest
* (*(int*)src
);
629 *(long*)dest
= *(long*)dest
* (*(long*)src
);
632 *(long long*)dest
= *(long long*)dest
* (*(long long*)src
);
635 *(short*)dest
= *(short*)dest
* (*(short*)src
);
638 *(char*)dest
= *(char*)dest
* (*(char*)src
);
641 *(double*)dest
= *(double*)dest
* (*(double*)src
);
644 *(float*)dest
= *(float*)dest
* (*(float*)src
);
656 void AllDataType::mudVal(void* dest
, void *src
, DataType type
)
660 *(int*)dest
= *(int*)dest
% (*(int*)src
);
666 *(int*)dest
= *(int*)dest
% (*(int*)src
);
669 *(long*)dest
= *(long*)dest
% (*(long*)src
);
672 *(long long*)dest
= *(long long*)dest
% (*(long long*)src
);
675 *(short*)dest
= *(short*)dest
% (*(short*)src
);
678 *(char*)dest
= *(char*)dest
% (*(char*)src
);
681 *(double*)dest
= *(long long*)dest
% (*(long long*)src
);
684 *(float*)dest
= *(int*)dest
% (*(int*)src
);
696 void AllDataType::divVal(void* dest
, void *src
, DataType type
)
700 *(int*)dest
= *(int*)dest
/ (*(int*)src
);
706 *(int*)dest
= *(int*)dest
/ (*(int*)src
);
709 *(long*)dest
= *(long*)dest
/ (*(long*)src
);
712 *(long long*)dest
= *(long long*)dest
/ (*(long long*)src
);
715 *(short*)dest
= *(short*)dest
/ (*(short*)src
);
718 *(char*)dest
= *(char*)dest
/ (*(char*)src
);
721 *(double*)dest
= *(double *)dest
/ (*(double*)src
);
724 *(float*)dest
= *(float*)dest
/ (*(float*)src
);
736 void AllDataType::divVal(void* dest
, int src
, DataType type
)
740 *(int*)dest
= *(int*)dest
/ src
;
746 *(int*)dest
= *(int*)dest
/ src
;
749 *(long*)dest
= *(long*)dest
/ src
;
752 *(long long*)dest
= *(long long*)dest
/ src
;
755 *(short*)dest
= *(short*)dest
/ src
;
758 *(char*)dest
= *(char*)dest
/ src
;
761 *(double*)dest
= *(double*)dest
/ src
;
764 *(float*)dest
= *(float*)dest
/ src
;
778 bool AllDataType::compareVal(void *val1, void *val2, ComparisionOp op,
779 DataType type, long length)
781 //Performance optimization.
782 //do not convert compareXXXVal to virtual functions. it takes more time
785 //as int is the heavily used type, hardcoding the compare here itself
786 if (OpEquals == op) {
787 if (*(int*)val1 == *(int*)val2) return true;
789 }else if (OpLessThanEquals == op) {
790 if (*(int*)val1 <= *(int*)val2) return true;
792 }else if (OpGreaterThanEquals == op) {
793 if (*(int*)val1 >= *(int*)val2) return true;
795 }else if (OpGreaterThan == op) {
796 if (*(int*)val1 > *(int*)val2) return true;
798 }else if (OpLessThan == op) {
799 if (*(int*)val1 < *(int*)val2) return true;
801 }else if (OpNotEquals == op) {
802 if (*(int*)val1 != *(int*)val2) return true;
806 }else if(typeString == type) {
807 return AllDataType::compareStringVal(val1, val2, op);
808 } else if (typeShort == type) {
809 return AllDataType::compareShortVal(val1, val2, op);
810 } else if (typeDouble == type) {
811 return AllDataType::compareDoubleVal(val1, val2, op);
812 } else if (typeFloat == type) {
813 return AllDataType::compareFloatVal(val1, val2, op);
814 } else if (typeLong == type) {
815 return AllDataType::compareLongVal(val1, val2, op);
816 } else if (typeLongLong == type) {
817 return AllDataType::compareLongLongVal(val1, val2, op);
818 } else if (typeByteInt == type) {
819 return AllDataType::compareByteIntVal(val1, val2, op);
820 } else if (typeTimeStamp == type) {
821 return AllDataType::compareTimeStampVal(val1, val2, op);
822 } else if (typeDate == type) {
823 return AllDataType::compareDateVal(val1, val2, op);
824 } else if (typeTime == type) {
825 return AllDataType::compareTimeVal(val1, val2, op);
826 } else if (typeBinary == type) {
827 return AllDataType::compareBinaryVal(val1, val2, op, length);
828 } else if (typeComposite == type) {
829 return AllDataType::compareBinaryVal(val1, val2, op, length);
834 bool AllDataType::compareIntVal(void* src1
, void *src2
, ComparisionOp op
)
836 printf("This function should never be called by anyone");
837 if (OpEquals
== op
) {
838 if (*(int*)src1
== *(int*)src2
) return true;
840 }else if (OpGreaterThan
== op
) {
841 if (*(int*)src1
> *(int*)src2
) return true;
843 }else if (OpLessThan
== op
) {
844 if (*(int*)src1
< *(int*)src2
) return true;
846 }else if (OpLessThanEquals
== op
) {
847 if (*(int*)src1
<= *(int*)src2
) return true;
849 }else if (OpGreaterThanEquals
== op
) {
850 if (*(int*)src1
>= *(int*)src2
) return true;
852 }else if (OpNotEquals
== op
) {
853 if (*(int*)src1
!= *(int*)src2
) return true;
859 bool AllDataType::compareLongVal(void* src1
, void *src2
, ComparisionOp op
)
865 if (*(long*)src1
== *(long*)src2
) result
= true;
869 if (*(long*)src1
!= *(long*)src2
) result
= true;
873 if (*(long*)src1
< *(long*)src2
) result
= true;
876 case OpLessThanEquals
:
877 if (*(long*)src1
<= *(long*)src2
) result
= true;
881 if (*(long*)src1
> *(long*)src2
) result
= true;
884 case OpGreaterThanEquals
:
885 if (*(long*)src1
>= *(long*)src2
) result
= true;
892 bool AllDataType::compareLongLongVal(void* src1
, void *src2
,
899 if (*(long long*)src1
== *(long long*)src2
) result
= true;
903 if (*(long long*)src1
!= *(long long*)src2
) result
= true;
907 if (*(long long*)src1
< *(long long*)src2
) result
= true;
910 case OpLessThanEquals
:
911 if (*(long long*)src1
<= *(long long*)src2
) result
= true;
915 if (*(long long*)src1
> *(long long*)src2
) result
= true;
918 case OpGreaterThanEquals
:
919 if (*(long long*)src1
>= *(long long*)src2
) result
= true;
926 bool AllDataType::compareShortVal(void* src1
, void *src2
, ComparisionOp op
)
932 if (*(short*)src1
== *(short*)src2
) result
= true;
936 if (*(short*)src1
!= *(short*)src2
) result
= true;
940 if (*(short*)src1
< *(short*)src2
) result
= true;
943 case OpLessThanEquals
:
944 if (*(short*)src1
<= *(short*)src2
) result
= true;
948 if (*(short*)src1
> *(short*)src2
) result
= true;
951 case OpGreaterThanEquals
:
952 if (*(short*)src1
>= *(short*)src2
) result
= true;
959 bool AllDataType::compareByteIntVal(void* src1
, void *src2
, ComparisionOp op
)
965 if (*(ByteInt
*)src1
== *(ByteInt
*)src2
) result
= true;
969 if (*(ByteInt
*)src1
!= *(ByteInt
*)src2
) result
= true;
973 if (*(ByteInt
*)src1
< *(ByteInt
*)src2
) result
= true;
976 case OpLessThanEquals
:
977 if (*(ByteInt
*)src1
<= *(ByteInt
*)src2
) result
= true;
981 if (*(ByteInt
*)src1
> *(ByteInt
*)src2
) result
= true;
984 case OpGreaterThanEquals
:
985 if (*(ByteInt
*)src1
>= *(ByteInt
*)src2
) result
= true;
992 bool AllDataType::compareDoubleVal(void* src1
, void *src2
, ComparisionOp op
)
998 if (*(double*)src1
== *(double*)src2
) result
= true;
1002 if (*(double*)src1
!= *(double*)src2
) result
= true;
1003 else result
= false;
1006 if (*(double*)src1
< *(double*)src2
) result
= true;
1007 else result
= false;
1009 case OpLessThanEquals
:
1010 if (*(double*)src1
<= *(double*)src2
) result
= true;
1011 else result
= false;
1014 if (*(double*)src1
> *(double*)src2
) result
= true;
1015 else result
= false;
1017 case OpGreaterThanEquals
:
1018 if (*(double*)src1
>= *(double*)src2
) result
= true;
1019 else result
= false;
1025 bool AllDataType::compareFloatVal(void* src1
, void *src2
, ComparisionOp op
)
1027 bool result
= false;
1031 if (*(float*)src1
== *(float*)src2
) result
= true;
1032 else result
= false;
1035 if (*(float*)src1
!= *(float*)src2
) result
= true;
1036 else result
= false;
1039 if (*(float*)src1
< *(float*)src2
) result
= true;
1040 else result
= false;
1042 case OpLessThanEquals
:
1043 if (*(float*)src1
<= *(float*)src2
) result
= true;
1044 else result
= false;
1047 if (*(float*)src1
> *(float*)src2
) result
= true;
1048 else result
= false;
1050 case OpGreaterThanEquals
:
1051 if (*(float*)src1
>= *(float*)src2
) result
= true;
1052 else result
= false;
1058 bool AllDataType::compareDateVal(void* src1
, void *src2
, ComparisionOp op
)
1060 bool result
= false;
1064 if (*(Date
*)src1
== *(Date
*)src2
) result
= true;
1065 else result
= false;
1068 if (*(Date
*)src1
!= *(Date
*)src2
) result
= true;
1069 else result
= false;
1072 if (*(Date
*)src1
< *(Date
*)src2
) result
= true;
1073 else result
= false;
1075 case OpLessThanEquals
:
1076 if (*(Date
*)src1
<= *(Date
*)src2
) result
= true;
1077 else result
= false;
1080 if (*(Date
*)src1
> *(Date
*)src2
) result
= true;
1081 else result
= false;
1083 case OpGreaterThanEquals
:
1084 if (*(Date
*)src1
>= *(Date
*)src2
) result
= true;
1085 else result
= false;
1091 bool AllDataType::compareTimeVal(void* src1
, void *src2
, ComparisionOp op
)
1093 bool result
= false;
1097 if (*(Time
*)src1
== *(Time
*)src2
) result
= true;
1098 else result
= false;
1101 if (*(Time
*)src1
!= *(Time
*)src2
) result
= true;
1102 else result
= false;
1105 if (*(Time
*)src1
< *(Time
*)src2
) result
= true;
1106 else result
= false;
1108 case OpLessThanEquals
:
1109 if (*(Time
*)src1
<= *(Time
*)src2
) result
= true;
1110 else result
= false;
1113 if (*(Time
*)src1
> *(Time
*)src2
) result
= true;
1114 else result
= false;
1116 case OpGreaterThanEquals
:
1117 if (*(Time
*)src1
>= *(Time
*)src2
) result
= true;
1118 else result
= false;
1124 bool AllDataType::compareTimeStampVal(void* src1
, void *src2
, ComparisionOp op
)
1126 bool result
= false;
1130 if (*(TimeStamp
*)src1
== *(TimeStamp
*)src2
) result
= true;
1131 else result
= false;
1134 if (*(TimeStamp
*)src1
!= *(TimeStamp
*)src2
) result
= true;
1135 else result
= false;
1138 if (*(TimeStamp
*)src1
< *(TimeStamp
*)src2
) result
= true;
1139 else result
= false;
1141 case OpLessThanEquals
:
1142 if (*(TimeStamp
*)src1
<= *(TimeStamp
*)src2
) result
= true;
1143 else result
= false;
1146 if (*(TimeStamp
*)src1
> *(TimeStamp
*)src2
) result
= true;
1147 else result
= false;
1149 case OpGreaterThanEquals
:
1150 if (*(TimeStamp
*)src1
>= *(TimeStamp
*)src2
) result
= true;
1151 else result
= false;
1157 bool AllDataType::compareStringVal(void* src1
, void *src2
, ComparisionOp op
)
1159 if (OpEquals
== op
) {
1160 if (strcmp((char*)src1
, (char*)src2
) ==0) return true;
1162 }else if (OpGreaterThan
== op
) {
1163 if (strcmp((char*)src1
, (char*)src2
) >0) return true;
1165 }else if (OpLessThan
== op
) {
1166 if (strcmp((char*)src1
, (char*)src2
) <0 ) return true;
1168 }else if (OpLessThanEquals
== op
) {
1169 // printf("Illegal Operator:Not Supported for String\n");
1171 if (strcmp((char*)src1
, (char*)src2
)<= 0) return true;
1173 }else if (OpGreaterThanEquals
== op
) {
1174 // printf("Illegal Operator:Not Supported for String\n");
1176 if (strcmp((char*)src1
, (char*)src2
) >=0) return true;
1178 }else if (OpNotEquals
== op
) {
1179 if (strcmp((char*)src1
, (char*)src2
) != 0) return true;
1181 }else if (OpLike
== op
) {
1182 return !os::strmatch((char*)src2
, (char*)src1
);
1184 printf("Illegeal Operator:Not supported for String\n");
1188 bool AllDataType::compareBinaryVal(void* src1
, void *src2
,
1189 ComparisionOp op
, int length
)
1191 bool result
= false;
1192 int ret
= os::memcmp(src1
, src2
, length
);
1196 if (ret
== 0 ) result
= true; else result
= false;
1199 if (ret
!= 0 ) result
= true; else result
= false;
1202 if (ret
< 0 ) result
= true; else result
= false;
1204 case OpLessThanEquals
:
1205 printf("Illegal Operator:Not Supported for Binary\n");
1208 if (ret
> 0 ) result
= true; else result
= false;
1210 case OpGreaterThanEquals
:
1211 printf("Illegal Operator:Not Supported for Binary\n");
1217 ComparisionOp AllDataType::getComparisionOperator(char *str)
1220 if (strcmp(str, "<=") == 0)
1221 op = OpLessThanEquals;
1222 else if (strcmp(str, ">=") == 0)
1223 op = OpGreaterThanEquals;
1224 else if (strcmp(str, "<") == 0)
1226 else if (strcmp(str, ">") == 0)
1228 else if (strcmp(str, "=") == 0)
1230 else if (strcmp(str, "!=") == 0 || strcmp(str, "<>") == 0 )
1232 else if (strcasecmp(str, "LIKE") == 0 )
1235 op = OpInvalidComparisionOp;
1240 void* AllDataType::alloc(DataType type
, int length
)
1246 dest
= malloc(sizeof(int));
1249 dest
= malloc(sizeof(long));
1252 dest
= malloc(sizeof(long long));
1255 dest
= malloc(sizeof(short));
1258 dest
= malloc(sizeof(char));
1261 dest
= malloc(sizeof(double));
1264 dest
= malloc(sizeof(float));
1268 //fldDef.length_ = sizeof(long double);
1271 if (length
== 0 ) return NULL
;
1272 dest
= malloc(length
);
1275 if (length
== 0 || length
> 512) return NULL
;
1276 dest
= malloc(length
);
1277 memset(dest
, 0, length
);
1280 dest
= malloc(sizeof(Date
));
1283 dest
= malloc(sizeof(Time
));
1286 dest
= malloc(sizeof(TimeStamp
));
1292 void AllDataType::memoryset(void *value
,DataType type
)
1297 value
= ::memset(value
, 0, sizeof(int));
1300 value
= ::memset(value
, 0, sizeof(long));
1303 value
=::memset(value
, 0, sizeof(long long));
1306 value
= ::memset(value
, 0, sizeof(short));
1309 value
= ::memset(value
, 0, sizeof(char));
1312 value
= ::memset(value
, 0, sizeof(double));
1315 value
= ::memset(value
, 0, sizeof(float));
1320 *(char*)value
= '\0';
1321 //if (length == 0 ) return NULL;
1322 //dest = malloc(length);
1325 /* if (length == 0 || length > 256 ) return NULL;
1327 memset(dest, 0, length);*/
1330 value
= ::memset(value
, 0, sizeof(Date
));
1333 value
= ::memset(value
, 0, sizeof(Time
));
1336 value
= ::memset(value
, 0, sizeof(TimeStamp
));
1344 DbRetVal
AllDataType::strToValue(void* dest
, char *src
, DataType type
, int length
)
1350 sscanf( src
, "%d", &val
);
1355 sscanf( src
, "%ld", &val
);
1358 case typeLongLong
: {
1360 sscanf( src
, "%lld", &val
);
1361 *(long long*)dest
= val
;
1365 sscanf( src
, "%hd", &val
);
1366 *(short*)dest
= val
;
1370 sscanf( src
, "%d", &val
);
1371 *(char*)dest
= *(char *)&val
;
1375 sscanf( src
, "%lg", &val
);
1376 *(double*)dest
= val
;
1380 sscanf( src
, "%f", &val
);
1381 *(float*)dest
= val
;
1386 strncpy((char*)dest
, (char*)src
, length
);
1387 char *d
=(char*)dest
;
1392 res
= sscanf( src
, "%d-%d-%d", &y
, &m
, &d
);
1394 res
= sscanf( src
, "%d/%d/%d", &y
, &m
, &d
);
1397 fprintf(stderr
,"Error reading date. yyyy{-/}mm{-/}dd is the valid format.");
1400 Date
dateObj(y
,m
,d
);
1401 *(Date
*)dest
= dateObj
;
1405 res
= sscanf( src
, "%d:%d:%d", &h
, &m
, &s
);
1408 fprintf(stderr
, "Error reading time, hh:mm:ss is the valid format.");
1411 Time
timeObj(h
,m
,s
);
1412 *(Time
*)dest
= timeObj
;
1414 case typeTimeStamp
: {
1415 int d
,m
,y
, h
,mn
,s
, res
=0;
1416 res
= sscanf( src
, "%d-%d-%d %d:%d:%d", &y
, &m
, &d
, &h
, &mn
, &s
);
1418 res
= sscanf( src
, "%d-%d-%d, %d:%d:%d", &y
, &m
, &d
, &h
, &mn
, &s
);
1420 res
= sscanf( src
, "%d/%d/%d %d:%d:%d", &y
, &m
, &d
, &h
, &mn
, &s
);
1422 res
= sscanf( src
, "%d/%d/%d, %d:%d:%d", &y
, &m
, &d
, &h
, &mn
, &s
);
1425 fprintf(stderr
, "Error reading timestamp, yyyy{-/}mm{-/}dd[,] hh:mm:ss is the valid format.");
1428 TimeStamp
timeStampObj(y
,m
,d
,h
,mn
,s
);
1429 *(TimeStamp
*)dest
= timeStampObj
;
1432 memset ((void *) dest
, 0, length
);
1433 unsigned char c
= 0;
1434 const char *str
= (const char *)src
;
1437 bool evenlegth
=false;
1438 if(i
%2){ evenlegth
=true;}
1439 unsigned char *val
= (unsigned char *)dest
+(length
-1);
1442 if (!isxdigit((int)c
)) {
1443 printError(ErrBadArg
, "Invalid hexadecimal value");
1446 if (c
<= '9') c
-= '0';
1447 else if (c
>= 'a') c
= c
- 'a' + 10;
1448 else c
= c
- 'A' + 10;
1451 if ((i
+1) % 2) { *val
= *val
| (c
<<4); val
--;}
1454 if (i
% 2) { *val
= *val
| (c
<<4); val
--;}
1468 void AllDataType::convert(DataType srcType
, void *src
,
1469 DataType destType
, void *dest
, int length
)
1471 switch ((DataType
) destType
)
1473 case typeInt
: convertToInt(dest
, src
, srcType
); break;
1474 case typeLong
: convertToLong(dest
, src
, srcType
); break;
1475 case typeLongLong
: convertToLongLong(dest
, src
, srcType
); break;
1476 case typeShort
: convertToShort(dest
, src
, srcType
); break;
1477 case typeByteInt
: convertToByteInt(dest
, src
, srcType
); break;
1479 case typeFloat
: convertToFloat(dest
, src
, srcType
); break;
1480 case typeDouble
: convertToDouble(dest
, src
, srcType
); break;
1483 case typeDecimal
: convertToDouble(dest
, src
, srcType
); break;
1485 case typeString
: convertToString(dest
, src
, srcType
); break;
1486 case typeBinary
: convertToBinary(dest
, src
, srcType
,length
); break;
1487 case typeDate
: convertToDate(dest
, src
, srcType
); break;
1488 case typeTime
: convertToTime(dest
, src
, srcType
); break;
1489 case typeTimeStamp
: convertToTimeStamp(dest
, src
, srcType
); break;
1494 void AllDataType::convertToInt( void* dest
, void* src
, DataType srcType
)
1498 case typeInt
: *(int *)dest
= *(int *)src
; break;
1499 case typeLong
: *(int *)dest
=(int) *(long *)src
; break;
1500 case typeLongLong
: *(int *)dest
=(int) *(long long *)src
; break;
1501 case typeShort
: *(int *)dest
=(int) *(short *)src
; break;
1502 case typeByteInt
: *(int *)dest
=(int) *(char *)src
; break;
1504 case typeFloat
: *(int *)dest
= (int) *(float *)src
; break;
1505 case typeDouble
: *(int *)dest
=(int) *(double *)src
; break;
1507 case typeString
: sscanf((const char*)src
, "%d", (int*) dest
); break;
1513 default: *(int *)dest
= (int) 0;
1517 void AllDataType::convertToLong( void* dest
, void* src
, DataType srcType
)
1521 case typeInt
: *(long *)dest
=(long) *(int *)src
; break;
1522 case typeLong
: *(long *)dest
= *(long *)src
; break;
1523 case typeLongLong
: *(long *)dest
=(long) *(long long *)src
; break;
1524 case typeShort
: *(long *)dest
=(long) *(short *)src
; break;
1525 case typeByteInt
: *(long *)dest
=(long) *(char *)src
; break;
1527 case typeFloat
: *(long *)dest
= (long) *(float *)src
; break;
1528 case typeDouble
: *(long *)dest
=(long) *(double *)src
; break;
1530 case typeString
: sscanf((const char*)src
, "%ld", (long*) dest
); break;
1536 default: *(long *)dest
= (long) 0;
1541 void AllDataType::convertToLongLong( void* dest
, void* src
, DataType srcType
)
1545 case typeInt
: *(long long *)dest
=(long long) *(int *)src
; break;
1546 case typeLong
: *(long long *)dest
= (long long) *(long *)src
; break;
1547 case typeLongLong
: *(long long *)dest
= *(long long *)src
; break;
1548 case typeShort
: *(long long *)dest
=(long long) *(short *)src
; break;
1549 case typeByteInt
: *(long long *)dest
=(long long) *(char *)src
; break;
1551 case typeFloat
: *(long long *)dest
= (long long) *(float *)src
; break;
1552 case typeDouble
: *(long long *)dest
=(long long) *(double *)src
; break;
1554 case typeString
: sscanf((const char*)src
, "%lld", (long long*) dest
); break;
1560 default: *(long long *)dest
= (long long) 0;
1564 void AllDataType::convertToShort( void* dest
, void* src
, DataType srcType
)
1568 case typeInt
: *(short*)dest
=(short) *(int*)src
; break;
1569 case typeLong
: *(short*)dest
= (short) *(long*)src
; break;
1570 case typeLongLong
: *(short*)dest
= (short) *(long long*)src
; break;
1571 case typeShort
: *(short*)dest
= *(short*)src
; break;
1572 case typeByteInt
: *(short*)dest
=(short) *(char *)src
; break;
1574 case typeFloat
: *(short*)dest
= (short) *(float *)src
; break;
1575 case typeDouble
: *(short*)dest
=(short) *(double *)src
; break;
1577 case typeString
: sscanf((const char*)src
, "%hd", (short*) dest
); break;
1583 default: *(short*)dest
= (short) 0;
1587 void AllDataType::convertToByteInt( void* dest
, void* src
, DataType srcType
)
1591 case typeInt
: *(char*)dest
= (char) *(int*)src
; break;
1592 case typeLong
: *(char*)dest
= (char) *(long*)src
; break;
1593 case typeLongLong
: *(char*)dest
= (char) *(long long*)src
; break;
1594 case typeShort
: *(char*)dest
= (char) *(short*)src
; break;
1595 case typeByteInt
: *(char*)dest
= *(char *)src
; break;
1597 case typeFloat
: *(char*)dest
= (char) *(float *)src
; break;
1598 case typeDouble
: *(char*)dest
=(char) *(double *)src
; break;
1600 case typeString
: sscanf((const char*)src
, "%c", (char*) dest
); break;
1606 default: *(char*)dest
= (char) 0;
1610 void AllDataType::convertToFloat( void* dest
, void* src
, DataType srcType
)
1614 case typeInt
: *(float *)dest
=(float) *(int *)src
; break;
1615 case typeLong
: *(float *)dest
=(float) *(long *)src
; break;
1616 case typeLongLong
: *(float *)dest
=(float) *(long long *)src
; break;
1617 case typeShort
: *(float *)dest
=(float) *(short *)src
; break;
1618 case typeByteInt
: *(float *)dest
=(float) *(char *)src
; break;
1620 case typeFloat
: *(float *)dest
= *(float *)src
; break;
1621 case typeDouble
: *(float *)dest
=(float) *(double *)src
; break;
1623 case typeString
: sscanf((const char*)src
, "%f", (float*) dest
); break;
1629 default: *(float *)dest
= (float) 0;
1633 void AllDataType::convertToDouble( void* dest
, void* src
, DataType srcType
)
1637 case typeInt
: *(double *)dest
=(double) *(int *)src
; break;
1638 case typeLong
: *(double *)dest
=(double) *(long *)src
; break;
1639 case typeLongLong
: *(double *)dest
=(double) *(long long *)src
; break;
1640 case typeShort
: *(double *)dest
=(double) *(short *)src
; break;
1641 case typeByteInt
: *(double *)dest
=(double) *(char *)src
; break;
1643 case typeFloat
: *(double *)dest
=(double) *(float *)src
; break;
1644 case typeDouble
: *(double *)dest
= *(double *)src
; break;
1646 case typeString
: sscanf((const char*)src
, "%lf", (double*) dest
); break;
1652 default: *(double *)dest
= (double) 0;
1656 void AllDataType::convertToString( void* dest
, void* src
, DataType srcType
, int length
)
1662 sprintf ((char *)dest
, "%d", *(int *)src
);
1667 sprintf ((char *)dest
, "%ld", *(long *)src
);
1672 sprintf ((char *)dest
, "%lld", *(long long *)src
);
1677 sprintf ((char *)dest
, "%hd", *(short *)src
);
1682 sprintf ((char *)dest
, "%hd", *(char *)src
);
1688 sprintf ((char *)dest
, "%f", *(float *)src
);
1693 sprintf ((char *) dest
, "%lf", *(double *)src
);
1699 strcpy((char*)dest
, (char*)src
);
1704 Date
* dt
= (Date
*)src
;
1705 sprintf((char*) dest
, "%d/%d/%d", dt
->year(),
1706 dt
->month(), dt
->dayOfMonth());
1711 Time
* tm
= (Time
*)src
;
1712 sprintf((char*)dest
,"%d:%d:%d.%d", tm
->hours(), tm
->minutes(), tm
->seconds(), 0);
1717 TimeStamp
* tm
= (TimeStamp
*)src
;
1718 sprintf((char*)dest
, "%d/%d/%d %d:%d:%d.%d", tm
->year(),
1719 tm
->month(), tm
->dayOfMonth(), tm
->hours(),
1720 tm
->minutes(), tm
->seconds(), 0 );
1725 unsigned char *c
= (unsigned char *) src
;
1726 unsigned char *str
= (unsigned char *) dest
;
1727 unsigned char p
= 0;
1729 while (i
< length
) {
1731 if (p
< 10) sprintf ((char *)str
++, "%c", '0' + p
);
1732 else sprintf((char *)str
++, "%c", 'A' + p
- 10);
1734 if (p
< 10) sprintf ((char *)str
++, "%c", '0' + p
);
1735 else sprintf((char *)str
++, "%c", 'A' + p
- 10);
1741 default: ((char*)dest
)[0] = '\0';
1745 void AllDataType::convertToDate( void* dest
, void* src
, DataType srcType
)
1761 Date
*dt
= (Date
*) dest
;
1762 dt
->parseFrom((char*)src
);
1765 default: ((char*)dest
)[0] = '\0';
1769 void AllDataType::convertToTime( void* dest
, void* src
, DataType srcType
)
1785 Time
*dt
= (Time
*) dest
;
1786 dt
->parseFrom((char*)src
);
1789 default: ((char*)dest
)[0] = '\0';
1793 void AllDataType::convertToTimeStamp( void* dest
, void* src
, DataType srcType
)
1809 TimeStamp
*dt
= (TimeStamp
*) dest
;
1810 dt
->parseFrom((char*)src
);
1813 default: ((char*)dest
)[0] = '\0';
1817 void AllDataType::convertToBinary(void *dest
, void *src
, DataType srcType
, int length
)
1823 memset ((void *) dest
, 0, length
);
1824 unsigned char c
= 0;
1825 const char *str
= (const char *)src
;
1827 i
= strlen((char*)src
)-1;
1828 bool evenlegth
=false;
1829 if(i
%2){ evenlegth
=true;}
1830 unsigned char *val
= (unsigned char *)dest
+(length
-1);
1833 if (c
<= '9') c
-= '0';
1834 else if (c
>= 'a') c
= c
- 'a' + 10;
1835 else c
= c
- 'A' + 10;
1838 if ((i
+1) % 2) { *val
= *val
| (c
<<4); val
--;}
1841 if (i
% 2) { *val
= *val
| (c
<<4); val
--;}
1850 int AllDataType::printVal(void* src
, DataType srcType
, int length
)
1857 count
= printf ("%d", *(int *)src
);
1862 count
= printf ("%ld", *(long *)src
);
1867 count
= printf ("%lld", *(long long *)src
);
1872 count
= printf("%hd", *(short *)src
);
1877 count
= printf("%hd", *(char *)src
);
1883 count
= printf("%f", *(float *)src
);
1888 count
= printf("%lf", *(double *)src
);
1894 count
= printf("%s", (char*)src
);
1899 Date
* dt
= (Date
*)src
;
1900 count
= printf("%d/%d/%d", dt
->year(),
1901 dt
->month(), dt
->dayOfMonth());
1906 Time
* tm
= (Time
*)src
;
1907 count
= printf("%d:%d:%d.%d", tm
->hours(), tm
->minutes(), tm
->seconds(), 0);
1912 TimeStamp
* tm
= (TimeStamp
*)src
;
1913 count
= printf("%d/%d/%d %d:%d:%d.%d", tm
->year(),
1914 tm
->month(), tm
->dayOfMonth(), tm
->hours(),
1915 tm
->minutes(), tm
->seconds(), 0 );
1920 unsigned char *c
= (unsigned char *) src
;
1921 unsigned char p
= 0;
1923 bool isDigitFound
=false;
1924 while (i
< length
) {
1926 if(('0'+p
)!='0'|| isDigitFound
){
1927 if (p
< 10) printf ("%c", '0' + p
);
1928 else printf("%c", 'A' + p
- 10);
1932 if(('0'+p
)!='0' || isDigitFound
){
1933 if (p
< 10) printf ("%c", '0' + p
);
1934 else printf("%c", 'A' + p
- 10);
1942 default: { printf("DataType not supported\n"); break; }