]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/db.cpp
fix bug compiling with DMC Borland gcc (macos); reverting part of 1.09 to 1.10
[wxWidgets.git] / src / common / db.cpp
index 065a0ac9d59dd3d03f754f7e00dabdf2573c0cdc..510800250a41633000cff6a7276a7cc5f68fc54b 100644 (file)
@@ -34,7 +34,7 @@
 // SYNOPSIS START
 // SYNOPSIS STOP
 */
 // SYNOPSIS START
 // SYNOPSIS STOP
 */
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "db.h"
 #endif
 
     #pragma implementation "db.h"
 #endif
 
@@ -53,9 +53,6 @@
     #include "wx/object.h"
     #include "wx/list.h"
     #include "wx/utils.h"
     #include "wx/object.h"
     #include "wx/list.h"
     #include "wx/utils.h"
-    #if wxUSE_GUI
-        #include "wx/msgdlg.h"
-    #endif
     #include "wx/log.h"
 #endif
 #include "wx/filefn.h"
     #include "wx/log.h"
 #endif
 #include "wx/filefn.h"
 
 #include "wx/db.h"
 
 
 #include "wx/db.h"
 
-WXDLLEXPORT_DATA(wxDbList*) PtrBegDbList = 0;
+// DLL options compatibility check:
+#include "wx/app.h"
+WX_CHECK_BUILD_OPTIONS("wxODBC")
 
 
+WXDLLIMPEXP_DATA_ODBC(wxDbList*) PtrBegDbList = 0;
 
 wxChar const *SQL_LOG_FILENAME         = wxT("sqllog.txt");
 wxChar const *SQL_CATALOG_FILENAME     = wxT("catalog.txt");
 
 wxChar const *SQL_LOG_FILENAME         = wxT("sqllog.txt");
 wxChar const *SQL_CATALOG_FILENAME     = wxT("catalog.txt");
@@ -562,7 +562,8 @@ const wxChar *wxDb::convertUserID(const wxChar *userID, wxString &UserID)
         UserID.Empty();
 
     // dBase does not use user names, and some drivers fail if you try to pass one
         UserID.Empty();
 
     // dBase does not use user names, and some drivers fail if you try to pass one
-    if (Dbms() == dbmsDBASE)
+    if ( Dbms() == dbmsDBASE
+         || Dbms() == dbmsXBASE_SEQUITER )
         UserID.Empty();
 
     // Oracle user names may only be in uppercase, so force
         UserID.Empty();
 
     // Oracle user names may only be in uppercase, so force
@@ -575,7 +576,7 @@ const wxChar *wxDb::convertUserID(const wxChar *userID, wxString &UserID)
 
 
 /********** wxDb::Open() **********/
 
 
 /********** wxDb::Open() **********/
-bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthStr)
+bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthStr, bool failOnDataTypeUnsupported)
 {
     wxASSERT(Dsn.Length());
     dsn        = Dsn;
 {
     wxASSERT(Dsn.Length());
     dsn        = Dsn;
@@ -595,13 +596,15 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
             cout << wxT("SQLSetConnectOption(CURSOR_LIB) successful") << endl;
         else
             cout << wxT("SQLSetConnectOption(CURSOR_LIB) failed") << endl;
             cout << wxT("SQLSetConnectOption(CURSOR_LIB) successful") << endl;
         else
             cout << wxT("SQLSetConnectOption(CURSOR_LIB) failed") << endl;
+#else
+        wxUnusedVar( retcode );
 #endif
     }
 
     // Connect to the data source
 #endif
     }
 
     // Connect to the data source
-    retcode = SQLConnect(hdbc, (UCHAR FAR *) dsn.c_str(), SQL_NTS,
-                         (UCHAR FAR *) uid.c_str(), SQL_NTS,
-                         (UCHAR FAR *) authStr.c_str(), SQL_NTS);
+    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))
 
     if ((retcode != SQL_SUCCESS) &&
         (retcode != SQL_SUCCESS_WITH_INFO))
@@ -627,7 +630,7 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
         return(FALSE);
 
     // Query the data source for inf. about itself
         return(FALSE);
 
     // Query the data source for inf. about itself
-    if (!getDbInfo())
+    if (!getDbInfo(failOnDataTypeUnsupported))
         return(FALSE);
 
     // Query the data source regarding data type information
         return(FALSE);
 
     // Query the data source regarding data type information
@@ -686,7 +689,10 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
             if (!getDataTypeInfo(SQL_FLOAT,typeInfFloat))
                 if (!getDataTypeInfo(SQL_DECIMAL,typeInfFloat))
                     if (!getDataTypeInfo(SQL_NUMERIC,typeInfFloat))
             if (!getDataTypeInfo(SQL_FLOAT,typeInfFloat))
                 if (!getDataTypeInfo(SQL_DECIMAL,typeInfFloat))
                     if (!getDataTypeInfo(SQL_NUMERIC,typeInfFloat))
-                        return(FALSE);
+                    {
+                        if (failOnDataTypeUnsupported)
+                            return(FALSE);
+                    }
                     else
                         typeInfFloat.FsqlType = SQL_NUMERIC;
                 else
                     else
                         typeInfFloat.FsqlType = SQL_NUMERIC;
                 else
@@ -704,7 +710,10 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
         // If SQL_INTEGER is not supported, use the floating point
         // data type to store integers as well as floats
         if (!getDataTypeInfo(typeInfFloat.FsqlType, typeInfInteger))
         // If SQL_INTEGER is not supported, use the floating point
         // data type to store integers as well as floats
         if (!getDataTypeInfo(typeInfFloat.FsqlType, typeInfInteger))
-            return(FALSE);
+        {
+            if (failOnDataTypeUnsupported)
+                return(FALSE);
+        }
         else
             typeInfInteger.FsqlType = typeInfFloat.FsqlType;
     }
         else
             typeInfInteger.FsqlType = typeInfFloat.FsqlType;
     }
@@ -712,25 +721,36 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
         typeInfInteger.FsqlType = SQL_INTEGER;
 
     // Date/Time
         typeInfInteger.FsqlType = SQL_INTEGER;
 
     // Date/Time
-    if (Dbms() != dbmsDBASE)
-    {
-        if (!getDataTypeInfo(SQL_TIMESTAMP,typeInfDate))
-            return(FALSE);
-        else
-            typeInfDate.FsqlType = SQL_TIMESTAMP;
-    }
-    else
+    if (!getDataTypeInfo(SQL_TIMESTAMP,typeInfDate))
     {
         if (!getDataTypeInfo(SQL_DATE,typeInfDate))
     {
         if (!getDataTypeInfo(SQL_DATE,typeInfDate))
-            return(FALSE);
+        {
+#ifdef SQL_DATETIME
+            if (getDataTypeInfo(SQL_DATETIME,typeInfDate))
+            {
+                typeInfDate.FsqlType = SQL_TIME;
+            }
+            else
+#endif // SQL_DATETIME defined
+            {
+                if (failOnDataTypeUnsupported)
+                    return(FALSE);
+            }
+        }
         else
             typeInfDate.FsqlType = SQL_DATE;
     }
         else
             typeInfDate.FsqlType = SQL_DATE;
     }
+    else
+        typeInfDate.FsqlType = SQL_TIMESTAMP;
+
 
     if (!getDataTypeInfo(SQL_LONGVARBINARY, typeInfBlob))
     {
         if (!getDataTypeInfo(SQL_VARBINARY,typeInfBlob))
 
     if (!getDataTypeInfo(SQL_LONGVARBINARY, typeInfBlob))
     {
         if (!getDataTypeInfo(SQL_VARBINARY,typeInfBlob))
-            return(FALSE);
+        {
+            if (failOnDataTypeUnsupported)
+                return(FALSE);
+        }
         else
             typeInfBlob.FsqlType = SQL_VARBINARY;
     }
         else
             typeInfBlob.FsqlType = SQL_VARBINARY;
     }
@@ -780,13 +800,15 @@ bool wxDb::Open(wxDb *copyDb)
             cout << wxT("SQLSetConnectOption(CURSOR_LIB) successful") << endl;
         else
             cout << wxT("SQLSetConnectOption(CURSOR_LIB) failed") << endl;
             cout << wxT("SQLSetConnectOption(CURSOR_LIB) successful") << endl;
         else
             cout << wxT("SQLSetConnectOption(CURSOR_LIB) failed") << endl;
+#else
+        wxUnusedVar( retcode );
 #endif
     }
 
     // Connect to the data source
 #endif
     }
 
     // Connect to the data source
-    retcode = SQLConnect(hdbc, (UCHAR FAR *) dsn.c_str(), SQL_NTS,
-                         (UCHAR FAR *) uid.c_str(), SQL_NTS,
-                         (UCHAR FAR *) authStr.c_str(), SQL_NTS);
+    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_ERROR)
         return(DispAllErrors(henv, hdbc));
 
     if (retcode == SQL_ERROR)
         return(DispAllErrors(henv, hdbc));
@@ -962,19 +984,31 @@ bool wxDb::setConnectionOptions(void)
 
 
 /********** wxDb::getDbInfo() **********/
 
 
 /********** wxDb::getDbInfo() **********/
-bool wxDb::getDbInfo(void)
+bool wxDb::getDbInfo(bool failOnDataTypeUnsupported)
 {
     SWORD cb;
     RETCODE retcode;
 
     if (SQLGetInfo(hdbc, SQL_SERVER_NAME, (UCHAR*) dbInf.serverName, 80, &cb) != SQL_SUCCESS)
 {
     SWORD cb;
     RETCODE retcode;
 
     if (SQLGetInfo(hdbc, SQL_SERVER_NAME, (UCHAR*) dbInf.serverName, 80, &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_DATABASE_NAME, (UCHAR*) dbInf.databaseName, 128, &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_DATABASE_NAME, (UCHAR*) dbInf.databaseName, 128, &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_DBMS_NAME, (UCHAR*) dbInf.dbmsName, 40, &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_DBMS_NAME, (UCHAR*) dbInf.dbmsName, 40, &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     // 16-Mar-1999
     // After upgrading to MSVC6, the original 20 char buffer below was insufficient,
 
     // 16-Mar-1999
     // After upgrading to MSVC6, the original 20 char buffer below was insufficient,
@@ -982,93 +1016,219 @@ bool wxDb::getDbInfo(void)
     retcode = SQLGetInfo(hdbc, SQL_DBMS_VER, (UCHAR*) dbInf.dbmsVer, 64, &cb);
 
     if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
     retcode = SQLGetInfo(hdbc, SQL_DBMS_VER, (UCHAR*) dbInf.dbmsVer, 64, &cb);
 
     if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_ACTIVE_CONNECTIONS, (UCHAR*) &dbInf.maxConnections, sizeof(dbInf.maxConnections), &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_ACTIVE_CONNECTIONS, (UCHAR*) &dbInf.maxConnections, sizeof(dbInf.maxConnections), &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_ACTIVE_STATEMENTS, (UCHAR*) &dbInf.maxStmts, sizeof(dbInf.maxStmts), &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_ACTIVE_STATEMENTS, (UCHAR*) &dbInf.maxStmts, sizeof(dbInf.maxStmts), &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_DRIVER_NAME, (UCHAR*) dbInf.driverName, 40, &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_DRIVER_NAME, (UCHAR*) dbInf.driverName, 40, &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_DRIVER_ODBC_VER, (UCHAR*) dbInf.odbcVer, 60, &cb) == SQL_ERROR)
 
     if (SQLGetInfo(hdbc, SQL_DRIVER_ODBC_VER, (UCHAR*) dbInf.odbcVer, 60, &cb) == SQL_ERROR)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     retcode = SQLGetInfo(hdbc, SQL_ODBC_VER, (UCHAR*) dbInf.drvMgrOdbcVer, 60, &cb);
     if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
 
     retcode = SQLGetInfo(hdbc, SQL_ODBC_VER, (UCHAR*) dbInf.drvMgrOdbcVer, 60, &cb);
     if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_DRIVER_VER, (UCHAR*) dbInf.driverVer, 60, &cb) == SQL_ERROR)
 
     if (SQLGetInfo(hdbc, SQL_DRIVER_VER, (UCHAR*) dbInf.driverVer, 60, &cb) == SQL_ERROR)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_ODBC_API_CONFORMANCE, (UCHAR*) &dbInf.apiConfLvl, sizeof(dbInf.apiConfLvl), &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_ODBC_API_CONFORMANCE, (UCHAR*) &dbInf.apiConfLvl, sizeof(dbInf.apiConfLvl), &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_ODBC_SAG_CLI_CONFORMANCE, (UCHAR*) &dbInf.cliConfLvl, sizeof(dbInf.cliConfLvl), &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_ODBC_SAG_CLI_CONFORMANCE, (UCHAR*) &dbInf.cliConfLvl, sizeof(dbInf.cliConfLvl), &cb) != SQL_SUCCESS)
-//        return(DispAllErrors(henv, hdbc));
     {
         // Not all drivers support this call - Nick Gorham(unixODBC)
         dbInf.cliConfLvl = 0;
     {
         // Not all drivers support this call - Nick Gorham(unixODBC)
         dbInf.cliConfLvl = 0;
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
     }
 
     if (SQLGetInfo(hdbc, SQL_ODBC_SQL_CONFORMANCE, (UCHAR*) &dbInf.sqlConfLvl, sizeof(dbInf.sqlConfLvl), &cb) != SQL_SUCCESS)
     }
 
     if (SQLGetInfo(hdbc, SQL_ODBC_SQL_CONFORMANCE, (UCHAR*) &dbInf.sqlConfLvl, sizeof(dbInf.sqlConfLvl), &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_OUTER_JOINS, (UCHAR*) dbInf.outerJoins, 2, &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_OUTER_JOINS, (UCHAR*) dbInf.outerJoins, 2, &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               // 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)
 
     if (SQLGetInfo(hdbc, SQL_PROCEDURES, (UCHAR*) dbInf.procedureSupport, 2, &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               // 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)
 
     if (SQLGetInfo(hdbc, SQL_ACCESSIBLE_TABLES, (UCHAR*) dbInf.accessibleTables, 2, &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               // 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)
 
     if (SQLGetInfo(hdbc, SQL_CURSOR_COMMIT_BEHAVIOR, (UCHAR*) &dbInf.cursorCommitBehavior, sizeof(dbInf.cursorCommitBehavior), &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_CURSOR_ROLLBACK_BEHAVIOR, (UCHAR*) &dbInf.cursorRollbackBehavior, sizeof(dbInf.cursorRollbackBehavior), &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_CURSOR_ROLLBACK_BEHAVIOR, (UCHAR*) &dbInf.cursorRollbackBehavior, sizeof(dbInf.cursorRollbackBehavior), &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_NON_NULLABLE_COLUMNS, (UCHAR*) &dbInf.supportNotNullClause, sizeof(dbInf.supportNotNullClause), &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_NON_NULLABLE_COLUMNS, (UCHAR*) &dbInf.supportNotNullClause, sizeof(dbInf.supportNotNullClause), &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_ODBC_SQL_OPT_IEF, (UCHAR*) dbInf.supportIEF, 2, &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_ODBC_SQL_OPT_IEF, (UCHAR*) dbInf.supportIEF, 2, &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               // 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)
 
     if (SQLGetInfo(hdbc, SQL_DEFAULT_TXN_ISOLATION, (UCHAR*) &dbInf.txnIsolation, sizeof(dbInf.txnIsolation), &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_TXN_ISOLATION_OPTION, (UCHAR*) &dbInf.txnIsolationOptions, sizeof(dbInf.txnIsolationOptions), &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_TXN_ISOLATION_OPTION, (UCHAR*) &dbInf.txnIsolationOptions, sizeof(dbInf.txnIsolationOptions), &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_FETCH_DIRECTION, (UCHAR*) &dbInf.fetchDirections, sizeof(dbInf.fetchDirections), &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_FETCH_DIRECTION, (UCHAR*) &dbInf.fetchDirections, sizeof(dbInf.fetchDirections), &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_LOCK_TYPES, (UCHAR*) &dbInf.lockTypes, sizeof(dbInf.lockTypes), &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_LOCK_TYPES, (UCHAR*) &dbInf.lockTypes, sizeof(dbInf.lockTypes), &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_POS_OPERATIONS, (UCHAR*) &dbInf.posOperations, sizeof(dbInf.posOperations), &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_POS_OPERATIONS, (UCHAR*) &dbInf.posOperations, sizeof(dbInf.posOperations), &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_POSITIONED_STATEMENTS, (UCHAR*) &dbInf.posStmts, sizeof(dbInf.posStmts), &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_POSITIONED_STATEMENTS, (UCHAR*) &dbInf.posStmts, sizeof(dbInf.posStmts), &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_SCROLL_CONCURRENCY, (UCHAR*) &dbInf.scrollConcurrency, sizeof(dbInf.scrollConcurrency), &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_SCROLL_CONCURRENCY, (UCHAR*) &dbInf.scrollConcurrency, sizeof(dbInf.scrollConcurrency), &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_SCROLL_OPTIONS, (UCHAR*) &dbInf.scrollOptions, sizeof(dbInf.scrollOptions), &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_SCROLL_OPTIONS, (UCHAR*) &dbInf.scrollOptions, sizeof(dbInf.scrollOptions), &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_STATIC_SENSITIVITY, (UCHAR*) &dbInf.staticSensitivity, sizeof(dbInf.staticSensitivity), &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_STATIC_SENSITIVITY, (UCHAR*) &dbInf.staticSensitivity, sizeof(dbInf.staticSensitivity), &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_TXN_CAPABLE, (UCHAR*) &dbInf.txnCapable, sizeof(dbInf.txnCapable), &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_TXN_CAPABLE, (UCHAR*) &dbInf.txnCapable, sizeof(dbInf.txnCapable), &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
     if (SQLGetInfo(hdbc, SQL_LOGIN_TIMEOUT, (UCHAR*) &dbInf.loginTimeout, sizeof(dbInf.loginTimeout), &cb) != SQL_SUCCESS)
 
     if (SQLGetInfo(hdbc, SQL_LOGIN_TIMEOUT, (UCHAR*) &dbInf.loginTimeout, sizeof(dbInf.loginTimeout), &cb) != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
+       {
+               DispAllErrors(henv, hdbc);
+               if (failOnDataTypeUnsupported)
+                       return FALSE;
+       }
 
 #ifdef DBDEBUG_CONSOLE
     cout << wxT("***** DATA SOURCE INFORMATION *****") << endl;
 
 #ifdef DBDEBUG_CONSOLE
     cout << wxT("***** DATA SOURCE INFORMATION *****") << endl;
@@ -1286,8 +1446,10 @@ bool wxDb::getDataTypeInfo(SWORD fSqlType, wxDbSqlTypeInfo &structSQLTypeInfo)
     // Get information about the data type specified
     if (SQLGetTypeInfo(hstmt, fSqlType) != SQL_SUCCESS)
         return(DispAllErrors(henv, hdbc, hstmt));
     // Get information about the data type specified
     if (SQLGetTypeInfo(hstmt, fSqlType) != SQL_SUCCESS)
         return(DispAllErrors(henv, hdbc, hstmt));
+
     // Fetch the record
     // Fetch the record
-    if ((retcode = SQLFetch(hstmt)) != SQL_SUCCESS)
+    retcode = SQLFetch(hstmt);
+    if (retcode != SQL_SUCCESS)
     {
 #ifdef DBDEBUG_CONSOLE
         if (retcode == SQL_NO_DATA_FOUND)
     {
 #ifdef DBDEBUG_CONSOLE
         if (retcode == SQL_NO_DATA_FOUND)
@@ -1299,6 +1461,7 @@ bool wxDb::getDataTypeInfo(SWORD fSqlType, wxDbSqlTypeInfo &structSQLTypeInfo)
     }
 
     wxChar typeName[DB_TYPE_NAME_LEN+1];
     }
 
     wxChar typeName[DB_TYPE_NAME_LEN+1];
+
     // Obtain columns from the record
     if (SQLGetData(hstmt, 1, SQL_C_CHAR, (UCHAR*) typeName, DB_TYPE_NAME_LEN, &cbRet) != SQL_SUCCESS)
         return(DispAllErrors(henv, hdbc, hstmt));
     // Obtain columns from the record
     if (SQLGetData(hstmt, 1, SQL_C_CHAR, (UCHAR*) typeName, DB_TYPE_NAME_LEN, &cbRet) != SQL_SUCCESS)
         return(DispAllErrors(henv, hdbc, hstmt));
@@ -1387,18 +1550,18 @@ void wxDb::Close(void)
 #ifdef __WXDEBUG__
     wxTablesInUse *tiu;
     wxNode *pNode;
 #ifdef __WXDEBUG__
     wxTablesInUse *tiu;
     wxNode *pNode;
-    pNode = TablesInUse.First();
+    pNode = TablesInUse.GetFirst();
     wxString s,s2;
     while (pNode)
     {
     wxString s,s2;
     while (pNode)
     {
-        tiu = (wxTablesInUse *)pNode->Data();
+        tiu = (wxTablesInUse *)pNode->GetData();
         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());
         }
         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());
         }
-        pNode = pNode->Next();
+        pNode = pNode->GetNext();
     }
 #endif
 
     }
 #endif
 
@@ -1461,7 +1624,7 @@ bool wxDb::DispAllErrors(HENV aHenv, HDBC aHdbc, HSTMT aHstmt)
 {
     wxString odbcErrMsg;
 
 {
     wxString odbcErrMsg;
 
-    while (SQLError(aHenv, aHdbc, aHstmt, (UCHAR FAR *) sqlState, &nativeError, (UCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS)
+    while (SQLError(aHenv, aHdbc, aHstmt, (SQLTCHAR FAR *) sqlState, &nativeError, (SQLTCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS)
     {
         odbcErrMsg.Printf(wxT("SQL State = %s\nNative Error Code = %li\nError Message = %s\n"), sqlState, nativeError, errorMsg);
         logError(odbcErrMsg, sqlState);
     {
         odbcErrMsg.Printf(wxT("SQL State = %s\nNative Error Code = %li\nError Message = %s\n"), sqlState, nativeError, errorMsg);
         logError(odbcErrMsg, sqlState);
@@ -1488,7 +1651,7 @@ bool wxDb::DispAllErrors(HENV aHenv, HDBC aHdbc, HSTMT aHstmt)
 /********** wxDb::GetNextError() **********/
 bool wxDb::GetNextError(HENV aHenv, HDBC aHdbc, HSTMT aHstmt)
 {
 /********** wxDb::GetNextError() **********/
 bool wxDb::GetNextError(HENV aHenv, HDBC aHdbc, HSTMT aHstmt)
 {
-    if (SQLError(aHenv, aHdbc, aHstmt, (UCHAR FAR *) sqlState, &nativeError, (UCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS)
+    if (SQLError(aHenv, aHdbc, aHstmt, (SQLTCHAR FAR *) sqlState, &nativeError, (SQLTCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS)
         return(TRUE);
     else
         return(FALSE);
         return(TRUE);
     else
         return(FALSE);
@@ -1844,7 +2007,7 @@ bool wxDb::DropView(const wxString &viewName)
     cout << endl << sqlStmt.c_str() << endl;
 #endif
 
     cout << endl << sqlStmt.c_str() << endl;
 #endif
 
-    if (SQLExecDirect(hstmt, (UCHAR FAR *) sqlStmt.c_str(), SQL_NTS) != SQL_SUCCESS)
+    if (SQLExecDirect(hstmt, (SQLTCHAR FAR *) sqlStmt.c_str(), SQL_NTS) != SQL_SUCCESS)
     {
         // Check for "Base table not found" error and ignore
         GetNextError(henv, hdbc, hstmt);
     {
         // Check for "Base table not found" error and ignore
         GetNextError(henv, hdbc, hstmt);
@@ -1877,7 +2040,7 @@ bool wxDb::ExecSql(const wxString &pSqlStmt)
 
     SQLFreeStmt(hstmt, SQL_CLOSE);
 
 
     SQLFreeStmt(hstmt, SQL_CLOSE);
 
-    retcode = SQLExecDirect(hstmt, (UCHAR FAR *) pSqlStmt.c_str(), SQL_NTS);
+    retcode = SQLExecDirect(hstmt, (SQLTCHAR FAR *) pSqlStmt.c_str(), SQL_NTS);
     if (retcode == SQL_SUCCESS ||
         (Dbms() == dbmsDB2 && (retcode == SQL_SUCCESS_WITH_INFO || retcode == SQL_NO_DATA_FOUND)))
     {
     if (retcode == SQL_SUCCESS ||
         (Dbms() == dbmsDB2 && (retcode == SQL_SUCCESS_WITH_INFO || retcode == SQL_NO_DATA_FOUND)))
     {
@@ -1955,7 +2118,7 @@ int wxDb::GetKeyFields(const wxString &tableName, wxDbColInf* colInf, UWORD noCo
     retcode = SQLPrimaryKeys(hstmt,
                              NULL, 0,                               /* Catalog name  */
                              NULL, 0,                               /* Schema name   */
     retcode = SQLPrimaryKeys(hstmt,
                              NULL, 0,                               /* Catalog name  */
                              NULL, 0,                               /* Schema name   */
-                             (UCHAR FAR *) tableName.c_str(), SQL_NTS); /* Table name    */
+                             (SQLTCHAR FAR *) tableName.c_str(), SQL_NTS); /* Table name    */
 
     /*---------------------------------------------------------------------*/
     /* Fetch and display the result set. This will be a list of the        */
 
     /*---------------------------------------------------------------------*/
     /* Fetch and display the result set. This will be a list of the        */
@@ -1982,7 +2145,7 @@ int wxDb::GetKeyFields(const wxString &tableName, wxDbColInf* colInf, UWORD noCo
     retcode = SQLForeignKeys(hstmt,
                              NULL, 0,                            /* Primary catalog */
                              NULL, 0,                            /* Primary schema  */
     retcode = SQLForeignKeys(hstmt,
                              NULL, 0,                            /* Primary catalog */
                              NULL, 0,                            /* Primary schema  */
-                             (UCHAR FAR *)tableName.c_str(), SQL_NTS,/* Primary table   */
+                             (SQLTCHAR FAR *)tableName.c_str(), SQL_NTS,/* Primary table   */
                              NULL, 0,                            /* Foreign catalog */
                              NULL, 0,                            /* Foreign schema  */
                              NULL, 0);                           /* Foreign table   */
                              NULL, 0,                            /* Foreign catalog */
                              NULL, 0,                            /* Foreign schema  */
                              NULL, 0);                           /* Foreign table   */
@@ -2028,14 +2191,13 @@ int wxDb::GetKeyFields(const wxString &tableName, wxDbColInf* colInf, UWORD noCo
                              NULL, 0,                             /* Primary table     */
                              NULL, 0,                             /* Foreign catalog   */
                              NULL, 0,                             /* Foreign schema    */
                              NULL, 0,                             /* Primary table     */
                              NULL, 0,                             /* Foreign catalog   */
                              NULL, 0,                             /* Foreign schema    */
-                             (UCHAR *)tableName.c_str(), SQL_NTS);/* Foreign table     */
+                             (SQLTCHAR *)tableName.c_str(), SQL_NTS);/* Foreign table     */
 
     /*---------------------------------------------------------------------*/
     /*  Fetch and display the result set. This will be all of the          */
     /*  primary keys in other tables that are referred to by foreign       */
     /*  keys in the tableName table.                                       */
     /*---------------------------------------------------------------------*/
 
     /*---------------------------------------------------------------------*/
     /*  Fetch and display the result set. This will be all of the          */
     /*  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);
     while ((retcode == SQL_SUCCESS) || (retcode == SQL_SUCCESS_WITH_INFO))
     {
         retcode = SQLFetch(hstmt);
@@ -2145,8 +2307,8 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID)
             {
                 retcode = SQLColumns(hstmt,
                                      NULL, 0,                                // All qualifiers
             {
                 retcode = SQLColumns(hstmt,
                                      NULL, 0,                                // All qualifiers
-                                     (UCHAR *) UserID.c_str(), SQL_NTS,      // Owner
-                                     (UCHAR *) TableName.c_str(), SQL_NTS,
+                                     (SQLTCHAR *) UserID.c_str(), SQL_NTS,      // Owner
+                                     (SQLTCHAR *) TableName.c_str(), SQL_NTS,
                                      NULL, 0);                               // All columns
             }
             else
                                      NULL, 0);                               // All columns
             }
             else
@@ -2154,7 +2316,7 @@ wxDbColInf *wxDb::GetColumns(wxChar *tableName[], const wxChar *userID)
                 retcode = SQLColumns(hstmt,
                                      NULL, 0,                                // All qualifiers
                                      NULL, 0,                                // Owner
                 retcode = SQLColumns(hstmt,
                                      NULL, 0,                                // All qualifiers
                                      NULL, 0,                                // Owner
-                                     (UCHAR *) TableName.c_str(), SQL_NTS,
+                                     (SQLTCHAR *) TableName.c_str(), SQL_NTS,
                                      NULL, 0);                               // All columns
             }
             if (retcode != SQL_SUCCESS)
                                      NULL, 0);                               // All columns
             }
             if (retcode != SQL_SUCCESS)
@@ -2300,8 +2462,8 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, UWORD *numCols, const wx
         {
             retcode = SQLColumns(hstmt,
                                  NULL, 0,                                // All qualifiers
         {
             retcode = SQLColumns(hstmt,
                                  NULL, 0,                                // All qualifiers
-                                 (UCHAR *) UserID.c_str(), SQL_NTS,    // Owner
-                                 (UCHAR *) TableName.c_str(), SQL_NTS,
+                                 (SQLTCHAR *) UserID.c_str(), SQL_NTS,    // Owner
+                                 (SQLTCHAR *) TableName.c_str(), SQL_NTS,
                                  NULL, 0);                               // All columns
         }
         else
                                  NULL, 0);                               // All columns
         }
         else
@@ -2309,7 +2471,7 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, UWORD *numCols, const wx
             retcode = SQLColumns(hstmt,
                                  NULL, 0,                                 // All qualifiers
                                  NULL, 0,                                 // Owner
             retcode = SQLColumns(hstmt,
                                  NULL, 0,                                 // All qualifiers
                                  NULL, 0,                                 // Owner
-                                 (UCHAR *) TableName.c_str(), SQL_NTS,
+                                 (SQLTCHAR *) TableName.c_str(), SQL_NTS,
                                  NULL, 0);                                // All columns
         }
         if (retcode != SQL_SUCCESS)
                                  NULL, 0);                                // All columns
         }
         if (retcode != SQL_SUCCESS)
@@ -2793,8 +2955,8 @@ int wxDb::GetColumnCount(const wxString &tableName, const wxChar *userID)
     {
         retcode = SQLColumns(hstmt,
                              NULL, 0,                                // All qualifiers
     {
         retcode = SQLColumns(hstmt,
                              NULL, 0,                                // All qualifiers
-                             (UCHAR *) UserID.c_str(), SQL_NTS,      // Owner
-                             (UCHAR *) TableName.c_str(), SQL_NTS,
+                             (SQLTCHAR *) UserID.c_str(), SQL_NTS,      // Owner
+                             (SQLTCHAR *) TableName.c_str(), SQL_NTS,
                              NULL, 0);                               // All columns
     }
     else
                              NULL, 0);                               // All columns
     }
     else
@@ -2802,7 +2964,7 @@ int wxDb::GetColumnCount(const wxString &tableName, const wxChar *userID)
         retcode = SQLColumns(hstmt,
                              NULL, 0,                                // All qualifiers
                              NULL, 0,                                // Owner
         retcode = SQLColumns(hstmt,
                              NULL, 0,                                // All qualifiers
                              NULL, 0,                                // Owner
-                             (UCHAR *) TableName.c_str(), SQL_NTS,
+                             (SQLTCHAR *) TableName.c_str(), SQL_NTS,
                              NULL, 0);                               // All columns
     }
     if (retcode != SQL_SUCCESS)
                              NULL, 0);                               // All columns
     }
     if (retcode != SQL_SUCCESS)
@@ -2853,7 +3015,6 @@ wxDbInf *wxDb::GetCatalog(const wxChar *userID)
  *       to avoid undesired unbinding of columns.
  */
 {
  *       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;
     int      noTab = 0;     // Counter while filling table entries
     int      pass;
     RETCODE  retcode;
@@ -2864,7 +3025,10 @@ wxDbInf *wxDb::GetCatalog(const wxChar *userID)
     convertUserID(userID,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.
     //-------------------------------------------------------------
     // Table Information
     // Pass 1 - Determine how many Tables there are.
@@ -2884,7 +3048,7 @@ wxDbInf *wxDb::GetCatalog(const wxChar *userID)
         {
             retcode = SQLTables(hstmt,
                                 NULL, 0,                             // All qualifiers
         {
             retcode = SQLTables(hstmt,
                                 NULL, 0,                             // All qualifiers
-                                (UCHAR *) UserID.c_str(), SQL_NTS,   // User specified
+                                (SQLTCHAR *) UserID.c_str(), SQL_NTS,   // User specified
                                 NULL, 0,                             // All tables
                                 NULL, 0);                            // All columns
         }
                                 NULL, 0,                             // All tables
                                 NULL, 0);                            // All columns
         }
@@ -2973,7 +3137,7 @@ bool wxDb::Catalog(const wxChar *userID, const wxString &fileName)
     wxChar    typeName[30+1];
     SDWORD    precision, length;
 
     wxChar    typeName[30+1];
     SDWORD    precision, length;
 
-    FILE *fp = fopen(fileName.c_str(),wxT("wt"));
+    FILE *fp = wxFopen(fileName.c_str(),wxT("wt"));
     if (fp == NULL)
         return(FALSE);
 
     if (fp == NULL)
         return(FALSE);
 
@@ -2990,7 +3154,7 @@ bool wxDb::Catalog(const wxChar *userID, const wxString &fileName)
     {
         retcode = SQLColumns(hstmt,
                              NULL, 0,                                // All qualifiers
     {
         retcode = SQLColumns(hstmt,
                              NULL, 0,                                // All qualifiers
-                             (UCHAR *) UserID.c_str(), SQL_NTS,      // User specified
+                             (SQLTCHAR *) UserID.c_str(), SQL_NTS,      // User specified
                              NULL, 0,                                // All tables
                              NULL, 0);                               // All columns
     }
                              NULL, 0,                                // All tables
                              NULL, 0);                               // All columns
     }
@@ -3022,20 +3186,20 @@ bool wxDb::Catalog(const wxChar *userID, const wxString &fileName)
         if (wxStrcmp(tblName, tblNameSave.c_str()))
         {
             if (cnt)
         if (wxStrcmp(tblName, tblNameSave.c_str()))
         {
             if (cnt)
-                fputs(wxT("\n"), fp);
-            fputs(wxT("================================ "), fp);
-            fputs(wxT("================================ "), fp);
-            fputs(wxT("===================== "), fp);
-            fputs(wxT("========= "), fp);
-            fputs(wxT("=========\n"), fp);
+                wxFputs(wxT("\n"), fp);
+            wxFputs(wxT("================================ "), fp);
+            wxFputs(wxT("================================ "), fp);
+            wxFputs(wxT("===================== "), fp);
+            wxFputs(wxT("========= "), fp);
+            wxFputs(wxT("=========\n"), fp);
             outStr.Printf(wxT("%-32s %-32s %-21s %9s %9s\n"),
                 wxT("TABLE NAME"), wxT("COLUMN NAME"), wxT("DATA TYPE"), wxT("PRECISION"), wxT("LENGTH"));
             outStr.Printf(wxT("%-32s %-32s %-21s %9s %9s\n"),
                 wxT("TABLE NAME"), wxT("COLUMN NAME"), wxT("DATA TYPE"), wxT("PRECISION"), wxT("LENGTH"));
-            fputs(outStr.c_str(), fp);
-            fputs(wxT("================================ "), fp);
-            fputs(wxT("================================ "), fp);
-            fputs(wxT("===================== "), fp);
-            fputs(wxT("========= "), fp);
-            fputs(wxT("=========\n"), fp);
+            wxFputs(outStr.c_str(), fp);
+            wxFputs(wxT("================================ "), fp);
+            wxFputs(wxT("================================ "), fp);
+            wxFputs(wxT("===================== "), fp);
+            wxFputs(wxT("========= "), fp);
+            wxFputs(wxT("=========\n"), fp);
             tblNameSave = tblName;
         }
 
             tblNameSave = tblName;
         }
 
@@ -3046,9 +3210,9 @@ bool wxDb::Catalog(const wxChar *userID, const wxString &fileName)
       GetData(7,SQL_C_SLONG, (UCHAR *)&precision,   0,                       &cb);
       GetData(8,SQL_C_SLONG, (UCHAR *)&length,      0,                       &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 %9d %9d\n"),
+        outStr.Printf(wxT("%-32s %-32s (%04d)%-15s %9ld %9ld\n"),
             tblName, colName, sqlDataType, typeName, precision, length);
             tblName, colName, sqlDataType, typeName, precision, length);
-        if (fputs(outStr.c_str(), fp) == EOF)
+        if (wxFputs(outStr.c_str(), fp) == EOF)
         {
             SQLFreeStmt(hstmt, SQL_CLOSE);
             fclose(fp);
         {
             SQLFreeStmt(hstmt, SQL_CLOSE);
             fclose(fp);
@@ -3123,8 +3287,8 @@ bool wxDb::TableExists(const wxString &tableName, const wxChar *userID, const wx
     {
         retcode = SQLTables(hstmt,
                             NULL, 0,                                  // All qualifiers
     {
         retcode = SQLTables(hstmt,
                             NULL, 0,                                  // All qualifiers
-                            (UCHAR *) UserID.c_str(), SQL_NTS,        // Only tables owned by this user
-                            (UCHAR FAR *)TableName.c_str(), SQL_NTS,
+                            (SQLTCHAR *) UserID.c_str(), SQL_NTS,        // Only tables owned by this user
+                            (SQLTCHAR FAR *)TableName.c_str(), SQL_NTS,
                             NULL, 0);                                 // All table types
     }
     else
                             NULL, 0);                                 // All table types
     }
     else
@@ -3132,7 +3296,7 @@ bool wxDb::TableExists(const wxString &tableName, const wxChar *userID, const wx
         retcode = SQLTables(hstmt,
                             NULL, 0,                                  // All qualifiers
                             NULL, 0,                                  // All owners
         retcode = SQLTables(hstmt,
                             NULL, 0,                                  // All qualifiers
                             NULL, 0,                                  // All owners
-                            (UCHAR FAR *)TableName.c_str(), SQL_NTS,
+                            (SQLTCHAR FAR *)TableName.c_str(), SQL_NTS,
                             NULL, 0);                                 // All table types
     }
     if (retcode != SQL_SUCCESS)
                             NULL, 0);                                 // All table types
     }
     if (retcode != SQL_SUCCESS)
@@ -3154,7 +3318,7 @@ bool wxDb::TableExists(const wxString &tableName, const wxChar *userID, const wx
 
 /********** wxDb::TablePrivileges() **********/
 bool wxDb::TablePrivileges(const wxString &tableName, const wxString &priv, const wxChar *userID,
 
 /********** wxDb::TablePrivileges() **********/
 bool wxDb::TablePrivileges(const wxString &tableName, const wxString &priv, const wxChar *userID,
-                            const wxChar *schema, const wxString &tablePath)
+                            const wxChar *schema, const wxString &WXUNUSED(tablePath))
 {
     wxASSERT(tableName.Length());
 
 {
     wxASSERT(tableName.Length());
 
@@ -3190,19 +3354,19 @@ bool wxDb::TablePrivileges(const wxString &tableName, const wxString &priv, cons
     {
         retcode = SQLTablePrivileges(hstmt,
                                      NULL, 0,                                    // Catalog
     {
         retcode = SQLTablePrivileges(hstmt,
                                      NULL, 0,                                    // Catalog
-                                     (UCHAR FAR *)Schema.c_str(), SQL_NTS,               // Schema
-                                     (UCHAR FAR *)TableName.c_str(), SQL_NTS);
+                                     (SQLTCHAR FAR *)Schema.c_str(), SQL_NTS,               // Schema
+                                     (SQLTCHAR FAR *)TableName.c_str(), SQL_NTS);
     }
     else
     {
         retcode = SQLTablePrivileges(hstmt,
                                      NULL, 0,                                    // Catalog
                                      NULL, 0,                                    // Schema
     }
     else
     {
         retcode = SQLTablePrivileges(hstmt,
                                      NULL, 0,                                    // Catalog
                                      NULL, 0,                                    // Schema
-                                     (UCHAR FAR *)TableName.c_str(), SQL_NTS);
+                                     (SQLTCHAR FAR *)TableName.c_str(), SQL_NTS);
     }
 
 #ifdef DBDEBUG_CONSOLE
     }
 
 #ifdef DBDEBUG_CONSOLE
-    fprintf(stderr ,wxT("SQLTablePrivileges() returned %i \n"),retcode);
+    wxFprintf(stderr ,wxT("SQLTablePrivileges() returned %i \n"),retcode);
 #endif
 
     if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO))
 #endif
 
     if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO))
@@ -3238,7 +3402,7 @@ bool wxDb::TablePrivileges(const wxString &tableName, const wxString &priv, cons
             return(DispAllErrors(henv, hdbc, hstmt));
         }
 #ifdef DBDEBUG_CONSOLE
             return(DispAllErrors(henv, hdbc, hstmt));
         }
 #ifdef DBDEBUG_CONSOLE
-        fprintf(stderr,wxT("Scanning %s privilege on table %s.%s granted by %s to %s\n"),
+        wxFprintf(stderr,wxT("Scanning %s privilege on table %s.%s granted by %s to %s\n"),
                 result.privilege,result.tableOwner,result.tableName,
                 result.grantor, result.grantee);
 #endif
                 result.privilege,result.tableOwner,result.tableName,
                 result.grantor, result.grantee);
 #endif
@@ -3277,10 +3441,10 @@ const wxString wxDb::SQLTableName(const wxChar *tableName)
     wxString TableName;
 
     if (Dbms() == dbmsACCESS)
     wxString TableName;
 
     if (Dbms() == dbmsACCESS)
-        TableName = '"';
+        TableName = _T("\"");
     TableName += tableName;
     if (Dbms() == dbmsACCESS)
     TableName += tableName;
     if (Dbms() == dbmsACCESS)
-        TableName += '"';
+        TableName += _T("\"");
 
     return TableName;
 }  // wxDb::SQLTableName()
 
     return TableName;
 }  // wxDb::SQLTableName()
@@ -3291,10 +3455,10 @@ const wxString wxDb::SQLColumnName(const wxChar *colName)
     wxString ColName;
 
     if (Dbms() == dbmsACCESS)
     wxString ColName;
 
     if (Dbms() == dbmsACCESS)
-        ColName = '"';
+        ColName = _T("\"");
     ColName += colName;
     if (Dbms() == dbmsACCESS)
     ColName += colName;
     if (Dbms() == dbmsACCESS)
-        ColName += '"';
+        ColName += _T("\"");
 
     return ColName;
 }  // wxDb::SQLColumnName()
 
     return ColName;
 }  // wxDb::SQLColumnName()
@@ -3310,7 +3474,7 @@ bool wxDb::SetSqlLogging(wxDbSqlLogState state, const wxString &filename, bool a
     {
         if (fpSqlLog == 0)
         {
     {
         if (fpSqlLog == 0)
         {
-            fpSqlLog = fopen(filename, (append ? wxT("at") : wxT("wt")));
+            fpSqlLog = wxFopen(filename, (append ? wxT("at") : wxT("wt")));
             if (fpSqlLog == NULL)
                 return(FALSE);
         }
             if (fpSqlLog == NULL)
                 return(FALSE);
         }
@@ -3339,11 +3503,11 @@ bool wxDb::WriteSqlLog(const wxString &logMsg)
     if (fpSqlLog == 0 || sqlLogState == sqlLogOFF)
         return(FALSE);
 
     if (fpSqlLog == 0 || sqlLogState == sqlLogOFF)
         return(FALSE);
 
-    if (fputs(wxT("\n"),   fpSqlLog) == EOF)
+    if (wxFputs(wxT("\n"),   fpSqlLog) == EOF)
         return(FALSE);
         return(FALSE);
-    if (fputs(logMsg, fpSqlLog) == EOF)
+    if (wxFputs(logMsg, fpSqlLog) == EOF)
         return(FALSE);
         return(FALSE);
-    if (fputs(wxT("\n"),   fpSqlLog) == EOF)
+    if (wxFputs(wxT("\n"),   fpSqlLog) == EOF)
         return(FALSE);
 
     return(TRUE);
         return(FALSE);
 
     return(TRUE);
@@ -3451,13 +3615,13 @@ wxDBMS wxDb::Dbms(void)
 
     if (!wxStricmp(dbInf.dbmsName,wxT("Microsoft SQL Server")))
         return((wxDBMS)(dbmsType = dbmsMS_SQL_SERVER));
 
     if (!wxStricmp(dbInf.dbmsName,wxT("Microsoft SQL Server")))
         return((wxDBMS)(dbmsType = dbmsMS_SQL_SERVER));
-    if (!wxStricmp(dbInf.dbmsName,wxT("MySQL")))
-        return((wxDBMS)(dbmsType = dbmsMY_SQL));
-    if (!wxStricmp(dbInf.dbmsName,wxT("PostgreSQL")))  // v6.5.0
+
+    baseName[10] = 0;
+    if (!wxStricmp(baseName,wxT("PostgreSQL")))  // v6.5.0
         return((wxDBMS)(dbmsType = dbmsPOSTGRES));
 
     baseName[9] = 0;
         return((wxDBMS)(dbmsType = dbmsPOSTGRES));
 
     baseName[9] = 0;
-    if (!wxStricmp(dbInf.dbmsName,wxT("Pervasive")))
+    if (!wxStricmp(baseName,wxT("Pervasive")))
         return((wxDBMS)(dbmsType = dbmsPERVASIVE_SQL));
 
     baseName[8] = 0;
         return((wxDBMS)(dbmsType = dbmsPERVASIVE_SQL));
 
     baseName[8] = 0;
@@ -3467,16 +3631,18 @@ wxDBMS wxDb::Dbms(void)
     baseName[6] = 0;
     if (!wxStricmp(baseName,wxT("Oracle")))
         return((wxDBMS)(dbmsType = dbmsORACLE));
     baseName[6] = 0;
     if (!wxStricmp(baseName,wxT("Oracle")))
         return((wxDBMS)(dbmsType = dbmsORACLE));
-    if (!wxStricmp(dbInf.dbmsName,wxT("ACCESS")))
+    if (!wxStricmp(baseName,wxT("ACCESS")))
         return((wxDBMS)(dbmsType = dbmsACCESS));
         return((wxDBMS)(dbmsType = dbmsACCESS));
-    if (!wxStricmp(dbInf.dbmsName,wxT("MySQL")))
-        return((wxDBMS)(dbmsType = dbmsMY_SQL));
     if (!wxStricmp(baseName,wxT("Sybase")))
       return((wxDBMS)(dbmsType = dbmsSYBASE_ASE));
 
     baseName[5] = 0;
     if (!wxStricmp(baseName,wxT("DBASE")))
         return((wxDBMS)(dbmsType = dbmsDBASE));
     if (!wxStricmp(baseName,wxT("Sybase")))
       return((wxDBMS)(dbmsType = dbmsSYBASE_ASE));
 
     baseName[5] = 0;
     if (!wxStricmp(baseName,wxT("DBASE")))
         return((wxDBMS)(dbmsType = dbmsDBASE));
+    if (!wxStricmp(baseName,wxT("xBase")))
+        return((wxDBMS)(dbmsType = dbmsXBASE_SEQUITER));
+    if (!wxStricmp(baseName,wxT("MySQL")))
+        return((wxDBMS)(dbmsType = dbmsMY_SQL));
 
     baseName[3] = 0;
     if (!wxStricmp(baseName,wxT("DB2")))
 
     baseName[3] = 0;
     if (!wxStricmp(baseName,wxT("DB2")))
@@ -3529,10 +3695,10 @@ bool wxDb::ModifyColumn(const wxString &tableName, const wxString &columnName,
     switch (Dbms())
     {
         case dbmsORACLE :
     switch (Dbms())
     {
         case dbmsORACLE :
-            alterSlashModify = "MODIFY";
+            alterSlashModify = _T("MODIFY");
             break;
         case dbmsMS_SQL_SERVER :
             break;
         case dbmsMS_SQL_SERVER :
-            alterSlashModify = "ALTER COLUMN";
+            alterSlashModify = _T("ALTER COLUMN");
             break;
         case dbmsUNIDENTIFIED :
             return FALSE;
             break;
         case dbmsUNIDENTIFIED :
             return FALSE;
@@ -3542,20 +3708,30 @@ bool wxDb::ModifyColumn(const wxString &tableName, const wxString &columnName,
         case dbmsPOSTGRES :
         case dbmsACCESS :
         case dbmsDBASE :
         case dbmsPOSTGRES :
         case dbmsACCESS :
         case dbmsDBASE :
+        case dbmsXBASE_SEQUITER :
         default :
         default :
-            alterSlashModify = "MODIFY";
+            alterSlashModify = _T("MODIFY");
             break;
     }
 
     // create the SQL statement
             break;
     }
 
     // create the SQL statement
-    sqlStmt.Printf(wxT("ALTER TABLE \"%s\" \"%s\" \"%s\" %s"), tableName.c_str(), alterSlashModify.c_str(),
+    if ( Dbms() == dbmsMY_SQL )
+    {
+        sqlStmt.Printf(wxT("ALTER TABLE %s %s %s %s"), tableName.c_str(), alterSlashModify.c_str(),
               columnName.c_str(), dataTypeName.c_str());
               columnName.c_str(), dataTypeName.c_str());
+    }
+    else
+    {
+        sqlStmt.Printf(wxT("ALTER TABLE \"%s\" \"%s\" \"%s\" %s"), tableName.c_str(), alterSlashModify.c_str(),
+              columnName.c_str(), dataTypeName.c_str());
+    }
 
     // For varchars only, append the size of the column
 
     // For varchars only, append the size of the column
-    if (dataType == DB_DATA_TYPE_VARCHAR)
+    if (dataType == DB_DATA_TYPE_VARCHAR &&
+        (Dbms() != dbmsMY_SQL || dataTypeName != _T("text")))
     {
         wxString s;
     {
         wxString s;
-        s.Printf(wxT("(%d)"), columnLength);
+        s.Printf(wxT("(%lu)"), columnLength);
         sqlStmt += s;
     }
 
         sqlStmt += s;
     }
 
@@ -3572,7 +3748,7 @@ bool wxDb::ModifyColumn(const wxString &tableName, const wxString &columnName,
 
 
 /********** wxDbGetConnection() **********/
 
 
 /********** wxDbGetConnection() **********/
-wxDb WXDLLEXPORT *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnlyCursors)
+wxDb WXDLLIMPEXP_ODBC *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnlyCursors)
 {
     wxDbList *pList;
 
 {
     wxDbList *pList;
 
@@ -3630,7 +3806,7 @@ wxDb WXDLLEXPORT *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnlyCurso
 
     pList->PtrDb = new wxDb(pDbConfig->GetHenv(), FwdOnlyCursors);
 
 
     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 (!matchingDbConnection)
         opened = pList->PtrDb->Open(pDbConfig->GetDsn(), pDbConfig->GetUserID(), pDbConfig->GetPassword());
@@ -3661,7 +3837,7 @@ wxDb WXDLLEXPORT *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnlyCurso
 
 
 /********** wxDbFreeConnection() **********/
 
 
 /********** wxDbFreeConnection() **********/
-bool WXDLLEXPORT wxDbFreeConnection(wxDb *pDb)
+bool WXDLLIMPEXP_ODBC wxDbFreeConnection(wxDb *pDb)
 {
     wxDbList *pList;
 
 {
     wxDbList *pList;
 
@@ -3679,7 +3855,7 @@ bool WXDLLEXPORT wxDbFreeConnection(wxDb *pDb)
 
 
 /********** wxDbCloseConnections() **********/
 
 
 /********** wxDbCloseConnections() **********/
-void WXDLLEXPORT wxDbCloseConnections(void)
+void WXDLLIMPEXP_ODBC wxDbCloseConnections(void)
 {
     wxDbList *pList, *pNext;
 
 {
     wxDbList *pList, *pNext;
 
@@ -3701,7 +3877,7 @@ void WXDLLEXPORT wxDbCloseConnections(void)
 
 
 /********** wxDbConnectionsInUse() **********/
 
 
 /********** wxDbConnectionsInUse() **********/
-int WXDLLEXPORT wxDbConnectionsInUse(void)
+int WXDLLIMPEXP_ODBC wxDbConnectionsInUse(void)
 {
     wxDbList *pList;
     int cnt = 0;
 {
     wxDbList *pList;
     int cnt = 0;
@@ -3721,7 +3897,7 @@ int WXDLLEXPORT wxDbConnectionsInUse(void)
 
 /********** wxDbLogExtendedErrorMsg() **********/
 // DEBUG ONLY function
 
 /********** wxDbLogExtendedErrorMsg() **********/
 // DEBUG ONLY function
-const wxChar WXDLLEXPORT *wxDbLogExtendedErrorMsg(const wxChar *userText,
+const wxChar WXDLLIMPEXP_ODBC *wxDbLogExtendedErrorMsg(const wxChar *userText,
                                                   wxDb *pDb,
                                                   const wxChar *ErrFile,
                                                   int ErrLine)
                                                   wxDb *pDb,
                                                   const wxChar *ErrFile,
                                                   int ErrLine)
@@ -3880,8 +4056,8 @@ bool wxDbGetDataSource(HENV henv, wxChar *Dsn, SWORD DsnMax, wxChar *DsDesc,
 {
     SWORD cb1,cb2;
 
 {
     SWORD cb1,cb2;
 
-    if (SQLDataSources(henv, direction, (UCHAR FAR *) Dsn, DsnMax, &cb1,
-                             (UCHAR FAR *) DsDesc, DsDescMax, &cb2) == SQL_SUCCESS)
+    if (SQLDataSources(henv, direction, (SQLTCHAR FAR *) Dsn, DsnMax, &cb1,
+                             (SQLTCHAR FAR *) DsDesc, DsDescMax, &cb2) == SQL_SUCCESS)
         return(TRUE);
     else
         return(FALSE);
         return(TRUE);
     else
         return(FALSE);
@@ -3910,22 +4086,22 @@ bool GetDataSource(HENV henv, char *Dsn, SWORD DsnMax, char *DsDesc, SWORD DsDes
     return wxDbGetDataSource(henv, Dsn, DsnMax, DsDesc, DsDescMax, direction);
 }
 /***** DEPRECATED: use wxDbGetConnection() *****/
     return wxDbGetDataSource(henv, Dsn, DsnMax, DsDesc, DsDescMax, direction);
 }
 /***** DEPRECATED: use wxDbGetConnection() *****/
-wxDb WXDLLEXPORT *GetDbConnection(DbStuff *pDbStuff, bool FwdOnlyCursors)
+wxDb WXDLLIMPEXP_ODBC *GetDbConnection(DbStuff *pDbStuff, bool FwdOnlyCursors)
 {
     return wxDbGetConnection((wxDbConnectInf *)pDbStuff, FwdOnlyCursors);
 }
 /***** DEPRECATED: use wxDbFreeConnection() *****/
 {
     return wxDbGetConnection((wxDbConnectInf *)pDbStuff, FwdOnlyCursors);
 }
 /***** DEPRECATED: use wxDbFreeConnection() *****/
-bool WXDLLEXPORT FreeDbConnection(wxDb *pDb)
+bool WXDLLIMPEXP_ODBC FreeDbConnection(wxDb *pDb)
 {
     return wxDbFreeConnection(pDb);
 }
 /***** DEPRECATED: use wxDbCloseConnections() *****/
 {
     return wxDbFreeConnection(pDb);
 }
 /***** DEPRECATED: use wxDbCloseConnections() *****/
-void WXDLLEXPORT CloseDbConnections(void)
+void WXDLLIMPEXP_ODBC CloseDbConnections(void)
 {
     wxDbCloseConnections();
 }
 /***** DEPRECATED: use wxDbConnectionsInUse() *****/
 {
     wxDbCloseConnections();
 }
 /***** DEPRECATED: use wxDbConnectionsInUse() *****/
-int WXDLLEXPORT NumberDbConnectionsInUse(void)
+int WXDLLIMPEXP_ODBC NumberDbConnectionsInUse(void)
 {
     return wxDbConnectionsInUse();
 }
 {
     return wxDbConnectionsInUse();
 }