]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/dbtable.cpp
1. added range checks in wxGridStringTable
[wxWidgets.git] / src / common / dbtable.cpp
index 21e953ef29db5153cdae2cea285419e30980ed79..396ed696c09750e228f828804ba17e4d960feb9e 100644 (file)
@@ -12,7 +12,7 @@
 // RCS-ID:      $Id$
 // Copyright:   (c) 1996 Remstar International, Inc.
 // Licence:     wxWindows licence, plus:
-// Notice:       This class library and its intellectual design are free of charge for use,
+// Notice:      This class library and its intellectual design are free of charge for use,
 //              modification, enhancement, debugging under the following conditions:
 //              1) These classes may only be used as part of the implementation of a
 //                 wxWindows-based application
 #endif
 
 #ifdef DBDEBUG_CONSOLE
-        #include <iostream.h>
+    #include "wx/ioswrap.h"
 #endif
 
 #ifdef    __BORLANDC__
-        #pragma hdrstop
+    #pragma hdrstop
 #endif  //__BORLANDC__
 
 #if wxMAJOR_VERSION == 2
-        #ifndef WX_PRECOMP
-                #include "wx/string.h"
-                #include "wx/object.h"
-                #include "wx/list.h"
-                #include "wx/utils.h"
-                #include "wx/msgdlg.h"
+    #ifndef WX_PRECOMP
+        #include "wx/string.h"
+        #include "wx/object.h"
+        #include "wx/list.h"
+        #include "wx/utils.h"
+        #include "wx/msgdlg.h"
+        #include "wx/log.h"
     #endif
     #include "wx/filefn.h"
 #endif
@@ -141,20 +142,20 @@ wxTable::wxTable(wxDB *pwxDB, const char *tblName, const int nCols,
 
     pDb->nTables++;
 
-    char s[200];
+    wxString s;
     tableID = ++lastTableID;
-    sprintf(s, "wxTable constructor (%-20s) tableID:[%6lu] pDb:[%p]", tblName,tableID,pDb);
+    s.sprintf("wxTable constructor (%-20s) tableID:[%6lu] pDb:[%p]", tblName,tableID,pDb);
 
 #ifdef __WXDEBUG__
     CstructTablesInUse *tableInUse;
-    tableInUse = new CstructTablesInUse();
+    tableInUse            = new CstructTablesInUse();
     tableInUse->tableName = tblName;
-    tableInUse->tableID = tableID;
-    tableInUse->pDb = pDb;
+    tableInUse->tableID   = tableID;
+    tableInUse->pDb       = pDb;
     TablesInUse.Append(tableInUse);
 #endif
 
-    pDb->WriteSqlLog(s);
+    pDb->WriteSqlLog(s.GetData());
 
     // Grab the HENV and HDBC from the wxDB object
     henv = pDb->henv;
@@ -201,7 +202,7 @@ wxTable::wxTable(wxDB *pwxDB, const char *tblName, const int nCols,
             case SQL_CURSOR_FORWARD_ONLY:
                 cout << "Forward Only";     break;
             case SQL_CURSOR_STATIC:
-                cout << "Static";               break;
+                cout << "Static";           break;
             case SQL_CURSOR_KEYSET_DRIVEN:
                 cout << "Keyset Driven";    break;
             case SQL_CURSOR_DYNAMIC:
@@ -245,17 +246,19 @@ wxTable::wxTable(wxDB *pwxDB, const char *tblName, const int nCols,
 /********** wxTable::~wxTable() **********/
 wxTable::~wxTable()
 {
-    char s[80];
+    wxString s;
     if (pDb)
     {
-        sprintf(s, "wxTable destructor (%-20s) tableID:[%6lu] pDb:[%p]", tableName,tableID,pDb);
-        pDb->WriteSqlLog(s);
+        s.sprintf("wxTable destructor (%-20s) tableID:[%6lu] pDb:[%p]", tableName,tableID,pDb);
+        pDb->WriteSqlLog(s.GetData());
     }
 
 #ifdef __WXDEBUG__
     if (tableID)
     {
+        TablesInUse.DeleteContents(TRUE);
         bool found = FALSE;
+
         wxNode *pNode;
         pNode = TablesInUse.First();
         while (pNode && !found)
@@ -264,20 +267,22 @@ wxTable::~wxTable()
             {
                 found = TRUE;
                 if (!TablesInUse.DeleteNode(pNode))
-                    wxMessageBox (s,"Unable to delete node!");
+                    wxLogDebug (s.c_str(),"Unable to delete node!");
             }
             else
                 pNode = pNode->Next();
         }
         if (!found)
         {
-            char msg[250];
-            sprintf(msg,"Unable to find the tableID in the linked\nlist of tables in use.\n\n%s",s);
-            wxMessageBox (msg,"NOTICE...");
+            wxString msg;
+            msg.sprintf("Unable to find the tableID in the linked\nlist of tables in use.\n\n%s",s.GetData());
+            wxLogDebug (msg.GetData(),"NOTICE...");
         }
     }
 #endif
 
+
+
     // Decrement the wxDB table count
     if (pDb)
         pDb->nTables--;
@@ -292,12 +297,14 @@ wxTable::~wxTable()
         if (hstmtInsert)
             if (SQLFreeStmt(hstmtInsert, SQL_DROP) != SQL_SUCCESS)
                 pDb->DispAllErrors(henv, hdbc);
+
         if (hstmtDelete)
             if (SQLFreeStmt(hstmtDelete, SQL_DROP) != SQL_SUCCESS)
-                pDb->DispAllErrors(henv, hdbc);
+
         if (hstmtUpdate)
             if (SQLFreeStmt(hstmtUpdate, SQL_DROP) != SQL_SUCCESS)
                 pDb->DispAllErrors(henv, hdbc);
+
     }
     if (hstmtInternal)
         if (SQLFreeStmt(hstmtInternal, SQL_DROP) != SQL_SUCCESS)
@@ -306,9 +313,11 @@ wxTable::~wxTable()
     // Delete dynamically allocated cursors
     if (hstmtDefault)
         DeleteCursor(hstmtDefault);
+
     if (hstmtCount)
         DeleteCursor(hstmtCount);
 
+
 }  // wxTable::~wxTable()
 
 
@@ -434,8 +443,8 @@ bool wxTable::bindUpdateParams(void)
             break;
         }
         if (SQLBindParameter(hstmtUpdate, colNo++, SQL_PARAM_INPUT, colDefs[i].SqlCtype,
-                                    fSqlType, precision, scale, (UCHAR*) colDefs[i].PtrDataObj, 
-                                    precision+1, &colDefs[i].CbValue) != SQL_SUCCESS)
+                             fSqlType, precision, scale, (UCHAR*) colDefs[i].PtrDataObj, 
+                             precision+1, &colDefs[i].CbValue) != SQL_SUCCESS)
             return(pDb->DispAllErrors(henv, hdbc, hstmtUpdate));
     }
 
@@ -455,7 +464,7 @@ bool wxTable::bindCols(HSTMT cursor)
     for (i = 0; i < noCols; i++)
     {
         if (SQLBindCol(cursor, i+1, colDefs[i].SqlCtype, (UCHAR*) colDefs[i].PtrDataObj,
-                            colDefs[i].SzDataObj, &cb) != SQL_SUCCESS)
+                       colDefs[i].SzDataObj, &cb) != SQL_SUCCESS)
             return(pDb->DispAllErrors(henv, hdbc, cursor));
     }
 
@@ -574,21 +583,21 @@ bool wxTable::Open(void)
         return FALSE;
 
     int i;
-    char sqlStmt[DB_MAX_STATEMENT_LEN];
+    wxString sqlStmt;
 
     // Verify that the table exists in the database
     if (!pDb->TableExists(tableName,pDb->GetUsername(),tablePath))
     {
-        char s[250];
+        wxString s;
         if (wxStrcmp(tablePath,""))
-            sprintf(s, "Error opening '%s/%s'.\n",tablePath,tableName);
+            s.sprintf("Error opening '%s/%s'.\n",tablePath,tableName);
         else
-            sprintf(s, "Error opening '%s'.\n", tableName);
+            s.sprintf("Error opening '%s'.\n", tableName);
         if (!pDb->TableExists(tableName,NULL,tablePath))
-            wxStrcat(s,"Table/view does not exist in the database.\n");
+            s += "Table/view does not exist in the database.\n";
         else
-            wxStrcat(s,"Current logged in user does not have sufficient privileges to access this table.\n");
-        pDb->LogError(s);
+            s += "Current logged in user does not have sufficient privileges to access this table.\n";
+        pDb->LogError(s.GetData());
         return(FALSE);
     }
 
@@ -613,33 +622,33 @@ bool wxTable::Open(void)
     if (!queryOnly && noCols > 0)
     {
         bool needComma = FALSE;
-        sprintf(sqlStmt, "INSERT INTO %s (", tableName);
+        sqlStmt.sprintf("INSERT INTO %s (", tableName);
         for (i = 0; i < noCols; i++)
         {
             if (! colDefs[i].InsertAllowed)
                 continue;
             if (needComma)
-                wxStrcat(sqlStmt, ",");
-            wxStrcat(sqlStmt, colDefs[i].ColName);
+                sqlStmt += ",";
+            sqlStmt += colDefs[i].ColName;
             needComma = TRUE;
         }
         needComma = FALSE;
-        wxStrcat(sqlStmt, ") VALUES (");
+        sqlStmt += ") VALUES (";
         for (i = 0; i < noCols; i++)
         {
             if (! colDefs[i].InsertAllowed)
                 continue;
             if (needComma)
-                wxStrcat(sqlStmt, ",");
-            wxStrcat(sqlStmt, "?");
+                sqlStmt += ",";
+            sqlStmt += "?";
             needComma = TRUE;
         }
-        wxStrcat(sqlStmt, ")");
+        sqlStmt += ")";
 
 //      pDb->WriteSqlLog(sqlStmt);
 
         // Prepare the insert statement for execution
-        if (SQLPrepare(hstmtInsert, (UCHAR FAR *) sqlStmt, SQL_NTS) != SQL_SUCCESS)
+        if (SQLPrepare(hstmtInsert, (UCHAR FAR *) sqlStmt.GetData(), SQL_NTS) != SQL_SUCCESS)
             return(pDb->DispAllErrors(henv, hdbc, hstmtInsert));
     }
     
@@ -884,7 +893,8 @@ bool wxTable::CreateTable(bool attemptDrop)
         return FALSE;
 
     int i, j;
-    char sqlStmt[DB_MAX_STATEMENT_LEN];
+//    char sqlStmt[DB_MAX_STATEMENT_LEN];
+    wxString sqlStmt;
 
 #ifdef DBDEBUG_CONSOLE
     cout << "Creating Table " << tableName << "..." << endl;
@@ -923,7 +933,8 @@ bool wxTable::CreateTable(bool attemptDrop)
 
     // Build a CREATE TABLE string from the colDefs structure.
     bool needComma = FALSE;
