2 Description: Connection Handle manager.
5 CSqlOdbcDbc::SQLAllocDbc();
6 CSqlOdbcDbc::SQLFreeDbc();
7 CSqlOdbcDbc::SQLConnect();
10 #define strtok_r strtok_s
11 #include "odbcCommon.h"
12 #include <SqlNwConnection.h>
15 CSqlOdbcDbc::CSqlOdbcDbc( void ) :
16 handleType_( SQL_HANDLE_DBC
),
19 err_( SQL_HANDLE_DBC
),
21 curAccessMode_( ACCESSMODE_READ_WRITE
),
22 curIsolationLevel_( READ_REPEATABLE
),
23 accessMode_( ACCESSMODE_READ_WRITE
),
24 isolationLevel_( READ_COMMITTED
),
25 autoCommit_( SQL_AUTOCOMMIT_ON
),
29 SQLRETURN
SQLAllocConnect(
30 SQLHENV EnvironmentHandle
,
31 SQLHDBC
*ConnectionHandle
)
33 return( CSqlOdbcDbc::SQLAllocHandle( EnvironmentHandle
, ConnectionHandle
) );
36 // All ODBC API's below.
37 SQLRETURN
CSqlOdbcDbc::SQLAllocHandle(
38 SQLHANDLE inputHandle
, // IN
39 SQLHANDLE
*outputHandle
) // OUT
42 CSqlOdbcEnv
*inputEnv
= (CSqlOdbcEnv
*) inputHandle
;
44 if( isValidHandle( inputEnv
, SQL_HANDLE_ENV
) != SQL_SUCCESS
)
45 return( SQL_INVALID_HANDLE
);
47 // Stop if odbcVersion not set.
48 if( inputEnv
->odbcVersion_
== 0 )
50 inputEnv
->err_
.set( ERROR_FUNCSEQ
);
53 if (NULL
== outputHandle
)
55 globalError
.set(ERROR_INVARGVAL
);
59 // Allocate Connection object.
60 *outputHandle
= (SQLHANDLE
*) new CSqlOdbcDbc
;
61 if( *outputHandle
== NULL
)
63 globalError
.set( ERROR_MEMALLOC
);
64 globalError
.printStr( SQL_OV_ODBC3
);
68 inputEnv
->dbcList_
.append(*outputHandle
);
69 inputEnv
->state_
= E2
;
70 ((CSqlOdbcDbc
*) *outputHandle
)->parentEnv_
= inputEnv
;
71 ((CSqlOdbcDbc
*) *outputHandle
)->state_
= C2
;
72 return( SQL_SUCCESS
);
75 SQLRETURN
SQLFreeConnect(
76 SQLHDBC ConnectionHandle
)
78 return( CSqlOdbcDbc::SQLFreeHandle( ConnectionHandle
) );
81 SQLRETURN
CSqlOdbcDbc::SQLFreeHandle(
82 SQLHANDLE inputHandle
) // IN
84 CSqlOdbcDbc
*inputDbc
= (CSqlOdbcDbc
*) inputHandle
;
87 if( isValidHandle( inputDbc
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
88 return( SQL_INVALID_HANDLE
);
90 // Check whether we can proceed.
91 if( inputDbc
->chkStateForSQLFreeHandle() != SQL_SUCCESS
)
94 // Remove Dbc from Parent Env.
95 ListIterator iter
= inputDbc
->parentEnv_
->dbcList_
.getIterator();
96 CSqlOdbcDbc
*dbcElem
= NULL
;
97 while(iter
.hasElement())
99 dbcElem
= (CSqlOdbcDbc
*) iter
.nextElement();
100 if (dbcElem
== inputDbc
) {
102 inputDbc
->parentEnv_
->dbcList_
.remove(dbcElem
);
106 if( inputDbc
->parentEnv_
->dbcList_
.size() == 0 )
107 inputDbc
->parentEnv_
->state_
= E1
;
109 inputDbc
->handleType_
= -1; // Make object invalid.
110 delete inputDbc
; // Delete Dbc.
112 return( SQL_SUCCESS
);
115 SQLRETURN
SQLDriverConnect(
116 SQLHDBC ConnectionHandle
,
117 SQLHWND WindowHandle
,
118 SQLCHAR
* InConnectionString
,
119 SQLSMALLINT StringLength1
,
120 SQLCHAR
* OutConnectionString
,
121 SQLSMALLINT BufferLength
,
122 SQLSMALLINT
* StringLength2Ptr
,
123 SQLUSMALLINT DriverCompletion
)
126 printError(ErrWarning
, "SQLDriverConnect");
130 if( isValidHandle( ConnectionHandle
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
131 return( SQL_INVALID_HANDLE
);
133 return( ((CSqlOdbcDbc
*) ConnectionHandle
)->SQLConnect(InConnectionString
,
134 SQL_NTS
, (SQLCHAR
*)"root", (SQLSMALLINT
)strlen("root"),
135 (SQLCHAR
*)"manager", (SQLSMALLINT
)strlen("manager")) );
139 char * CSqlOdbcDbc::getFromUrl(char *url
,char *name
)
141 char *token
=NULL
, *subtoken
=NULL
;
142 char *saveptr1
, *saveptr2
,*str1
,*str2
;
143 for ( str1
= url
; ; str1
= NULL
) {
144 token
= strtok_r(str1
, ";" , &saveptr1
);
147 // printf("TOKEN: %s\n",token);
149 subtoken
= strtok_r(str2
, "=", &saveptr2
);
150 //printf(" --> %s\n", subtoken);
151 if (subtoken
!= NULL
){
152 if(strcasecmp(subtoken
,name
)==0)
154 return strtok_r(NULL
,"=",&saveptr2
);
161 SQLRETURN
SQLConnect( // All param's are IN
162 SQLHDBC ConnectionHandle
,
164 SQLSMALLINT NameLength1
,
166 SQLSMALLINT NameLength2
,
167 SQLCHAR
*Authentication
,
168 SQLSMALLINT NameLength3
)
171 printError(ErrWarning
, "SQLConnect");
175 if( isValidHandle( ConnectionHandle
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
176 return( SQL_INVALID_HANDLE
);
178 return( ((CSqlOdbcDbc
*) ConnectionHandle
)->SQLConnect( ServerName
, NameLength1
,
179 UserName
, NameLength2
, Authentication
, NameLength3
) );
182 SQLRETURN
CSqlOdbcDbc::SQLConnect( // All param's are IN
191 char str
[IDENTIFIER_LENGTH
];
193 char *hostName
= NULL
;
195 char *connMode
= NULL
;
199 if( chkStateForSQLConnect() != SQL_SUCCESS
)
202 // Invalid Buffer Length.
203 if( (len1
< 0 && len1
!= SQL_NTS
) || (len2
< 0 && len2
!= SQL_NTS
) || (len2
< 0 && len2
!= SQL_NTS
) )
205 err_
.set( ERROR_BUFLEN
);
208 if (fsqlConn_
!= NULL
)
210 err_
.set( ERROR_CONNINUSE
);
211 return ( SQL_ERROR
);
213 if (NULL
== serverName
)
215 err_
.set(ERROR_INVARGVAL
);
218 if (NULL
== user
|| NULL
== pass
)
220 err_
.set(ERROR_INVARGVAL
);
224 strncpy(str
,(char *) serverName
, IDENTIFIER_LENGTH
);
225 dsn
= getFromUrl(str
,"DSN");
226 strncpy(str
,(char *) serverName
, IDENTIFIER_LENGTH
);
227 connMode
= getFromUrl(str
,"MODE");
228 strncpy(str
,(char *) serverName
, IDENTIFIER_LENGTH
);
229 hostName
= getFromUrl(str
,"SERVER");
230 strncpy(str
,(char *) serverName
, IDENTIFIER_LENGTH
);
231 portNo
= getFromUrl(str
,"PORT");
232 //printf("Mode=%s , hostName=%s port=%s\n",connMode,hostName,portNo);
233 if(NULL
!= connMode
){
234 if (hostName
== NULL
|| strcasecmp((char*)hostName
, "localhost") == 0 ){
235 if (strcasecmp((char*)connMode
, "Gateway") == 0){
236 fsqlConn_
= SqlFactory::createConnection(CSqlGateway
);
238 }else if (strcasecmp((char*)connMode
, "Adapter") == 0){
239 fsqlConn_
= SqlFactory::createConnection(CSqlAdapter
);
241 }else if (strcasecmp((char*)connMode
, "csql") == 0){
242 fsqlConn_
= SqlFactory::createConnection(CSql
);
244 }else return ( SQL_ERROR
);
246 if (portNo
== NULL
) {
247 err_
.set(ERROR_INVARGVAL
);
250 if (strcasecmp((char*)connMode
, "Gateway") == 0){
251 fsqlConn_
= SqlFactory::createConnection(CSqlNetworkGateway
);
252 SqlNwConnection
*con
= (SqlNwConnection
*)fsqlConn_
;
253 con
->setHost(hostName
, atoi(portNo
));
255 }else if (strcasecmp((char*)connMode
, "Adapter") == 0){
256 fsqlConn_
= SqlFactory::createConnection(CSqlNetworkAdapter
);
257 SqlNwConnection
*con
= (SqlNwConnection
*)fsqlConn_
;
258 con
->setHost(hostName
, atoi(portNo
));
260 }else if (strcasecmp((char*)connMode
, "csql") == 0){
261 fsqlConn_
= SqlFactory::createConnection(CSqlNetwork
);
262 SqlNwConnection
*con
= (SqlNwConnection
*)fsqlConn_
;
263 con
->setHost(hostName
, atoi(portNo
));
266 err_
.set( ERROR_INVARGVAL
);
267 return ( SQL_ERROR
);
272 fsqlConn_
= SqlFactory::createConnection(CSql
);
275 rc
= fsqlConn_
->connect( (char*) user
, (char*) pass
);
278 err_
.set( ERROR_CONNREJCTD
);
281 rc
= fsqlConn_
->beginTrans( isolationLevel_
);
284 err_
.set( ERROR_INVTRANSTATE
);
287 curAccessMode_
= accessMode_
;
288 curIsolationLevel_
= isolationLevel_
;
293 return( SQL_SUCCESS
);
297 SQLRETURN
SQLDisconnect(
298 SQLHDBC ConnectionHandle
) // IN
301 printError(ErrWarning
, "SQLDisConnect");
304 if( isValidHandle( ConnectionHandle
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
305 return( SQL_INVALID_HANDLE
);
306 SQLRETURN ret
= ( ((CSqlOdbcDbc
*) ConnectionHandle
)->SQLDisconnect() );
310 SQLRETURN
CSqlOdbcDbc::SQLDisconnect( void )
318 if( chkStateForSQLDisconnect() != SQL_SUCCESS
)
321 ListIterator iter
=stmtList_
.getIterator();
322 while (iter
.hasElement()) {
323 rc
= CSqlOdbcStmt::SQLFreeHandle(iter
.nextElement());
328 // Rollback the transaction
329 if( fsqlConn_
->rollback() != OK
)
333 if( fsqlConn_
->disconnect() != OK
)
338 // Change the state of Dbc
341 return( SQL_SUCCESS
);
344 SQLRETURN
CSqlOdbcDbc::SQLEndTran(
345 SQLSMALLINT completionType
) // IN
348 printError(ErrWarning
, "SQLEndTran: %hd", completionType
);
357 if( chkStateForSQLEndTran() != SQL_SUCCESS
)
360 // Stop if no transaction is started.
362 return( SQL_SUCCESS
);
364 // Close cursors of all the statements
365 ListIterator iter
= stmtList_
.getIterator();
366 CSqlOdbcStmt
*stmtElem
= NULL
;
367 while (iter
.hasElement()) {
368 stmtElem
= (CSqlOdbcStmt
*) iter
.nextElement();
369 stmtElem
->SQLFreeHandle( SQL_CLOSE
);
371 // Finish transaction
372 switch( completionType
)
376 if( fsqlConn_
->commit() != OK
)
379 if( fsqlConn_
->beginTrans( curIsolationLevel_
) != OK
)
385 if( fsqlConn_
->rollback() != OK
)
388 rc
= fsqlConn_
->beginTrans( curIsolationLevel_
);
391 default: err_
.set( ERROR_OPTRANGE
);
396 if( stmtList_
.size() == 0 )
401 return( SQL_SUCCESS
);
404 SQLRETURN
SQLSetConnectOption(
405 SQLHDBC ConnectionHandle
,
409 return( SQLSetConnectAttr( ConnectionHandle
, Option
, (SQLPOINTER
) Value
, 0) );
412 SQLRETURN
SQLSetConnectAttr(
413 SQLHDBC ConnectionHandle
,
414 SQLINTEGER Attribute
,
416 SQLINTEGER StringLength
)
419 if( isValidHandle( ConnectionHandle
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
420 return( SQL_INVALID_HANDLE
);
422 return( ((CSqlOdbcDbc
*)ConnectionHandle
)->SQLSetConnectAttr( Attribute
, Value
, StringLength
) );
425 SQLRETURN
CSqlOdbcDbc::SQLSetConnectAttr(
426 SQLINTEGER attribute
,
428 SQLINTEGER stringLength
)
435 case SQL_ATTR_ACCESS_MODE
:
437 if( (SQLUINTEGER
) value
== SQL_MODE_READ_ONLY
)
438 accessMode_
= ACCESSMODE_READ_ONLY
;
439 else if( (SQLUINTEGER
) value
== SQL_MODE_READ_WRITE
)
440 accessMode_
= ACCESSMODE_READ_WRITE
;
445 case SQL_DEFAULT_TXN_ISOLATION
:
446 case SQL_ATTR_TXN_ISOLATION
:
448 if( (SQLUINTEGER
) value
== SQL_TXN_READ_UNCOMMITTED
)
449 isolationLevel_
= READ_UNCOMMITTED
;
450 else if( (SQLUINTEGER
) value
== SQL_TXN_READ_COMMITTED
)
451 isolationLevel_
= READ_COMMITTED
;
452 else if( (SQLUINTEGER
) value
== SQL_TXN_REPEATABLE_READ
)
453 isolationLevel_
= READ_REPEATABLE
;
454 // else if( (SQLUINTEGER) value == SQL_TXN_SERIALIZABLE )
455 // isolationLevel_ = SERIALIZABLE;
460 case SQL_ATTR_AUTOCOMMIT
:
461 autoCommit_
= (SQLUINTEGER
) value
;
463 SQLEndTran( SQL_COMMIT
);
466 default: err_
.set( ERROR_OPTRANGE
);
470 return( SQL_SUCCESS
);
473 SQLRETURN
SQLGetConnectOption(
474 SQLHDBC ConnectionHandle
,
478 return( SQLGetConnectAttr( ConnectionHandle
, Option
, Value
, 0, 0) );
481 SQLRETURN
SQLGetConnectAttr(
482 SQLHDBC ConnectionHandle
,
483 SQLINTEGER Attribute
,
485 SQLINTEGER BufferLength
,
486 SQLINTEGER
*StringLength
)
489 if( isValidHandle( ConnectionHandle
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
490 return( SQL_INVALID_HANDLE
);
492 return( ((CSqlOdbcDbc
*)ConnectionHandle
)->SQLGetConnectAttr( Attribute
, Value
, BufferLength
, StringLength
) );
495 SQLRETURN
CSqlOdbcDbc::SQLGetConnectAttr(
496 SQLINTEGER attribute
,
498 SQLINTEGER bufferLength
,
499 SQLINTEGER
*stringLength
)
506 case SQL_ATTR_ACCESS_MODE
:
507 // Get ODBC Access Mode
508 if( accessMode_
== ACCESSMODE_READ_ONLY
)
509 *((SQLUINTEGER
*) value
) = SQL_MODE_READ_ONLY
;
510 else if( accessMode_
== ACCESSMODE_READ_WRITE
)
511 *((SQLUINTEGER
*) value
) = SQL_MODE_READ_WRITE
;
516 case SQL_DEFAULT_TXN_ISOLATION
:
517 case SQL_ATTR_TXN_ISOLATION
:
519 if( (SQLUINTEGER
) isolationLevel_
== READ_UNCOMMITTED
)
520 *((SQLUINTEGER
*) value
) = SQL_TXN_READ_UNCOMMITTED
;
521 else if( (SQLUINTEGER
) isolationLevel_
== READ_COMMITTED
)
522 *((SQLUINTEGER
*) value
) = SQL_TXN_READ_COMMITTED
;
523 else if( (SQLUINTEGER
) isolationLevel_
== READ_REPEATABLE
)
524 *((SQLUINTEGER
*) value
) = SQL_TXN_REPEATABLE_READ
;
525 // else if( (SQLUINTEGER) isolationLevel_ == SERIALIZABLE )
526 // *((SQLUINTEGER*) value) = SQL_TXN_SERIALIZABLE;
531 case SQL_ATTR_AUTOCOMMIT
:
532 *((SQLUINTEGER
*) value
) = autoCommit_
;
535 default: err_
.set( ERROR_OPTRANGE
);
539 return( SQL_SUCCESS
);
542 /*SQLRETURN SQLGetFunctions(
543 SQLHDBC ConnectionHandle,
544 SQLUSMALLINT FunctionId,
545 SQLUSMALLINT * SupportedPtr)
547 if( isValidHandle( ConnectionHandle, SQL_HANDLE_DBC ) != SQL_SUCCESS )
548 return( SQL_INVALID_HANDLE );
549 return( ((CSqlOdbcDbc*)ConnectionHandle)->SQLGetFunctions(FunctionId,SupportedPtr) );
552 SQLRETURN
CSqlOdbcDbc::SQLGetFunctions(
553 SQLUSMALLINT FunctionId
,
554 SQLUSMALLINT
* SupportedPtr
)
556 if (NULL
== SupportedPtr
)
558 err_
.set(ERROR_INVARGVAL
);
561 if(isFunctionSupports(FunctionId
))
562 *SupportedPtr
= SQL_TRUE
;
564 *SupportedPtr
= SQL_FALSE
;
565 return (SQL_SUCCESS
);
570 SQLRETURN
SQLGetInfo(
571 SQLHDBC ConnectionHandle
,
572 SQLUSMALLINT InfoType
,
573 SQLPOINTER InfoValuePtr
,
574 SQLSMALLINT BufferLength
,
575 SQLSMALLINT
* StringLengthPtr
)
577 if( isValidHandle( ConnectionHandle
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
578 return( SQL_INVALID_HANDLE
);
580 return( ((CSqlOdbcDbc
*)ConnectionHandle
)->SQLGetInfo( InfoType
,InfoValuePtr
,BufferLength
,StringLengthPtr
) );
584 SQLRETURN
CSqlOdbcDbc::SQLGetInfo(
585 SQLUSMALLINT InfoType
,
586 SQLPOINTER InfoValuePtr
,
587 SQLSMALLINT BufferLength
,
588 SQLSMALLINT
* StringLengthPtr
)
590 return (SQL_SUCCESS
);