1 #include "odbcCommon.h"
3 SQLRETURN
SQLAllocHandle( SQLSMALLINT hdlType
,
10 return CSqlOdbcEnv::SQLAllocHandle( inHdl
, outHdl
);
12 return CSqlOdbcDbc::SQLAllocHandle( inHdl
, outHdl
);
14 return CSqlOdbcStmt::SQLAllocHandle( inHdl
, outHdl
);
17 globalError
.set( ERROR_OPTRANGE
);
18 globalError
.printStr( SQL_OV_ODBC3
);
22 SQLRETURN
SQLFreeHandle(
28 case SQL_HANDLE_ENV
: return CSqlOdbcEnv::SQLFreeHandle( inHdl
);
29 case SQL_HANDLE_DBC
: return CSqlOdbcDbc::SQLFreeHandle( inHdl
);
30 case SQL_HANDLE_STMT
: return CSqlOdbcStmt::SQLFreeHandle( inHdl
);
33 globalError
.set( ERROR_OPTRANGE
);
34 globalError
.printStr( SQL_OV_ODBC3
);
43 if( isValidHandle( hdl
, hdlType
) != SQL_SUCCESS
)
44 return( SQL_INVALID_HANDLE
);
49 return ((CSqlOdbcEnv
*) hdl
)->SQLEndTran( compType
);
51 return ((CSqlOdbcDbc
*) hdl
)->SQLEndTran( compType
);
54 globalError
.set( ERROR_OPTRANGE
);
55 globalError
.printStr( SQL_OV_ODBC3
);
59 SQLRETURN
isValidHandle( SQLHANDLE hdl
,
62 if( hdlType
== SQL_HANDLE_ENV
|| hdlType
== SQL_HANDLE_DBC
|| hdlType
== SQL_HANDLE_STMT
)
65 if( ((CSqlOdbcEnv
*) hdl
)->handleType_
== hdlType
)
66 return( SQL_SUCCESS
);
68 globalError
.set( ERROR_MEM_MGMNT
);
69 globalError
.printStr( SQL_OV_ODBC3
);
70 return( SQL_INVALID_HANDLE
);
73 SQLRETURN
isValidCType( SQLSMALLINT type
)
98 case SQL_C_TYPE_TIMESTAMP
:
99 case SQL_C_BINARY
: break;
100 default: return( SQL_ERROR
);
102 return( SQL_SUCCESS
);
105 SQLRETURN
isValidSQLType( SQLSMALLINT type
)
126 case SQL_TYPE_TIMESTAMP
:
128 case SQL_VARBINARY
: break;
129 default: return( SQL_ERROR
);
131 return( SQL_SUCCESS
);
134 DataType
getCSqlType( SQLSMALLINT type
)
165 case SQL_C_TYPE_DATE
:
168 case SQL_C_TYPE_TIME
:
170 case SQL_C_TIMESTAMP
:
171 case SQL_C_TYPE_TIMESTAMP
:
172 return typeTimeStamp
;
176 default: return( typeUnknown
);
180 SQLSMALLINT
getSQLType( DataType type
)
206 return SQL_TIMESTAMP
;
214 //case csqlSqlTlongDouble: might be equal typeDecimal
216 //case csqlSqlTvarString:
217 // return SQL_VARCHAR;
218 //case csqlSqlTvarBinary:
219 // return SQL_BINARY;
228 SQLCHAR
*getSQLTypeName( SQLSMALLINT type
)
233 return (SQLCHAR
*)"CHAR";
235 return (SQLCHAR
*)"VARCHAR";
237 return (SQLCHAR
*)"BIT";
239 return (SQLCHAR
*)"SMALLINT";
241 return (SQLCHAR
*)"INTEGER";
243 return (SQLCHAR
*)"REAL";
246 return (SQLCHAR
*)"NUMERIC";
248 return (SQLCHAR
*)"DOUBLE";
250 return (SQLCHAR
*)"FLOAT";
252 return (SQLCHAR
*)"TINYINT";
254 return (SQLCHAR
*)"BIGINT";
257 return (SQLCHAR
*)"DATE";
260 return (SQLCHAR
*)"TIME";
262 case SQL_TYPE_TIMESTAMP
:
263 return (SQLCHAR
*)"TIMESTAMP";
265 return (SQLCHAR
*)"BINARY";
271 void getInputBuffer(void **buffer
,SQLSMALLINT type
,SQLUINTEGER length
)
276 *buffer
= new short();
285 *buffer
= new long long();
288 *buffer
= new signed char();
291 *buffer = new unsigned char ();
295 *buffer
= new float();
298 *buffer
= new double();
301 // case csqlSqlTlongDouble:
302 // case csqlSqlTnumeric:
303 *buffer
= new long double ();
307 // case csqlSqlTvarString:
308 *buffer
= new char [length
+1];
311 *buffer
= new Date();
314 *buffer
= new Time();
317 *buffer
= new TimeStamp();
320 // case csqlSqlTvarBinary:
321 *buffer
= new unsigned char [length
+1];
326 // CSQL TODO - Need to review and finalize.
327 //Copies data from the application onto the destination
328 //Called from SQLExecute
329 //Destination here can be directly the database bound buffer or
331 void copyFromOdbc(AbsSqlStatement
*stmt
, int paramNo
, SQLUINTEGER destLen
,void *odbcData
,SQLUINTEGER odbcLen
,SQLSMALLINT type
)
333 //No point in continuing further
339 //*(short*)destData = *(short*)odbcData;
340 stmt
->setShortParam(paramNo
, *(short*)odbcData
);
343 //*(int*)destData = *(int*)odbcData;
344 stmt
->setIntParam(paramNo
, *(int*)odbcData
);
347 //*(long*)destData = *(long*)odbcData;
348 stmt
->setLongParam(paramNo
, *(long*)odbcData
);
351 //*(long long*)destData = *(long long*)odbcData;
352 stmt
->setLongLongParam(paramNo
, *(long long *)odbcData
);
355 //*(char*)destData = *(char*)odbcData;
356 ByteInt
bt(*(char*)odbcData
);
357 stmt
->setByteIntParam(paramNo
, bt
);
361 *(unsigned char*)destData = *(unsigned char*)odbcData;
365 //*(float*)destData = *(float*)odbcData;
366 stmt
->setFloatParam(paramNo
, *(float*)odbcData
);
370 //*(double*)destData = *(double*)odbcData;
371 stmt
->setDoubleParam(paramNo
, *(double*)odbcData
);
374 // case csqlSqlTlongDouble:
375 // case csqlSqlTnumeric:
377 //*(long double*)destData = *(long double*)odbcData;
382 stmt
->setStringParam(paramNo
, (char*) odbcData
);
383 /*if(odbcLen < destLen)
385 strcpy( (char*)destData, (char*)odbcData);
386 *((char*)destData+odbcLen)='\0';
390 strncpy((char*)destData,(char*)odbcData,(destLen-1));
391 *((char*)destData+destLen)='\0';
397 dt
.set((*(SQL_DATE_STRUCT
*)odbcData
).year
,
398 (*(SQL_DATE_STRUCT
*)odbcData
).month
,
399 (*(SQL_DATE_STRUCT
*)odbcData
).day
);
400 stmt
->setDateParam(paramNo
, dt
);
405 tm
.set((*(SQL_TIME_STRUCT
*)odbcData
).hour
,
406 (*(SQL_TIME_STRUCT
*)odbcData
).minute
,
407 (*(SQL_TIME_STRUCT
*)odbcData
).second
);
408 stmt
->setTimeParam(paramNo
, tm
);
411 case typeTimeStamp
: {
413 ts
.setDate((*(SQL_TIMESTAMP_STRUCT
*)odbcData
).year
,
414 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).month
,
415 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).day
);
416 ts
.setTime((*(SQL_TIMESTAMP_STRUCT
*)odbcData
).hour
,
417 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).minute
,
418 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).second
);
419 stmt
->setTimeStampParam(paramNo
, ts
);
426 void convertFromOdbc(DataType srcType
, void *src
, DataType destType
, void *dest
,int length
, TDBInfo tdbname
)
428 switch ((DataType
) destType
)
430 case typeInt
: AllDataType::convertToInt(dest
, src
, srcType
); break;
431 case typeLong
: AllDataType::convertToLong(dest
, src
, srcType
); break;
432 case typeLongLong
: AllDataType::convertToLongLong(dest
, src
, srcType
); break;
433 case typeShort
: AllDataType::convertToShort(dest
, src
, srcType
); break;
434 case typeByteInt
: AllDataType::convertToByteInt(dest
, src
, srcType
); break;
436 case typeFloat
: AllDataType::convertToFloat(dest
, src
, srcType
); break;
437 case typeDouble
: AllDataType::convertToDouble(dest
, src
, srcType
); break;
440 case typeDecimal
: AllDataType::convertToDouble(dest
, src
, srcType
); break;
442 case typeString
: convertToStringFromOdbc(dest
, src
, srcType
); break;
443 case typeBinary
: AllDataType::convertToBinary(dest
, src
, srcType
,length
); break;
444 case typeDate
: AllDataType::convertToDate(dest
, src
, srcType
); break;
445 case typeTime
: AllDataType::convertToTime(dest
, src
, srcType
); break;
446 case typeTimeStamp
: AllDataType::convertToTimeStamp(dest
, src
, srcType
); break;
450 void convertToStringFromOdbc(void *dest
,void*src
,DataType srcType
,int length
,TDBInfo tdbname
)
456 //sprintf ((char *)dest, "%d", *(int *)src);
457 Util::itoa(*(int*)src
, (char*)dest
);
462 sprintf ((char *)dest
, "%ld", *(long *)src
);
467 sprintf ((char *)dest
, "%lld", *(long long *)src
);
472 sprintf ((char *)dest
, "%hd", *(short *)src
);
477 sprintf ((char *)dest
, "%hhd", *(char *)src
);
483 sprintf ((char *)dest
, "%f", *(float *)src
);
488 sprintf ((char *) dest
, "%lf", *(double *)src
);
493 strcpy((char*)dest
, (char*)src
);
499 dt
.set((*(SQL_DATE_STRUCT
*)src
).year
,
500 (*(SQL_DATE_STRUCT
*)src
).month
,
501 (*(SQL_DATE_STRUCT
*)src
).day
);
502 sprintf((char*) dest
, "%d/%d/%d", dt
.year(),dt
.month(), dt
.dayOfMonth());
508 tm
.set((*(SQL_TIME_STRUCT
*)src
).hour
,
509 (*(SQL_TIME_STRUCT
*)src
).minute
,
510 (*(SQL_TIME_STRUCT
*)src
).second
);
511 sprintf((char*)dest
,"%d:%d:%d.%d", tm
.hours(), tm
.minutes(), tm
.seconds(), 0);
517 ts
.setDate((*(SQL_TIMESTAMP_STRUCT
*)src
).year
,
518 (*(SQL_TIMESTAMP_STRUCT
*)src
).month
,
519 (*(SQL_TIMESTAMP_STRUCT
*)src
).day
);
520 ts
.setTime((*(SQL_TIMESTAMP_STRUCT
*)src
).hour
,
521 (*(SQL_TIMESTAMP_STRUCT
*)src
).minute
,
522 (*(SQL_TIMESTAMP_STRUCT
*)src
).second
);
523 sprintf((char*)dest
, "%d/%d/%d %d:%d:%d.%d", ts
.year(),ts
.month(), ts
.dayOfMonth(), ts
.hours(),ts
.minutes(), ts
.seconds(), 0 );
528 unsigned char *c
= (unsigned char *) src
;
529 unsigned char *str
= (unsigned char *) dest
;
534 if (p
< 10) sprintf ((char *)str
++, "%c", '0' + p
);
535 else sprintf((char *)str
++, "%c", 'A' + p
- 10);
537 if (p
< 10) sprintf ((char *)str
++, "%c", '0' + p
);
538 else sprintf((char *)str
++, "%c", 'A' + p
- 10);
544 default: ((char*)dest
)[0] = '\0';
549 //Copies data from the database onto the application buffer
550 //Called from SQLFetch
551 //Destination here can be the actual application buffer or
553 SQLINTEGER
copyToOdbc(void *odbcData
,SQLUINTEGER odbcLen
,void *sourceData
,SQLUINTEGER sourceLen
,SQLSMALLINT type
, SQLSMALLINT apptype
)
556 if(odbcData
== NULL
|| sourceData
== NULL
)
558 if( apptype
== typeString
&& type
!= apptype
){
559 AllDataType::convertToString(odbcData
, sourceData
,(DataType
) type
);
560 if(sourceLen
< odbcLen
) return sourceLen
;
566 *(short*)odbcData
= *(short*)sourceData
;
570 *(int*)odbcData
= *(int*)sourceData
;
574 *(long*)odbcData
= *(long*)sourceData
;
578 *(long long*)odbcData
= *(long long*)sourceData
;
582 *(char*)odbcData
= *(char*)sourceData
;
586 // CSqlOdbcError::printDbg("copyToOdbc");
587 // *(unsigned char*)odbcData = *(unsigned char*)sourceData;
591 *(float*)odbcData
= *(float*)sourceData
;
594 *(double*)odbcData
= *(double*)sourceData
;
598 // case csqlSqlTlongDouble:
599 // case csqlSqlTnumeric:
600 *(long double*)odbcData
= *(long double*)sourceData
;
603 // case csqlSqlTvarString:
604 if(sourceLen
< odbcLen
)
606 strcpy((char*)odbcData
,(char*)sourceData
);
607 ind
=strlen((char*)odbcData
)+1;
611 strncpy((char*)odbcData
,(char*)sourceData
,odbcLen
);
614 *((char *)odbcData
+ind
-1)='\0';
617 (*(SQL_DATE_STRUCT
*)odbcData
).year
= (*(Date
*)sourceData
).year();
618 (*(SQL_DATE_STRUCT
*)odbcData
).month
= (*(Date
*)sourceData
).month();
619 (*(SQL_DATE_STRUCT
*)odbcData
).day
= (*(Date
*)sourceData
).dayOfMonth();
622 (*(SQL_TIME_STRUCT
*)odbcData
).hour
= (*(Time
*)sourceData
).hours();
623 (*(SQL_TIME_STRUCT
*)odbcData
).minute
= (*(Time
*)sourceData
).minutes();
624 (*(SQL_TIME_STRUCT
*)odbcData
).second
= (*(Time
*)sourceData
).seconds();
627 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).year
= (*(TimeStamp
*)sourceData
).year();
628 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).month
= (*(TimeStamp
*)sourceData
).month();
629 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).day
= (*(TimeStamp
*)sourceData
).dayOfMonth();
630 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).hour
= (*(TimeStamp
*)sourceData
).hours();
631 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).minute
= (*(TimeStamp
*)sourceData
).minutes();
632 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).second
= (*(TimeStamp
*)sourceData
).seconds();
635 // case csqlSqlTvarBinary:
636 // CSqlOdbcError::printDbg("copyToOdbc");
637 // memset((unsigned char*)odbcData,0,odbcLen);
638 if(sourceLen
< odbcLen
)
640 memcpy( (unsigned char*)odbcData
, (unsigned char*)sourceData
,sourceLen
);
645 memcpy( (unsigned char*)odbcData
, (unsigned char*)sourceData
,odbcLen
);
652 bool isFunctionSupports(SQLUSMALLINT type
)
656 case SQL_API_SQLALLOCHANDLE
:
660 case SQL_API_SQLGETDESCFIELD
:
664 case SQL_API_SQLBINDCOL
:
668 case SQL_API_SQLGETDESCREC
:
672 case SQL_API_SQLCANCEL
:
676 case SQL_API_SQLGETDIAGFIELD
:
680 case SQL_API_SQLCLOSECURSOR
:
684 case SQL_API_SQLGETDIAGREC
:
688 case SQL_API_SQLCOLATTRIBUTE
:
692 case SQL_API_SQLGETENVATTR
:
696 case SQL_API_SQLCONNECT
:
700 case SQL_API_SQLGETFUNCTIONS
:
704 case SQL_API_SQLCOPYDESC
:
708 case SQL_API_SQLGETINFO
:
712 case SQL_API_SQLDATASOURCES
:
716 case SQL_API_SQLGETSTMTATTR
:
720 case SQL_API_SQLDESCRIBECOL
:
724 case SQL_API_SQLGETTYPEINFO
:
728 case SQL_API_SQLDISCONNECT
:
732 case SQL_API_SQLNUMRESULTCOLS
:
736 case SQL_API_SQLDRIVERS
:
740 case SQL_API_SQLPARAMDATA
:
744 case SQL_API_SQLENDTRAN
:
748 case SQL_API_SQLPREPARE
:
752 case SQL_API_SQLEXECDIRECT
:
756 case SQL_API_SQLPUTDATA
:
760 case SQL_API_SQLEXECUTE
:
764 case SQL_API_SQLROWCOUNT
:
768 case SQL_API_SQLFETCH
:
772 case SQL_API_SQLSETCONNECTATTR
:
776 case SQL_API_SQLFETCHSCROLL
:
780 case SQL_API_SQLSETCURSORNAME
:
784 case SQL_API_SQLFREEHANDLE
:
788 case SQL_API_SQLSETDESCFIELD
:
792 case SQL_API_SQLFREESTMT
:
796 case SQL_API_SQLSETDESCREC
:
800 case SQL_API_SQLGETCONNECTATTR
:
804 case SQL_API_SQLSETENVATTR
:
808 case SQL_API_SQLGETCURSORNAME
:
812 case SQL_API_SQLSETSTMTATTR
:
816 case SQL_API_SQLGETDATA
:
820 case SQL_API_SQLCOLUMNS
:
824 case SQL_API_SQLSTATISTICS
:
828 case SQL_API_SQLSPECIALCOLUMNS
:
832 case SQL_API_SQLTABLES
:
836 case SQL_API_SQLBINDPARAMETER
:
840 case SQL_API_SQLNATIVESQL
:
844 case SQL_API_SQLBROWSECONNECT
:
848 case SQL_API_SQLNUMPARAMS
:
852 case SQL_API_SQLPRIMARYKEYS
:
856 case SQL_API_SQLCOLUMNPRIVILEGES
:
860 case SQL_API_SQLPROCEDURECOLUMNS
:
864 case SQL_API_SQLDESCRIBEPARAM
:
868 case SQL_API_SQLPROCEDURES
:
872 case SQL_API_SQLDRIVERCONNECT
:
876 case SQL_API_SQLSETPOS
:
880 case SQL_API_SQLFOREIGNKEYS
:
884 case SQL_API_SQLTABLEPRIVILEGES
:
888 case SQL_API_SQLMORERESULTS
: