]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/db.cpp
Give wxListBox a GetClassDefaultAttributes so wxCalendarCtrl (and
[wxWidgets.git] / src / common / db.cpp
index 49078ccb84c0b80c21da5975c918e9b7eb99f306..8403a4ca4232b533fb2f2e4af1f575cf2499e25e 100644 (file)
 // Notice:      This class library and its intellectual design are free of charge for use,
 //              modification, enhancement, debugging under the following conditions:
 //              1) These classes may only be used as part of the implementation of a
-//                 wxWindows-based application
-//              2) All enhancements and bug fixes are to be submitted back to the wxWindows
-//                 user groups free of all charges for use with the wxWindows library.
+//                 wxWidgets-based application
+//              2) All enhancements and bug fixes are to be submitted back to the wxWidgets
+//                 user groups free of all charges for use with the wxWidgets library.
 //              3) These classes may not be distributed as part of any other class library,
 //                 DLL, text (written or electronic), other than a complete distribution of
-//                 the wxWindows GUI development toolkit.
+//                 the wxWidgets GUI development toolkit.
 ///////////////////////////////////////////////////////////////////////////////
 
 /*
@@ -167,10 +167,13 @@ bool wxDbConnectInf::Initialize()
     Dsn[0] = 0;
     Uid[0] = 0;
     AuthStr[0] = 0;
+    ConnectionStr[0] = 0;
     Description.Empty();
     FileType.Empty();
     DefaultDir.Empty();
 
+    useConnectionStr = FALSE;
+
     return TRUE;
 }  // wxDbConnectInf::Initialize()
 
@@ -219,7 +222,7 @@ void wxDbConnectInf::SetDsn(const wxString &dsn)
 void wxDbConnectInf::SetUserID(const wxString &uid)
 {
     wxASSERT(uid.Length() < sizeof(Uid));
-    wxStrcpy(Uid,uid);
+    wxStrcpy(Uid, uid);
 }  // wxDbConnectInf::SetUserID()
 
 
@@ -227,9 +230,17 @@ void wxDbConnectInf::SetPassword(const wxString &password)
 {
     wxASSERT(password.Length() < sizeof(AuthStr));
 
-    wxStrcpy(AuthStr,password);
+    wxStrcpy(AuthStr, password);
 }  // wxDbConnectInf::SetPassword()
 
+void wxDbConnectInf::SetConnectionStr(const wxString &connectStr)
+{
+    wxASSERT(connectStr.Length() < sizeof(ConnectionStr));
+    
+    useConnectionStr = wxStrlen(connectStr) > 0;
+
+    wxStrcpy(ConnectionStr, connectStr);
+}  // wxDbConnectInf::SetConnectionStr()
 
 
 /********** wxDbColFor Constructor **********/
@@ -540,6 +551,7 @@ void wxDb::initialize()
     // Mark database as not open as of yet
     dbIsOpen = FALSE;
     dbIsCached = FALSE;
+    dbOpenedWithConnectionString = FALSE;
 }  // wxDb::initialize()
 
 
@@ -575,39 +587,8 @@ const wxChar *wxDb::convertUserID(const wxChar *userID, wxString &UserID)
 }  // wxDb::convertUserID()
 
 
