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
)
164 case SQL_C_TYPE_DATE
:
167 case SQL_C_TYPE_TIME
:
169 case SQL_C_TIMESTAMP
:
170 case SQL_C_TYPE_TIMESTAMP
:
171 return typeTimeStamp
;
175 default: return( typeUnknown
);
179 SQLSMALLINT
getSQLType( DataType type
)
205 return SQL_TIMESTAMP
;
213 //case csqlSqlTlongDouble: might be equal typeDecimal
215 //case csqlSqlTvarString:
216 // return SQL_VARCHAR;
217 //case csqlSqlTvarBinary:
218 // return SQL_BINARY;
227 SQLCHAR
*getSQLTypeName( SQLSMALLINT type
)
232 return (SQLCHAR
*)"CHAR";
234 return (SQLCHAR
*)"VARCHAR";
236 return (SQLCHAR
*)"BIT";
238 return (SQLCHAR
*)"SMALLINT";
240 return (SQLCHAR
*)"INTEGER";
242 return (SQLCHAR
*)"REAL";
245 return (SQLCHAR
*)"NUMERIC";
247 return (SQLCHAR
*)"DOUBLE";
249 return (SQLCHAR
*)"FLOAT";
251 return (SQLCHAR
*)"TINYINT";
253 return (SQLCHAR
*)"BIGINT";
256 return (SQLCHAR
*)"DATE";
259 return (SQLCHAR
*)"TIME";
261 case SQL_TYPE_TIMESTAMP
:
262 return (SQLCHAR
*)"TIMESTAMP";
264 return (SQLCHAR
*)"BINARY";
270 void getInputBuffer(void **buffer
,SQLSMALLINT type
,SQLUINTEGER length
)
275 *buffer
= new short();
284 *buffer
= new long long();
287 *buffer
= new signed char();
290 *buffer = new unsigned char ();
294 *buffer
= new float();
297 *buffer
= new double();
300 // case csqlSqlTlongDouble:
301 // case csqlSqlTnumeric:
302 *buffer
= new long double ();
306 // case csqlSqlTvarString:
307 *buffer
= new char [length
+1];
310 *buffer
= new Date();
313 *buffer
= new Time();
316 *buffer
= new TimeStamp();
319 // case csqlSqlTvarBinary:
320 *buffer
= new unsigned char [length
+1];
325 // CSQL TODO - Need to review and finalize.
326 //Copies data from the application onto the destination
327 //Called from SQLExecute
328 //Destination here can be directly the database bound buffer or
330 void copyFromOdbc(AbsSqlStatement
*stmt
, int paramNo
, SQLUINTEGER destLen
,void *odbcData
,SQLUINTEGER odbcLen
,SQLSMALLINT type
)
332 //No point in continuing further
338 //*(short*)destData = *(short*)odbcData;
339 stmt
->setShortParam(paramNo
, *(short*)odbcData
);
342 //*(int*)destData = *(int*)odbcData;
343 stmt
->setIntParam(paramNo
, *(int*)odbcData
);
346 //*(long*)destData = *(long*)odbcData;
347 stmt
->setLongParam(paramNo
, *(long*)odbcData
);
350 //*(long long*)destData = *(long long*)odbcData;
351 stmt
->setLongLongParam(paramNo
, *(long long *)odbcData
);
354 //*(char*)destData = *(char*)odbcData;
355 ByteInt
bt(*(char*)odbcData
);
356 stmt
->setByteIntParam(paramNo
, bt
);
360 *(unsigned char*)destData = *(unsigned char*)odbcData;
364 //*(float*)destData = *(float*)odbcData;
365 stmt
->setFloatParam(paramNo
, *(float*)odbcData
);
369 //*(double*)destData = *(double*)odbcData;
370 stmt
->setDoubleParam(paramNo
, *(double*)odbcData
);
373 // case csqlSqlTlongDouble:
374 // case csqlSqlTnumeric:
376 //*(long double*)destData = *(long double*)odbcData;
381 stmt
->setStringParam(paramNo
, (char*) odbcData
);
382 /*if(odbcLen < destLen)
384 strcpy( (char*)destData, (char*)odbcData);
385 *((char*)destData+odbcLen)='\0';
389 strncpy((char*)destData,(char*)odbcData,(destLen-1));
390 *((char*)destData+destLen)='\0';
396 dt
.set((*(SQL_DATE_STRUCT
*)odbcData
).year
,
397 (*(SQL_DATE_STRUCT
*)odbcData
).month
,
398 (*(SQL_DATE_STRUCT
*)odbcData
).day
);
399 stmt
->setDateParam(paramNo
, dt
);
404 tm
.set((*(SQL_TIME_STRUCT
*)odbcData
).hour
,
405 (*(SQL_TIME_STRUCT
*)odbcData
).minute
,
406 (*(SQL_TIME_STRUCT
*)odbcData
).second
);
407 stmt
->setTimeParam(paramNo
, tm
);
410 case typeTimeStamp
: {
412 ts
.setDate((*(SQL_TIMESTAMP_STRUCT
*)odbcData
).year
,
413 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).month
,
414 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).day
);
415 ts
.setTime((*(SQL_TIMESTAMP_STRUCT
*)odbcData
).hour
,
416 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).minute
,
417 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).second
);
418 stmt
->setTimeStampParam(paramNo
, ts
);
425 //Copies data from the database onto the application buffer
426 //Called from SQLFetch
427 //Destination here can be the actual application buffer or
429 SQLINTEGER
copyToOdbc(void *odbcData
,SQLUINTEGER odbcLen
,void *sourceData
,SQLUINTEGER sourceLen
,SQLSMALLINT type
)
432 if(odbcData
== NULL
|| sourceData
== NULL
)
437 *(short*)odbcData
= *(short*)sourceData
;
441 *(int*)odbcData
= *(int*)sourceData
;
445 *(long*)odbcData
= *(long*)sourceData
;
449 *(long long*)odbcData
= *(long long*)sourceData
;
453 *(char*)odbcData
= *(char*)sourceData
;
457 // CSqlOdbcError::printDbg("copyToOdbc");
458 // *(unsigned char*)odbcData = *(unsigned char*)sourceData;
462 *(float*)odbcData
= *(float*)sourceData
;
465 *(double*)odbcData
= *(double*)sourceData
;
469 // case csqlSqlTlongDouble:
470 // case csqlSqlTnumeric:
471 *(long double*)odbcData
= *(long double*)sourceData
;
474 // case csqlSqlTvarString:
475 if(sourceLen
< odbcLen
)
477 strcpy((char*)odbcData
,(char*)sourceData
);
478 ind
=strlen((char*)odbcData
)+1;
482 strncpy((char*)odbcData
,(char*)sourceData
,odbcLen
);
485 *((char *)odbcData
+ind
-1)='\0';
488 (*(SQL_DATE_STRUCT
*)odbcData
).year
= (*(Date
*)sourceData
).year();
489 (*(SQL_DATE_STRUCT
*)odbcData
).month
= (*(Date
*)sourceData
).month();
490 (*(SQL_DATE_STRUCT
*)odbcData
).day
= (*(Date
*)sourceData
).dayOfMonth();
493 (*(SQL_TIME_STRUCT
*)odbcData
).hour
= (*(Time
*)sourceData
).hours();
494 (*(SQL_TIME_STRUCT
*)odbcData
).minute
= (*(Time
*)sourceData
).minutes();
495 (*(SQL_TIME_STRUCT
*)odbcData
).second
= (*(Time
*)sourceData
).seconds();
498 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).year
= (*(TimeStamp
*)sourceData
).year();
499 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).month
= (*(TimeStamp
*)sourceData
).month();
500 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).day
= (*(TimeStamp
*)sourceData
).dayOfMonth();
501 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).hour
= (*(TimeStamp
*)sourceData
).hours();
502 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).minute
= (*(TimeStamp
*)sourceData
).minutes();
503 (*(SQL_TIMESTAMP_STRUCT
*)odbcData
).second
= (*(TimeStamp
*)sourceData
).seconds();
506 // case csqlSqlTvarBinary:
507 // CSqlOdbcError::printDbg("copyToOdbc");
508 // memset((unsigned char*)odbcData,0,odbcLen);
509 if(sourceLen
< odbcLen
)
511 memcpy( (unsigned char*)odbcData
, (unsigned char*)sourceData
,sourceLen
);
516 memcpy( (unsigned char*)odbcData
, (unsigned char*)sourceData
,odbcLen
);