X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8ecff18117f8cabc0f515ad81aa4ad265e5e17d3..855f31ebe72bef834a32df2c274b41fb282ad265:/src/common/dbtable.cpp diff --git a/src/common/dbtable.cpp b/src/common/dbtable.cpp index 346dcd34f9..fff7942cae 100644 --- a/src/common/dbtable.cpp +++ b/src/common/dbtable.cpp @@ -28,11 +28,6 @@ #endif #ifdef DBDEBUG_CONSOLE -#if wxUSE_IOSTREAMH - #include -#else - #include -#endif #include "wx/ioswrap.h" #endif @@ -44,28 +39,20 @@ #include "wx/dbtable.h" -#ifdef __UNIX__ -// The HPUX preprocessor lines below were commented out on 8/20/97 -// because macros.h currently redefines DEBUG and is unneeded. -// # ifdef HPUX -// # include -// # endif -# ifdef LINUX -# include -# endif -#endif - ULONG lastTableID = 0; #ifdef __WXDEBUG__ + #include "wx/thread.h" + wxList TablesInUse; + wxCriticalSection csTablesInUse; #endif void csstrncpyt(wxChar *target, const wxChar *source, int n) { - while ( (*target++ = *source++) != '\0' && --n ) + while ( (*target++ = *source++) != '\0' && --n != 0 ) ; *target = '\0'; @@ -107,19 +94,6 @@ wxDbTable::wxDbTable(wxDb *pwxDb, const wxString &tblName, const UWORD numColumn } // wxDbTable::wxDbTable() -/***** DEPRECATED: use wxDbTable::wxDbTable() format above *****/ -#if WXWIN_COMPATIBILITY_2_4 -wxDbTable::wxDbTable(wxDb *pwxDb, const wxString &tblName, const UWORD numColumns, - const wxChar *qryTblName, bool qryOnly, const wxString &tblPath) -{ - wxString tempQryTblName; - tempQryTblName = qryTblName; - if (!initialize(pwxDb, tblName, numColumns, tempQryTblName, qryOnly, tblPath)) - cleanup(); -} // wxDbTable::wxDbTable() -#endif // WXWIN_COMPATIBILITY_2_4 - - /********** wxDbTable::~wxDbTable() **********/ wxDbTable::~wxDbTable() { @@ -186,7 +160,8 @@ bool wxDbTable::initialize(wxDb *pwxDb, const wxString &tblName, const UWORD num wxString s; tableID = ++lastTableID; - s.Printf(wxT("wxDbTable constructor (%-20s) tableID:[%6lu] pDb:[%p]"), tblName.c_str(), tableID, pDb); + s.Printf(wxT("wxDbTable constructor (%-20s) tableID:[%6lu] pDb:[%p]"), + tblName.c_str(), tableID, wx_static_cast(void*, pDb)); #ifdef __WXDEBUG__ wxTablesInUse *tableInUse; @@ -194,7 +169,10 @@ bool wxDbTable::initialize(wxDb *pwxDb, const wxString &tblName, const UWORD num tableInUse->tableName = tblName; tableInUse->tableID = tableID; tableInUse->pDb = pDb; - TablesInUse.Append(tableInUse); + { + wxCriticalSectionLocker lock(csTablesInUse); + TablesInUse.Append(tableInUse); + } #endif pDb->WriteSqlLog(s); @@ -309,7 +287,8 @@ void wxDbTable::cleanup() wxString s; if (pDb) { - s.Printf(wxT("wxDbTable destructor (%-20s) tableID:[%6lu] pDb:[%p]"), tableName.c_str(), tableID, pDb); + s.Printf(wxT("wxDbTable destructor (%-20s) tableID:[%6lu] pDb:[%p]"), + tableName.c_str(), tableID, wx_static_cast(void*, pDb)); pDb->WriteSqlLog(s); } @@ -319,17 +298,20 @@ void wxDbTable::cleanup() bool found = false; wxList::compatibility_iterator pNode; - pNode = TablesInUse.GetFirst(); - while (pNode && !found) { - if (((wxTablesInUse *)pNode->GetData())->tableID == tableID) + wxCriticalSectionLocker lock(csTablesInUse); + pNode = TablesInUse.GetFirst(); + while (!found && pNode) { - found = true; - delete (wxTablesInUse *)pNode->GetData(); - TablesInUse.Erase(pNode); + if (((wxTablesInUse *)pNode->GetData())->tableID == tableID) + { + found = true; + delete (wxTablesInUse *)pNode->GetData(); + TablesInUse.Erase(pNode); + } + else + pNode = pNode->GetNext(); } - else - pNode = pNode->GetNext(); } if (!found) { @@ -558,21 +540,17 @@ bool wxDbTable::bindUpdateParams(void) /********** wxDbTable::bindCols() **********/ bool wxDbTable::bindCols(HSTMT cursor) { - static SQLLEN cb; - // Bind each column of the table to a memory address for fetching data UWORD i; for (i = 0; i < m_numCols; i++) { - cb = colDefs[i].CbValue; if (SQLBindCol(cursor, (UWORD)(i+1), colDefs[i].SqlCtype, (UCHAR*) colDefs[i].PtrDataObj, - colDefs[i].SzDataObj, &cb ) != SQL_SUCCESS) + colDefs[i].SzDataObj, &colDefs[i].CbValue ) != SQL_SUCCESS) return (pDb->DispAllErrors(henv, hdbc, cursor)); } // Completed successfully return true; - } // wxDbTable::bindCols() @@ -1310,7 +1288,7 @@ void wxDbTable::BuildWhereClause(wxString &pWhereClause, int typeOfWhere, case SQL_C_WCHAR: #endif //case SQL_C_WXCHAR: SQL_C_WXCHAR is covered by either SQL_C_CHAR or SQL_C_WCHAR - colValue.Printf(wxT("'%s'"), (UCHAR FAR *) colDefs[colNumber].PtrDataObj); + colValue.Printf(wxT("'%s'"), GetDb()->EscapeSqlChars((wxChar *)colDefs[colNumber].PtrDataObj).c_str()); break; case SQL_C_SHORT: case SQL_C_SSHORT: @@ -2242,6 +2220,20 @@ void wxDbTable::ClearMemberVar(UWORD colNumber, bool setToNull) pDt->second = 0; pDt->fraction = 0; break; + case SQL_C_DATE: + DATE_STRUCT *pDtd; + pDtd = (DATE_STRUCT *) colDefs[colNumber].PtrDataObj; + pDtd->year = 0; + pDtd->month = 0; + pDtd->day = 0; + break; + case SQL_C_TIME: + TIME_STRUCT *pDtt; + pDtt = (TIME_STRUCT *) colDefs[colNumber].PtrDataObj; + pDtt->hour = 0; + pDtt->minute = 0; + pDtt->second = 0; + break; } if (setToNull)