-    sprintf(sqlStmt, "CREATE TABLE %s (", tableName);
+    sqlStmt.sprintf("CREATE TABLE %s (", tableName);
+
     for (i = 0; i < noCols; i++)
     {
         // Exclude derived columns since they are NOT part of the base table
@@ -931,38 +942,38 @@ bool wxTable::CreateTable(bool attemptDrop)
             continue;
         // Comma Delimiter
         if (needComma)
-           wxStrcat(sqlStmt, ",");
+           sqlStmt += ",";
         // Column Name
-        wxStrcat(sqlStmt, colDefs[i].ColName);
-        wxStrcat(sqlStmt, " ");
+        sqlStmt += colDefs[i].ColName;
+        sqlStmt += " ";
         // Column Type
         switch(colDefs[i].DbDataType)
         {
             case DB_DATA_TYPE_VARCHAR:
-                wxStrcat(sqlStmt, pDb->typeInfVarchar.TypeName); break;
+                sqlStmt += pDb->typeInfVarchar.TypeName; break;
             case DB_DATA_TYPE_INTEGER:
-                wxStrcat(sqlStmt, pDb->typeInfInteger.TypeName); break;
+                sqlStmt += pDb->typeInfInteger.TypeName; break;
             case DB_DATA_TYPE_FLOAT:
-                wxStrcat(sqlStmt, pDb->typeInfFloat.TypeName); break;
+                sqlStmt += pDb->typeInfFloat.TypeName; break;
             case DB_DATA_TYPE_DATE:
-                wxStrcat(sqlStmt, pDb->typeInfDate.TypeName); break;
+                sqlStmt += pDb->typeInfDate.TypeName; break;
         }
         // For varchars, append the size of the string
         if (colDefs[i].DbDataType == DB_DATA_TYPE_VARCHAR)
         {
-            char s[10];
+            wxString s;
             // wxStrcat(sqlStmt, "(");
             // wxStrcat(sqlStmt, itoa(colDefs[i].SzDataObj, s, 10));
             // wxStrcat(sqlStmt, ")");
-            sprintf(s, "(%d)", colDefs[i].SzDataObj);
-            wxStrcat(sqlStmt, s);
+            s.sprintf("(%d)", colDefs[i].SzDataObj);
+            sqlStmt += s.GetData();
         }
 
         if (pDb->Dbms() == dbmsSYBASE_ASE || pDb->Dbms() == dbmsMY_SQL)
         {
             if (colDefs[i].KeyField)
             {
-                wxStrcat(sqlStmt, " NOT NULL");
+                sqlStmt += " NOT NULL";
             }
         }
         
@@ -981,14 +992,14 @@ bool wxTable::CreateTable(bool attemptDrop)
     {
         if (pDb->Dbms() != dbmsMY_SQL)
         {
-            wxStrcat(sqlStmt, ",CONSTRAINT ");
-            wxStrcat(sqlStmt, tableName);
-            wxStrcat(sqlStmt, "_PIDX PRIMARY KEY (");
+            sqlStmt += ",CONSTRAINT ";
+            sqlStmt += tableName;
+            sqlStmt += "_PIDX PRIMARY KEY (";
         }
         else
         {
             /* MySQL goes out on this one. We also declare the relevant key NON NULL above */
-            wxStrcat(sqlStmt, ", PRIMARY KEY (");
+            sqlStmt += ", PRIMARY KEY (";
         }
 
         // List column name(s) of column(s) comprising the primary key
@@ -997,23 +1008,23 @@ bool wxTable::CreateTable(bool attemptDrop)
             if (colDefs[i].KeyField)
             {
                 if (j++) // Multi part key, comma separate names
-                    wxStrcat(sqlStmt, ",");
-                wxStrcat(sqlStmt, colDefs[i].ColName);
+                    sqlStmt += ",";
+                sqlStmt += colDefs[i].ColName;
             }
         }
-       wxStrcat(sqlStmt, ")");
+       sqlStmt += ")";
     }
     // Append the closing parentheses for the create table statement
-   wxStrcat(sqlStmt, ")");
+    sqlStmt += ")";
 
-    pDb->WriteSqlLog(sqlStmt);
+    pDb->WriteSqlLog(sqlStmt.GetData());
 
 #ifdef DBDEBUG_CONSOLE
-    cout << endl << sqlStmt << endl;
+    cout << endl << sqlStmt.GetData() << endl;
 #endif
 
     // Execute the CREATE TABLE statement
-   RETCODE retcode = SQLExecDirect(hstmt, (UCHAR FAR *) sqlStmt, SQL_NTS);
+    RETCODE retcode = SQLExecDirect(hstmt, (UCHAR FAR *) sqlStmt.GetData(), SQL_NTS);
     if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
     {
         pDb->DispAllErrors(henv, hdbc, hstmt);
@@ -1039,29 +1050,29 @@ bool wxTable::DropTable()
 {
     // NOTE: This function returns TRUE if the Table does not exist, but
     //       only for identified databases.  Code will need to be added
-    //          below for any other databases when those databases are defined
+    //       below for any other databases when those databases are defined
     //       to handle this situation consistently
 
-    char sqlStmt[DB_MAX_STATEMENT_LEN];
+    wxString sqlStmt;
 
-    sprintf(sqlStmt, "DROP TABLE %s", tableName);
+    sqlStmt.sprintf("DROP TABLE %s", tableName);
 
-    pDb->WriteSqlLog(sqlStmt);
+    pDb->WriteSqlLog(sqlStmt.GetData());
 
 #ifdef DBDEBUG_CONSOLE
-    cout << endl << sqlStmt << endl;
+    cout << endl << sqlStmt.GetData() << endl;
 #endif
 
-    if (SQLExecDirect(hstmt, (UCHAR FAR *) sqlStmt, SQL_NTS) != SQL_SUCCESS)
+    if (SQLExecDirect(hstmt, (UCHAR FAR *) sqlStmt.GetData(), SQL_NTS) != SQL_SUCCESS)
     {
         // Check for "Base table not found" error and ignore
         pDb->GetNextError(henv, hdbc, hstmt);
         if (wxStrcmp(pDb->sqlState,"S0002"))  // "Base table not found"
         {
             // Check for product specific error codes
-            if (!((pDb->Dbms() == dbmsSYBASE_ASA    && !wxStrcmp(pDb->sqlState,"42000"))     ||  // 5.x (and lower?)
-                   (pDb->Dbms() == dbmsMY_SQL           && !wxStrcmp(pDb->sqlState,"S1000"))     ||  // untested
-                   (pDb->Dbms() == dbmsPOSTGRES     && !wxStrcmp(pDb->sqlState,"08S01"))))    // untested
+            if (!((pDb->Dbms() == dbmsSYBASE_ASA && !wxStrcmp(pDb->sqlState,"42000"))   ||  // 5.x (and lower?)
+                  (pDb->Dbms() == dbmsMY_SQL     && !wxStrcmp(pDb->sqlState,"S1000"))   ||  // untested
+                  (pDb->Dbms() == dbmsPOSTGRES   && !wxStrcmp(pDb->sqlState,"08S01"))))     // untested
             {
                 pDb->DispNextError();
                 pDb->DispAllErrors(henv, hdbc, hstmt);
@@ -1085,52 +1096,53 @@ bool wxTable::DropTable()
 /********** wxTable::CreateIndex() **********/
 bool wxTable::CreateIndex(const char * idxName, bool unique, int noIdxCols, CidxDef *pIdxDefs, bool attemptDrop)
 {
-    char sqlStmt[DB_MAX_STATEMENT_LEN];
+//    char sqlStmt[DB_MAX_STATEMENT_LEN];
+    wxString sqlStmt;
 
     // Drop the index first
     if (attemptDrop && !DropIndex(idxName))
         return (FALSE);
 
     // Build a CREATE INDEX statement
-    wxStrcpy(sqlStmt, "CREATE ");
+    sqlStmt = "CREATE ";
     if (unique)
-        wxStrcat(sqlStmt, "UNIQUE ");
+        sqlStmt += "UNIQUE ";
 
-    wxStrcat(sqlStmt, "INDEX ");
-    wxStrcat(sqlStmt, idxName);
-    wxStrcat(sqlStmt, " ON ");
-    wxStrcat(sqlStmt, tableName);
-    wxStrcat(sqlStmt, " (");
+    sqlStmt += "INDEX ";
+    sqlStmt += idxName;
+    sqlStmt += " ON ";
+    sqlStmt += tableName;
+    sqlStmt += " (";
 
     // Append list of columns making up index
     int i;
     for (i = 0; i < noIdxCols; i++)
     {
-        wxStrcat(sqlStmt, pIdxDefs[i].ColName);
-      /* Postgres doesn't cope with ASC */
+        sqlStmt += pIdxDefs[i].ColName;
+        /* Postgres doesn't cope with ASC */
         if (pDb->Dbms() != dbmsPOSTGRES)
         {
             if (pIdxDefs[i].Ascending)
-                wxStrcat(sqlStmt, " ASC");
+                sqlStmt += " ASC";
             else
-                wxStrcat(sqlStmt, " DESC");
+                sqlStmt += " DESC";
         }
 
         if ((i + 1) < noIdxCols)
-            wxStrcat(sqlStmt, ",");
+            sqlStmt += ",";
     }
     
     // Append closing parentheses
-    wxStrcat(sqlStmt, ")");
+    sqlStmt += ")";
 
-    pDb->WriteSqlLog(sqlStmt);
+    pDb->WriteSqlLog(sqlStmt.GetData());
 
 #ifdef DBDEBUG_CONSOLE
-    cout << endl << sqlStmt << endl << endl;
+    cout << endl << sqlStmt.GetData() << endl << endl;
 #endif
 
     // Execute the CREATE INDEX statement
-    if (SQLExecDirect(hstmt, (UCHAR FAR *) sqlStmt, SQL_NTS) != SQL_SUCCESS)
+    if (SQLExecDirect(hstmt, (UCHAR FAR *) sqlStmt.GetData(), SQL_NTS) != SQL_SUCCESS)
     {
         pDb->DispAllErrors(henv, hdbc, hstmt);
         pDb->RollbackTrans();
@@ -1158,31 +1170,31 @@ bool wxTable::DropIndex(const char * idxName)
     //          below for any other databases when those databases are defined
     //       to handle this situation consistently
 
-    char sqlStmt[DB_MAX_STATEMENT_LEN];
+    wxString sqlStmt;
 
     if (pDb->Dbms() == dbmsACCESS)
-        sprintf(sqlStmt, "DROP INDEX %s ON %s",idxName,tableName);
+        sqlStmt.sprintf("DROP INDEX %s ON %s",idxName,tableName);
     else if (pDb->Dbms() == dbmsSYBASE_ASE)
-        sprintf(sqlStmt, "DROP INDEX %s.%s",tableName,idxName);
+        sqlStmt.sprintf("DROP INDEX %s.%s",tableName,idxName);
     else
-        sprintf(sqlStmt, "DROP INDEX %s",idxName);
+        sqlStmt.sprintf("DROP INDEX %s",idxName);
 
-    pDb->WriteSqlLog(sqlStmt);
+    pDb->WriteSqlLog(sqlStmt.GetData());
 
 #ifdef DBDEBUG_CONSOLE
-    cout << endl << sqlStmt << endl;
+    cout << endl << sqlStmt.GetData() << endl;
 #endif
 
-    if (SQLExecDirect(hstmt, (UCHAR FAR *) sqlStmt, SQL_NTS) != SQL_SUCCESS)
+    if (SQLExecDirect(hstmt, (UCHAR FAR *) sqlStmt.GetData(), SQL_NTS) != SQL_SUCCESS)
     {
         // Check for "Index not found" error and ignore
         pDb->GetNextError(henv, hdbc, hstmt);
         if (wxStrcmp(pDb->sqlState,"S0012"))  // "Index not found"
         {
             // Check for product specific error codes
-            if (!((pDb->Dbms() == dbmsSYBASE_ASA    && !wxStrcmp(pDb->sqlState,"42000"))   ||  // v5.x (and lower?)
-                   (pDb->Dbms() == dbmsSYBASE_ASE   && !wxStrcmp(pDb->sqlState,"S0002"))   ||  // Base table not found
-                   (pDb->Dbms() == dbmsMY_SQL           && !wxStrcmp(pDb->sqlState,"42S02"))       // untested
+            if (!((pDb->Dbms() == dbmsSYBASE_ASA  && !wxStrcmp(pDb->sqlState,"42000")) ||  // v5.x (and lower?)
+                   (pDb->Dbms() == dbmsSYBASE_ASE && !wxStrcmp(pDb->sqlState,"S0002")) ||  // Base table not found
+                   (pDb->Dbms() == dbmsMY_SQL     && !wxStrcmp(pDb->sqlState,"42S02"))     // untested
                     ))
             {
                 pDb->DispNextError();
@@ -1663,6 +1675,7 @@ void wxTable::ClearMemberVars(void)
             pDt->second = 0;
             pDt->fraction = 0;
             break;
+       
         }
     }
 
@@ -1727,8 +1740,6 @@ void wxTable::SetColDefs (int index, const char *fieldName, int dataType, void *
 
 
 /********** wxTable::SetColDef() **********/
-// BJO20000121 : changed prototype in order to return proper pointer on wxColDataPtr's array
-//bool wxTable::SetColDefs(wxColInf *pColInfs, ULONG numCols, wxColDataPtr *pColDataPtrs)
 wxColDataPtr* wxTable::SetColDefs (wxColInf *pColInfs, ULONG numCols)
 {
     assert(pColInfs);
@@ -1743,34 +1754,15 @@ wxColDataPtr* wxTable::SetColDefs (wxColInf *pColInfs, ULONG numCols)
 
         for (index = 0; index < numCols; index++)
         {
-/*
-            wxString title,msg;
-            title.sprintf("Catalog: %s, Schema: %s, Table name: %s",pColInfs[index].catalog,pColInfs[index].schema,pColInfs[index].tableName);
-            msg.sprintf("Column name: %s\nData type: %04d\nType name: %s\nColumn size: %d\nBuffer len: %d\nDecimals:%d\nRadix: %d\nNullable: %d\nRemarks: %s",
-                pColInfs[index].colName,pColInfs[index].sqlDataType,pColInfs[index].typeName,pColInfs[index].columnSize,pColInfs[index].bufferLength,pColInfs[index].decimalDigits,pColInfs[index].numPrecRadix,pColInfs[index].nullable,pColInfs[index].remarks);
-            msg += "                                     \nDB_DATA_TYPE: ";
-            switch(pColInfs[index].dbDataType)
-            {
-                case DB_DATA_TYPE_VARCHAR:
-                    msg += pDb->typeInfVarchar.TypeName; break;
-                case DB_DATA_TYPE_INTEGER:
-                    msg += pDb->typeInfInteger.TypeName; break;
-                case DB_DATA_TYPE_FLOAT:
-                    msg += pDb->typeInfFloat.TypeName; break;
-                case DB_DATA_TYPE_DATE:
-                    msg += pDb->typeInfDate.TypeName; break;
-            }
-            wxMessageBox(msg.GetData(),title.GetData());
-*/
             // Process the fields
             switch (pColInfs[index].dbDataType)
             {
                 case DB_DATA_TYPE_VARCHAR:
                 {
-                    pColDataPtrs[index].PtrDataObj = new char[pColInfs[index].bufferLength+1];
-                    pColDataPtrs[index].SzDataObj  = pColInfs[index].bufferLength;
-                    pColDataPtrs[index].SqlCtype   = SQL_C_CHAR;
-                    break;
+                   pColDataPtrs[index].PtrDataObj = new char[pColInfs[index].bufferLength+1];
+                   pColDataPtrs[index].SzDataObj  = pColInfs[index].columnSize;
+                   pColDataPtrs[index].SqlCtype   = SQL_C_CHAR;
+                   break;
                 }
                 case DB_DATA_TYPE_INTEGER:
                 {
@@ -1837,26 +1829,26 @@ void wxTable::SetCursor(HSTMT *hstmtActivate)
 ULONG wxTable::Count(const char *args)
 {
     ULONG l;
-    char sqlStmt[DB_MAX_STATEMENT_LEN];
+    wxString sqlStmt;
     SDWORD cb;
 
     // Build a "SELECT COUNT(*) FROM queryTableName [WHERE whereClause]" SQL Statement
-    wxStrcpy(sqlStmt, "SELECT COUNT(");
-    wxStrcat(sqlStmt, args);
-    wxStrcat(sqlStmt, ") FROM ");
-    wxStrcat(sqlStmt, queryTableName);
+    sqlStmt  = "SELECT COUNT(";
+    sqlStmt += args;
+    sqlStmt += ") FROM ";
+    sqlStmt += queryTableName;
 
     if (from && wxStrlen(from))
-        wxStrcat(sqlStmt, from);
+        sqlStmt += from;
 
     // Add the where clause if one is provided
     if (where && wxStrlen(where))
     {
-        wxStrcat(sqlStmt, " WHERE ");
-        wxStrcat(sqlStmt, where);
+        sqlStmt += " WHERE ";
+        sqlStmt += where;
     }
 
-    pDb->WriteSqlLog(sqlStmt);
+    pDb->WriteSqlLog(sqlStmt.GetData());
 
     // Initialize the Count cursor if it's not already initialized
     if (!hstmtCount)
@@ -1868,7 +1860,7 @@ ULONG wxTable::Count(const char *args)
     }
 
     // Execute the SQL statement
-    if (SQLExecDirect(*hstmtCount, (UCHAR FAR *) sqlStmt, SQL_NTS) != SQL_SUCCESS)
+    if (SQLExecDirect(*hstmtCount, (UCHAR FAR *) sqlStmt.GetData(), SQL_NTS) != SQL_SUCCESS)
     {
         pDb->DispAllErrors(henv, hdbc, *hstmtCount);
         return(0);
@@ -1953,7 +1945,7 @@ bool wxTable::Refresh(void)
         pDb->DispAllErrors(henv, hdbc, hstmtInternal);
 
     // Restore the original where and order by clauses
-    where     = saveWhere;
+    where   = saveWhere;
     orderBy = saveOrderBy;
 
     return(result);