2 Description: Connection Handle manager.
5 CSqlOdbcDbc::SQLAllocDbc();
6 CSqlOdbcDbc::SQLFreeDbc();
7 CSqlOdbcDbc::SQLConnect();
10 #include "odbcCommon.h"
13 CSqlOdbcDbc::CSqlOdbcDbc( void ) :
14 handleType_( SQL_HANDLE_DBC
),
17 err_( SQL_HANDLE_DBC
),
19 curAccessMode_( ACCESSMODE_READ_WRITE
),
20 curIsolationLevel_( READ_REPEATABLE
),
21 accessMode_( ACCESSMODE_READ_WRITE
),
22 isolationLevel_( READ_COMMITTED
),
23 autoCommit_( SQL_AUTOCOMMIT_ON
)
26 SQLRETURN
SQLAllocConnect(
27 SQLHENV EnvironmentHandle
,
28 SQLHDBC
*ConnectionHandle
)
30 return( CSqlOdbcDbc::SQLAllocHandle( EnvironmentHandle
, ConnectionHandle
) );
33 // All ODBC API's below.
34 SQLRETURN
CSqlOdbcDbc::SQLAllocHandle(
35 SQLHANDLE inputHandle
, // IN
36 SQLHANDLE
*outputHandle
) // OUT
39 CSqlOdbcEnv
*inputEnv
= (CSqlOdbcEnv
*) inputHandle
;
41 if( isValidHandle( inputEnv
, SQL_HANDLE_ENV
) != SQL_SUCCESS
)
42 return( SQL_INVALID_HANDLE
);
44 // Stop if odbcVersion not set.
45 if( inputEnv
->odbcVersion_
== 0 )
47 inputEnv
->err_
.set( ERROR_FUNCSEQ
);
51 // Allocate Connection object.
52 *outputHandle
= (SQLHANDLE
*) new CSqlOdbcDbc
;
53 if( *outputHandle
== NULL
)
55 globalError
.set( ERROR_MEMALLOC
);
56 globalError
.printStr( SQL_OV_ODBC3
);
60 // Initialize relation b/w Env and Dbc
61 inputEnv
->dbcList_
.insert( inputEnv
->dbcList_
.begin(), (CSqlOdbcDbc
*) *outputHandle
);
62 inputEnv
->state_
= E2
;
63 ((CSqlOdbcDbc
*) *outputHandle
)->parentEnv_
= inputEnv
;
64 ((CSqlOdbcDbc
*) *outputHandle
)->state_
= C2
;
66 return( SQL_SUCCESS
);
69 SQLRETURN
SQLFreeConnect(
70 SQLHDBC ConnectionHandle
)
72 return( CSqlOdbcDbc::SQLFreeHandle( ConnectionHandle
) );
75 SQLRETURN
CSqlOdbcDbc::SQLFreeHandle(
76 SQLHANDLE inputHandle
) // IN
78 CSqlOdbcDbc
*inputDbc
= (CSqlOdbcDbc
*) inputHandle
;
81 if( isValidHandle( inputDbc
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
82 return( SQL_INVALID_HANDLE
);
84 // Check whether we can proceed.
85 if( inputDbc
->chkStateForSQLFreeHandle() != SQL_SUCCESS
)
88 // Remove Dbc from Parent Env.
89 std::vector
<CSqlOdbcDbc
*>::iterator iter
;
90 iter
= inputDbc
->parentEnv_
->dbcList_
.begin();
91 while( iter
!= inputDbc
->parentEnv_
->dbcList_
.end() )
93 if( *iter
== inputDbc
)
95 inputDbc
->parentEnv_
->dbcList_
.erase( iter
);
100 if( inputDbc
->parentEnv_
->dbcList_
.size() == 0 )
101 inputDbc
->parentEnv_
->state_
= E1
;
103 inputDbc
->handleType_
= -1; // Make object invalid.
104 delete inputDbc
; // Delete Dbc.
106 return( SQL_SUCCESS
);
109 SQLRETURN
SQLDriverConnect(
110 SQLHDBC ConnectionHandle
,
111 SQLHWND WindowHandle
,
112 SQLCHAR
* InConnectionString
,
113 SQLSMALLINT StringLength1
,
114 SQLCHAR
* OutConnectionString
,
115 SQLSMALLINT BufferLength
,
116 SQLSMALLINT
* StringLength2Ptr
,
117 SQLUSMALLINT DriverCompletion
)
119 printf("Connection string is %s\n", InConnectionString
);
121 if( isValidHandle( ConnectionHandle
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
122 return( SQL_INVALID_HANDLE
);
124 return( ((CSqlOdbcDbc
*) ConnectionHandle
)->SQLConnect((SQLCHAR
*)"a",
125 (SQLSMALLINT
)strlen("a"), (SQLCHAR
*)"root", (SQLSMALLINT
)strlen("root"),
126 (SQLCHAR
*)"manager", (SQLSMALLINT
)strlen("manager")) );
130 SQLRETURN
SQLConnect( // All param's are IN
131 SQLHDBC ConnectionHandle
,
133 SQLSMALLINT NameLength1
,
135 SQLSMALLINT NameLength2
,
136 SQLCHAR
*Authentication
,
137 SQLSMALLINT NameLength3
)
140 if( isValidHandle( ConnectionHandle
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
141 return( SQL_INVALID_HANDLE
);
143 return( ((CSqlOdbcDbc
*) ConnectionHandle
)->SQLConnect( ServerName
, NameLength1
,
144 UserName
, NameLength2
, Authentication
, NameLength3
) );
147 SQLRETURN
CSqlOdbcDbc::SQLConnect( // All param's are IN
156 char *hostName
,*portNo
;
161 if( chkStateForSQLConnect() != SQL_SUCCESS
)
164 // Invalid Buffer Length.
165 if( (len1
< 0 && len1
!= SQL_NTS
) || (len2
< 0 && len2
!= SQL_NTS
) || (len2
< 0 && len2
!= SQL_NTS
) )
167 err_
.set( ERROR_BUFLEN
);
170 if (fsqlConn_
!= NULL
)
172 err_
.set( ERROR_CONNINUSE
);
173 return ( SQL_ERROR
);
175 if (strcasecmp((char*)serverName
, "gateway") == 0)
177 fsqlConn_
= SqlFactory::createConnection(CSqlGateway
);
179 }else if (strcasecmp((char*)serverName
, "adapter") == 0){
180 fsqlConn_
= SqlFactory::createConnection(CSqlAdapter
);
183 fsqlConn_
= SqlFactory::createConnection(CSql
);
187 rc
= fsqlConn_
->connect( (char*) user
, (char*) pass
);
190 err_
.set( ERROR_CONNREJCTD
);
193 rc
= fsqlConn_
->beginTrans( isolationLevel_
);
196 err_
.set( ERROR_INVTRANSTATE
);
199 curAccessMode_
= accessMode_
;
200 curIsolationLevel_
= isolationLevel_
;
205 return( SQL_SUCCESS
);
208 SQLRETURN
SQLDisconnect(
209 SQLHDBC ConnectionHandle
) // IN
212 if( isValidHandle( ConnectionHandle
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
213 return( SQL_INVALID_HANDLE
);
214 SQLRETURN ret
= ( ((CSqlOdbcDbc
*) ConnectionHandle
)->SQLDisconnect() );
218 SQLRETURN
CSqlOdbcDbc::SQLDisconnect( void )
226 if( chkStateForSQLDisconnect() != SQL_SUCCESS
)
230 while( stmtList_
.size() != 0 )
232 rc
= CSqlOdbcStmt::SQLFreeHandle( stmtList_
[0] );
233 // This free's the stmt and removes element from stmtList_.
238 // Commit the transaction
239 if( fsqlConn_
->commit() != OK
)
243 if( fsqlConn_
->disconnect() != OK
)
247 // Change the state of Dbc
250 return( SQL_SUCCESS
);
253 SQLRETURN
CSqlOdbcDbc::SQLEndTran(
254 SQLSMALLINT completionType
) // IN
262 if( chkStateForSQLEndTran() != SQL_SUCCESS
)
265 // Stop if no transaction is started.
267 return( SQL_SUCCESS
);
269 // Close cursors of all the statements
270 std::vector
<CSqlOdbcStmt
*>::iterator iter
;
271 iter
= stmtList_
.begin();
272 while( iter
!= stmtList_
.end() )
274 (*iter
)->SQLFreeHandle( SQL_CLOSE
);
278 // Finish transaction
279 switch( completionType
)
283 if( fsqlConn_
->commit() != OK
)
286 if( fsqlConn_
->beginTrans( curIsolationLevel_
) != OK
)
292 if( fsqlConn_
->rollback() != OK
)
295 rc
= fsqlConn_
->beginTrans( curIsolationLevel_
);
298 default: err_
.set( ERROR_OPTRANGE
);
303 if( stmtList_
.size() == 0 )
308 return( SQL_SUCCESS
);
311 SQLRETURN
SQLSetConnectOption(
312 SQLHDBC ConnectionHandle
,
316 printf("PRABA::I AM CALLED in setconnect otpion\n");
317 return( SQLSetConnectAttr( ConnectionHandle
, Option
, (SQLPOINTER
) Value
, 0) );
320 SQLRETURN
SQLSetConnectAttr(
321 SQLHDBC ConnectionHandle
,
322 SQLINTEGER Attribute
,
324 SQLINTEGER StringLength
)
326 printf("PRABA::I AM CALLEDn conn attr\n");
328 if( isValidHandle( ConnectionHandle
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
329 return( SQL_INVALID_HANDLE
);
331 return( ((CSqlOdbcDbc
*)ConnectionHandle
)->SQLSetConnectAttr( Attribute
, Value
, StringLength
) );
334 SQLRETURN
CSqlOdbcDbc::SQLSetConnectAttr(
335 SQLINTEGER attribute
,
337 SQLINTEGER stringLength
)
344 case SQL_ATTR_ACCESS_MODE
:
346 if( (SQLUINTEGER
) value
== SQL_MODE_READ_ONLY
)
347 accessMode_
= ACCESSMODE_READ_ONLY
;
348 else if( (SQLUINTEGER
) value
== SQL_MODE_READ_WRITE
)
349 accessMode_
= ACCESSMODE_READ_WRITE
;
354 case SQL_DEFAULT_TXN_ISOLATION
:
355 case SQL_ATTR_TXN_ISOLATION
:
357 if( (SQLUINTEGER
) value
== SQL_TXN_READ_UNCOMMITTED
)
358 isolationLevel_
= READ_UNCOMMITTED
;
359 else if( (SQLUINTEGER
) value
== SQL_TXN_READ_COMMITTED
)
360 isolationLevel_
= READ_COMMITTED
;
361 else if( (SQLUINTEGER
) value
== SQL_TXN_REPEATABLE_READ
)
362 isolationLevel_
= READ_REPEATABLE
;
363 // else if( (SQLUINTEGER) value == SQL_TXN_SERIALIZABLE )
364 // isolationLevel_ = SERIALIZABLE;
369 case SQL_ATTR_AUTOCOMMIT
:
370 autoCommit_
= (SQLUINTEGER
) value
;
372 SQLEndTran( SQL_COMMIT
);
375 default: err_
.set( ERROR_OPTRANGE
);
379 return( SQL_SUCCESS
);
382 SQLRETURN
SQLGetConnectOption(
383 SQLHDBC ConnectionHandle
,
387 return( SQLGetConnectAttr( ConnectionHandle
, Option
, Value
, 0, 0) );
390 SQLRETURN
SQLGetConnectAttr(
391 SQLHDBC ConnectionHandle
,
392 SQLINTEGER Attribute
,
394 SQLINTEGER BufferLength
,
395 SQLINTEGER
*StringLength
)
398 if( isValidHandle( ConnectionHandle
, SQL_HANDLE_DBC
) != SQL_SUCCESS
)
399 return( SQL_INVALID_HANDLE
);
401 return( ((CSqlOdbcDbc
*)ConnectionHandle
)->SQLGetConnectAttr( Attribute
, Value
, BufferLength
, StringLength
) );
404 SQLRETURN
CSqlOdbcDbc::SQLGetConnectAttr(
405 SQLINTEGER attribute
,
407 SQLINTEGER bufferLength
,
408 SQLINTEGER
*stringLength
)
415 case SQL_ATTR_ACCESS_MODE
:
416 // Get ODBC Access Mode
417 if( accessMode_
== ACCESSMODE_READ_ONLY
)
418 *((SQLUINTEGER
*) value
) = SQL_MODE_READ_ONLY
;
419 else if( accessMode_
== ACCESSMODE_READ_WRITE
)
420 *((SQLUINTEGER
*) value
) = SQL_MODE_READ_WRITE
;
425 case SQL_DEFAULT_TXN_ISOLATION
:
426 case SQL_ATTR_TXN_ISOLATION
:
428 if( (SQLUINTEGER
) isolationLevel_
== READ_UNCOMMITTED
)
429 *((SQLUINTEGER
*) value
) = SQL_TXN_READ_UNCOMMITTED
;
430 else if( (SQLUINTEGER
) isolationLevel_
== READ_COMMITTED
)
431 *((SQLUINTEGER
*) value
) = SQL_TXN_READ_COMMITTED
;
432 else if( (SQLUINTEGER
) isolationLevel_
== READ_REPEATABLE
)
433 *((SQLUINTEGER
*) value
) = SQL_TXN_REPEATABLE_READ
;
434 // else if( (SQLUINTEGER) isolationLevel_ == SERIALIZABLE )
435 // *((SQLUINTEGER*) value) = SQL_TXN_SERIALIZABLE;
440 case SQL_ATTR_AUTOCOMMIT
:
441 *((SQLUINTEGER
*) value
) = autoCommit_
;
444 default: err_
.set( ERROR_OPTRANGE
);
448 return( SQL_SUCCESS
);