-/********** wxDb::Open() **********/
-bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthStr, bool failOnDataTypeUnsupported)
+bool wxDb::open(bool failOnDataTypeUnsupported)
 {
-    wxASSERT(Dsn.Length());
-    dsn        = Dsn;
-    uid        = Uid;
-    authStr    = AuthStr;
-
-    RETCODE retcode;
-
-    if (!FwdOnlyCursors())
-    {
-        // Specify that the ODBC cursor library be used, if needed.  This must be
-        // specified before the connection is made.
-        retcode = SQLSetConnectOption(hdbc, SQL_ODBC_CURSORS, SQL_CUR_USE_IF_NEEDED);
-
-#ifdef DBDEBUG_CONSOLE
-        if (retcode == SQL_SUCCESS)
-            cout << wxT("SQLSetConnectOption(CURSOR_LIB) successful") << endl;
-        else
-            cout << wxT("SQLSetConnectOption(CURSOR_LIB) failed") << endl;
-#endif
-    }
-
-    // Connect to the data source
-    retcode = SQLConnect(hdbc, (SQLTCHAR FAR *) dsn.c_str(), SQL_NTS,
-                         (SQLTCHAR FAR *) uid.c_str(), SQL_NTS,
-                         (SQLTCHAR FAR *) authStr.c_str(), SQL_NTS);
-
-    if ((retcode != SQL_SUCCESS) &&
-        (retcode != SQL_SUCCESS_WITH_INFO))
-        return(DispAllErrors(henv, hdbc));
-
 /*
     If using Intersolv branded ODBC drivers, this is the place where you would substitute
     your branded driver license information
@@ -755,7 +736,6 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
     else
         typeInfBlob.FsqlType = SQL_LONGVARBINARY;
 
-//typeInfBlob.TypeName = "BLOB";
 
 #ifdef DBDEBUG_CONSOLE
     cout << wxT("VARCHAR DATA TYPE: ") << typeInfVarchar.TypeName << endl;
@@ -768,22 +748,64 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
 
     // Completed Successfully
     return(TRUE);
+}
 
-} // wxDb::Open()
+bool wxDb::Open(const wxString& inConnectStr, bool failOnDataTypeUnsupported)
+{
+    wxASSERT(inConnectStr.Length());
+    dsn        = wxT("");
+    uid        = wxT("");
+    authStr    = wxT("");
 
+    RETCODE retcode;
 
-bool wxDb::Open(wxDbConnectInf *dbConnectInf)
-{
-    return Open(dbConnectInf->GetDsn(), dbConnectInf->GetUserID(),
-                dbConnectInf->GetPassword());
-}  // wxDb::Open()
+    if (!FwdOnlyCursors())
+    {
+        // Specify that the ODBC cursor library be used, if needed.  This must be
+        // specified before the connection is made.
+        retcode = SQLSetConnectOption(hdbc, SQL_ODBC_CURSORS, SQL_CUR_USE_IF_NEEDED);
 
+#ifdef DBDEBUG_CONSOLE
+        if (retcode == SQL_SUCCESS)
+            cout << wxT("SQLSetConnectOption(CURSOR_LIB) successful") << endl;
+        else
+            cout << wxT("SQLSetConnectOption(CURSOR_LIB) failed") << endl;
+#else
+        wxUnusedVar(retcode);
+#endif
+    }
 
-bool wxDb::Open(wxDb *copyDb)
+    // Connect to the data source
+    SQLTCHAR outConnectBuffer[SQL_MAX_CONNECTSTR_LEN+1];  // MS recommends at least 1k buffer
+    short outConnectBufferLen;
+
+    inConnectionStr = inConnectStr;
+
+    retcode = SQLDriverConnect(hdbc, NULL, (SQLTCHAR FAR *)inConnectionStr.c_str(),
+                        inConnectionStr.Length(), (SQLTCHAR FAR *)outConnectBuffer,
+                        sizeof(outConnectBuffer), &outConnectBufferLen, SQL_DRIVER_COMPLETE );
+
+    if ((retcode != SQL_SUCCESS) &&
+        (retcode != SQL_SUCCESS_WITH_INFO))
+        return(DispAllErrors(henv, hdbc));
+
+    outConnectBuffer[outConnectBufferLen] = 0;
+    outConnectionStr = outConnectBuffer;
+    dbOpenedWithConnectionString = TRUE;
+
+    return open(failOnDataTypeUnsupported);
+}
+
+/********** wxDb::Open() **********/
+bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthStr, bool failOnDataTypeUnsupported)
 {
-    dsn        = copyDb->GetDatasourceName();
-    uid        = copyDb->GetUsername();
-    authStr    = copyDb->GetPassword();
+    wxASSERT(Dsn.Length());
+    dsn        = Dsn;
+    uid        = Uid;
+    authStr    = AuthStr;
+
+    inConnectionStr = wxT("");
+    outConnectionStr = wxT("");
 
     RETCODE retcode;
 
@@ -798,6 +820,8 @@ bool wxDb::Open(wxDb *copyDb)
             cout << wxT("SQLSetConnectOption(CURSOR_LIB) successful") << endl;
         else
             cout << wxT("SQLSetConnectOption(CURSOR_LIB) failed") << endl;
+#else
+        wxUnusedVar( retcode );
 #endif
     }
 
