]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/dbtable.cpp
Applied patch #423927, (Min size for stretch parts of wxBoxSizer)
[wxWidgets.git] / src / common / dbtable.cpp
index 524fb96e8e9969cdd1418d366f5dfd30b6d74c20..0df9c08bc44e3fae50edee19b87f1df4a85548a2 100644 (file)
@@ -417,7 +417,7 @@ ODBC 3.0 says to use this form
 /***************************** PRIVATE FUNCTIONS *****************************/
 
 
-/********** wxDbTable::bindUpdateParams() **********/
+/********** wxDbTable::bindParams() **********/
 bool wxDbTable::bindParams(bool forUpdate)
 {
     wxASSERT(!queryOnly);
@@ -431,17 +431,18 @@ bool wxDbTable::bindParams(bool forUpdate)
     // Bind each column of the table that should be bound
     // to a parameter marker
     int i;
-        UWORD colNo;
-    for (i = 0, colNo = 1; i < noCols; i++)
+    UWORD colNo;
+
+    for (i=0, colNo=1; i < noCols; i++)
     {
         if (forUpdate)
         {
-            if (! colDefs[i].Updateable)
+            if (!colDefs[i].Updateable)
                 continue;
         }
         else
         {
-            if (! colDefs[i].InsertAllowed)
+            if (!colDefs[i].InsertAllowed)
                 continue;
         }
 
@@ -541,8 +542,6 @@ bool wxDbTable::bindUpdateParams(void)
 /********** wxDbTable::bindCols() **********/
 bool wxDbTable::bindCols(HSTMT cursor)
 {
-//RG-NULL    static SDWORD  cb;
-    
     // Bind each column of the table to a memory address for fetching data
     UWORD i;
     for (i = 0; i < noCols; i++)
@@ -572,7 +571,7 @@ bool wxDbTable::getRec(UWORD fetchType)
         UWORD   rowStatus;
 
         retcode = SQLExtendedFetch(hstmt, fetchType, 0, &cRowsFetched, &rowStatus);
-        if (retcode  != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
+        if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
         {
             if (retcode == SQL_NO_DATA_FOUND)
                 return(FALSE);
@@ -618,12 +617,21 @@ bool wxDbTable::getRec(UWORD fetchType)
 /********** wxDbTable::execDelete() **********/
 bool wxDbTable::execDelete(const wxString &pSqlStmt)
 {
+    RETCODE retcode;
+
     // Execute the DELETE statement
-    if (SQLExecDirect(hstmtDelete, (UCHAR FAR *) pSqlStmt.c_str(), SQL_NTS) != SQL_SUCCESS)
-        return(pDb->DispAllErrors(henv, hdbc, hstmtDelete));
+    retcode = SQLExecDirect(hstmtDelete, (UCHAR FAR *) pSqlStmt.c_str(), SQL_NTS);
 
-    // Record deleted successfully
-    return(TRUE);
+    if (retcode == SQL_SUCCESS ||
+        retcode == SQL_NO_DATA_FOUND ||
+        retcode == SQL_SUCCESS_WITH_INFO)
+    {
+        // Record deleted successfully
+        return(TRUE);
+    }
+
+    // Problem deleting record
+    return(pDb->DispAllErrors(henv, hdbc, hstmtDelete));
 
 }  // wxDbTable::execDelete()
 
@@ -631,12 +639,21 @@ bool wxDbTable::execDelete(const wxString &pSqlStmt)
 /********** wxDbTable::execUpdate() **********/
 bool wxDbTable::execUpdate(const wxString &pSqlStmt)
 {
+    RETCODE retcode;
+
     // Execute the UPDATE statement
-    if (SQLExecDirect(hstmtUpdate, (UCHAR FAR *) pSqlStmt.c_str(), SQL_NTS) != SQL_SUCCESS)
-        return(pDb->DispAllErrors(henv, hdbc, hstmtUpdate));
+    retcode = SQLExecDirect(hstmtUpdate, (UCHAR FAR *) pSqlStmt.c_str(), SQL_NTS);
 
-    // Record deleted successfully
-    return(TRUE);
+    if (retcode == SQL_SUCCESS ||
+        retcode == SQL_NO_DATA_FOUND ||
+        retcode == SQL_SUCCESS_WITH_INFO)
+    {
+        // Record updated successfully
+        return(TRUE);
+    }
+
+    // Problem updating record
+    return(pDb->DispAllErrors(henv, hdbc, hstmtUpdate));
 
 }  // wxDbTable::execUpdate()
 
@@ -1001,7 +1018,7 @@ void wxDbTable::BuildSelectStmt(wxString &pSqlStmt, int typeOfSelect, bool disti
     for (i = 0; i < noCols; i++)
     {
         // If joining tables, the base table column names must be qualified to avoid ambiguity
-        if (appendFromClause)
+        if (appendFromClause || pDb->Dbms() == dbmsACCESS)
         {
             pSqlStmt += queryTableName;
             pSqlStmt += wxT(".");
@@ -1016,7 +1033,7 @@ void wxDbTable::BuildSelectStmt(wxString &pSqlStmt, int typeOfSelect, bool disti
     if (!distinct && CanUpdByROWID())
     {
         // If joining tables, the base table column names must be qualified to avoid ambiguity
-        if (appendFromClause)
+        if (appendFromClause || pDb->Dbms() == dbmsACCESS)
         {
             pSqlStmt += wxT(",");
             pSqlStmt += queryTableName;
@@ -1115,7 +1132,7 @@ void wxDbTable::BuildUpdateStmt(wxString &pSqlStmt, int typeOfUpd, const wxStrin
 
     bool firstColumn = TRUE;
 
-    pSqlStmt.Printf(wxT("UPDATE %s SET "), tableName.c_str());
+    pSqlStmt.Printf(wxT("UPDATE %s SET "), tableName.Upper().c_str());
 
     // Append a list of columns to be updated
     int i;
@@ -1399,16 +1416,31 @@ bool wxDbTable::CreateTable(bool attemptDrop)
     }
     if (j && pDb->Dbms() != dbmsDBASE)  // Found a keyfield
     {
-        if (pDb->Dbms() != dbmsMY_SQL)
-        {
-            sqlStmt += wxT(",CONSTRAINT ");
-            sqlStmt += tableName;
-            sqlStmt += wxT("_PIDX PRIMARY KEY (");
-        }
-        else
+        switch (pDb->Dbms())
         {
-            /* MySQL goes out on this one. We also declare the relevant key NON NULL above */
-            sqlStmt += wxT(", PRIMARY KEY (");
+            case dbmsSYBASE_ASA:
+            case dbmsSYBASE_ASE:
+            case dbmsMY_SQL:
+            {
+                // MySQL goes out on this one. We also declare the relevant key NON NULL above
+                sqlStmt += wxT(",PRIMARY KEY (");
+                break;
+            }
+            default:
+            {
+                sqlStmt += wxT(",CONSTRAINT ");
+                //  DB2 is limited to 18 characters for index names
+                if (pDb->Dbms() == dbmsDB2)
+                {
+                    wxASSERT_MSG((tableName && wxStrlen(tableName) <= 13), wxT("DB2 table/index names must be no longer than 13 characters in length.\n\nTruncating table name to 13 characters."));
+                    sqlStmt += tableName.substr(0, 13);
+                }
+                else
+                    sqlStmt += tableName;
+
+                sqlStmt += wxT("_PIDX PRIMARY KEY (");
+                break;
+            }
         }
 
         // List column name(s) of column(s) comprising the primary key
@@ -1421,7 +1453,15 @@ bool wxDbTable::CreateTable(bool attemptDrop)
                 sqlStmt += colDefs[i].ColName;
             }
         }
-       sqlStmt += wxT(")");
+        sqlStmt += wxT(")");
+
+        if (pDb->Dbms() == dbmsSYBASE_ASA ||
+            pDb->Dbms() == dbmsSYBASE_ASE)
+        {
+            sqlStmt += wxT(" CONSTRAINT ");
+            sqlStmt += tableName;
+            sqlStmt += wxT("_PIDX");
+        }
     }
     // Append the closing parentheses for the create table statement
     sqlStmt += wxT(")");
@@ -1472,22 +1512,27 @@ bool wxDbTable::DropTable()
     cout << endl << sqlStmt.c_str() << endl;
 #endif
 
-    if (SQLExecDirect(hstmt, (UCHAR FAR *) sqlStmt.c_str(), SQL_NTS) != SQL_SUCCESS)
+
+
+
+    RETCODE retcode = SQLExecDirect(hstmt, (UCHAR FAR *) sqlStmt.c_str(), SQL_NTS);
+    if (retcode != SQL_SUCCESS)
     {
         // Check for "Base table not found" error and ignore
         pDb->GetNextError(henv, hdbc, hstmt);   
-        if (wxStrcmp(pDb->sqlState, wxT("S0002")) &&
-            wxStrcmp(pDb->sqlState, wxT("S1000")))  // "Base table not found" 
-        {    
+        if (wxStrcmp(pDb->sqlState, wxT("S0002")) /*&&
+            wxStrcmp(pDb->sqlState, wxT("S1000"))*/)  // "Base table not found" 
+        {
             // Check for product specific error codes
-            if (!((pDb->Dbms() == dbmsSYBASE_ASA  && !wxStrcmp(pDb->sqlState,wxT("42000")))   ||  // 5.x (and lower?)
-                (pDb->Dbms() == dbmsSYBASE_ASE    && !wxStrcmp(pDb->sqlState,wxT("37000")))   ||   
-                (pDb->Dbms() == dbmsPOSTGRES      && !wxStrcmp(pDb->sqlState,wxT("08S01")))))     
+            if (!((pDb->Dbms() == dbmsSYBASE_ASA    && !wxStrcmp(pDb->sqlState,wxT("42000")))   ||  // 5.x (and lower?)
+                  (pDb->Dbms() == dbmsSYBASE_ASE    && !wxStrcmp(pDb->sqlState,wxT("37000")))   ||   
+                  (pDb->Dbms() == dbmsPERVASIVE_SQL && !wxStrcmp(pDb->sqlState,wxT("S1000")))   ||  // Returns an S1000 then an S0002
+                  (pDb->Dbms() == dbmsPOSTGRES      && !wxStrcmp(pDb->sqlState,wxT("08S01")))))     
             {
                 pDb->DispNextError();
                 pDb->DispAllErrors(henv, hdbc, hstmt);
                 pDb->RollbackTrans();
-                CloseCursor(hstmt);
+//                CloseCursor(hstmt);
                 return(FALSE);
             }
         }
@@ -1504,7 +1549,8 @@ bool wxDbTable::DropTable()
 
 
 /********** wxDbTable::CreateIndex() **********/
-bool wxDbTable::CreateIndex(const wxString &idxName, bool unique, int noIdxCols, wxDbIdxDef *pIdxDefs, bool attemptDrop)
+bool wxDbTable::CreateIndex(const wxString &idxName, bool unique, UWORD noIdxCols,
+                                     wxDbIdxDef *pIdxDefs, bool attemptDrop)
 {
     wxString sqlStmt;
 
@@ -1632,12 +1678,13 @@ bool wxDbTable::DropIndex(const wxString &idxName)
 {
     // NOTE: This function returns TRUE if the Index 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
 
     wxString sqlStmt;
 
-    if (pDb->Dbms() == dbmsACCESS || pDb->Dbms() == dbmsMY_SQL)
+    if (pDb->Dbms() == dbmsACCESS || pDb->Dbms() == dbmsMY_SQL ||
+        pDb->Dbms() == dbmsDBASE /*|| Paradox needs this syntax too when we add support*/)
         sqlStmt.Printf(wxT("DROP INDEX %s ON %s"),idxName.c_str(), tableName.c_str());
     else if ((pDb->Dbms() == dbmsMS_SQL_SERVER) ||
              (pDb->Dbms() == dbmsSYBASE_ASE))
@@ -1686,9 +1733,9 @@ bool wxDbTable::DropIndex(const wxString &idxName)
 
 
 /********** wxDbTable::SetOrderByColNums() **********/
-bool wxDbTable::SetOrderByColNums(int first, ... )
+bool wxDbTable::SetOrderByColNums(UWORD first, ... )
 {
-    int         colNo = first;
+    int        colNo = first;  // using 'int' to be able to look for wxDB_NO_MORE_COLUN_NUMBERS
     va_list     argptr;
 
     bool        abort = FALSE;
@@ -1879,7 +1926,7 @@ bool wxDbTable::DeleteMatching(void)
 
 
 /********** wxDbTable::IsColNull() **********/
-bool wxDbTable::IsColNull(int colNo)
+bool wxDbTable::IsColNull(UWORD colNo)
 {
 /*
     This logic is just not right.  It would indicate TRUE
@@ -1964,7 +2011,7 @@ bool wxDbTable::IsCursorClosedOnCommit(void)
 
 
 /********** wxDbTable::ClearMemberVar() **********/
-void wxDbTable::ClearMemberVar(int colNo, bool setToNull)
+void wxDbTable::ClearMemberVar(UWORD colNo, bool setToNull)
 {
     wxASSERT(colNo < noCols);
 
@@ -2040,7 +2087,7 @@ bool wxDbTable::SetQueryTimeout(UDWORD nSeconds)
 
 
 /********** wxDbTable::SetColDefs() **********/
-void wxDbTable::SetColDefs(int index, const wxString &fieldName, int dataType, void *pData,
+void wxDbTable::SetColDefs(UWORD index, const wxString &fieldName, int dataType, void *pData,
                            SWORD cType, int size, bool keyField, bool upd,
                            bool insAllow, bool derivedCol)
 {
@@ -2079,14 +2126,14 @@ void wxDbTable::SetColDefs(int index, const wxString &fieldName, int dataType, v
 
 
 /********** wxDbTable::SetColDefs() **********/
-wxDbColDataPtr* wxDbTable::SetColDefs(wxDbColInf *pColInfs, ULONG numCols)
+wxDbColDataPtr* wxDbTable::SetColDefs(wxDbColInf *pColInfs, UWORD numCols)
 {
     wxASSERT(pColInfs);
     wxDbColDataPtr *pColDataPtrs = NULL;
 
     if (pColInfs)
     {
-        ULONG index;
+        UWORD index;
        
         pColDataPtrs = new wxDbColDataPtr[numCols+1];
 
@@ -2136,7 +2183,7 @@ wxDbColDataPtr* wxDbTable::SetColDefs(wxDbColInf *pColInfs, ULONG numCols)
                     pColDataPtrs[index].SqlCtype   = SQL_C_TIMESTAMP;
                     break;
                 case DB_DATA_TYPE_BLOB:
-                                                 int notSupportedYet = 0;
+                    int notSupportedYet = 0;
                     wxASSERT_MSG(notSupportedYet, wxT("This form of ::SetColDefs() cannot be used with BLOB columns"));
                     pColDataPtrs[index].PtrDataObj = /*BLOB ADDITION NEEDED*/NULL;
                     pColDataPtrs[index].SzDataObj  = /*BLOB ADDITION NEEDED*/sizeof(void *);
@@ -2313,8 +2360,8 @@ bool wxDbTable::Refresh(void)
 }  // wxDbTable::Refresh()
 
 
-/********** wxDbTable::SetColNull(int colNo, bool set) **********/
-bool wxDbTable::SetColNull(int colNo, bool set)
+/********** wxDbTable::SetColNull() **********/
+bool wxDbTable::SetColNull(UWORD colNo, bool set)
 {
     if (colNo < noCols)
     {
@@ -2329,7 +2376,7 @@ bool wxDbTable::SetColNull(int colNo, bool set)
 }  // wxDbTable::SetColNull()
 
 
-/********** wxDbTable::SetColNull(const wxString &colName, bool set) **********/
+/********** wxDbTable::SetColNull() **********/
 bool wxDbTable::SetColNull(const wxString &colName, bool set)
 {
     int i;