Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

CTBodbcConnect.cxx

Go to the documentation of this file.
00001 //
00002 // $Id: CTBodbcConnect.cxx,v 1.9 2000/02/29 12:50:10 mueller Exp $
00003 //
00004 /*----------------------------------------------------------------------------*/
00005 /* C Tool Box: Designed and implemented by:                                   */
00006 /*    Walter F.J. Mueller   Gesellschaft fuer Schwerionenforschung (GSI)      */
00007 /*                          Planckstrasse 1, D-64291 Darmstadt, Germany       */
00008 /*                  Email:  W.F.J.Mueller@gsi.de                              */
00009 /*                  WWW:    http://www-kp3.gsi.de/www/kp3/people/mueller.html */
00010 /*------------------------------------------+---------------------------------*/
00011 
00012 #include "CTB.hxx"
00013 #include "CTBsystem.hxx"
00014 
00015 #include "CTBodbc.hxx"
00016 #include "CTBodbcConnect.hxx"
00017 
00023 //------------------------------------------+-----------------------------------
00025 
00026 CTBodbcConnect::CTBodbcConnect()
00027   : m_hdbc(0),
00028     mb_connected(false),
00029     mb_trace(false)
00030 {
00031 }
00032 
00033 //------------------------------------------+-----------------------------------
00035 
00036 CTBodbcConnect::~CTBodbcConnect()
00037 {
00038   Disconnect();                             // just disconnect
00039 }
00040 
00041 //------------------------------------------+-----------------------------------
00043 
00044 bool CTBodbcConnect::Connect(const char* c_dcs)
00045 {
00046   RETCODE   i_rc;
00047   UCHAR     c_buf[257];
00048   SWORD     i_buflen;
00049   float     f_tretry =  0.;                 // integrated retry time
00050   float     f_twait  = 10.;                 // time to wait for retry
00051 
00052   if (!m_henv) {                            // if no ODBC environment
00053     i_rc = SQLAllocEnv (&m_henv);
00054     TraceODBCCall("CTBodbcConnect::Connect->SQLAllocEnv",i_rc);
00055     if (i_rc != SQL_SUCCESS) {
00056       PrintError(cerr);
00057       return false;
00058     }
00059   }
00060 
00061   if (!m_hdbc) {                            // if no connection environment
00062     i_rc = SQLAllocConnect (m_henv, &m_hdbc);
00063     TraceODBCCall("CTBodbcConnect::Connect->SQLAllocConnect",i_rc);
00064     if (i_rc != SQL_SUCCESS) {
00065       PrintError(cerr);
00066       return false;
00067     }
00068   }
00069 
00070   if (mb_connected) {                       // already connected
00071     return false;                           // ??? or disconnect here ???
00072   }
00073 
00074   for (bool b_retry = true; b_retry;) {
00075     i_rc = SQLDriverConnect(m_hdbc, 0,      // is SQLConnect sufficient ???
00076                             (UCHAR *) c_dcs,SQL_NTS, 
00077                             (UCHAR *) c_buf,sizeof (c_buf),&i_buflen, 
00078                             SQL_DRIVER_COMPLETE);
00079     TraceODBCCall("CTBodbcConnect::Connect->SQLDriverConnect",i_rc);
00080 
00081     if (i_rc != SQL_SUCCESS && i_rc != SQL_SUCCESS_WITH_INFO) {
00082       PrintError(cerr);
00083       if (f_tretry < 3600.) {
00084         cerr << "CTBodbcConnect-I Retry in " 
00085              << (int) f_twait << "seconds" << endl;
00086         CTBsystem::Sleep(f_twait);
00087         f_tretry += f_twait;
00088         if (f_twait < 320.) f_twait *= 2.;
00089       } else {
00090         return false;
00091       }
00092     } else {
00093       b_retry = false;
00094     }
00095   }
00096 
00097   mb_connected = true;
00098   return true;
00099 }
00100 
00101 //------------------------------------------+-----------------------------------
00103 
00104 bool CTBodbcConnect::Disconnect()
00105 {
00106   RETCODE   i_rc;
00107 
00108   if (!mb_connected) return false;
00109   
00110   i_rc = SQLDisconnect(m_hdbc);
00111   TraceODBCCall("CTBodbcConnect::~CTBodbcConnect->SQLDisconnect",i_rc);
00112   if (m_hdbc) {
00113     i_rc = SQLFreeConnect(m_hdbc);
00114     TraceODBCCall("CTBodbcConnect::~CTBodbcConnect->SQLFreeConnect",i_rc);
00115   }
00116   mb_connected = false;
00117   return true;
00118 }
00119 
00120 //------------------------------------------+-----------------------------------
00122 
00123 bool CTBodbcConnect::AutoCommit(bool b_val)
00124 {
00125   RETCODE i_rc;
00126   
00127   i_rc = SQLSetConnectOption(m_hdbc,SQL_AUTOCOMMIT,
00128                              b_val ? SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF);
00129   TraceODBCCall("CTBodbcConnect::AutoCommit->SQLDSetConnectOption",i_rc);
00130   if (i_rc != SQL_SUCCESS && i_rc != SQL_SUCCESS_WITH_INFO) {
00131     PrintError(cerr);
00132     return false;
00133   }
00134 
00135   return true;
00136 }
00137 
00138 //------------------------------------------+-----------------------------------
00140 
00141 bool CTBodbcConnect::Commit()
00142 {
00143   RETCODE i_rc;
00144   
00145   i_rc = SQLTransact(m_henv,m_hdbc,SQL_COMMIT);
00146   TraceODBCCall("CTBodbcConnect::Commit->SQLTransact",i_rc);
00147   if (i_rc != SQL_SUCCESS && i_rc != SQL_SUCCESS_WITH_INFO) {
00148     PrintError(cerr);
00149     return false;
00150   }
00151 
00152   return true;
00153 }
00154 
00155 //------------------------------------------+-----------------------------------
00157 
00158 bool CTBodbcConnect::Rollback()
00159 {
00160   RETCODE i_rc;
00161   
00162   i_rc = SQLTransact(m_henv,m_hdbc,SQL_ROLLBACK);
00163   TraceODBCCall("CTBodbcConnect::Commit->SQLTransact",i_rc);
00164   if (i_rc != SQL_SUCCESS && i_rc != SQL_SUCCESS_WITH_INFO) {
00165     PrintError(cerr);
00166     return false;
00167   }
00168 
00169   return true;
00170 }
00171 
00172 //------------------------------------------+-----------------------------------
00174 
00175 bool CTBodbcConnect::Trace(bool b_trace)
00176 {
00177   bool b_old = mb_trace;
00178   mb_trace = b_trace;
00179   return b_old;
00180 }
00181 
00182 //------------------------------------------+-----------------------------------
00184 
00185 void CTBodbcConnect::PrintError(ostream& os)
00186 {
00187   unsigned char  c_state[16];
00188   unsigned char  c_msg[SQL_MAX_MESSAGE_LENGTH];
00189   
00190   while (SQLError(m_henv,m_hdbc,SQL_NULL_HSTMT,c_state,0,
00191                   c_msg,SQL_MAX_MESSAGE_LENGTH-1,0) == SQL_SUCCESS) {
00192     os << c_msg << " SQLSTATE " << c_state << endl;
00193   }
00194   while (SQLError(m_henv,SQL_NULL_HDBC,SQL_NULL_HSTMT,c_state,0,
00195                   c_msg,SQL_MAX_MESSAGE_LENGTH-1,0) == SQL_SUCCESS) {
00196     os << c_msg << " SQLSTATE " << c_state << endl;
00197   }
00198   return;
00199 }
00200 
00201 //------------------------------------------+-----------------------------------
00203 
00204 void CTBodbcConnect::ToStream(ostream& os) const
00205 {
00206   os << "DBMS Product Information\n";
00207   PrintInfo(SQL_DBMS_NAME,"SQL_DBMS_NAME:",os);
00208   PrintInfo(SQL_DBMS_VER,"SQL_DBMS_VER:",os);
00209   PrintInfo(SQL_DATABASE_NAME,"SQL_DATABASE_NAME:",os);
00210 
00211   //  PrintInfo(SQL_ACTIVE_CONNECTIONS,"SQL_ACTIVE_CONNECTIONS:",os);
00212   //  PrintInfo(SQL_ACTIVE_STATEMENTS,"SQL_ACTIVE_STATEMENTS:",os);
00213   PrintInfo(SQL_DATA_SOURCE_NAME,"SQL_DATA_SOURCE_NAME:",os);
00214   //  PrintInfo(SQL_DRIVER_HDBC,"SQL_DRIVER_HDBC:",os);
00215   //  PrintInfo(SQL_DRIVER_HENV,"SQL_DRIVER_HENV:",os);
00216   //  PrintInfo(SQL_DRIVER_HLIB,"SQL_DRIVER_HLIB:",os);
00217   //  PrintInfo(SQL_DRIVER_HSTMT,"SQL_DRIVER_HSTMT:",os);
00218   PrintInfo(SQL_DRIVER_NAME,"SQL_DRIVER_NAME:",os);
00219   PrintInfo(SQL_DRIVER_ODBC_VER,"SQL_DRIVER_ODBC_VER:",os);
00220   PrintInfo(SQL_DRIVER_VER,"SQL_DRIVER_VER:",os);
00221   //  PrintInfo(SQL_FETCH_DIRECTION,"SQL_FETCH_DIRECTION:",os);
00222   //  PrintInfo(SQL_FILE_USAGE,"SQL_FILE_USAGE:",os);
00223   //  PrintInfo(SQL_GETDATA_EXTENSIONS,"SQL_GETDATA_EXTENSIONS:",os);
00224   //  PrintInfo(SQL_LOCK_TYPES,"SQL_LOCK_TYPES:",os);
00225   //  PrintInfo(SQL_ODBC_API_CONFORMANCE,"SQL_ODBC_API_CONFORMANCE:",os);
00226   //  PrintInfo(SQL_ODBC_SAG_CLI_CONFORMANCE,"SQL_ODBC_SAG_CLI_CONFORMANCE:",os);
00227   PrintInfo(SQL_ODBC_VER,"SQL_ODBC_VER:",os);
00228   //  PrintInfo(SQL_POS_OPERATIONS,"SQL_POS_OPERATIONS:",os);
00229   PrintInfo(SQL_ROW_UPDATES,"SQL_ROW_UPDATES:",os);
00230   PrintInfo(SQL_SEARCH_PATTERN_ESCAPE,"SQL_SEARCH_PATTERN_ESCAPE:",os);
00231   PrintInfo(SQL_SERVER_NAME,"SQL_SERVER_NAME:",os);
00232 
00233   PrintInfo(SQL_ACCESSIBLE_PROCEDURES,"SQL_ACCESSIBLE_PROCEDURES:",os);
00234   PrintInfo(SQL_ACCESSIBLE_TABLES,"SQL_ACCESSIBLE_TABLES:",os);
00235   //  PrintInfo(SQL_BOOKMARK_PERSISTENCE,"SQL_BOOKMARK_PERSISTENCE:",os);
00236   //  PrintInfo(SQL_CONCAT_NULL_BEHAVIOR,"SQL_CONCAT_NULL_BEHAVIOR:",os);
00237   //  PrintInfo(SQL_CURSOR_COMMIT_BEHAVIOR,"SQL_CURSOR_COMMIT_BEHAVIOR:",os);
00238   //  PrintInfo(SQL_CURSOR_ROLLBACK_BEHAVIOR,"SQL_CURSOR_ROLLBACK_BEHAVIOR:",os);
00239   PrintInfo(SQL_DATA_SOURCE_READ_ONLY,"SQL_DATA_SOURCE_READ_ONLY:",os);
00240   //  PrintInfo(SQL_DEFAULT_TXN_ISOLATION,"SQL_DEFAULT_TXN_ISOLATION:",os);
00241   PrintInfo(SQL_MULT_RESULT_SETS,"SQL_MULT_RESULT_SETS:",os);
00242   PrintInfo(SQL_MULTIPLE_ACTIVE_TXN,"SQL_MULTIPLE_ACTIVE_TXN:",os);
00243   PrintInfo(SQL_NEED_LONG_DATA_LEN,"SQL_NEED_LONG_DATA_LEN:",os);
00244   //  PrintInfo(SQL_NULL_COLLATION,"SQL_NULL_COLLATION:",os);
00245   PrintInfo(SQL_OWNER_TERM,"SQL_OWNER_TERM:",os);
00246   PrintInfo(SQL_PROCEDURE_TERM,"SQL_PROCEDURE_TERM:",os);
00247   PrintInfo(SQL_QUALIFIER_TERM,"SQL_QUALIFIER_TERM:",os);
00248   //  PrintInfo(SQL_SCROLL_CONCURRENCY,"SQL_SCROLL_CONCURRENCY:",os);
00249   //  PrintInfo(SQL_SCROLL_OPTIONS,"SQL_SCROLL_OPTIONS:",os);
00250   //  PrintInfo(SQL_STATIC_SENSITIVITY,"SQL_STATIC_SENSITIVITY:",os);
00251   PrintInfo(SQL_TABLE_TERM,"SQL_TABLE_TERM:",os);
00252   //  PrintInfo(SQL_TXN_CAPABLE,"SQL_TXN_CAPABLE:",os);
00253   //  PrintInfo(SQL_TXN_ISOLATION_OPTION,"SQL_TXN_ISOLATION_OPTION:",os);
00254   PrintInfo(SQL_USER_NAME,"SQL_USER_NAME:",os);
00255 
00256   //  PrintInfo(SQL_ALTER_TABLE,"SQL_ALTER_TABLE:",os);
00257   PrintInfo(SQL_COLUMN_ALIAS,"SQL_COLUMN_ALIAS:",os);
00258   //  PrintInfo(SQL_CORRELATION_NAME,"SQL_CORRELATION_NAME:",os);
00259   PrintInfo(SQL_EXPRESSIONS_IN_ORDERBY,"SQL_EXPRESSIONS_IN_ORDERBY:",os);
00260   //  PrintInfo(SQL_GROUP_BY,"SQL_GROUP_BY:",os);
00261   //  PrintInfo(SQL_IDENTIFIER_CASE,"SQL_IDENTIFIER_CASE:",os);
00262   //  PrintInfo(SQL_IDENTIFIER_QUOTE_CHAR,"SQL_IDENTIFIER_QUOTE_CHAR:",os);
00263   //  PrintInfo(SQL_KEYWORDS,"SQL_KEYWORDS:",os);
00264   PrintInfo(SQL_LIKE_ESCAPE_CLAUSE,"SQL_LIKE_ESCAPE_CLAUSE:",os);
00265   //  PrintInfo(SQL_NON_NULLABLE_COLUMNS,"SQL_NON_NULLABLE_COLUMNS:",os);
00266   //  PrintInfo(SQL_ODBC_SQL_CONFORMANCE,"SQL_ODBC_SQL_CONFORMANCE:",os);
00267   //  PrintInfo(SQL_ODBC_SQL_OPT_IEF,"SQL_ODBC_SQL_OPT_IEF:",os);
00268   PrintInfo(SQL_ORDER_BY_COLUMNS_IN_SELECT,"SQL_ORDER_BY_COLUMNS_IN_SELECT:",os);
00269   PrintInfo(SQL_OUTER_JOINS,"SQL_OUTER_JOINS:",os);
00270   //  PrintInfo(SQL_OWNER_USAGE,"SQL_OWNER_USAGE:",os);
00271   //  PrintInfo(SQL_POSITIONED_STATEMENTS,"SQL_POSITIONED_STATEMENTS:",os);
00272   PrintInfo(SQL_PROCEDURES,"SQL_PROCEDURES:",os);
00273   //  PrintInfo(SQL_QUALIFIER_LOCATION,"SQL_QUALIFIER_LOCATION:",os);
00274   PrintInfo(SQL_QUALIFIER_NAME_SEPARATOR,"SQL_QUALIFIER_NAME_SEPARATOR:",os);
00275   //  PrintInfo(SQL_QUALIFIER_USAGE,"SQL_QUALIFIER_USAGE:",os);
00276   //  PrintInfo(SQL_QUOTED_IDENTIFIER_CASE,"SQL_QUOTED_IDENTIFIER_CASE:",os);
00277   PrintInfo(SQL_SPECIAL_CHARACTERS,"SQL_SPECIAL_CHARACTERS:",os);
00278   //  PrintInfo(SQL_SUBQUERIES,"SQL_SUBQUERIES:",os);
00279   //  PrintInfo(SQL_UNION,"SQL_UNION:",os);
00280 
00281   //  PrintInfo(SQL_MAX_BINARY_LITERAL_LEN,"SQL_MAX_BINARY_LITERAL_LEN:",os);
00282   //  PrintInfo(SQL_MAX_CHAR_LITERAL_LEN,"SQL_MAX_CHAR_LITERAL_LEN:",os);
00283   //  PrintInfo(SQL_MAX_COLUMN_NAME_LEN,"SQL_MAX_COLUMN_NAME_LEN:",os);
00284   //  PrintInfo(SQL_MAX_COLUMNS_IN_GROUP_BY,"SQL_MAX_COLUMNS_IN_GROUP_BY:",os);
00285   //  PrintInfo(SQL_MAX_COLUMNS_IN_ORDER_BY,"SQL_MAX_COLUMNS_IN_ORDER_BY:",os);
00286   //  PrintInfo(SQL_MAX_COLUMNS_IN_INDEX,"SQL_MAX_COLUMNS_IN_INDEX:",os);
00287   //  PrintInfo(SQL_MAX_COLUMNS_IN_SELECT,"SQL_MAX_COLUMNS_IN_SELECT:",os);
00288   //  PrintInfo(SQL_MAX_COLUMNS_IN_TABLE,"SQL_MAX_COLUMNS_IN_TABLE:",os);
00289   //  PrintInfo(SQL_MAX_CURSOR_NAME_LEN,"SQL_MAX_CURSOR_NAME_LEN:",os);
00290   //  PrintInfo(SQL_MAX_INDEX_SIZE,"SQL_MAX_INDEX_SIZE:",os);
00291   //  PrintInfo(SQL_MAX_OWNER_NAME_LEN,"SQL_MAX_OWNER_NAME_LEN:",os);
00292   // PrintInfo(SQL_MAX_PROCEDURE_NAME_LEN,"SQL_MAX_PROCEDURE_NAME_LEN:",os);
00293   //  PrintInfo(SQL_MAX_QUALIFIER_NAME_LEN,"SQL_MAX_QUALIFIER_NAME_LEN:",os);
00294   //  PrintInfo(SQL_MAX_ROW_SIZE,"SQL_MAX_ROW_SIZE:",os);
00295   //  PrintInfo(SQL_MAX_ROW_SIZE_INCLUDES_LONG,"SQL_MAX_ROW_SIZE_INCLUDES_LONG:",os);
00296   //  PrintInfo(SQL_MAX_STATEMENT_LEN,"SQL_MAX_STATEMENT_LEN:",os);
00297   //  PrintInfo(SQL_MAX_TABLE_NAME_LEN,"SQL_MAX_TABLE_NAME_LEN:",os);
00298   //  PrintInfo(SQL_MAX_TABLES_IN_SELECT,"SQL_MAX_TABLES_IN_SELECT:",os);
00299   //  PrintInfo(SQL_MAX_USER_NAME_LEN,"SQL_MAX_USER_NAME_LEN:",os);
00300   //  PrintInfo(SQL_CONVERT_FUNCTIONS,"SQL_CONVERT_FUNCTIONS:",os);
00301 
00302   //  PrintInfo(SQL_NUMERIC_FUNCTIONS,"SQL_NUMERIC_FUNCTIONS:",os);
00303   //  PrintInfo(SQL_STRING_FUNCTIONS,"SQL_STRING_FUNCTIONS:",os);
00304   //  PrintInfo(SQL_SYSTEM_FUNCTIONS,"SQL_SYSTEM_FUNCTIONS:",os);
00305   //  PrintInfo(SQL_TIMEDATE_ADD_INTERVALS,"SQL_TIMEDATE_ADD_INTERVALS:",os);
00306   //  PrintInfo(SQL_TIMEDATE_DIFF_INTERVALS,"SQL_TIMEDATE_DIFF_INTERVALS:",os);
00307   //  PrintInfo(SQL_TIMEDATE_FUNCTIONS,"SQL_TIMEDATE_FUNCTIONS:",os);
00308 
00309   //  PrintInfo(SQL_CONVERT_BIGINT,"SQL_CONVERT_BIGINT:",os);
00310   //  PrintInfo(SQL_CONVERT_BINARY,"SQL_CONVERT_BINARY:",os);
00311   //  PrintInfo(SQL_CONVERT_BIT,"SQL_CONVERT_BIT:",os);
00312   //  PrintInfo(SQL_CONVERT_CHAR,"SQL_CONVERT_CHAR:",os);
00313   //  PrintInfo(SQL_CONVERT_DATE,"SQL_CONVERT_DATE:",os);
00314   //  PrintInfo(SQL_CONVERT_DECIMAL,"SQL_CONVERT_DECIMAL:",os);
00315   //  PrintInfo(SQL_CONVERT_DOUBLE,"SQL_CONVERT_DOUBLE:",os);
00316   //  PrintInfo(SQL_CONVERT_FLOAT,"SQL_CONVERT_FLOAT:",os);
00317   //  PrintInfo(SQL_CONVERT_INTEGER,"SQL_CONVERT_INTEGER:",os);
00318   //  PrintInfo(SQL_CONVERT_LONGVARBINARY,"SQL_CONVERT_LONGVARBINARY:",os);
00319   //  PrintInfo(SQL_CONVERT_LONGVARCHAR,"SQL_CONVERT_LONGVARCHAR:",os);
00320   //  PrintInfo(SQL_CONVERT_NUMERIC,"SQL_CONVERT_NUMERIC:",os);
00321   //  PrintInfo(SQL_CONVERT_REAL,"SQL_CONVERT_REAL:",os);
00322   //  PrintInfo(SQL_CONVERT_SMALLINT,"SQL_CONVERT_SMALLINT:",os);
00323   //  PrintInfo(SQL_CONVERT_TIME,"SQL_CONVERT_TIME:",os);
00324   //  PrintInfo(SQL_CONVERT_TIMESTAMP,"SQL_CONVERT_TIMESTAMP:",os);
00325   //  PrintInfo(SQL_CONVERT_TINYINT,"SQL_CONVERT_TINYINT:",os);
00326   //  PrintInfo(SQL_CONVERT_VARBINARY,"SQL_CONVERT_VARBINARY:",os);
00327   //  PrintInfo(SQL_CONVERT_VARCHAR,"SQL_CONVERT_VARCHAR:",os);
00328 
00329   return;
00330 }
00331 
00332 //------------------------------------------+-----------------------------------
00334 
00339 void CTBodbcConnect::TraceODBCCall(const char* c_text, RETCODE i_rc)
00340 {
00341   if (!mb_trace) return;
00342 
00343   cout << c_text << ": ";
00344   switch(i_rc){
00345   case SQL_INVALID_HANDLE:
00346     cout << "SQL_INVALID_HANDLE";
00347     break;
00348   case SQL_ERROR:
00349     cout << "SQL_ERROR";
00350     break;
00351   case SQL_SUCCESS:
00352     cout << "SQL_SUCCESS";
00353     break;
00354   case SQL_SUCCESS_WITH_INFO:
00355     cout << "SQL_SUCCESS_WITH_INFO";
00356     break;
00357   case SQL_NO_DATA_FOUND:
00358     cout << "SQL_NO_DATA_FOUND";
00359     break;
00360   default:
00361     cout << i_rc;
00362     break;
00363   }
00364   cout << endl;
00365   return;
00366 }
00367 
00368 //------------------------------------------+-----------------------------------
00370 
00371 void CTBodbcConnect::PrintInfo(UWORD i_infotype, const char* c_prefix,
00372                                ostream& os) const
00373 {
00374   RETCODE   i_rc;
00375   char      c_buf[256];
00376   SWORD     i_rsize;
00377 
00378   if (mb_connected) {
00379     i_rc = SQLGetInfo(m_hdbc,i_infotype,c_buf,256,&i_rsize);
00380     os << "  " << c_prefix << " " << c_buf << "\n";
00381   }
00382   return;
00383 }
00384 
00385 //------------------------------------------+-----------------------------------
00386 HENV CTBodbcConnect::m_henv;                // will autoinit to 0
00387 //------------------------------------------+-----------------------------------
00388 
00389 #if (defined(CTB__OutLine) || defined(CTBodbcConnect__OutLine))
00390 #define inline
00391 #include "CTBodbcConnect.icc"
00392 #undef  inline
00393 #endif

Generated at Fri Oct 24 18:16:03 2003 for CTBodbc by doxygen1.2.9-20010812 written by Dimitri van Heesch, © 1997-2001