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 //Copies data from the database onto the application buffer
427 //Called from SQLFetch
428 //Destination here can be the actual application buffer or
430 SQLINTEGER
copyToOdbc(void *odbcData
,SQLUINTEGER odbcLen
,void *sourceData
,SQLUINTEGER sourceLen
,SQLSMALLINT type
, SQLSMALLINT apptype
)
433 if(odbcData
== NULL
|| sourceData
== NULL
)
435 if( apptype
== typeString
&& type
!= apptype
){
436 AllDataType::convertToString(odbcData
, sourceData
,(DataType
) type
);
437 if(sourceLen
< odbcLen
) return sourceLen
;
443 *(short*)odbcData
= *(short*)sourceData
;
447 *(int*)odbcData
= *(int*)sourceData
;
451 *(long*)odbcData
= *(long*)sourceData
;
455 *(long long*)odbcData
= *(long long*)sourceData
;
459 *(char*)odbcData
= *(char*)sourceData
;
463 // CSqlOdbcError::printDbg("copyToOdbc");
464 // *(unsigned char*)odbcData = *(unsigned char*)sourceData;
468 *(float*)odbcData
= *(float*)sourceData
;
471 *(double*)odbcData
= *(double*)sourceData
;
475 // case csqlSqlTlongDouble:
476 // case csqlSqlTnumeric:
477 *(long double*)odbcData
= *(long double*)sourceData
;
480 // case csqlSqlTvarString:
481 if(sourceLen
< odbcLen
)
483 strcpy((char*)odbcData
,(char*)sourceData
);
484 ind
=strlen((char*)odbcData
)+1;
488 strncpy((char*)odbcData
,(char*)sourceData
,odbcLen
);
491 *((char *)odbcData
+ind
-1)='\0';
494 (*(SQL_DATE_STRUCT
*)odbcData
).year
= (*(Date
*)sourceData
).year();
495 (*(SQL_DATE_STRUCT
*)odbcData
).month
= (*(Date
*)sourceData
).month();
496 (*(SQL_DATE_STRUCT
*)odbcData
).day
= (*(Date
*)sourceData
).dayOfMonth();
499 (*(SQL_TIME_STRUCT
*)odbcData
).hour
= (*(Time
*)sourceData
).hours();
500 (*(SQL_TIME_STRUCT
*)odbcData
).minute
= (*(Time
*)sourceData
).minutes();
501 (*(SQL_TIME_STRUCT
*)odbcData
).second
= (*(Time
*)sourceData
).seconds();
504 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).year
= (*(TimeStamp
*)sourceData
).year();
505 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).month
= (*(TimeStamp
*)sourceData
).month();
506 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).day
= (*(TimeStamp
*)sourceData
).dayOfMonth();
507 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).hour
= (*(TimeStamp
*)sourceData
).hours();
508 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).minute
= (*(TimeStamp
*)sourceData
).minutes();
509 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).second
= (*(TimeStamp
*)sourceData
).seconds();
512 // case csqlSqlTvarBinary:
513 // CSqlOdbcError::printDbg("copyToOdbc");
514 // memset((unsigned char*)odbcData,0,odbcLen);
515 if(sourceLen
< odbcLen
)
517 memcpy( (unsigned char*)odbcData
, (unsigned char*)sourceData
,sourceLen
);
522 memcpy( (unsigned char*)odbcData
, (unsigned char*)sourceData
,odbcLen
);
529 bool isFunctionSupports(SQLUSMALLINT type
)
533 case SQL_API_SQLALLOCHANDLE
:
537 case SQL_API_SQLGETDESCFIELD
:
541 case SQL_API_SQLBINDCOL
:
545 case SQL_API_SQLGETDESCREC
:
549 case SQL_API_SQLCANCEL
:
553 case SQL_API_SQLGETDIAGFIELD
:
557 case SQL_API_SQLCLOSECURSOR
:
561 case SQL_API_SQLGETDIAGREC
:
565 case SQL_API_SQLCOLATTRIBUTE
:
569 case SQL_API_SQLGETENVATTR
:
573 case SQL_API_SQLCONNECT
:
577 case SQL_API_SQLGETFUNCTIONS
:
581 case SQL_API_SQLCOPYDESC
:
585 case SQL_API_SQLGETINFO
:
589 case SQL_API_SQLDATASOURCES
:
593 case SQL_API_SQLGETSTMTATTR
:
597 case SQL_API_SQLDESCRIBECOL
:
601 case SQL_API_SQLGETTYPEINFO
:
605 case SQL_API_SQLDISCONNECT
:
609 case SQL_API_SQLNUMRESULTCOLS
:
613 case SQL_API_SQLDRIVERS
:
617 case SQL_API_SQLPARAMDATA
:
621 case SQL_API_SQLENDTRAN
:
625 case SQL_API_SQLPREPARE
:
629 case SQL_API_SQLEXECDIRECT
:
633 case SQL_API_SQLPUTDATA
:
637 case SQL_API_SQLEXECUTE
:
641 case SQL_API_SQLROWCOUNT
:
645 case SQL_API_SQLFETCH
:
649 case SQL_API_SQLSETCONNECTATTR
:
653 case SQL_API_SQLFETCHSCROLL
:
657 case SQL_API_SQLSETCURSORNAME
:
661 case SQL_API_SQLFREEHANDLE
:
665 case SQL_API_SQLSETDESCFIELD
:
669 case SQL_API_SQLFREESTMT
:
673 case SQL_API_SQLSETDESCREC
:
677 case SQL_API_SQLGETCONNECTATTR
:
681 case SQL_API_SQLSETENVATTR
:
685 case SQL_API_SQLGETCURSORNAME
:
689 case SQL_API_SQLSETSTMTATTR
:
693 case SQL_API_SQLGETDATA
:
697 case SQL_API_SQLCOLUMNS
:
701 case SQL_API_SQLSTATISTICS
:
705 case SQL_API_SQLSPECIALCOLUMNS
:
709 case SQL_API_SQLTABLES
:
713 case SQL_API_SQLBINDPARAMETER
:
717 case SQL_API_SQLNATIVESQL
:
721 case SQL_API_SQLBROWSECONNECT
:
725 case SQL_API_SQLNUMPARAMS
:
729 case SQL_API_SQLPRIMARYKEYS
:
733 case SQL_API_SQLCOLUMNPRIVILEGES
:
737 case SQL_API_SQLPROCEDURECOLUMNS
:
741 case SQL_API_SQLDESCRIBEPARAM
:
745 case SQL_API_SQLPROCEDURES
:
749 case SQL_API_SQLDRIVERCONNECT
:
753 case SQL_API_SQLSETPOS
:
757 case SQL_API_SQLFOREIGNKEYS
:
761 case SQL_API_SQLTABLEPRIVILEGES
:
765 case SQL_API_SQLMORERESULTS
: