// SYNOPSIS STOP
*/
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
- #pragma implementation "dbtable.h"
-#endif
-
#include "wx/wxprec.h"
#ifdef __BORLANDC__
/********** wxDbTable::bindCols() **********/
bool wxDbTable::bindCols(HSTMT cursor)
{
- static SDWORD cb;
+ static SQLLEN cb;
// Bind each column of the table to a memory address for fetching data
UWORD i;
if (!pDb->FwdOnlyCursors())
{
// Fetch the NEXT, PREV, FIRST or LAST record, depending on fetchType
- UDWORD cRowsFetched;
+ SQLULEN cRowsFetched;
UWORD rowStatus;
retcode = SQLExtendedFetch(hstmt, fetchType, 0, &cRowsFetched, &rowStatus);
int i;
wxString sqlStmt;
wxString s;
-// int NumKeyCols=0;
// Calculate the maximum size of the concatenated
// keys for use with wxDbGrid
{
if (colDefs[i].KeyField)
{
-// NumKeyCols++;
m_keysize += colDefs[i].SzDataObj;
}
}
s.Empty();
+
+ bool exists = true;
+ if (checkTableExists)
+ {
+ if (pDb->Dbms() == dbmsPOSTGRES)
+ exists = pDb->TableExists(tableName, NULL, tablePath);
+ else
+ exists = pDb->TableExists(tableName, pDb->GetUsername(), tablePath);
+ }
+
// Verify that the table exists in the database
- if (checkTableExists && !pDb->TableExists(tableName, pDb->GetUsername(), tablePath))
+ if (!exists)
{
s = wxT("Table/view does not exist in the database");
if ( *(pDb->dbInf.accessibleTables) == wxT('Y'))
else if (checkPrivileges)
{
// Verify the user has rights to access the table.
- // Shortcut boolean evaluation to optimize out call to
- // TablePrivileges
- //
- // Unfortunately this optimization doesn't seem to be
- // reliable!
- if (// *(pDb->dbInf.accessibleTables) == 'N' &&
- !pDb->TablePrivileges(tableName, wxT("SELECT"), pDb->GetUsername(), pDb->GetUsername(), tablePath))
+ bool hasPrivs wxDUMMY_INITIALIZE(true);
+
+ if (pDb->Dbms() == dbmsPOSTGRES)
+ hasPrivs = pDb->TablePrivileges(tableName, wxT("SELECT"), pDb->GetUsername(), NULL, tablePath);
+ else
+ hasPrivs = pDb->TablePrivileges(tableName, wxT("SELECT"), pDb->GetUsername(), pDb->GetUsername(), tablePath);
+
+ if (!hasPrivs)
s = wxT("Connecting user does not have sufficient privileges to access this table.\n");
}
- if (!s.IsEmpty())
+ if (!s.empty())
{
wxString p;
- if (!tablePath.IsEmpty())
+ if (!tablePath.empty())
p.Printf(wxT("Error opening '%s/%s'.\n"),tablePath.c_str(),tableName.c_str());
else
p.Printf(wxT("Error opening '%s'.\n"), tableName.c_str());
if (needComma)
sqlStmt += wxT(",");
sqlStmt += pDb->SQLColumnName(colDefs[i].ColName);
-// sqlStmt += colDefs[i].ColName;
needComma = true;
}
needComma = false;
// e.g. DELETE FROM PARTS WHERE ROWID = '111.222.333'
if (CanUpdateByROWID())
{
- SDWORD cb;
+ SQLLEN cb;
wxChar rowid[wxDB_ROWID_LEN+1];
// Get the ROWID value. If not successful retreiving the ROWID,
{
pSqlStmt += wxT(",");
pSqlStmt += pDb->SQLTableName(queryTableName);
-// pSqlStmt += queryTableName;
pSqlStmt += wxT(".ROWID");
}
else
/********** wxDbTable::BuildUpdateStmt() **********/
-void wxDbTable::BuildUpdateStmt(wxString &pSqlStmt, int typeOfUpd, const wxString &pWhereClause)
+void wxDbTable::BuildUpdateStmt(wxString &pSqlStmt, int typeOfUpdate, const wxString &pWhereClause)
{
wxASSERT(!queryOnly);
if (queryOnly)
// Append the WHERE clause to the SQL UPDATE statement
pSqlStmt += wxT(" WHERE ");
- switch(typeOfUpd)
+ switch(typeOfUpdate)
{
case DB_UPD_KEYFIELDS:
// If the datasource supports the ROWID column, build
// e.g. UPDATE PARTS SET Col1 = ?, Col2 = ? WHERE ROWID = '111.222.333'
if (CanUpdateByROWID())
{
- SDWORD cb;
+ SQLLEN cb;
wxChar rowid[wxDB_ROWID_LEN+1];
// Get the ROWID value. If not successful retreiving the ROWID,
/***** DEPRECATED: use wxDbTable::BuildUpdateStmt(wxString &....) form *****/
-void wxDbTable::BuildUpdateStmt(wxChar *pSqlStmt, int typeOfUpd, const wxString &pWhereClause)
+void wxDbTable::BuildUpdateStmt(wxChar *pSqlStmt, int typeOfUpdate, const wxString &pWhereClause)
{
wxString tempSqlStmt;
- BuildUpdateStmt(tempSqlStmt, typeOfUpd, pWhereClause);
+ BuildUpdateStmt(tempSqlStmt, typeOfUpdate, pWhereClause);
wxStrcpy(pSqlStmt, tempSqlStmt);
} // BuildUpdateStmt()
switch(colDefs[colNumber].SqlCtype)
{
case SQL_C_CHAR:
-#ifndef __UNIX__
+#ifdef SQL_C_WCHAR
case SQL_C_WCHAR:
-#endif
+#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);
break;
/********** wxDbTable::CreateIndex() **********/
-bool wxDbTable::CreateIndex(const wxString &idxName, bool unique, UWORD noIdxCols,
- wxDbIdxDef *pIdxDefs, bool attemptDrop)
+bool wxDbTable::CreateIndex(const wxString &indexName, bool unique, UWORD numIndexColumns,
+ wxDbIdxDef *pIndexDefs, bool attemptDrop)
{
wxString sqlStmt;
// Drop the index first
- if (attemptDrop && !DropIndex(idxName))
+ if (attemptDrop && !DropIndex(indexName))
return false;
// MySQL (and possibly Sybase ASE?? - gt) require that any columns which are used as portions
wxString sqlStmt;
int i;
bool ok = true;
- for (i = 0; i < noIdxCols && ok; i++)
+ for (i = 0; i < numIndexColumns && ok; i++)
{
int j = 0;
bool found = false;
// this information
while (!found && (j < this->m_numCols))
{
- if (wxStrcmp(colDefs[j].ColName,pIdxDefs[i].ColName) == 0)
+ if (wxStrcmp(colDefs[j].ColName,pIndexDefs[i].ColName) == 0)
found = true;
if (!found)
j++;
if (found)
{
- ok = pDb->ModifyColumn(tableName, pIdxDefs[i].ColName,
+ ok = pDb->ModifyColumn(tableName, pIndexDefs[i].ColName,
colDefs[j].DbDataType, (int)(colDefs[j].SzDataObj / sizeof(wxChar)),
wxT("NOT NULL"));
sqlStmt += wxT("UNIQUE ");
sqlStmt += wxT("INDEX ");
- sqlStmt += pDb->SQLTableName(idxName);
+ sqlStmt += pDb->SQLTableName(indexName);
sqlStmt += wxT(" ON ");
sqlStmt += pDb->SQLTableName(tableName);
// Append list of columns making up index
int i;
- for (i = 0; i < noIdxCols; i++)
+ for (i = 0; i < numIndexColumns; i++)
{
- sqlStmt += pDb->SQLColumnName(pIdxDefs[i].ColName);
-// sqlStmt += pIdxDefs[i].ColName;
+ sqlStmt += pDb->SQLColumnName(pIndexDefs[i].ColName);
+// sqlStmt += pIndexDefs[i].ColName;
// MySQL requires a key length on VARCHAR keys
if ( pDb->Dbms() == dbmsMY_SQL )
int j;
for ( j = 0; j < m_numCols; ++j )
{
- if ( wxStrcmp( pIdxDefs[i].ColName, colDefs[j].ColName ) == 0 )
+ if ( wxStrcmp( pIndexDefs[i].ColName, colDefs[j].ColName ) == 0 )
{
break;
}
!(pDb->Dbms() == dbmsFIREBIRD) &&
!(pDb->Dbms() == dbmsPOSTGRES))
{
- if (pIdxDefs[i].Ascending)
+ if (pIndexDefs[i].Ascending)
sqlStmt += wxT(" ASC");
else
sqlStmt += wxT(" DESC");
}
else
- wxASSERT_MSG(pIdxDefs[i].Ascending, _T("Datasource does not support DESCending index columns"));
+ wxASSERT_MSG(pIndexDefs[i].Ascending, _T("Datasource does not support DESCending index columns"));
- if ((i + 1) < noIdxCols)
+ if ((i + 1) < numIndexColumns)
sqlStmt += wxT(",");
}
/********** wxDbTable::DropIndex() **********/
-bool wxDbTable::DropIndex(const wxString &idxName)
+bool wxDbTable::DropIndex(const wxString &indexName)
{
// NOTE: This function returns true if the Index does not exist, but
// only for identified databases. Code will need to be added
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"),
- pDb->SQLTableName(idxName.c_str()).c_str(),
+ pDb->SQLTableName(indexName.c_str()).c_str(),
pDb->SQLTableName(tableName.c_str()).c_str());
else if ((pDb->Dbms() == dbmsMS_SQL_SERVER) ||
(pDb->Dbms() == dbmsSYBASE_ASE) ||
(pDb->Dbms() == dbmsXBASE_SEQUITER))
sqlStmt.Printf(wxT("DROP INDEX %s.%s"),
pDb->SQLTableName(tableName.c_str()).c_str(),
- pDb->SQLTableName(idxName.c_str()).c_str());
+ pDb->SQLTableName(indexName.c_str()).c_str());
else
sqlStmt.Printf(wxT("DROP INDEX %s"),
- pDb->SQLTableName(idxName.c_str()).c_str());
+ pDb->SQLTableName(indexName.c_str()).c_str());
pDb->WriteSqlLog(sqlStmt);
(pDb->Dbms() == dbmsSYBASE_ASE && !wxStrcmp(pDb->sqlState,wxT("37000"))) ||
(pDb->Dbms() == dbmsMS_SQL_SERVER && !wxStrcmp(pDb->sqlState,wxT("S1000"))) ||
(pDb->Dbms() == dbmsINTERBASE && !wxStrcmp(pDb->sqlState,wxT("S1000"))) ||
+ (pDb->Dbms() == dbmsMAXDB && !wxStrcmp(pDb->sqlState,wxT("S1000"))) ||
(pDb->Dbms() == dbmsFIREBIRD && !wxStrcmp(pDb->sqlState,wxT("HY000"))) ||
(pDb->Dbms() == dbmsSYBASE_ASE && !wxStrcmp(pDb->sqlState,wxT("S0002"))) || // Base table not found
(pDb->Dbms() == dbmsMY_SQL && !wxStrcmp(pDb->sqlState,wxT("42S12"))) || // tested by Christopher Ludwik Marino-Cebulski using v3.23.21beta
switch(colDefs[colNumber].SqlCtype)
{
case SQL_C_CHAR:
-#ifndef __UNIX__
+#ifdef SQL_C_WCHAR
case SQL_C_WCHAR:
#endif
//case SQL_C_WXCHAR: SQL_C_WXCHAR is covered by either SQL_C_CHAR or SQL_C_WCHAR
/********** wxDbTable::SetColDefs() **********/
bool wxDbTable::SetColDefs(UWORD index, const wxString &fieldName, int dataType, void *pData,
SWORD cType, int size, bool keyField, bool updateable,
- bool insAllow, bool derivedCol)
+ bool insertAllowed, bool derivedColumn)
{
wxString tmpStr;
colDefs[index].SqlCtype = cType;
colDefs[index].SzDataObj = size; //TODO: glt ??? * sizeof(wxChar) ???
colDefs[index].KeyField = keyField;
- colDefs[index].DerivedCol = derivedCol;
+ colDefs[index].DerivedCol = derivedColumn;
// Derived columns by definition would NOT be "Insertable" or "Updateable"
- if (derivedCol)
+ if (derivedColumn)
{
colDefs[index].Updateable = false;
colDefs[index].InsertAllowed = false;
else
{
colDefs[index].Updateable = updateable;
- colDefs[index].InsertAllowed = insAllow;
+ colDefs[index].InsertAllowed = insertAllowed;
}
colDefs[index].Null = false;
{
ULONG count;
wxString sqlStmt;
- SDWORD cb;
+ SQLLEN cb;
// Build a "SELECT COUNT(*) FROM queryTableName [WHERE whereClause]" SQL Statement
sqlStmt = wxT("SELECT COUNT(");
if (CanUpdateByROWID())
{
- SDWORD cb;
+ SQLLEN cb;
wxChar rowid[wxDB_ROWID_LEN+1];
// Get the ROWID value. If not successful retreiving the ROWID,
{
switch (colDefs[colNumber].SqlCtype)
{
+#if wxUSE_UNICODE
+ #if defined(SQL_WCHAR)
+ case SQL_WCHAR:
+ #endif
+ #if defined(SQL_WVARCHAR)
+ case SQL_WVARCHAR:
+ #endif
+#endif
case SQL_CHAR:
case SQL_VARCHAR:
val = (wxChar *)(colDefs[colNumber].PtrDataObj);
switch (colDefs[colNumber].SqlCtype)
{
+#if wxUSE_UNICODE
+ #if defined(SQL_WCHAR)
+ case SQL_WCHAR:
+ #endif
+ #if defined(SQL_WVARCHAR)
+ case SQL_WVARCHAR:
+ #endif
+#endif
case SQL_CHAR:
case SQL_VARCHAR:
csstrncpyt((wxChar *)(colDefs[colNumber].PtrDataObj),