]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/db.cpp
some wxArtProv docs
[wxWidgets.git] / src / common / db.cpp
index a4717bd38003c29f559a7ae4b0774289cc176f10..15160d59514e31454a27b222fbc636ce1c8a69f4 100644 (file)
@@ -53,7 +53,9 @@
     #include "wx/object.h"
     #include "wx/list.h"
     #include "wx/utils.h"
-    #include "wx/msgdlg.h"
+    #if wxUSE_GUI
+        #include "wx/msgdlg.h"
+    #endif
     #include "wx/log.h"
 #endif
 #include "wx/filefn.h"
@@ -113,7 +115,7 @@ typedef struct
 wxDbConnectInf::wxDbConnectInf()
 {
     Henv = 0;
-    freeHenvOnDestroy = false;
+    freeHenvOnDestroy = FALSE;
 
     Initialize();
 }  // Constructor
@@ -125,7 +127,7 @@ wxDbConnectInf::wxDbConnectInf(HENV henv, const wxString &dsn, const wxString &u
                        const wxString &fileType, const wxString &description)
 {
     Henv = 0;
-    freeHenvOnDestroy = false;
+    freeHenvOnDestroy = FALSE;
 
     Initialize();
 
@@ -156,7 +158,7 @@ wxDbConnectInf::~wxDbConnectInf()
 /********** wxDbConnectInf::Initialize() **********/
 bool wxDbConnectInf::Initialize()
 {
-    freeHenvOnDestroy = false;
+    freeHenvOnDestroy = FALSE;
 
     if (freeHenvOnDestroy && Henv)
         FreeHenv();
@@ -169,7 +171,7 @@ bool wxDbConnectInf::Initialize()
     FileType.Empty();
     DefaultDir.Empty();
 
-    return true;
+    return TRUE;
 }  // wxDbConnectInf::Initialize()
 
 
@@ -184,12 +186,12 @@ bool wxDbConnectInf::AllocHenv()
     if (SQLAllocEnv(&Henv) != SQL_SUCCESS)
     {
         wxLogDebug(wxT("A problem occured while trying to get a connection to the data source"));
-        return false;
+        return FALSE;
     }
 
-    freeHenvOnDestroy = true;
+    freeHenvOnDestroy = TRUE;
 
-    return true;
+    return TRUE;
 }  // wxDbConnectInf::AllocHenv()
 
 
@@ -201,7 +203,7 @@ void wxDbConnectInf::FreeHenv()
         SQLFreeEnv(Henv);
 
     Henv = 0;
-    freeHenvOnDestroy = false;
+    freeHenvOnDestroy = FALSE;
 
 }  // wxDbConnectInf::FreeHenv()
 
@@ -347,7 +349,7 @@ int wxDbColFor::Format(int Nation, int dbDataType, SWORD sqlDataType,
             s_Field.Printf(wxT("Unknown Format(%d)-SQL(%d)"),dbDataType,sqlDataType);        //
             break;
     };
-    return true;
+    return TRUE;
 }  // wxDbColFor::Format()
 
 
@@ -389,7 +391,7 @@ bool wxDbColInf::Initialize()
     FkTableName[0]  = 0;
     pColFor         = NULL;
 
-    return true;
+    return TRUE;
 }  // wxDbColInf::Initialize()
 
 
@@ -417,7 +419,7 @@ bool wxDbTableInf::Initialize()
     numCols         = 0;
     pColInf         = NULL;
 
-    return true;
+    return TRUE;
 }  // wxDbTableInf::Initialize()
 
 
@@ -445,7 +447,7 @@ bool wxDbInf::Initialize()
     numTables       = 0;
     pTableInf       = NULL;
 
-    return true;
+    return TRUE;
 }  // wxDbInf::Initialize()
 
 
@@ -526,7 +528,7 @@ void wxDb::initialize()
     typeInfBlob.MaximumScale  = 0;
 
     // Error reporting is turned OFF by default
-    silent = true;
+    silent = TRUE;
 
     // Allocate a data source connection handle
     if (SQLAllocConnect(henv, &hdbc) != SQL_SUCCESS)
@@ -536,8 +538,8 @@ void wxDb::initialize()
     DB_STATUS = 0;
 
     // Mark database as not open as of yet
-    dbIsOpen = false;
-    dbIsCached = false;
+    dbIsOpen = FALSE;
+    dbIsCached = FALSE;
 }  // wxDb::initialize()
 
 
@@ -573,7 +575,7 @@ const wxChar *wxDb::convertUserID(const wxChar *userID, wxString &UserID)
 
 
 /********** 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;
@@ -601,15 +603,6 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
                          (UCHAR FAR *) uid.c_str(), SQL_NTS,
                          (UCHAR FAR *) authStr.c_str(), SQL_NTS);
 
-/*
-    if (retcode == SQL_SUCCESS_WITH_INFO)
-        DispAllErrors(henv, hdbc);
-    else if (retcode != SQL_SUCCESS)
-        return(DispAllErrors(henv, hdbc));
-
-    if (retcode == SQL_ERROR)
-        return(DispAllErrors(henv, hdbc));
-*/
     if ((retcode != SQL_SUCCESS) &&
         (retcode != SQL_SUCCESS_WITH_INFO))
         return(DispAllErrors(henv, hdbc));
@@ -623,7 +616,7 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
 */
 
     // Mark database as open
-    dbIsOpen = true;
+    dbIsOpen = TRUE;
 
     // Allocate a statement handle for the database connection
     if (SQLAllocStmt(hdbc, &hstmt) != SQL_SUCCESS)
@@ -631,11 +624,11 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
 
     // Set Connection Options
     if (!setConnectionOptions())
-        return(false);
+        return(FALSE);
 
     // Query the data source for inf. about itself
     if (!getDbInfo())
-        return(false);
+        return(FALSE);
 
     // Query the data source regarding data type information
 
@@ -681,7 +674,7 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
     // VARCHAR = Variable length character string
     if (!getDataTypeInfo(SQL_VARCHAR, typeInfVarchar))
         if (!getDataTypeInfo(SQL_CHAR, typeInfVarchar))
-            return(false);
+            return(FALSE);
         else
             typeInfVarchar.FsqlType = SQL_CHAR;
     else
@@ -693,7 +686,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))
-                        return(false);
+                    {
+                        if (failOnDataTypeUnsupported)
+                            return(FALSE);
+                    }
                     else
                         typeInfFloat.FsqlType = SQL_NUMERIC;
                 else
@@ -711,7 +707,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))
-            return(false);
+        {
+            if (failOnDataTypeUnsupported)
+                return(FALSE);
+        }
         else
             typeInfInteger.FsqlType = typeInfFloat.FsqlType;
     }
@@ -719,25 +718,36 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
         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))
-            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_TIMESTAMP;
+
 
     if (!getDataTypeInfo(SQL_LONGVARBINARY, typeInfBlob))
     {
         if (!getDataTypeInfo(SQL_VARBINARY,typeInfBlob))
-            return(false);
+        {
+            if (failOnDataTypeUnsupported)
+                return(FALSE);
+        }
         else
             typeInfBlob.FsqlType = SQL_VARBINARY;
     }
@@ -756,7 +766,7 @@ bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthSt
 #endif
 
     // Completed Successfully
-    return(true);
+    return(TRUE);
 
 } // wxDb::Open()
 
@@ -807,7 +817,7 @@ bool wxDb::Open(wxDb *copyDb)
 */
 
     // Mark database as open
-    dbIsOpen = true;
+    dbIsOpen = TRUE;
 
     // Allocate a statement handle for the database connection
     if (SQLAllocStmt(hdbc, &hstmt) != SQL_SUCCESS)
@@ -815,7 +825,7 @@ bool wxDb::Open(wxDb *copyDb)
 
     // Set Connection Options
     if (!setConnectionOptions())
-        return(false);
+        return(FALSE);
 
     // Instead of Querying the data source for info about itself, it can just be copied
     // from the wxDb instance that was passed in (copyDb).
@@ -896,7 +906,7 @@ bool wxDb::Open(wxDb *copyDb)
 #endif
 
     // Completed Successfully
-    return(true);
+    return(TRUE);
 } // wxDb::Open() 2
 
 
@@ -963,7 +973,7 @@ bool wxDb::setConnectionOptions(void)
 #endif
 
     // Completed Successfully
-    return(true);
+    return(TRUE);
 
 } // wxDb::setConnectionOptions()
 
@@ -1273,7 +1283,7 @@ bool wxDb::getDbInfo(void)
 #endif
 
     // Completed Successfully
-    return(true);
+    return(TRUE);
 
 } // wxDb::getDbInfo()
 
@@ -1293,8 +1303,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));
+
     // 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)
@@ -1302,10 +1314,11 @@ bool wxDb::getDataTypeInfo(SWORD fSqlType, wxDbSqlTypeInfo &structSQLTypeInfo)
 #endif
         DispAllErrors(henv, hdbc, hstmt);
         SQLFreeStmt(hstmt, SQL_CLOSE);
-        return(false);
+        return(FALSE);
     }
 
     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));
@@ -1358,7 +1371,7 @@ bool wxDb::getDataTypeInfo(SWORD fSqlType, wxDbSqlTypeInfo &structSQLTypeInfo)
         return(DispAllErrors(henv, hdbc, hstmt));
 
     // Completed Successfully
-    return(true);
+    return(TRUE);
 
 } // wxDb::getDataTypeInfo()
 
@@ -1403,7 +1416,7 @@ void wxDb::Close(void)
         {
             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,s2);
+            wxLogDebug (s.c_str(),s2.c_str());
         }
         pNode = pNode->Next();
     }
@@ -1415,7 +1428,7 @@ void wxDb::Close(void)
         wxStrcpy(DBerrorList[i], errorList[i]);
 
     dbmsType = dbmsUNIDENTIFIED;
-    dbIsOpen = false;
+    dbIsOpen = FALSE;
 
 } // wxDb::Close()
 
@@ -1431,7 +1444,7 @@ bool wxDb::CommitTrans(void)
     }
 
     // Completed successfully
-    return(true);
+    return(TRUE);
 
 } // wxDb::CommitTrans()
 
@@ -1444,7 +1457,7 @@ bool wxDb::RollbackTrans(void)
         return(DispAllErrors(henv, hdbc));
 
     // Completed successfully
-    return(true);
+    return(TRUE);
 
 } // wxDb::RollbackTrans()
 
@@ -1461,7 +1474,7 @@ bool wxDb::DispAllErrors(HENV aHenv, HDBC aHdbc, HSTMT aHstmt)
  * If in DBDEBUG_CONSOLE mode, the constructed string will be displayed in the console
  * window and program execution will be paused until the user presses a key.
  *
- * This function always returns a false, so that functions which call this function
+ * This function always returns a FALSE, so that functions which call this function
  * can have a line like "return (DispAllErrors(henv, hdbc));" to indicate the failure
  * of the users request, so that the calling code can then process the error msg log
  */
@@ -1487,7 +1500,7 @@ bool wxDb::DispAllErrors(HENV aHenv, HDBC aHdbc, HSTMT aHstmt)
         }
     }
 
-    return(false);  // This function always returns false.
+    return(FALSE);  // This function always returns FALSE.
 
 } // wxDb::DispAllErrors()
 
@@ -1496,9 +1509,9 @@ bool wxDb::DispAllErrors(HENV aHenv, HDBC aHdbc, HSTMT aHstmt)
 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)
-        return(true);
+        return(TRUE);
     else
-        return(false);
+        return(FALSE);
 
 } // wxDb::GetNextError()
 
@@ -1782,7 +1795,7 @@ bool wxDb::Grant(int privileges, const wxString &tableName, const wxString &user
     }
 
     sqlStmt += wxT(" ON ");
-    sqlStmt += tableName;
+    sqlStmt += SQLTableName(tableName);
     sqlStmt += wxT(" TO ");
     sqlStmt += userList;
 
