///////////////////////////////////////////////////////////////////////////////
-// Name: dbtable.cpp
+// Name: src/common/dbtable.cpp
// Purpose: Implementation of the wxDbTable class.
// Author: Doug Card
// Modified by: George Tasker
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
-/*
-// SYNOPSIS START
-// SYNOPSIS STOP
-*/
-
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
- #pragma implementation "dbtable.h"
-#endif
-
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
+#if wxUSE_ODBC
+
+#ifndef WX_PRECOMP
+ #include "wx/object.h"
+ #include "wx/list.h"
+ #include "wx/string.h"
+ #include "wx/utils.h"
+ #include "wx/log.h"
+#endif
+
#ifdef DBDEBUG_CONSOLE
#if wxUSE_IOSTREAMH
#include <iostream.h>
#include "wx/ioswrap.h"
#endif
-#ifndef WX_PRECOMP
- #include "wx/string.h"
- #include "wx/object.h"
- #include "wx/list.h"
- #include "wx/utils.h"
- #include "wx/log.h"
-#endif
#include "wx/filefn.h"
-#if wxUSE_ODBC
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
tableName.Empty();
queryTableName.Empty();
- wxASSERT(tblName.Length());
+ wxASSERT(tblName.length());
wxASSERT(pDb);
if (!pDb)
(pDb->Dbms() == dbmsINTERBASE))
tableName = tableName.Upper();
- if (tblPath.Length())
+ if (tblPath.length())
tablePath = tblPath; // Table Path - used for dBase files
else
tablePath.Empty();
- if (qryTblName.Length()) // Name of the table/view to query
+ if (qryTblName.length()) // Name of the table/view to query
queryTableName = qryTblName;
else
queryTableName = tblName;
switch(colDefs[columnIndex].DbDataType)
{
case DB_DATA_TYPE_VARCHAR:
+ case DB_DATA_TYPE_MEMO:
if (colDefs[columnIndex].Null)
colDefs[columnIndex].CbValue = SQL_NULL_DATA;
else
precision = colDefs[i].SzDataObj;
scale = 0;
break;
+ case DB_DATA_TYPE_MEMO:
+ fSqlType = pDb->GetTypeInfMemo().FsqlType;
+ precision = colDefs[i].SzDataObj;
+ scale = 0;
+ break;
case DB_DATA_TYPE_INTEGER:
fSqlType = pDb->GetTypeInfInteger().FsqlType;
precision = pDb->GetTypeInfInteger().Precision;
/********** 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;
}
}
else if (checkPrivileges)
{
// Verify the user has rights to access the table.
- bool hasPrivs = true;
+ bool hasPrivs wxDUMMY_INITIALIZE(true);
+
if (pDb->Dbms() == dbmsPOSTGRES)
hasPrivs = pDb->TablePrivileges(tableName, wxT("SELECT"), pDb->GetUsername(), NULL, tablePath);
else
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;
// Handle the case of DeleteWhere() and the where clause is blank. It should
// delete all records from the database in this case.
- if (typeOfDel == DB_DEL_WHERE && (pWhereClause.Length() == 0))
+ if (typeOfDel == DB_DEL_WHERE && (pWhereClause.length() == 0))
{
pSqlStmt.Printf(wxT("DELETE FROM %s"),
pDb->SQLTableName(tableName.c_str()).c_str());
// 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,
if (typeOfSelect == DB_SELECT_WHERE && from && wxStrlen(from))
appendFromClause = true;
#else
- if (typeOfSelect == DB_SELECT_WHERE && from.Length())
+ if (typeOfSelect == DB_SELECT_WHERE && from.length())
appendFromClause = true;
#endif
{
pSqlStmt += wxT(",");
pSqlStmt += pDb->SQLTableName(queryTableName);
-// pSqlStmt += queryTableName;
pSqlStmt += wxT(".ROWID");
}
else
#if wxODBC_BACKWARD_COMPATABILITY
if (where && wxStrlen(where)) // May not want a where clause!!!
#else
- if (where.Length()) // May not want a where clause!!!
+ if (where.length()) // May not want a where clause!!!
#endif
{
pSqlStmt += wxT(" WHERE ");
break;
case DB_SELECT_KEYFIELDS:
BuildWhereClause(whereClause, DB_WHERE_KEYFIELDS);
- if (whereClause.Length())
+ if (whereClause.length())
{
pSqlStmt += wxT(" WHERE ");
pSqlStmt += whereClause;
break;
case DB_SELECT_MATCHING:
BuildWhereClause(whereClause, DB_WHERE_MATCHING);
- if (whereClause.Length())
+ if (whereClause.length())
{
pSqlStmt += wxT(" WHERE ");
pSqlStmt += whereClause;
#if wxODBC_BACKWARD_COMPATABILITY
if (orderBy && wxStrlen(orderBy))
#else
- if (orderBy.Length())
+ if (orderBy.length())
#endif
{
pSqlStmt += wxT(" ORDER BY ");
// 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,
// Concatenate where phrase for the column
wxString tStr = colDefs[colNumber].ColName;
- if (qualTableName.Length() && tStr.Find(wxT('.')) == wxNOT_FOUND)
+ if (qualTableName.length() && tStr.Find(wxT('.')) == wxNOT_FOUND)
{
pWhereClause += pDb->SQLTableName(qualTableName);
pWhereClause += wxT(".");
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;
case DB_DATA_TYPE_VARCHAR:
cout << pDb->GetTypeInfVarchar().TypeName << wxT("(") << (int)(colDefs[i].SzDataObj / sizeof(wxChar)) << wxT(")");
break;
+ case DB_DATA_TYPE_MEMO:
+ cout << pDb->GetTypeInfMemo().TypeName;
+ break;
case DB_DATA_TYPE_INTEGER:
cout << pDb->GetTypeInfInteger().TypeName;
break;
case DB_DATA_TYPE_VARCHAR:
sqlStmt += pDb->GetTypeInfVarchar().TypeName;
break;
+ case DB_DATA_TYPE_MEMO:
+ sqlStmt += pDb->GetTypeInfMemo().TypeName;
+ break;
case DB_DATA_TYPE_INTEGER:
sqlStmt += pDb->GetTypeInfInteger().TypeName;
break;
(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
if (!colDefs) // May happen if the database connection fails
return false;
- if (fieldName.Length() > (unsigned int) DB_MAX_COLUMN_NAME_LEN)
+ if (fieldName.length() > (unsigned int) DB_MAX_COLUMN_NAME_LEN)
{
wxStrncpy(colDefs[index].ColName, fieldName, DB_MAX_COLUMN_NAME_LEN);
colDefs[index].ColName[DB_MAX_COLUMN_NAME_LEN] = 0; // Prevent buffer overrun
pColDataPtrs[index].SzDataObj = pColInfs[index].bufferSize+(1*sizeof(wxChar));
pColDataPtrs[index].SqlCtype = SQL_C_WXCHAR;
break;
+ case DB_DATA_TYPE_MEMO:
+ pColDataPtrs[index].PtrDataObj = new wxChar[pColInfs[index].bufferSize+(1*sizeof(wxChar))];
+ pColDataPtrs[index].SzDataObj = pColInfs[index].bufferSize+(1*sizeof(wxChar));
+ pColDataPtrs[index].SqlCtype = SQL_C_WXCHAR;
+ break;
case DB_DATA_TYPE_INTEGER:
// Can be long or short
if (pColInfs[index].bufferSize == sizeof(long))
{
ULONG count;
wxString sqlStmt;
- SDWORD cb;
+ SQLLEN cb;
// Build a "SELECT COUNT(*) FROM queryTableName [WHERE whereClause]" SQL Statement
sqlStmt = wxT("SELECT COUNT(");
#if wxODBC_BACKWARD_COMPATABILITY
if (from && wxStrlen(from))
#else
- if (from.Length())
+ if (from.length())
#endif
sqlStmt += from;
#if wxODBC_BACKWARD_COMPATABILITY
if (where && wxStrlen(where))
#else
- if (where.Length())
+ if (where.length())
#endif
{
sqlStmt += wxT(" WHERE ");
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),
#endif // wxUSE_ODBC
-