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 DbRetVal
AllDataType::strToValue(void* dest
, char *src
, DataType type
, int length
)
28 sscanf( src
, "%d", &val
);
33 sscanf( src
, "%ld", &val
);
38 sscanf( src
, "%lld", &val
);
39 *(long long*)dest
= val
;
43 sscanf( src
, "%hd", &val
);
48 sscanf( src
, "%hhd", &val
);
49 *(char*)dest
= *(char *)&val
;
53 sscanf( src
, "%lg", &val
);
58 sscanf( src
, "%f", &val
);
65 strncpy((char*)dest
, (char*)src
, length
);
71 if (strlen(src
) == 11) {
72 if ( src
[6] == '-' || src
[6] == '/' ) {
73 Date::changeToCsqlFormat(src
);
76 res
= sscanf( src
, "%d-%d-%d", &y
, &m
, &d
);
78 res
= sscanf( src
, "%d/%d/%d", &y
, &m
, &d
);
79 if (strcmp(src
,"now")==0 || strcmp(src
,"NOW")==0){
80 Date
*dt
= (Date
*) dest
;
81 dt
->parseFrom((char*)src
);
86 fprintf(stderr
,"Error reading date. yyyy{-/}mm{-/}dd is the valid format.");
89 /* Looking up at ranges of year-month-day */
90 if(!date
.isValidDate(y
, m
, d
)){
91 fprintf(stderr
,"Error reading date. The value \"%d-%d-%d\" is inappropriate.",y
,m
,d
);
96 *(Date
*)dest
= dateObj
;
100 res
= sscanf( src
, "%d:%d:%d", &h
, &m
, &s
);
101 if(strcmp(src
,"now")==0 || strcmp(src
,"NOW")==0){
102 Time
*dt
= (Time
*) dest
;
103 dt
->parseFrom((char*)src
);
109 res
= sscanf( src
, "%d-%d-%d %d:%d:%d", &y
, &mn
, &d
, &h
, &m
, &s
);
111 fprintf(stderr
, "Error reading time, hh:mm:ss is the valid format.");
117 if(!time
.isValidTime(h
, m
, s
)){
118 fprintf(stderr
,"Error reading Time. The value \"%d-%d-%d\" is inappropriate.",h
,m
,s
);
123 *(Time
*)dest
= timeObj
;
125 case typeTimeStamp
: {
126 int d
,m
,y
, h
,mn
,s
, res
=0;
127 bool isNow
= ( strcasecmp(src
,"now")==0 );
128 if(!isNow
&& isalpha(int(src
[5]))) {
129 TimeStamp::changeToCsqlFormat(src
);
131 res
= sscanf( src
, "%d-%d-%d %d:%d:%d", &y
, &m
, &d
, &h
, &mn
, &s
);
133 res
= sscanf( src
, "%d-%d-%d, %d:%d:%d", &y
, &m
, &d
, &h
, &mn
, &s
);
135 res
= sscanf( src
, "%d/%d/%d %d:%d:%d", &y
, &m
, &d
, &h
, &mn
, &s
);
137 res
= sscanf( src
, "%d/%d/%d, %d:%d:%d", &y
, &m
, &d
, &h
, &mn
, &s
);
140 TimeStamp
*dt
= (TimeStamp
*) dest
;
141 dt
->parseFrom((char*)src
);
146 fprintf(stderr
, "Error reading timestamp, yyyy{-/}mm{-/}dd[,] hh:mm:ss is the valid format.");
150 /* Looking up at 'YY-MM-DD' */
151 if(!date
.isValidDate(y
, m
, d
)){
152 fprintf(stderr
,"Error reading date. The value \"%d-%d-%d\" is inappropriate.",y
,m
,d
);
156 /* Looking up at 'Hour-Min-Sec' */
157 if(!time
.isValidTime(h
, m
, s
)){
158 fprintf(stderr
,"Error reading Time. The value \"%d-%d-%d\" is inappropriate.",h
,m
,s
);
162 TimeStamp
timeStampObj(y
,m
,d
,h
,mn
,s
);
163 *(TimeStamp
*)dest
= timeStampObj
;
166 memset ((void *) dest
, 0, length
);
168 const char *str
= (const char *)src
;
171 if( i
> (length
*2)-1 ){ i
= (length
*2)-1 ; }
172 bool evenlegth
=false;
173 if(i
%2){ evenlegth
=true;}
174 unsigned char *val
= (unsigned char *)dest
+(length
-1);
177 if (!isxdigit((int)c
)) {
178 printError(ErrBadArg
, "Invalid hexadecimal value");
181 if (c
<= '9') c
-= '0';
182 else if (c
>= 'a') c
= c
- 'a' + 10;
183 else c
= c
- 'A' + 10;
186 if ((i
+1) % 2) { *val
= *val
| (c
<<4); val
--;}
189 if (i
% 2) { *val
= *val
| (c
<<4); val
--;}
203 void AllDataType::convert(DataType srcType
, void *src
,
204 DataType destType
, void *dest
, int length
)
206 switch ((DataType
) destType
)
208 case typeInt
: convertToInt(dest
, src
, srcType
); break;
209 case typeLong
: convertToLong(dest
, src
, srcType
); break;
210 case typeLongLong
: convertToLongLong(dest
, src
, srcType
); break;
211 case typeShort
: convertToShort(dest
, src
, srcType
); break;
212 case typeByteInt
: convertToByteInt(dest
, src
, srcType
); break;
214 case typeFloat
: convertToFloat(dest
, src
, srcType
); break;
215 case typeDouble
: convertToDouble(dest
, src
, srcType
); break;
218 case typeDecimal
: convertToDouble(dest
, src
, srcType
); break;
220 case typeString
: convertToString(dest
, src
, srcType
); break;
221 case typeBinary
: convertToBinary(dest
, src
, srcType
,length
); break;
222 case typeDate
: convertToDate(dest
, src
, srcType
); break;
223 case typeTime
: convertToTime(dest
, src
, srcType
); break;
224 case typeTimeStamp
: convertToTimeStamp(dest
, src
, srcType
); break;
229 void AllDataType::convertToInt( void* dest
, void* src
, DataType srcType
)
233 case typeInt
: *(int *)dest
= *(int *)src
; break;
234 case typeLong
: *(int *)dest
=(int) *(long *)src
; break;
235 case typeLongLong
: *(int *)dest
=(int) *(long long *)src
; break;
236 case typeShort
: *(int *)dest
=(int) *(short *)src
; break;
237 case typeByteInt
: *(int *)dest
=(int) *(char *)src
; break;
239 case typeFloat
: *(int *)dest
= (int) *(float *)src
; break;
240 case typeDouble
: *(int *)dest
=(int) *(double *)src
; break;
242 case typeString
: sscanf((const char*)src
, "%d", (int*) dest
); break;
248 default: *(int *)dest
= (int) 0;
252 void AllDataType::convertToLong( void* dest
, void* src
, DataType srcType
)
256 case typeInt
: *(long *)dest
=(long) *(int *)src
; break;
257 case typeLong
: *(long *)dest
= *(long *)src
; break;
258 case typeLongLong
: *(long *)dest
=(long) *(long long *)src
; break;
259 case typeShort
: *(long *)dest
=(long) *(short *)src
; break;
260 case typeByteInt
: *(long *)dest
=(long) *(char *)src
; break;
262 case typeFloat
: *(long *)dest
= (long) *(float *)src
; break;
263 case typeDouble
: *(long *)dest
=(long) *(double *)src
; break;
265 case typeString
: sscanf((const char*)src
, "%ld", (long*) dest
); break;
271 default: *(long *)dest
= (long) 0;
276 void AllDataType::convertToLongLong( void* dest
, void* src
, DataType srcType
)
280 case typeInt
: *(long long *)dest
=(long long) *(int *)src
; break;
281 case typeLong
: *(long long *)dest
= (long long) *(long *)src
; break;
282 case typeLongLong
: *(long long *)dest
= *(long long *)src
; break;
283 case typeShort
: *(long long *)dest
=(long long) *(short *)src
; break;
284 case typeByteInt
: *(long long *)dest
=(long long) *(char *)src
; break;
286 case typeFloat
: *(long long *)dest
= (long long) *(float *)src
; break;
287 case typeDouble
: *(long long *)dest
=(long long) *(double *)src
; break;
289 case typeString
: sscanf((const char*)src
, "%lld", (long long*) dest
); break;
295 default: *(long long *)dest
= (long long) 0;
299 void AllDataType::convertToShort( void* dest
, void* src
, DataType srcType
)
303 case typeInt
: *(short*)dest
=(short) *(int*)src
; break;
304 case typeLong
: *(short*)dest
= (short) *(long*)src
; break;
305 case typeLongLong
: *(short*)dest
= (short) *(long long*)src
; break;
306 case typeShort
: *(short*)dest
= *(short*)src
; break;
307 case typeByteInt
: *(short*)dest
=(short) *(char *)src
; break;
309 case typeFloat
: *(short*)dest
= (short) *(float *)src
; break;
310 case typeDouble
: *(short*)dest
=(short) *(double *)src
; break;
312 case typeString
: sscanf((const char*)src
, "%hd", (short*) dest
); break;
318 default: *(short*)dest
= (short) 0;
322 void AllDataType::convertToByteInt( void* dest
, void* src
, DataType srcType
)
326 case typeInt
: *(char*)dest
= (char) *(int*)src
; break;
327 case typeLong
: *(char*)dest
= (char) *(long*)src
; break;
328 case typeLongLong
: *(char*)dest
= (char) *(long long*)src
; break;
329 case typeShort
: *(char*)dest
= (char) *(short*)src
; break;
330 case typeByteInt
: *(char*)dest
= *(char *)src
; break;
332 case typeFloat
: *(char*)dest
= (char) *(float *)src
; break;
333 case typeDouble
: *(char*)dest
=(char) *(double *)src
; break;
335 case typeString
: sscanf((const char*)src
, "%hhd", (char*) dest
); break;
341 default: *(char*)dest
= (char) 0;
345 void AllDataType::convertToFloat( void* dest
, void* src
, DataType srcType
)
349 case typeInt
: *(float *)dest
=(float) *(int *)src
; break;
350 case typeLong
: *(float *)dest
=(float) *(long *)src
; break;
351 case typeLongLong
: *(float *)dest
=(float) *(long long *)src
; break;
352 case typeShort
: *(float *)dest
=(float) *(short *)src
; break;
353 case typeByteInt
: *(float *)dest
=(float) *(char *)src
; break;
355 case typeFloat
: *(float *)dest
= *(float *)src
; break;
356 case typeDouble
: *(float *)dest
=(float) *(double *)src
; break;
358 case typeString
: sscanf((const char*)src
, "%f", (float*) dest
); break;
364 default: *(float *)dest
= (float) 0;
368 void AllDataType::convertToDouble( void* dest
, void* src
, DataType srcType
)
372 case typeInt
: *(double *)dest
=(double) *(int *)src
; break;
373 case typeLong
: *(double *)dest
=(double) *(long *)src
; break;
374 case typeLongLong
: *(double *)dest
=(double) *(long long *)src
; break;
375 case typeShort
: *(double *)dest
=(double) *(short *)src
; break;
376 case typeByteInt
: *(double *)dest
=(double) *(char *)src
; break;
378 case typeFloat
: *(double *)dest
=(double) *(float *)src
; break;
379 case typeDouble
: *(double *)dest
= *(double *)src
; break;
381 case typeString
: sscanf((const char*)src
, "%lf", (double*) dest
); break;
387 default: *(double *)dest
= (double) 0;
391 void AllDataType::convertToString( void* dest
, void* src
, DataType srcType
, int length
,TDBInfo tdbname
)
397 Util::itoa(*(int*)src
, (char*)dest
);
402 sprintf ((char *)dest
, "%ld", *(long *)src
);
407 sprintf ((char *)dest
, "%lld", *(long long *)src
);
412 sprintf ((char *)dest
, "%hd", *(short *)src
);
417 sprintf ((char *)dest
, "%hhd", *(char *)src
);
423 sprintf ((char *)dest
, "%f", *(float *)src
);
428 sprintf ((char *) dest
, "%lf", *(double *)src
);
434 strcpy((char*)dest
, (char*)src
);
439 Date
* dt
= (Date
*)src
;
440 sprintf((char*) dest
, "%d/%d/%d", dt
->year(),dt
->month(), dt
->dayOfMonth());
445 Time
* tm
= (Time
*)src
;
446 sprintf((char*)dest
,"%d:%d:%d.%d", tm
->hours(), tm
->minutes(), tm
->seconds(), 0);
451 TimeStamp
* tm
= (TimeStamp
*)src
;
452 sprintf((char*)dest
, "%d/%d/%d %d:%d:%d.%d", tm
->year(),tm
->month(), tm
->dayOfMonth(), tm
->hours(),tm
->minutes(), tm
->seconds(), 0 );
457 unsigned char *c
= (unsigned char *) src
;
458 unsigned char *str
= (unsigned char *) dest
;
463 if (p
< 10) sprintf ((char *)str
++, "%c", '0' + p
);
464 else sprintf((char *)str
++, "%c", 'A' + p
- 10);
466 if (p
< 10) sprintf ((char *)str
++, "%c", '0' + p
);
467 else sprintf((char *)str
++, "%c", 'A' + p
- 10);
473 default: ((char*)dest
)[0] = '\0';
477 void AllDataType::convertToDate( void* dest
, void* src
, DataType srcType
)
494 Date
*dt
= (Date
*) dest
;
495 dt
->parseFrom((char*)src
);
498 default: ((char*)dest
)[0] = '\0';
502 void AllDataType::convertToTime( void* dest
, void* src
, DataType srcType
)
519 Time
*dt
= (Time
*) dest
;
520 dt
->parseFrom((char*)src
);
523 default: ((char*)dest
)[0] = '\0';
527 void AllDataType::convertToTimeStamp( void* dest
, void* src
, DataType srcType
)
544 TimeStamp
*dt
= (TimeStamp
*) dest
;
545 dt
->parseFrom((char*)src
);
548 default: ((char*)dest
)[0] = '\0';
552 void AllDataType::convertToBinary(void *dest
, void *src
, DataType srcType
, int length
)
558 memset ((void *) dest
, 0, length
);
560 const char *str
= (const char *)src
;
562 i
= strlen((char*)src
)-1;
563 if( i
> (length
*2)-1 ){ i
= (length
*2)-1 ; }
564 bool evenlegth
=false;
565 if(i
%2){ evenlegth
=true;}
566 unsigned char *val
= (unsigned char *)dest
+(length
-1);
569 if (c
<= '9') c
-= '0';
570 else if (c
>= 'a') c
= c
- 'a' + 10;
571 else c
= c
- 'A' + 10;
574 if ((i
+1) % 2) { *val
= *val
| (c
<<4); val
--;}
577 if (i
% 2) { *val
= *val
| (c
<<4); val
--;}