@@ -806,7 +830,84 @@ bool wxDb::Open(wxDb *copyDb)
                          (SQLTCHAR FAR *) uid.c_str(), SQL_NTS,
                          (SQLTCHAR FAR *) authStr.c_str(), SQL_NTS);
 
-    if (retcode == SQL_ERROR)
+    if ((retcode != SQL_SUCCESS) &&
+        (retcode != SQL_SUCCESS_WITH_INFO))
+        return(DispAllErrors(henv, hdbc));
+
+    return open(failOnDataTypeUnsupported);
+
+} // wxDb::Open()
+
+
+bool wxDb::Open(wxDbConnectInf *dbConnectInf, bool failOnDataTypeUnsupported)
+{
+    wxASSERT(dbConnectInf);
+
+    // Use the connection string if one is present
+    if (dbConnectInf->UseConnectionStr())
+        return Open(GetConnectionInStr(), failOnDataTypeUnsupported);
+    else
+        return Open(dbConnectInf->GetDsn(), dbConnectInf->GetUserID(),
+                    dbConnectInf->GetPassword(), failOnDataTypeUnsupported);
+}  // wxDb::Open()
+
+
+bool wxDb::Open(wxDb *copyDb)
+{
+    dsn              = copyDb->GetDatasourceName();
+    uid              = copyDb->GetUsername();
+    authStr          = copyDb->GetPassword();
+    inConnectionStr  = copyDb->GetConnectionInStr();
+    outConnectionStr = copyDb->GetConnectionOutStr();
+
+    RETCODE retcode;
+
+    if (!FwdOnlyCursors())
+    {
+        // Specify that the ODBC cursor library be used, if needed.  This must be
+        // specified before the connection is made.
+        retcode = SQLSetConnectOption(hdbc, SQL_ODBC_CURSORS, SQL_CUR_USE_IF_NEEDED);
+
+#ifdef DBDEBUG_CONSOLE
+        if (retcode == SQL_SUCCESS)
+            cout << wxT("SQLSetConnectOption(CURSOR_LIB) successful") << endl;
+        else
+            cout << wxT("SQLSetConnectOption(CURSOR_LIB) failed") << endl;
+#else
+        wxUnusedVar( retcode );
+#endif
+    }
+
+    if (copyDb->OpenedWithConnectionString())
+    {
+        // Connect to the data source
+        SQLTCHAR outConnectBuffer[SQL_MAX_CONNECTSTR_LEN+1];
+        short outConnectBufferLen;
+
+        inConnectionStr = copyDb->GetConnectionInStr();
+
+        retcode = SQLDriverConnect(hdbc, NULL, (SQLTCHAR FAR *)inConnectionStr.c_str(),
+                            inConnectionStr.Length(), (SQLTCHAR FAR *)outConnectBuffer,
+                            sizeof(outConnectBuffer), &outConnectBufferLen, SQL_DRIVER_COMPLETE);
+
+        if ((retcode != SQL_SUCCESS) &&
+            (retcode != SQL_SUCCESS_WITH_INFO))
+            return(DispAllErrors(henv, hdbc));
+
+        outConnectBuffer[outConnectBufferLen] = 0;
+        outConnectionStr = outConnectBuffer;
+        dbOpenedWithConnectionString = TRUE;
+    }
+    else
+    {
+        // Connect to the data source
+        retcode = SQLConnect(hdbc, (SQLTCHAR FAR *) dsn.c_str(), SQL_NTS,
+                             (SQLTCHAR FAR *) uid.c_str(), SQL_NTS,
+                             (SQLTCHAR FAR *) authStr.c_str(), SQL_NTS);
+    }
+
+    if ((retcode != SQL_SUCCESS) &&
+        (retcode != SQL_SUCCESS_WITH_INFO))
         return(DispAllErrors(henv, hdbc));
 
 /*
@@ -985,21 +1086,24 @@ bool wxDb::getDbInfo(bool failOnDataTypeUnsupported)
     SWORD cb;
     RETCODE retcode;
 
-    if (SQLGetInfo(hdbc, SQL_SERVER_NAME, (UCHAR*) dbInf.serverName, 80, &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_SERVER_NAME, (UCHAR*) dbInf.serverName, 80, &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_DATABASE_NAME, (UCHAR*) dbInf.databaseName, 128, &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_DATABASE_NAME, (UCHAR*) dbInf.databaseName, 128, &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_DBMS_NAME, (UCHAR*) dbInf.dbmsName, 40, &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_DBMS_NAME, (UCHAR*) dbInf.dbmsName, 40, &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
@@ -1010,7 +1114,6 @@ bool wxDb::getDbInfo(bool failOnDataTypeUnsupported)
     // After upgrading to MSVC6, the original 20 char buffer below was insufficient,
     // causing database connectivity to fail in some cases.
     retcode = SQLGetInfo(hdbc, SQL_DBMS_VER, (UCHAR*) dbInf.dbmsVer, 64, &cb);
-
     if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
@@ -1018,28 +1121,32 @@ bool wxDb::getDbInfo(bool failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_ACTIVE_CONNECTIONS, (UCHAR*) &dbInf.maxConnections, sizeof(dbInf.maxConnections), &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_ACTIVE_CONNECTIONS, (UCHAR*) &dbInf.maxConnections, sizeof(dbInf.maxConnections), &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_ACTIVE_STATEMENTS, (UCHAR*) &dbInf.maxStmts, sizeof(dbInf.maxStmts), &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_ACTIVE_STATEMENTS, (UCHAR*) &dbInf.maxStmts, sizeof(dbInf.maxStmts), &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_DRIVER_NAME, (UCHAR*) dbInf.driverName, 40, &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_DRIVER_NAME, (UCHAR*) dbInf.driverName, 40, &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_DRIVER_ODBC_VER, (UCHAR*) dbInf.odbcVer, 60, &cb) == SQL_ERROR)
+    retcode = SQLGetInfo(hdbc, SQL_DRIVER_ODBC_VER, (UCHAR*) dbInf.odbcVer, 60, &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
@@ -1054,21 +1161,24 @@ bool wxDb::getDbInfo(bool failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_DRIVER_VER, (UCHAR*) dbInf.driverVer, 60, &cb) == SQL_ERROR)
+    retcode = SQLGetInfo(hdbc, SQL_DRIVER_VER, (UCHAR*) dbInf.driverVer, 60, &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_ODBC_API_CONFORMANCE, (UCHAR*) &dbInf.apiConfLvl, sizeof(dbInf.apiConfLvl), &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_ODBC_API_CONFORMANCE, (UCHAR*) &dbInf.apiConfLvl, sizeof(dbInf.apiConfLvl), &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_ODBC_SAG_CLI_CONFORMANCE, (UCHAR*) &dbInf.cliConfLvl, sizeof(dbInf.cliConfLvl), &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_ODBC_SAG_CLI_CONFORMANCE, (UCHAR*) &dbInf.cliConfLvl, sizeof(dbInf.cliConfLvl), &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
     {
         // Not all drivers support this call - Nick Gorham(unixODBC)
         dbInf.cliConfLvl = 0;
@@ -1077,149 +1187,152 @@ bool wxDb::getDbInfo(bool failOnDataTypeUnsupported)
                        return FALSE;
     }
 
-    if (SQLGetInfo(hdbc, SQL_ODBC_SQL_CONFORMANCE, (UCHAR*) &dbInf.sqlConfLvl, sizeof(dbInf.sqlConfLvl), &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_ODBC_SQL_CONFORMANCE, (UCHAR*) &dbInf.sqlConfLvl, sizeof(dbInf.sqlConfLvl), &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_OUTER_JOINS, (UCHAR*) dbInf.outerJoins, 2, &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_OUTER_JOINS, (UCHAR*) dbInf.outerJoins, 2, &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
-               // TODO: BugTracker# 785080 : fails with mysql 4 on linux - edr
-               // TODO: dbInf.outerJoins[0]='N';
-               // TODO: dbInf.outerJoins[1]='\x0';
-
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_PROCEDURES, (UCHAR*) dbInf.procedureSupport, 2, &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_PROCEDURES, (UCHAR*) dbInf.procedureSupport, 2, &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
-               // TODO: BugTracker# 785080 : fails with mysql 4 on linux - edr
-               // TODO: dbInf.procedureSupport[0]='N';
-               // TODO: dbInf.procedureSupport[1]='\x0';
-
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_ACCESSIBLE_TABLES, (UCHAR*) dbInf.accessibleTables, 2, &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_ACCESSIBLE_TABLES, (UCHAR*) dbInf.accessibleTables, 2, &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
-               // TODO: BugTracker# 785080 : fails with mysql 4 on linux - edr
-               // TODO: dbInf.accessibleTables[0]='N';
-               // TODO: dbInf.accessibleTables[1]='\x0';
-
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_CURSOR_COMMIT_BEHAVIOR, (UCHAR*) &dbInf.cursorCommitBehavior, sizeof(dbInf.cursorCommitBehavior), &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_CURSOR_COMMIT_BEHAVIOR, (UCHAR*) &dbInf.cursorCommitBehavior, sizeof(dbInf.cursorCommitBehavior), &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_CURSOR_ROLLBACK_BEHAVIOR, (UCHAR*) &dbInf.cursorRollbackBehavior, sizeof(dbInf.cursorRollbackBehavior), &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_CURSOR_ROLLBACK_BEHAVIOR, (UCHAR*) &dbInf.cursorRollbackBehavior, sizeof(dbInf.cursorRollbackBehavior), &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_NON_NULLABLE_COLUMNS, (UCHAR*) &dbInf.supportNotNullClause, sizeof(dbInf.supportNotNullClause), &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_NON_NULLABLE_COLUMNS, (UCHAR*) &dbInf.supportNotNullClause, sizeof(dbInf.supportNotNullClause), &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_ODBC_SQL_OPT_IEF, (UCHAR*) dbInf.supportIEF, 2, &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_ODBC_SQL_OPT_IEF, (UCHAR*) dbInf.supportIEF, 2, &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
-               // TODO: BugTracker# 785080 : fails with mysql 4 on linux - edr
-               // TODO: dbInf.supportIEF[0]='N';
-               // TODO: dbInf.supportIEF[1]='\x0';
-
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_DEFAULT_TXN_ISOLATION, (UCHAR*) &dbInf.txnIsolation, sizeof(dbInf.txnIsolation), &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_DEFAULT_TXN_ISOLATION, (UCHAR*) &dbInf.txnIsolation, sizeof(dbInf.txnIsolation), &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_TXN_ISOLATION_OPTION, (UCHAR*) &dbInf.txnIsolationOptions, sizeof(dbInf.txnIsolationOptions), &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_TXN_ISOLATION_OPTION, (UCHAR*) &dbInf.txnIsolationOptions, sizeof(dbInf.txnIsolationOptions), &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_FETCH_DIRECTION, (UCHAR*) &dbInf.fetchDirections, sizeof(dbInf.fetchDirections), &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_FETCH_DIRECTION, (UCHAR*) &dbInf.fetchDirections, sizeof(dbInf.fetchDirections), &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_LOCK_TYPES, (UCHAR*) &dbInf.lockTypes, sizeof(dbInf.lockTypes), &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_LOCK_TYPES, (UCHAR*) &dbInf.lockTypes, sizeof(dbInf.lockTypes), &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_POS_OPERATIONS, (UCHAR*) &dbInf.posOperations, sizeof(dbInf.posOperations), &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_POS_OPERATIONS, (UCHAR*) &dbInf.posOperations, sizeof(dbInf.posOperations), &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_POSITIONED_STATEMENTS, (UCHAR*) &dbInf.posStmts, sizeof(dbInf.posStmts), &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_POSITIONED_STATEMENTS, (UCHAR*) &dbInf.posStmts, sizeof(dbInf.posStmts), &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_SCROLL_CONCURRENCY, (UCHAR*) &dbInf.scrollConcurrency, sizeof(dbInf.scrollConcurrency), &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_SCROLL_CONCURRENCY, (UCHAR*) &dbInf.scrollConcurrency, sizeof(dbInf.scrollConcurrency), &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_SCROLL_OPTIONS, (UCHAR*) &dbInf.scrollOptions, sizeof(dbInf.scrollOptions), &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_SCROLL_OPTIONS, (UCHAR*) &dbInf.scrollOptions, sizeof(dbInf.scrollOptions), &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_STATIC_SENSITIVITY, (UCHAR*) &dbInf.staticSensitivity, sizeof(dbInf.staticSensitivity), &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_STATIC_SENSITIVITY, (UCHAR*) &dbInf.staticSensitivity, sizeof(dbInf.staticSensitivity), &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_TXN_CAPABLE, (UCHAR*) &dbInf.txnCapable, sizeof(dbInf.txnCapable), &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_TXN_CAPABLE, (UCHAR*) &dbInf.txnCapable, sizeof(dbInf.txnCapable), &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
                        return FALSE;
        }
 
-    if (SQLGetInfo(hdbc, SQL_LOGIN_TIMEOUT, (UCHAR*) &dbInf.loginTimeout, sizeof(dbInf.loginTimeout), &cb) != SQL_SUCCESS)
+    retcode = SQLGetInfo(hdbc, SQL_LOGIN_TIMEOUT, (UCHAR*) &dbInf.loginTimeout, sizeof(dbInf.loginTimeout), &cb);
+    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
        {
                DispAllErrors(henv, hdbc);
                if (failOnDataTypeUnsupported)
@@ -1545,7 +1658,7 @@ void wxDb::Close(void)
 
 #ifdef __WXDEBUG__
     wxTablesInUse *tiu;
-    wxNode *pNode;
+    wxList::compatibility_iterator pNode;
     pNode = TablesInUse.GetFirst();
     wxString s,s2;
     while (pNode)
@@ -1554,8 +1667,8 @@ void wxDb::Close(void)
         if (tiu->pDb == this)
         {
             s.Printf(wxT("(%-20s)     tableID:[%6lu]     pDb:[%p]"), tiu->tableName,tiu->tableID,tiu->pDb);
-            s2.Printf(wxT("Orphaned found using pDb:[%p]"),this);
-            wxLogDebug (s.c_str(),s2.c_str());
+            s2.Printf(wxT("Orphaned table found using pDb:[%p]"),this);
+            wxLogDebug(s.c_str(),s2.c_str());
         }
         pNode = pNode->GetNext();
     }
@@ -2194,7 +2307,6 @@ int wxDb::GetKeyFields(const wxString &tableName, wxDbColInf* colInf, UWORD noCo
     /*  primary keys in other tables that are referred to by foreign       */
     /*  keys in the tableName table.                                       */
     /*---------------------------------------------------------------------*/
-    i = 0;
     while ((retcode == SQL_SUCCESS) || (retcode == SQL_SUCCESS_WITH_INFO))
     {
         retcode = SQLFetch(hstmt);
@@ -2805,7 +2917,7 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh
 #ifdef __WXDEBUG__
                         default:
                             wxString errMsg;
-                            errMsg.Printf(wxT("SQL Data type %d currently not supported by wxWindows"), colInf[colNo].sqlDataType);
+                            errMsg.Printf(wxT("SQL Data type %d currently not supported by wxWidgets"), colInf[colNo].sqlDataType);
                             wxLogDebug(errMsg,wxT("ODBC DEBUG MESSAGE"));
 #endif
                     }
@@ -3012,7 +3124,6 @@ wxDbInf *wxDb::GetCatalog(const wxChar *userID)
  *       to avoid undesired unbinding of columns.
  */
 {
-    wxDbInf *pDbInf = NULL; // Array of catalog entries
     int      noTab = 0;     // Counter while filling table entries
     int      pass;
     RETCODE  retcode;
@@ -3023,7 +3134,10 @@ wxDbInf *wxDb::GetCatalog(const wxChar *userID)
     convertUserID(userID,UserID);
 
     //-------------------------------------------------------------
-    pDbInf = new wxDbInf;          // Create the Database Array
+    // Create the Database Array of catalog entries
+
+    wxDbInf *pDbInf = new wxDbInf;
+
     //-------------------------------------------------------------
     // Table Information
     // Pass 1 - Determine how many Tables there are.
@@ -3178,6 +3292,13 @@ bool wxDb::Catalog(const wxChar *userID, const wxString &fileName)
         if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
             break;
 
+        GetData(3,SQL_C_CHAR,  (UCHAR *) tblName,     DB_MAX_TABLE_NAME_LEN+1, &cb);
+        GetData(4,SQL_C_CHAR,  (UCHAR *) colName,     DB_MAX_COLUMN_NAME_LEN+1,&cb);
+        GetData(5,SQL_C_SSHORT,(UCHAR *)&sqlDataType, 0,                       &cb);
+        GetData(6,SQL_C_CHAR,  (UCHAR *) typeName,    sizeof(typeName),        &cb);
+        GetData(7,SQL_C_SLONG, (UCHAR *)&precision,   0,                       &cb);
+        GetData(8,SQL_C_SLONG, (UCHAR *)&length,      0,                       &cb);
+
         if (wxStrcmp(tblName, tblNameSave.c_str()))
         {
             if (cnt)
@@ -3198,13 +3319,6 @@ bool wxDb::Catalog(const wxChar *userID, const wxString &fileName)
             tblNameSave = tblName;
         }
 
-      GetData(3,SQL_C_CHAR,  (UCHAR *) tblName,     DB_MAX_TABLE_NAME_LEN+1, &cb);
-      GetData(4,SQL_C_CHAR,  (UCHAR *) colName,     DB_MAX_COLUMN_NAME_LEN+1,&cb);
-      GetData(5,SQL_C_SSHORT,(UCHAR *)&sqlDataType, 0,                       &cb);
-      GetData(6,SQL_C_CHAR,  (UCHAR *) typeName,    sizeof(typeName),        &cb);
-      GetData(7,SQL_C_SLONG, (UCHAR *)&precision,   0,                       &cb);
-      GetData(8,SQL_C_SLONG, (UCHAR *)&length,      0,                       &cb);
-
         outStr.Printf(wxT("%-32s %-32s (%04d)%-15s %9ld %9ld\n"),
             tblName, colName, sqlDataType, typeName, precision, length);
         if (wxFputs(outStr.c_str(), fp) == EOF)
@@ -3761,17 +3875,42 @@ wxDb WXDLLIMPEXP_ODBC *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnly
         // The database connection must be for the same datasource
         // name and must currently not be in use.
         if (pList->Free &&
-            (pList->PtrDb->FwdOnlyCursors() == FwdOnlyCursors) &&
-            (!wxStrcmp(pDbConfig->GetDsn(), pList->Dsn)))  // Found a free connection
+            (pList->PtrDb->FwdOnlyCursors() == FwdOnlyCursors))
         {
-            pList->Free = FALSE;
-            return(pList->PtrDb);
+            if (pDbConfig->UseConnectionStr())
+            {
+                if (pList->PtrDb->OpenedWithConnectionString() && 
+                     (!wxStrcmp(pDbConfig->GetConnectionStr(), pList->ConnectionStr)))
+                {
+                    // Found a free connection
+                    pList->Free = FALSE;
+                    return(pList->PtrDb);
+                }
+            }
+            else
+            {
+                if (!pList->PtrDb->OpenedWithConnectionString() &&
+                     (!wxStrcmp(pDbConfig->GetDsn(), pList->Dsn)))
+                {
+                    // Found a free connection
+                    pList->Free = FALSE;
+                    return(pList->PtrDb);
+                }
+            }
         }
 
-        if (!wxStrcmp(pDbConfig->GetDsn(), pList->Dsn) &&
-            !wxStrcmp(pDbConfig->GetUserID(), pList->Uid) &&
-            !wxStrcmp(pDbConfig->GetPassword(), pList->AuthStr))
-            matchingDbConnection = pList->PtrDb;
+        if (pDbConfig->UseConnectionStr())
+        {
+            if (!wxStrcmp(pDbConfig->GetConnectionStr(), pList->ConnectionStr))
+                matchingDbConnection = pList->PtrDb;
+        }
+        else
+        {
+            if (!wxStrcmp(pDbConfig->GetDsn(), pList->Dsn) &&
+                !wxStrcmp(pDbConfig->GetUserID(), pList->Uid) &&
+                !wxStrcmp(pDbConfig->GetPassword(), pList->AuthStr))
+                matchingDbConnection = pList->PtrDb;
+        }
     }
 
     // No available connections.  A new connection must be made and
