corrected to accept hostname and connect to network
[csql.git] / src / odbc / odbcDbc.cxx
blob92f73b9ea736965807d742058dd8220c30e06b54
1 /* Class CSqlOdbcDbc
2 Description: Connection Handle manager.
4 ODBC API's:
5 CSqlOdbcDbc::SQLAllocDbc();
6 CSqlOdbcDbc::SQLFreeDbc();
7 CSqlOdbcDbc::SQLConnect();
8 */
10 #include "odbcCommon.h"
12 // Constructor
13 CSqlOdbcDbc::CSqlOdbcDbc( void ) :
14 handleType_( SQL_HANDLE_DBC ),
15 parentEnv_( 0 ),
16 state_( C1 ),
17 err_( SQL_HANDLE_DBC ),
18 mode_ (1),
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 );
48 return( SQL_ERROR );
51 // Allocate Connection object.
52 *outputHandle = (SQLHANDLE*) new CSqlOdbcDbc;
53 if( *outputHandle == NULL )
55 globalError.set( ERROR_MEMALLOC );
56 globalError.printStr( SQL_OV_ODBC3 );
57 return( SQL_ERROR );
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;
80 // Validate handle
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 )
86 return( SQL_ERROR );
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 );
96 break;
98 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);
120 // Validate handle
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,
132 SQLCHAR *ServerName,
133 SQLSMALLINT NameLength1,
134 SQLCHAR *UserName,
135 SQLSMALLINT NameLength2,
136 SQLCHAR *Authentication,
137 SQLSMALLINT NameLength3)
139 // Validate handle
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
148 SQLCHAR *serverName,
149 SQLSMALLINT len1,
150 SQLCHAR *user,
151 SQLSMALLINT len2,
152 SQLCHAR *pass,
153 SQLSMALLINT len3)
155 int rc;
156 char *hostName,*portNo;
157 // Start with NO_ERR
158 err_.set( NO_ERR );
160 // Can we proceed ?
161 if( chkStateForSQLConnect() != SQL_SUCCESS )
162 return( SQL_ERROR );
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 );
168 return( SQL_ERROR );
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);
178 mode_ = 2;
179 }else if (strcasecmp((char*)serverName, "adapter") == 0){
180 fsqlConn_ = SqlFactory::createConnection(CSqlAdapter);
181 mode_ = 3;
182 }else{
183 fsqlConn_ = SqlFactory::createConnection(CSql);
184 mode_ = 1;
187 rc = fsqlConn_->connect( (char*) user, (char*) pass );
188 if( rc != OK )
190 err_.set( ERROR_CONNREJCTD);
191 return( SQL_ERROR );
193 rc = fsqlConn_->beginTrans( isolationLevel_ );
194 if( rc != OK )
196 err_.set( ERROR_INVTRANSTATE );
197 return( SQL_ERROR );
199 curAccessMode_ = accessMode_;
200 curIsolationLevel_ = isolationLevel_;
202 // Update Dbc state
203 state_ = C4;
205 return( SQL_SUCCESS );
208 SQLRETURN SQLDisconnect(
209 SQLHDBC ConnectionHandle) // IN
211 // Validate Handle
212 if( isValidHandle( ConnectionHandle, SQL_HANDLE_DBC ) != SQL_SUCCESS )
213 return( SQL_INVALID_HANDLE );
214 SQLRETURN ret = ( ((CSqlOdbcDbc*) ConnectionHandle)->SQLDisconnect() );
215 return ret;
218 SQLRETURN CSqlOdbcDbc::SQLDisconnect( void )
220 SQLRETURN rc;
222 // Start with NO_ERR
223 err_.set( NO_ERR );
225 // Can we proceed ?
226 if( chkStateForSQLDisconnect() != SQL_SUCCESS )
227 return( SQL_ERROR );
229 // Free all stmts
230 while( stmtList_.size() != 0 )
232 rc = CSqlOdbcStmt::SQLFreeHandle( stmtList_[0] );
233 // This free's the stmt and removes element from stmtList_.
234 if( rc != OK )
235 return( SQL_ERROR );
238 // Commit the transaction
239 if( fsqlConn_->commit() != OK )
240 return( SQL_ERROR );
242 // Disconnect
243 if( fsqlConn_->disconnect() != OK )
244 return( SQL_ERROR );
246 delete fsqlConn_;
247 fsqlConn_ = NULL;
248 // Change the state of Dbc
249 state_ = C2;
251 return( SQL_SUCCESS );
254 SQLRETURN CSqlOdbcDbc::SQLEndTran(
255 SQLSMALLINT completionType) // IN
257 SQLRETURN rc;
259 // Start with NO_ERR
260 err_.set( NO_ERR );
262 // Can we proceed ?
263 if( chkStateForSQLEndTran() != SQL_SUCCESS )
264 return( SQL_ERROR );
266 // Stop if no transaction is started.
267 if( state_ != C6 )
268 return( SQL_SUCCESS );
270 // Close cursors of all the statements
271 std::vector<CSqlOdbcStmt*>::iterator iter;
272 iter = stmtList_.begin();
273 while( iter != stmtList_.end() )
275 (*iter)->SQLFreeHandle( SQL_CLOSE );
276 iter++;
279 // Finish transaction
280 switch( completionType )
282 case SQL_COMMIT:
284 if( fsqlConn_->commit() != OK )
285 return( SQL_ERROR );
287 if( fsqlConn_->beginTrans( curIsolationLevel_ ) != OK )
288 return( SQL_ERROR );
290 break;
292 case SQL_ROLLBACK:
293 if( fsqlConn_->rollback() != OK )
294 return( SQL_ERROR );
296 rc = fsqlConn_->beginTrans( curIsolationLevel_ );
297 break;
299 default: err_.set( ERROR_OPTRANGE );
300 return( SQL_ERROR );
303 // Had statements ?
304 if( stmtList_.size() == 0 )
305 state_ = C4;
306 else
307 state_ = C5;
309 return( SQL_SUCCESS );
312 SQLRETURN SQLSetConnectOption(
313 SQLHDBC ConnectionHandle,
314 SQLUSMALLINT Option,
315 SQLUINTEGER Value)
317 return( SQLSetConnectAttr( ConnectionHandle, Option, (SQLPOINTER) Value, 0) );
320 SQLRETURN SQLSetConnectAttr(
321 SQLHDBC ConnectionHandle,
322 SQLINTEGER Attribute,
323 SQLPOINTER Value,
324 SQLINTEGER StringLength)
326 // Validate handle
327 if( isValidHandle( ConnectionHandle, SQL_HANDLE_DBC ) != SQL_SUCCESS )
328 return( SQL_INVALID_HANDLE );
330 return( ((CSqlOdbcDbc*)ConnectionHandle)->SQLSetConnectAttr( Attribute, Value, StringLength ) );
333 SQLRETURN CSqlOdbcDbc::SQLSetConnectAttr(
334 SQLINTEGER attribute,
335 SQLPOINTER value,
336 SQLINTEGER stringLength)
338 // Start with NO_ERR
339 err_.set( NO_ERR );
341 switch( attribute )
343 case SQL_ATTR_ACCESS_MODE:
344 // validate 'value'
345 if( (SQLUINTEGER) value == SQL_MODE_READ_ONLY )
346 accessMode_ = ACCESSMODE_READ_ONLY;
347 else if( (SQLUINTEGER) value == SQL_MODE_READ_WRITE )
348 accessMode_ = ACCESSMODE_READ_WRITE;
349 else
350 return( SQL_ERROR );
352 break;
353 case SQL_DEFAULT_TXN_ISOLATION:
354 case SQL_ATTR_TXN_ISOLATION:
355 // validate 'value'
356 if( (SQLUINTEGER) value == SQL_TXN_READ_UNCOMMITTED )
357 isolationLevel_ = READ_UNCOMMITTED;
358 else if( (SQLUINTEGER) value == SQL_TXN_READ_COMMITTED )
359 isolationLevel_ = READ_COMMITTED;
360 else if( (SQLUINTEGER) value == SQL_TXN_REPEATABLE_READ )
361 isolationLevel_ = READ_REPEATABLE;
362 // else if( (SQLUINTEGER) value == SQL_TXN_SERIALIZABLE )
363 // isolationLevel_ = SERIALIZABLE;
364 else
365 return( SQL_ERROR );
367 break;
368 case SQL_ATTR_AUTOCOMMIT:
369 autoCommit_ = (SQLUINTEGER) value;
370 if( state_ == C6 )
371 SQLEndTran( SQL_COMMIT );
372 break;
374 default: err_.set( ERROR_OPTRANGE );
375 return( SQL_ERROR );
378 return( SQL_SUCCESS );
381 SQLRETURN SQLGetConnectOption(
382 SQLHDBC ConnectionHandle,
383 SQLUSMALLINT Option,
384 SQLPOINTER Value)
386 return( SQLGetConnectAttr( ConnectionHandle, Option, Value, 0, 0) );
389 SQLRETURN SQLGetConnectAttr(
390 SQLHDBC ConnectionHandle,
391 SQLINTEGER Attribute,
392 SQLPOINTER Value,
393 SQLINTEGER BufferLength,
394 SQLINTEGER *StringLength)
396 // Validate handle
397 if( isValidHandle( ConnectionHandle, SQL_HANDLE_DBC ) != SQL_SUCCESS )
398 return( SQL_INVALID_HANDLE );
400 return( ((CSqlOdbcDbc*)ConnectionHandle)->SQLGetConnectAttr( Attribute, Value, BufferLength, StringLength ) );
403 SQLRETURN CSqlOdbcDbc::SQLGetConnectAttr(
404 SQLINTEGER attribute,
405 SQLPOINTER value,
406 SQLINTEGER bufferLength,
407 SQLINTEGER *stringLength)
409 // Start with NO_ERR
410 err_.set( NO_ERR );
412 switch( attribute )
414 case SQL_ATTR_ACCESS_MODE:
415 // Get ODBC Access Mode
416 if( accessMode_ == ACCESSMODE_READ_ONLY )
417 *((SQLUINTEGER*) value) = SQL_MODE_READ_ONLY;
418 else if( accessMode_ == ACCESSMODE_READ_WRITE )
419 *((SQLUINTEGER*) value) = SQL_MODE_READ_WRITE;
420 else
421 return( SQL_ERROR );
423 break;
424 case SQL_DEFAULT_TXN_ISOLATION:
425 case SQL_ATTR_TXN_ISOLATION:
426 // validate 'value'
427 if( (SQLUINTEGER) isolationLevel_ == READ_UNCOMMITTED )
428 *((SQLUINTEGER*) value) = SQL_TXN_READ_UNCOMMITTED;
429 else if( (SQLUINTEGER) isolationLevel_ == READ_COMMITTED )
430 *((SQLUINTEGER*) value) = SQL_TXN_READ_COMMITTED;
431 else if( (SQLUINTEGER) isolationLevel_ == READ_REPEATABLE )
432 *((SQLUINTEGER*) value) = SQL_TXN_REPEATABLE_READ;
433 // else if( (SQLUINTEGER) isolationLevel_ == SERIALIZABLE )
434 // *((SQLUINTEGER*) value) = SQL_TXN_SERIALIZABLE;
435 else
436 return( SQL_ERROR );
438 break;
439 case SQL_ATTR_AUTOCOMMIT:
440 *((SQLUINTEGER*) value) = autoCommit_;
441 break;
443 default: err_.set( ERROR_OPTRANGE );
444 return( SQL_ERROR );
447 return( SQL_SUCCESS );