@@ -1805,7 +1818,7 @@ bool wxDb::CreateView(const wxString &viewName, const wxString &colList,
 
     // Drop the view first
     if (attemptDrop && !DropView(viewName))
-        return false;
+        return FALSE;
 
     // Build the create view statement
     sqlStmt  = wxT("CREATE VIEW ");
@@ -1836,7 +1849,7 @@ bool wxDb::CreateView(const wxString &viewName, const wxString &colList,
 bool wxDb::DropView(const wxString &viewName)
 {
 /*
- * NOTE: This function returns true if the View does not exist, but
+ * NOTE: This function returns TRUE if the View does not exist, but
  *       only for identified databases.  Code will need to be added
  *            below for any other databases when those databases are defined
  *       to handle this situation consistently
@@ -1863,16 +1876,16 @@ bool wxDb::DropView(const wxString &viewName)
                 DispNextError();
                 DispAllErrors(henv, hdbc, hstmt);
                 RollbackTrans();
-                return(false);
+                return(FALSE);
             }
         }
     }
 
     // Commit the transaction
     if (!CommitTrans())
-        return(false);
+        return(FALSE);
 
-    return true;
+    return TRUE;
 
 }  // wxDb::DropView()
 
@@ -1888,12 +1901,12 @@ bool wxDb::ExecSql(const wxString &pSqlStmt)
     if (retcode == SQL_SUCCESS ||
         (Dbms() == dbmsDB2 && (retcode == SQL_SUCCESS_WITH_INFO || retcode == SQL_NO_DATA_FOUND)))
     {
-        return(true);
+        return(TRUE);
     }
     else
     {
         DispAllErrors(henv, hdbc, hstmt);
-        return(false);
+        return(FALSE);
     }
 
 }  // wxDb::ExecSql()
@@ -1903,11 +1916,11 @@ bool wxDb::ExecSql(const wxString &pSqlStmt)
 bool wxDb::GetNext(void)
 {
     if (SQLFetch(hstmt) == SQL_SUCCESS)
-        return(true);
+        return(TRUE);
     else
     {
         DispAllErrors(henv, hdbc, hstmt);
-        return(false);
+        return(FALSE);
     }
 
 }  // wxDb::GetNext()
@@ -1920,11 +1933,11 @@ bool wxDb::GetData(UWORD colNo, SWORD cType, PTR pData, SDWORD maxLen, SDWORD FA
     wxASSERT(cbReturned);
 
     if (SQLGetData(hstmt, colNo, cType, pData, maxLen, cbReturned) == SQL_SUCCESS)
-        return(true);
+        return(TRUE);
     else
     {
         DispAllErrors(henv, hdbc, hstmt);
-        return(false);
+        return(FALSE);
     }
 
 }  // wxDb::GetData()
@@ -2064,7 +2077,7 @@ int wxDb::GetKeyFields(const wxString &tableName, wxDbColInf* colInf, UWORD noCo
     }  // while
     SQLFreeStmt(hstmt, SQL_CLOSE);  /* Close the cursor (the hstmt is still allocated). */
 
-    return true;
+    return TRUE;
 
 }  // wxDb::GetKeyFields()
 
@@ -2685,7 +2698,7 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh
     // Build a generic SELECT statement which returns 0 rows
     wxString Stmt;
 
-    Stmt.Printf(wxT("select * from %s where 0=1"), tableName);
+    Stmt.Printf(wxT("select * from \"%s\" where 0=1"), tableName);
 
     // Execute query
     if (SQLExecDirect(hstmt, (UCHAR FAR *) Stmt.c_str(), SQL_NTS) != SQL_SUCCESS)
@@ -2757,7 +2770,7 @@ wxDbColInf *wxDb::GetColumns(const wxString &tableName, int *numCols, const wxCh
 
 
 /********** wxDb::GetColumnCount() **********/
-UWORD wxDb::GetColumnCount(const wxString &tableName, const wxChar *userID)
+int wxDb::GetColumnCount(const wxString &tableName, const wxChar *userID)
 /*
  * Returns a count of how many columns are in a table.
  * If an error occurs in computing the number of columns
@@ -2978,11 +2991,11 @@ bool wxDb::Catalog(const wxChar *userID, const wxString &fileName)
     wxChar    colName[DB_MAX_COLUMN_NAME_LEN+1];
     SWORD     sqlDataType;
     wxChar    typeName[30+1];
-    SWORD     precision, length;
+    SDWORD    precision, length;
 
     FILE *fp = fopen(fileName.c_str(),wxT("wt"));
     if (fp == NULL)
-        return(false);
+        return(FALSE);
 
     SQLFreeStmt(hstmt, SQL_CLOSE);
 
@@ -3013,15 +3026,19 @@ bool wxDb::Catalog(const wxChar *userID, const wxString &fileName)
     {
         DispAllErrors(henv, hdbc, hstmt);
         fclose(fp);
-        return(false);
+        return(FALSE);
     }
 
     wxString outStr;
     tblNameSave.Empty();
     int cnt = 0;
 
-    while ((retcode = SQLFetch(hstmt)) == SQL_SUCCESS)
+    while (TRUE)
     {
+        retcode = SQLFetch(hstmt);
+        if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
+            break;
+
         if (wxStrcmp(tblName, tblNameSave.c_str()))
         {
             if (cnt)
@@ -3042,12 +3059,12 @@ 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_SSHORT,(UCHAR *)&precision,  0,                       &cb);
-      GetData(8,SQL_C_SSHORT,(UCHAR *)&length,     0,                       &cb);
+      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 %9d %9d\n"),
             tblName, colName, sqlDataType, typeName, precision, length);
@@ -3055,7 +3072,7 @@ bool wxDb::Catalog(const wxChar *userID, const wxString &fileName)
         {
             SQLFreeStmt(hstmt, SQL_CLOSE);
             fclose(fp);
-            return(false);
+            return(FALSE);
         }
         cnt++;
     }
@@ -3073,7 +3090,7 @@ bool wxDb::Catalog(const wxChar *userID, const wxString &fileName)
 
 bool wxDb::TableExists(const wxString &tableName, const wxChar *userID, const wxString &tablePath)
 /*
- * Table name can refer to a table, view, alias or synonym.  Returns true
+ * Table name can refer to a table, view, alias or synonym.  Returns TRUE
  * if the object exists in the database.  This function does not indicate
  * whether or not the user has privleges to query or perform other functions
  * on the table.
@@ -3150,7 +3167,7 @@ bool wxDb::TableExists(const wxString &tableName, const wxChar *userID, const wx
 
     SQLFreeStmt(hstmt, SQL_CLOSE);
 
-    return(true);
+    return(TRUE);
 
 }  // wxDb::TableExists()
 
@@ -3211,30 +3228,30 @@ bool wxDb::TablePrivileges(const wxString &tableName, const wxString &priv, cons
     if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO))
         return(DispAllErrors(henv, hdbc, hstmt));
 
-    bool failed = false;
+    bool failed = FALSE;
     retcode = SQLFetch(hstmt);
     while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
     {
         if (SQLGetData(hstmt, 1, SQL_C_CHAR, (UCHAR*) result.tableQual, sizeof(result.tableQual), &cbRetVal) != SQL_SUCCESS)
-            failed = true;
+            failed = TRUE;
 
         if (!failed && SQLGetData(hstmt, 2, SQL_C_CHAR, (UCHAR*) result.tableOwner, sizeof(result.tableOwner), &cbRetVal) != SQL_SUCCESS)
-            failed = true;
+            failed = TRUE;
 
         if (!failed && SQLGetData(hstmt, 3, SQL_C_CHAR, (UCHAR*) result.tableName, sizeof(result.tableName), &cbRetVal) != SQL_SUCCESS)
-            failed = true;
+            failed = TRUE;
 
         if (!failed && SQLGetData(hstmt, 4, SQL_C_CHAR, (UCHAR*) result.grantor, sizeof(result.grantor), &cbRetVal) != SQL_SUCCESS)
-            failed = true;
+            failed = TRUE;
 
         if (!failed && SQLGetData(hstmt, 5, SQL_C_CHAR, (UCHAR*) result.grantee, sizeof(result.grantee), &cbRetVal) != SQL_SUCCESS)
-            failed = true;
+            failed = TRUE;
 
         if (!failed && SQLGetData(hstmt, 6, SQL_C_CHAR, (UCHAR*) result.privilege, sizeof(result.privilege), &cbRetVal) != SQL_SUCCESS)
-            failed = true;
+            failed = TRUE;
 
         if (!failed && SQLGetData(hstmt, 7, SQL_C_CHAR, (UCHAR*) result.grantable, sizeof(result.grantable), &cbRetVal) != SQL_SUCCESS)
-            failed = true;
+            failed = TRUE;
 
         if (failed)
         {
@@ -3246,35 +3263,63 @@ bool wxDb::TablePrivileges(const wxString &tableName, const wxString &priv, cons
                 result.grantor, result.grantee);
 #endif
 
-        if (UserID.IsSameAs(result.tableOwner,false))
+        if (UserID.IsSameAs(result.tableOwner,FALSE))
         {
             SQLFreeStmt(hstmt, SQL_CLOSE);
-            return true;
+            return TRUE;
         }
 
-        if (UserID.IsSameAs(result.grantee,false) &&
+        if (UserID.IsSameAs(result.grantee,FALSE) &&
             !wxStrcmp(result.privilege,priv))
         {
             SQLFreeStmt(hstmt, SQL_CLOSE);
-            return true;
+            return TRUE;
         }
 
         if (!wxStrcmp(result.grantee,curRole) &&
             !wxStrcmp(result.privilege,priv))
         {
             SQLFreeStmt(hstmt, SQL_CLOSE);
-            return true;
+            return TRUE;
         }
 
         retcode = SQLFetch(hstmt);
     }
 
     SQLFreeStmt(hstmt, SQL_CLOSE);
-    return false;
+    return FALSE;
 
 }  // wxDb::TablePrivileges
 
 
+const wxString wxDb::SQLTableName(const wxChar *tableName)
+{
+    wxString TableName;
+
+    if (Dbms() == dbmsACCESS)
+        TableName = '"';
+    TableName += tableName;
+    if (Dbms() == dbmsACCESS)
+        TableName += '"';
+
+    return TableName;
+}  // wxDb::SQLTableName()
+
+
+const wxString wxDb::SQLColumnName(const wxChar *colName)
+{
+    wxString ColName;
+
+    if (Dbms() == dbmsACCESS)
+        ColName = '"';
+    ColName += colName;
+    if (Dbms() == dbmsACCESS)
+        ColName += '"';
+
+    return ColName;
+}  // wxDb::SQLColumnName()
+
+
 /********** wxDb::SetSqlLogging() **********/
 bool wxDb::SetSqlLogging(wxDbSqlLogState state, const wxString &filename, bool append)
 {
@@ -3287,7 +3332,7 @@ bool wxDb::SetSqlLogging(wxDbSqlLogState state, const wxString &filename, bool a
         {
             fpSqlLog = fopen(filename, (append ? wxT("at") : wxT("wt")));
             if (fpSqlLog == NULL)
-                return(false);
+                return(FALSE);
         }
     }
     else  // sqlLogOFF
@@ -3295,13 +3340,13 @@ bool wxDb::SetSqlLogging(wxDbSqlLogState state, const wxString &filename, bool a
         if (fpSqlLog)
         {
             if (fclose(fpSqlLog))
-                return(false);
+                return(FALSE);
             fpSqlLog = 0;
         }
     }
 
     sqlLogState = state;
-    return(true);
+    return(TRUE);
 
 }  // wxDb::SetSqlLogging()
 
@@ -3312,16 +3357,16 @@ bool wxDb::WriteSqlLog(const wxString &logMsg)
     wxASSERT(logMsg.Length());
 
     if (fpSqlLog == 0 || sqlLogState == sqlLogOFF)
-        return(false);
+        return(FALSE);
 
     if (fputs(wxT("\n"),   fpSqlLog) == EOF)
-        return(false);
+        return(FALSE);
     if (fputs(logMsg, fpSqlLog) == EOF)
-        return(false);
+        return(FALSE);
     if (fputs(wxT("\n"),   fpSqlLog) == EOF)
-        return(false);
+        return(FALSE);
 
-    return(true);
+    return(TRUE);
 
 }  // wxDb::WriteSqlLog()
 
@@ -3349,7 +3394,7 @@ wxDBMS wxDb::Dbms(void)
  *        - Does not support the SQL_TIMESTAMP structure
  *        - Supports only one cursor and one connect (apparently? with Microsoft driver only?)
  *        - Does not automatically create the primary index if the 'keyField' param of SetColDef
- *            is true.  The user must create ALL indexes from their program.
+ *            is TRUE.  The user must create ALL indexes from their program.
  *        - Table names can only be 8 characters long
  *        - Column names can only be 10 characters long
  *
@@ -3365,7 +3410,7 @@ wxDBMS wxDb::Dbms(void)
  *
  * MY_SQL
  *        - If a column is part of the Primary Key, the column cannot be NULL
- *        - Cannot support selecting for update [::CanSelectForUpdate()].  Always returns false
+ *        - Cannot support selecting for update [::CanSelectForUpdate()].  Always returns FALSE
  *        - Columns that are part of primary or secondary keys must be defined as being NOT NULL
  *            when they are created.  Some code is added in ::CreateIndex to try to adjust the
  *            column definition if it is not defined correctly, but it is experimental
@@ -3453,6 +3498,9 @@ wxDBMS wxDb::Dbms(void)
     if (!wxStricmp(baseName,wxT("DBASE")))
         return((wxDBMS)(dbmsType = dbmsDBASE));
 
+    if (!wxStricmp(baseName,wxT("MySQL")))
+        return((wxDBMS)(dbmsType = dbmsMY_SQL));
+
     baseName[3] = 0;
     if (!wxStricmp(baseName,wxT("DB2")))
         return((wxDBMS)(dbmsType = dbmsDBASE));
@@ -3473,7 +3521,7 @@ bool wxDb::ModifyColumn(const wxString &tableName, const wxString &columnName,
 
     // Must specify a columnLength if modifying a VARCHAR type column
     if (dataType == DB_DATA_TYPE_VARCHAR && !columnLength)
-        return false;
+        return FALSE;
 
     wxString dataTypeName;
     wxString sqlStmt;
@@ -3497,7 +3545,7 @@ bool wxDb::ModifyColumn(const wxString &tableName, const wxString &columnName,
             dataTypeName = typeInfBlob.TypeName;
             break;
         default:
-            return false;
+            return FALSE;
     }
 
     // Set the modify or alter syntax depending on the type of database connected to
@@ -3510,7 +3558,7 @@ bool wxDb::ModifyColumn(const wxString &tableName, const wxString &columnName,
             alterSlashModify = "ALTER COLUMN";
             break;
         case dbmsUNIDENTIFIED :
-            return false;
+            return FALSE;
         case dbmsSYBASE_ASA :
         case dbmsSYBASE_ASE :
         case dbmsMY_SQL :
@@ -3523,11 +3571,12 @@ bool wxDb::ModifyColumn(const wxString &tableName, const wxString &columnName,
     }
 
     // create the SQL statement
-    sqlStmt.Printf(wxT("ALTER TABLE %s %s %s %s"), tableName.c_str(), alterSlashModify.c_str(),
+    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
-    if (dataType == DB_DATA_TYPE_VARCHAR)
+    if (dataType == DB_DATA_TYPE_VARCHAR &&
+        (Dbms() != dbmsMY_SQL || dataTypeName != "text"))
     {
         wxString s;
         s.Printf(wxT("(%d)"), columnLength);
@@ -3568,7 +3617,7 @@ wxDb WXDLLEXPORT *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnlyCurso
             (pList->PtrDb->FwdOnlyCursors() == FwdOnlyCursors) &&
             (!wxStrcmp(pDbConfig->GetDsn(), pList->Dsn)))  // Found a free connection
         {
-            pList->Free = false;
+            pList->Free = FALSE;
             return(pList->PtrDb);
         }
 
@@ -3598,14 +3647,14 @@ wxDb WXDLLEXPORT *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnlyCurso
 
     // Initialize new node in the linked list
     pList->PtrNext  = 0;
-    pList->Free     = false;
+    pList->Free     = FALSE;
     pList->Dsn      = pDbConfig->GetDsn();
     pList->Uid      = pDbConfig->GetUserID();
     pList->AuthStr  = pDbConfig->GetPassword();
 
     pList->PtrDb = new wxDb(pDbConfig->GetHenv(), FwdOnlyCursors);
 
-    bool opened = false;
+    bool opened = FALSE;
 
     if (!matchingDbConnection)
         opened = pList->PtrDb->Open(pDbConfig->GetDsn(), pDbConfig->GetUserID(), pDbConfig->GetPassword());
@@ -3615,8 +3664,8 @@ wxDb WXDLLEXPORT *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnlyCurso
     // Connect to the datasource
     if (opened)
     {
-        pList->PtrDb->setCached(true);  // Prevent a user from deleting a cached connection
-        pList->PtrDb->SetSqlLogging(SQLLOGstate,SQLLOGfn,true);
+        pList->PtrDb->setCached(TRUE);  // Prevent a user from deleting a cached connection
+        pList->PtrDb->SetSqlLogging(SQLLOGstate,SQLLOGfn,TRUE);
         return(pList->PtrDb);
     }
     else  // Unable to connect, destroy list item
@@ -3644,11 +3693,11 @@ bool WXDLLEXPORT wxDbFreeConnection(wxDb *pDb)
     for (pList = PtrBegDbList; pList; pList = pList->PtrNext)
     {
         if (pList->PtrDb == pDb)  // Found it, now free it!!!
-            return (pList->Free = true);
+            return (pList->Free = TRUE);
     }
 
     // Never found the database object, return failure
-    return(false);
+    return(FALSE);
 
 }  // wxDbFreeConnection()
 
@@ -3664,7 +3713,7 @@ void WXDLLEXPORT wxDbCloseConnections(void)
         pNext = pList->PtrNext;       // Save the pointer to next
         pList->PtrDb->CommitTrans();  // Commit any open transactions on wxDb object
         pList->PtrDb->Close();        // Close the wxDb object
-        pList->PtrDb->setCached(false);  // Allows deletion of the wxDb instance
+        pList->PtrDb->setCached(FALSE);  // Allows deletion of the wxDb instance
         delete pList->PtrDb;          // Deletes the wxDb object
         delete pList;                 // Deletes the linked list object
     }
@@ -3684,7 +3733,7 @@ int WXDLLEXPORT wxDbConnectionsInUse(void)
     // Scan the linked list counting db connections that are currently in use
     for (pList = PtrBegDbList; pList; pList = pList->PtrNext)
     {
-        if (pList->Free == false)
+        if (pList->Free == FALSE)
             cnt++;
     }
 
@@ -3696,8 +3745,10 @@ int WXDLLEXPORT wxDbConnectionsInUse(void)
 
 /********** wxDbLogExtendedErrorMsg() **********/
 // DEBUG ONLY function
-const wxChar WXDLLEXPORT *wxDbLogExtendedErrorMsg(const wxChar *userText, wxDb *pDb,
-                             char *ErrFile, int ErrLine)
+const wxChar WXDLLEXPORT *wxDbLogExtendedErrorMsg(const wxChar *userText,
+                                                  wxDb *pDb,
+                                                  const wxChar *ErrFile,
+                                                  int ErrLine)
 {
     static wxString msg;
     msg = userText;
@@ -3716,7 +3767,7 @@ const wxChar WXDLLEXPORT *wxDbLogExtendedErrorMsg(const wxChar *userText, wxDb *
 
     msg.Append (wxT("\nODBC errors:\n"));
     msg += wxT("\n");
-    
+
     // Display errors for this connection
     int i;
     for (i = 0; i < DB_MAX_ERROR_HISTORY; i++)
@@ -3742,20 +3793,20 @@ const wxChar WXDLLEXPORT *wxDbLogExtendedErrorMsg(const wxChar *userText, wxDb *
 /********** wxDbSqlLog() **********/
 bool wxDbSqlLog(wxDbSqlLogState state, const wxChar *filename)
 {
-    bool append = false;
+    bool append = FALSE;
     wxDbList *pList;
 
     for (pList = PtrBegDbList; pList; pList = pList->PtrNext)
     {
         if (!pList->PtrDb->SetSqlLogging(state,filename,append))
-            return(false);
-        append = true;
+            return(FALSE);
+        append = TRUE;
     }
 
     SQLLOGstate = state;
     SQLLOGfn = filename;
 
-    return(true);
+    return(TRUE);
 
 }  // wxDbSqlLog()
 
@@ -3771,7 +3822,7 @@ int wxDbCreateDataSource(const wxString &driverName, const wxString &dsn, const
  * ODBC driver must be ODBC 3.0 compliant to use this function
  */
 {
-    int result = false;
+    int result = FALSE;
 
 //!!!! ONLY FUNCTIONAL UNDER MSW with VC6 !!!!
 #ifdef __VISUALC__
@@ -3793,7 +3844,7 @@ int wxDbCreateDataSource(const wxString &driverName, const wxString &dsn, const
     int k;
     do
     {
-        k = setupStr.Find((wxChar)2,true);
+        k = setupStr.Find((wxChar)2,TRUE);
         if (k != wxNOT_FOUND)
             setupStr[(UINT)k] = wxT('\0');
     }
@@ -3827,14 +3878,14 @@ int wxDbCreateDataSource(const wxString &driverName, const wxString &dsn, const
         }
     }
     else
-       result = true;
+       result = TRUE;
 #else
     // Using iODBC/unixODBC or some other compiler which does not support the APIs
     // necessary to use this function, so this function is not supported
 #ifdef __WXDEBUG__
     wxLogDebug(wxT("wxDbCreateDataSource() not available except under VC++/MSW"),wxT("ODBC DEBUG MESSAGE"));
 #endif
-    result = false;
+    result = FALSE;
 #endif  // __VISUALC__
 
     return result;
@@ -3845,7 +3896,7 @@ int wxDbCreateDataSource(const wxString &driverName, const wxString &dsn, const
 
 /********** wxDbGetDataSource() **********/
 bool wxDbGetDataSource(HENV henv, wxChar *Dsn, SWORD DsnMax, wxChar *DsDesc,
-                       SWORD DsDescMax, DWORD direction)
+                       SWORD DsDescMax, UWORD direction)
 /*
  * Dsn and DsDesc will contain the data source name and data source
  * description upon return
@@ -3855,9 +3906,9 @@ bool wxDbGetDataSource(HENV henv, wxChar *Dsn, SWORD DsnMax, wxChar *DsDesc,
 
     if (SQLDataSources(henv, direction, (UCHAR FAR *) Dsn, DsnMax, &cb1,
                              (UCHAR FAR *) DsDesc, DsDescMax, &cb2) == SQL_SUCCESS)
-        return(true);
+        return(TRUE);
     else
-        return(false);
+        return(FALSE);
 
 }  // wxDbGetDataSource()