@@ -3793,18 +3932,28 @@ wxDb WXDLLIMPEXP_ODBC *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnly
     }
 
     // Initialize new node in the linked list
-    pList->PtrNext  = 0;
-    pList->Free     = FALSE;
-    pList->Dsn      = pDbConfig->GetDsn();
-    pList->Uid      = pDbConfig->GetUserID();
-    pList->AuthStr  = pDbConfig->GetPassword();
+    pList->PtrNext          = 0;
+    pList->Free             = FALSE;
+    pList->Dsn              = pDbConfig->GetDsn();
+    pList->Uid              = pDbConfig->GetUserID();
+    pList->AuthStr          = pDbConfig->GetPassword();
+    pList->ConnectionStr    = pDbConfig->GetConnectionStr();
 
     pList->PtrDb = new wxDb(pDbConfig->GetHenv(), FwdOnlyCursors);
 
-    bool opened = FALSE;
+    bool opened;
 
     if (!matchingDbConnection)
-        opened = pList->PtrDb->Open(pDbConfig->GetDsn(), pDbConfig->GetUserID(), pDbConfig->GetPassword());
+    {
+        if (pDbConfig->UseConnectionStr())
+        {
+            opened = pList->PtrDb->Open(pDbConfig->GetConnectionStr());
+        }
+        else
+        {
+            opened = pList->PtrDb->Open(pDbConfig->GetDsn(), pDbConfig->GetUserID(), pDbConfig->GetPassword());
+        }
+    }
     else
         opened = pList->PtrDb->Open(matchingDbConnection);
 
