2 Description: Connection Handle manager.
5 CSqlOdbcDbc::SQLAllocDbc();
6 CSqlOdbcDbc::SQLFreeDbc();
7 CSqlOdbcDbc::SQLConnect();
10 #include "odbcCommon.h"
11 #include <SqlNwConnection.h>
14 CSqlOdbcDbc::CSqlOdbcDbc( void ) :
15 handleType_( SQL_HANDLE_DBC
),
18 err_( SQL_HANDLE_DBC
),
20 curAccessMode_( ACCESSMODE_READ_WRITE
),
21 curIsolationLevel_( READ_REPEATABLE
),
22 accessMode_( ACCESSMODE_READ_WRITE
),
23 isolationLevel_( READ_COMMITTED
),
24 autoCommit_( SQL_AUTOCOMMIT_ON
),
28 SQLRETURN
SQLAllocConnect(
29 SQLHENV EnvironmentHandle
,
30 SQLHDBC
*ConnectionHandle
)
32 return( CSqlOdbcDbc::SQLAllocHandle( EnvironmentHandle
, ConnectionHandle
) );
35 // All ODBC API's below.
36 SQLRETURN
CSqlOdbcDbc::SQLAllocHandle(
37 SQLHANDLE inputHandle
, // IN
38 SQLHANDLE
*outputHandle
) // OUT
41 CSqlOdbcEnv
*inputEnv
= (CSqlOdbcEnv
*) inputHandle
;
43 if( isValidHandle( inputEnv
, SQL_HANDLE_ENV
) != SQL_SUCCESS
)
44 return( SQL_INVALID_HANDLE
);
46 // Stop if odbcVersion not set.
47 if( inputEnv
->odbcVersion_
== 0 )
49 inputEnv
->err_
.set( ERROR_FUNCSEQ
);
52 if (NULL
== outputHandle
)
54 globalError
.set(ERROR_INVARGVAL
);
58 // Allocate Connection object.
59 *outputHandle
= (SQLHANDLE
*) new CSqlOdbcDbc
;
60 if( *outputHandle
== NULL
)
62 globalError
.set( ERROR_MEMALLOC
);
63 globalError
.printStr( SQL_OV_ODBC3
);
67 inputEnv
->dbcList_
.append(*outputHandle
);
68 inputEnv
->state_
= E2
;
69 ((CSqlOdbcDbc
*) *outputHandle
)->parentEnv_
= inputEnv
;
70 ((CSqlOdbcDbc
*) *outputHandle
)->state_
= C2
;
71 return( SQL_SUCCESS
);
74 SQLRETURN
SQLFreeConnect(
75 SQLHDBC ConnectionHandle
)
77 return( CSqlOdbcDbc::SQLFreeHandle( ConnectionHandle
) );
80 SQLRETURN
CSqlOdbcDbc::SQLFreeHandle(
81 SQLHANDLE inputHandle
) // IN
83 CSqlOdbcDbc
*inputDbc
= (CSqlOdbcDbc
*) inputHandle
;
86 if( isValidHandle( inputDbc
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
87 return( SQL_INVALID_HANDLE
);
89 // Check whether we can proceed.
90 if( inputDbc
->chkStateForSQLFreeHandle() != SQL_SUCCESS
)
93 // Remove Dbc from Parent Env.
94 ListIterator iter
= inputDbc
->parentEnv_
->dbcList_
.getIterator();
95 CSqlOdbcDbc
*dbcElem
= NULL
;
96 while(iter
.hasElement())
98 dbcElem
= (CSqlOdbcDbc
*) iter
.nextElement();
99 if (dbcElem
== inputDbc
) {
101 inputDbc
->parentEnv_
->dbcList_
.remove(dbcElem
);
105 if( inputDbc
->parentEnv_
->dbcList_
.size() == 0 )
106 inputDbc
->parentEnv_
->state_
= E1
;
108 inputDbc
->handleType_
= -1; // Make object invalid.
109 delete inputDbc
; // Delete Dbc.
111 return( SQL_SUCCESS
);
114 SQLRETURN
SQLDriverConnect(
115 SQLHDBC ConnectionHandle
,
116 SQLHWND WindowHandle
,
117 SQLCHAR
* InConnectionString
,
118 SQLSMALLINT StringLength1
,
119 SQLCHAR
* OutConnectionString
,
120 SQLSMALLINT BufferLength
,
121 SQLSMALLINT
* StringLength2Ptr
,
122 SQLUSMALLINT DriverCompletion
)
125 printError(ErrWarning
, "SQLDriverConnect");
129 if( isValidHandle( ConnectionHandle
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
130 return( SQL_INVALID_HANDLE
);
132 return( ((CSqlOdbcDbc
*) ConnectionHandle
)->SQLConnect(InConnectionString
,
133 SQL_NTS
, (SQLCHAR
*)"root", (SQLSMALLINT
)strlen("root"),
134 (SQLCHAR
*)"manager", (SQLSMALLINT
)strlen("manager")) );
138 char * CSqlOdbcDbc::getFromUrl(char *url
,char *name
)
140 char *token
=NULL
, *subtoken
=NULL
;
141 char *saveptr1
, *saveptr2
,*str1
,*str2
;
142 for ( str1
= url
; ; str1
= NULL
) {
143 token
= strtok_r(str1
, ";" , &saveptr1
);
146 // printf("TOKEN: %s\n",token);
148 subtoken
= strtok_r(str2
, "=", &saveptr2
);
149 //printf(" --> %s\n", subtoken);
150 if (subtoken
!= NULL
){
151 if(strcasecmp(subtoken
,name
)==0)
153 return strtok_r(NULL
,"=",&saveptr2
);
160 SQLRETURN
SQLConnect( // All param's are IN
161 SQLHDBC ConnectionHandle
,
163 SQLSMALLINT NameLength1
,
165 SQLSMALLINT NameLength2
,
166 SQLCHAR
*Authentication
,
167 SQLSMALLINT NameLength3
)
170 printError(ErrWarning
, "SQLConnect");
174 if( isValidHandle( ConnectionHandle
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
175 return( SQL_INVALID_HANDLE
);
177 return( ((CSqlOdbcDbc
*) ConnectionHandle
)->SQLConnect( ServerName
, NameLength1
,
178 UserName
, NameLength2
, Authentication
, NameLength3
) );
181 SQLRETURN
CSqlOdbcDbc::SQLConnect( // All param's are IN
190 char str
[IDENTIFIER_LENGTH
];
192 char *hostName
= NULL
;
194 char *connMode
= NULL
;
198 if( chkStateForSQLConnect() != SQL_SUCCESS
)
201 // Invalid Buffer Length.
202 if( (len1
< 0 && len1
!= SQL_NTS
) || (len2
< 0 && len2
!= SQL_NTS
) || (len2
< 0 && len2
!= SQL_NTS
) )
204 err_
.set( ERROR_BUFLEN
);
207 if (fsqlConn_
!= NULL
)
209 err_
.set( ERROR_CONNINUSE
);
210 return ( SQL_ERROR
);
212 if (NULL
== serverName
)
214 err_
.set(ERROR_INVARGVAL
);
217 if (NULL
== user
|| NULL
== pass
)
219 err_
.set(ERROR_INVARGVAL
);
223 strncpy(str
,(char *) serverName
, IDENTIFIER_LENGTH
);
224 dsn
= getFromUrl(str
,"DSN");
225 strncpy(str
,(char *) serverName
, IDENTIFIER_LENGTH
);
226 connMode
= getFromUrl(str
,"MODE");
227 strncpy(str
,(char *) serverName
, IDENTIFIER_LENGTH
);
228 hostName
= getFromUrl(str
,"SERVER");
229 strncpy(str
,(char *) serverName
, IDENTIFIER_LENGTH
);
230 portNo
= getFromUrl(str
,"PORT");
231 //printf("Mode=%s , hostName=%s port=%s\n",connMode,hostName,portNo);
232 if(NULL
!= connMode
){
233 if (hostName
== NULL
|| strcasecmp((char*)hostName
, "localhost") == 0 ){
234 if (strcasecmp((char*)connMode
, "Gateway") == 0){
235 fsqlConn_
= SqlFactory::createConnection(CSqlGateway
);
237 }else if (strcasecmp((char*)connMode
, "Adapter") == 0){
238 fsqlConn_
= SqlFactory::createConnection(CSqlAdapter
);
240 }else if (strcasecmp((char*)connMode
, "csql") == 0){
241 fsqlConn_
= SqlFactory::createConnection(CSql
);
243 }else return ( SQL_ERROR
);
245 if (portNo
== NULL
) {
246 err_
.set(ERROR_INVARGVAL
);
249 if (strcasecmp((char*)connMode
, "Gateway") == 0){
250 fsqlConn_
= SqlFactory::createConnection(CSqlNetworkGateway
);
251 SqlNwConnection
*con
= (SqlNwConnection
*)fsqlConn_
;
252 con
->setHost(hostName
, atoi(portNo
));
254 }else if (strcasecmp((char*)connMode
, "Adapter") == 0){
255 fsqlConn_
= SqlFactory::createConnection(CSqlNetworkAdapter
);
256 SqlNwConnection
*con
= (SqlNwConnection
*)fsqlConn_
;
257 con
->setHost(hostName
, atoi(portNo
));
259 }else if (strcasecmp((char*)connMode
, "csql") == 0){
260 fsqlConn_
= SqlFactory::createConnection(CSqlNetwork
);
261 SqlNwConnection
*con
= (SqlNwConnection
*)fsqlConn_
;
262 con
->setHost(hostName
, atoi(portNo
));
265 err_
.set( ERROR_INVARGVAL
);
266 return ( SQL_ERROR
);
271 fsqlConn_
= SqlFactory::createConnection(CSql
);
274 rc
= fsqlConn_
->connect( (char*) user
, (char*) pass
);
277 err_
.set( ERROR_CONNREJCTD
);
280 rc
= fsqlConn_
->beginTrans( isolationLevel_
);
283 err_
.set( ERROR_INVTRANSTATE
);
286 curAccessMode_
= accessMode_
;
287 curIsolationLevel_
= isolationLevel_
;
292 return( SQL_SUCCESS
);
296 SQLRETURN
SQLDisconnect(
297 SQLHDBC ConnectionHandle
) // IN
300 printError(ErrWarning
, "SQLDisConnect");
303 if( isValidHandle( ConnectionHandle
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
304 return( SQL_INVALID_HANDLE
);
305 SQLRETURN ret
= ( ((CSqlOdbcDbc
*) ConnectionHandle
)->SQLDisconnect() );
309 SQLRETURN
CSqlOdbcDbc::SQLDisconnect( void )
317 if( chkStateForSQLDisconnect() != SQL_SUCCESS
)
320 ListIterator iter
=stmtList_
.getIterator();
321 while (iter
.hasElement()) {
322 rc
= CSqlOdbcStmt::SQLFreeHandle(iter
.nextElement());
327 // Rollback the transaction
328 if( fsqlConn_
->rollback() != OK
)
332 if( fsqlConn_
->disconnect() != OK
)
337 // Change the state of Dbc
340 return( SQL_SUCCESS
);
343 SQLRETURN
CSqlOdbcDbc::SQLEndTran(
344 SQLSMALLINT completionType
) // IN
347 printError(ErrWarning
, "SQLEndTran: %hd", completionType
);
356 if( chkStateForSQLEndTran() != SQL_SUCCESS
)
359 // Stop if no transaction is started.
361 return( SQL_SUCCESS
);
363 // Close cursors of all the statements
364 ListIterator iter
= stmtList_
.getIterator();
365 CSqlOdbcStmt
*stmtElem
= NULL
;
366 while (iter
.hasElement()) {
367 stmtElem
= (CSqlOdbcStmt
*) iter
.nextElement();
368 stmtElem
->SQLFreeHandle( SQL_CLOSE
);
370 // Finish transaction
371 switch( completionType
)
375 if( fsqlConn_
->commit() != OK
)
378 if( fsqlConn_
->beginTrans( curIsolationLevel_
) != OK
)
384 if( fsqlConn_
->rollback() != OK
)
387 rc
= fsqlConn_
->beginTrans( curIsolationLevel_
);
390 default: err_
.set( ERROR_OPTRANGE
);
395 if( stmtList_
.size() == 0 )
400 return( SQL_SUCCESS
);
403 SQLRETURN
SQLSetConnectOption(
404 SQLHDBC ConnectionHandle
,
408 return( SQLSetConnectAttr( ConnectionHandle
, Option
, (SQLPOINTER
) Value
, 0) );
411 SQLRETURN
SQLSetConnectAttr(
412 SQLHDBC ConnectionHandle
,
413 SQLINTEGER Attribute
,
415 SQLINTEGER StringLength
)
418 if( isValidHandle( ConnectionHandle
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
419 return( SQL_INVALID_HANDLE
);
421 return( ((CSqlOdbcDbc
*)ConnectionHandle
)->SQLSetConnectAttr( Attribute
, Value
, StringLength
) );
424 SQLRETURN
CSqlOdbcDbc::SQLSetConnectAttr(
425 SQLINTEGER attribute
,
427 SQLINTEGER stringLength
)
434 case SQL_ATTR_ACCESS_MODE
:
436 if( (SQLUINTEGER
) value
== SQL_MODE_READ_ONLY
)
437 accessMode_
= ACCESSMODE_READ_ONLY
;
438 else if( (SQLUINTEGER
) value
== SQL_MODE_READ_WRITE
)
439 accessMode_
= ACCESSMODE_READ_WRITE
;
444 case SQL_DEFAULT_TXN_ISOLATION
:
445 case SQL_ATTR_TXN_ISOLATION
:
447 if( (SQLUINTEGER
) value
== SQL_TXN_READ_UNCOMMITTED
)
448 isolationLevel_
= READ_UNCOMMITTED
;
449 else if( (SQLUINTEGER
) value
== SQL_TXN_READ_COMMITTED
)
450 isolationLevel_
= READ_COMMITTED
;
451 else if( (SQLUINTEGER
) value
== SQL_TXN_REPEATABLE_READ
)
452 isolationLevel_
= READ_REPEATABLE
;
453 // else if( (SQLUINTEGER) value == SQL_TXN_SERIALIZABLE )
454 // isolationLevel_ = SERIALIZABLE;
459 case SQL_ATTR_AUTOCOMMIT
:
460 autoCommit_
= (SQLUINTEGER
) value
;
462 SQLEndTran( SQL_COMMIT
);
465 default: err_
.set( ERROR_OPTRANGE
);
469 return( SQL_SUCCESS
);
472 SQLRETURN
SQLGetConnectOption(
473 SQLHDBC ConnectionHandle
,
477 return( SQLGetConnectAttr( ConnectionHandle
, Option
, Value
, 0, 0) );
480 SQLRETURN
SQLGetConnectAttr(
481 SQLHDBC ConnectionHandle
,
482 SQLINTEGER Attribute
,
484 SQLINTEGER BufferLength
,
485 SQLINTEGER
*StringLength
)
488 if( isValidHandle( ConnectionHandle
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
489 return( SQL_INVALID_HANDLE
);
491 return( ((CSqlOdbcDbc
*)ConnectionHandle
)->SQLGetConnectAttr( Attribute
, Value
, BufferLength
, StringLength
) );
494 SQLRETURN
CSqlOdbcDbc::SQLGetConnectAttr(
495 SQLINTEGER attribute
,
497 SQLINTEGER bufferLength
,
498 SQLINTEGER
*stringLength
)
505 case SQL_ATTR_ACCESS_MODE
:
506 // Get ODBC Access Mode
507 if( accessMode_
== ACCESSMODE_READ_ONLY
)
508 *((SQLUINTEGER
*) value
) = SQL_MODE_READ_ONLY
;
509 else if( accessMode_
== ACCESSMODE_READ_WRITE
)
510 *((SQLUINTEGER
*) value
) = SQL_MODE_READ_WRITE
;
515 case SQL_DEFAULT_TXN_ISOLATION
:
516 case SQL_ATTR_TXN_ISOLATION
:
518 if( (SQLUINTEGER
) isolationLevel_
== READ_UNCOMMITTED
)
519 *((SQLUINTEGER
*) value
) = SQL_TXN_READ_UNCOMMITTED
;
520 else if( (SQLUINTEGER
) isolationLevel_
== READ_COMMITTED
)
521 *((SQLUINTEGER
*) value
) = SQL_TXN_READ_COMMITTED
;
522 else if( (SQLUINTEGER
) isolationLevel_
== READ_REPEATABLE
)
523 *((SQLUINTEGER
*) value
) = SQL_TXN_REPEATABLE_READ
;
524 // else if( (SQLUINTEGER) isolationLevel_ == SERIALIZABLE )
525 // *((SQLUINTEGER*) value) = SQL_TXN_SERIALIZABLE;
530 case SQL_ATTR_AUTOCOMMIT
:
531 *((SQLUINTEGER
*) value
) = autoCommit_
;
534 default: err_
.set( ERROR_OPTRANGE
);
538 return( SQL_SUCCESS
);
541 /*SQLRETURN SQLGetFunctions(
542 SQLHDBC ConnectionHandle,
543 SQLUSMALLINT FunctionId,
544 SQLUSMALLINT * SupportedPtr)
546 if( isValidHandle( ConnectionHandle, SQL_HANDLE_DBC ) != SQL_SUCCESS )
547 return( SQL_INVALID_HANDLE );
548 return( ((CSqlOdbcDbc*)ConnectionHandle)->SQLGetFunctions(FunctionId,SupportedPtr) );
551 SQLRETURN
CSqlOdbcDbc::SQLGetFunctions(
552 SQLUSMALLINT FunctionId
,
553 SQLUSMALLINT
* SupportedPtr
)
555 if (NULL
== SupportedPtr
)
557 err_
.set(ERROR_INVARGVAL
);
560 if(isFunctionSupports(FunctionId
))
561 *SupportedPtr
= SQL_TRUE
;
563 *SupportedPtr
= SQL_FALSE
;
564 return (SQL_SUCCESS
);
569 SQLRETURN
SQLGetInfo(
570 SQLHDBC ConnectionHandle
,
571 SQLUSMALLINT InfoType
,
572 SQLPOINTER InfoValuePtr
,
573 SQLSMALLINT BufferLength
,
574 SQLSMALLINT
* StringLengthPtr
)
576 if( isValidHandle( ConnectionHandle
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
577 return( SQL_INVALID_HANDLE
);
579 return( ((CSqlOdbcDbc
*)ConnectionHandle
)->SQLGetInfo( InfoType
,InfoValuePtr
,BufferLength
,StringLengthPtr
) );
583 SQLRETURN
CSqlOdbcDbc::SQLGetInfo(
584 SQLUSMALLINT InfoType
,
585 SQLPOINTER InfoValuePtr
,
586 SQLSMALLINT BufferLength
,
587 SQLSMALLINT
* StringLengthPtr
)
589 return (SQL_SUCCESS
);