@@ -3812,7 +3961,7 @@ wxDb WXDLLIMPEXP_ODBC *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnly
     if (opened)
     {
         pList->PtrDb->setCached(TRUE);  // Prevent a user from deleting a cached connection
-        pList->PtrDb->SetSqlLogging(SQLLOGstate,SQLLOGfn,TRUE);
+        pList->PtrDb->SetSqlLogging(SQLLOGstate, SQLLOGfn, TRUE);
         return(pList->PtrDb);
     }
     else  // Unable to connect, destroy list item
@@ -3820,11 +3969,12 @@ wxDb WXDLLIMPEXP_ODBC *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnly
         if (pList->PtrPrev)
             pList->PtrPrev->PtrNext = 0;
         else
-            PtrBegDbList = 0;                // Empty list again
-        pList->PtrDb->CommitTrans();    // Commit any open transactions on wxDb object
-        pList->PtrDb->Close();            // Close the wxDb object
-        delete pList->PtrDb;                // Deletes the wxDb object
-        delete pList;                        // Deletes the linked list object
+            PtrBegDbList = 0;        // Empty list again
+
+        pList->PtrDb->CommitTrans(); // Commit any open transactions on wxDb object
+        pList->PtrDb->Close();       // Close the wxDb object
+        delete pList->PtrDb;         // Deletes the wxDb object
+        delete pList;                // Deletes the linked list object
         return(0);
     }
 
@@ -3892,7 +4042,7 @@ int WXDLLIMPEXP_ODBC wxDbConnectionsInUse(void)
 
 /********** wxDbLogExtendedErrorMsg() **********/
 // DEBUG ONLY function
-const wxChar* WXDLLIMPEXP_ODBC wxDbLogExtendedErrorMsg(const wxChar *userText,
+const wxChar WXDLLIMPEXP_ODBC *wxDbLogExtendedErrorMsg(const wxChar *userText,
                                                   wxDb *pDb,
                                                   const wxChar *ErrFile,
                                                   int ErrLine)