// Created: 9.96
// 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,
-// modification, enhancement, debugging under the following conditions:
-// 1) These classes may only be used as part of the implementation of a
-// wxWindows-based application
-// 2) All enhancements and bug fixes are to be submitted back to the wxWindows
-// user groups free of all charges for use with the wxWindows library.
-// 3) These classes may not be distributed as part of any other class library,
-// DLL, text (written or electronic), other than a complete distribution of
-// the wxWindows GUI development toolkit.
+// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
/*
// SYNOPSIS START
// SYNOPSIS STOP
*/
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
+ #pragma implementation "db.h"
+#endif
#include "wx/wxprec.h"
-
-// Use this line for wxWindows v1.x
-//#include "wx_ver.h"
-// Use this line for wxWindows v2.x
-#include "wx/version.h"
-
-#if wxMAJOR_VERSION == 2
- #ifdef __GNUG__
- #pragma implementation "db.h"
- #endif
+#ifdef __BORLANDC__
+ #pragma hdrstop
#endif
#ifdef DBDEBUG_CONSOLE
#include "wx/ioswrap.h"
#endif
-#ifdef __BORLANDC__
- #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"
- #include "wx/log.h"
- #endif
- #include "wx/filefn.h"
- #include "wx/wxchar.h"
-#endif
-
-
-#if wxMAJOR_VERSION == 1
-# if defined(wx_msw) || defined(wx_x)
-# ifdef WX_PRECOMP
-# include "wx_prec.h"
-# else
-# include "wx.h"
-# endif
-# endif
-# define wxUSE_ODBC 1
+#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"
+#include "wx/wxchar.h"
#if wxUSE_ODBC
#include <stdlib.h>
#include <ctype.h>
-#if wxMAJOR_VERSION == 1
- #include "db.h"
-#elif wxMAJOR_VERSION == 2
- #include "wx/db.h"
-#endif
+#include "wx/db.h"
-WXDLLEXPORT_DATA(wxDbList*) PtrBegDbList = 0;
+// DLL options compatibility check:
+#include "wx/app.h"
+WX_CHECK_BUILD_OPTIONS("wxODBC")
+WXDLLIMPEXP_DATA_ODBC(wxDbList*) PtrBegDbList = 0;
wxChar const *SQL_LOG_FILENAME = wxT("sqllog.txt");
wxChar const *SQL_CATALOG_FILENAME = wxT("catalog.txt");
// connection
wxChar DBerrorList[DB_MAX_ERROR_HISTORY][DB_MAX_ERROR_MSG_LEN];
+
// This type defines the return row-struct form
// SQLTablePrivileges, and is used by wxDB::TablePrivileges.
typedef struct
wxDbConnectInf::wxDbConnectInf()
{
Henv = 0;
- freeHenvOnDestroy = FALSE;
+ freeHenvOnDestroy = false;
Initialize();
} // Constructor
/********** wxDbConnectInf Constructor - form 2 **********/
-wxDbConnectInf::wxDbConnectInf(HENV henv, const wxString &dsn, const wxString &userID,
+wxDbConnectInf::wxDbConnectInf(HENV henv, const wxString &dsn, const wxString &userID,
const wxString &password, const wxString &defaultDir,
const wxString &fileType, const wxString &description)
{
Henv = 0;
- freeHenvOnDestroy = FALSE;
+ freeHenvOnDestroy = false;
Initialize();
/********** wxDbConnectInf::Initialize() **********/
bool wxDbConnectInf::Initialize()
{
- freeHenvOnDestroy = FALSE;
+ freeHenvOnDestroy = false;
if (freeHenvOnDestroy && Henv)
FreeHenv();
Dsn[0] = 0;
Uid[0] = 0;
AuthStr[0] = 0;
+ ConnectionStr[0] = 0;
Description.Empty();
FileType.Empty();
DefaultDir.Empty();
- return TRUE;
+ useConnectionStr = false;
+
+ return true;
} // wxDbConnectInf::Initialize()
if (SQLAllocEnv(&Henv) != SQL_SUCCESS)
{
wxLogDebug(wxT("A problem occured while trying to get a connection to the data source"));
- return FALSE;
+ return false;
}
- freeHenvOnDestroy = TRUE;
+ freeHenvOnDestroy = true;
- return TRUE;
+ return true;
} // wxDbConnectInf::AllocHenv()
SQLFreeEnv(Henv);
Henv = 0;
- freeHenvOnDestroy = FALSE;
+ freeHenvOnDestroy = false;
} // wxDbConnectInf::FreeHenv()
void wxDbConnectInf::SetUserID(const wxString &uid)
{
wxASSERT(uid.Length() < sizeof(Uid));
- wxStrcpy(Uid,uid);
+ wxStrcpy(Uid, uid);
} // wxDbConnectInf::SetUserID()
void wxDbConnectInf::SetPassword(const wxString &password)
{
wxASSERT(password.Length() < sizeof(AuthStr));
-
- wxStrcpy(AuthStr,password);
+
+ wxStrcpy(AuthStr, password);
} // wxDbConnectInf::SetPassword()
+void wxDbConnectInf::SetConnectionStr(const wxString &connectStr)
+{
+ wxASSERT(connectStr.Length() < sizeof(ConnectionStr));
+
+ useConnectionStr = wxStrlen(connectStr) > 0;
+
+ wxStrcpy(ConnectionStr, connectStr);
+} // wxDbConnectInf::SetConnectionStr()
/********** wxDbColFor Constructor **********/
s_Field = wxT("%02d/%02d/%04d %02d:%02d:%02d.%03d");
}
break;
- case DB_DATA_TYPE_BLOB:
+ case DB_DATA_TYPE_BLOB:
s_Field.Printf(wxT("Unable to format(%d)-SQL(%d)"),dbDataType,sqlDataType); //
- break;
+ break;
default:
s_Field.Printf(wxT("Unknown Format(%d)-SQL(%d)"),dbDataType,sqlDataType); //
break;
FkTableName[0] = 0;
pColFor = NULL;
- return TRUE;
+ return true;
} // wxDbColInf::Initialize()
numCols = 0;
pColInf = NULL;
- return TRUE;
+ return true;
} // wxDbTableInf::Initialize()
numTables = 0;
pTableInf = NULL;
- return TRUE;
+ return true;
} // wxDbInf::Initialize()
-/********** wxDb Constructors **********/
+/********** wxDb Constructor **********/
wxDb::wxDb(const HENV &aHenv, bool FwdOnlyCursors)
{
// Copy the HENV into the db class
} // wxDb::wxDb()
+/********** wxDb Destructor **********/
+wxDb::~wxDb()
+{
+ wxASSERT_MSG(!IsCached(),wxT("Cached connections must not be manually deleted, use\nwxDbFreeConnection() or wxDbCloseConnections()."));
+
+ if (IsOpen())
+ {
+ Close();
+ }
+} // wxDb destructor
+
+
+
/********** PRIVATE! wxDb::initialize PRIVATE! **********/
/********** wxDb::initialize() **********/
void wxDb::initialize()
typeInfBlob.MaximumScale = 0;
// Error reporting is turned OFF by default
- silent = TRUE;
+ silent = true;
// Allocate a data source connection handle
if (SQLAllocConnect(henv, &hdbc) != SQL_SUCCESS)
DB_STATUS = 0;
// Mark database as not open as of yet
- dbIsOpen = FALSE;
+ dbIsOpen = false;
+ dbIsCached = false;
+ dbOpenedWithConnectionString = false;
} // wxDb::initialize()
UserID.Empty();
// dBase does not use user names, and some drivers fail if you try to pass one
- if (Dbms() == dbmsDBASE)
+ if ( Dbms() == dbmsDBASE
+ || Dbms() == dbmsXBASE_SEQUITER )
UserID.Empty();
// Oracle user names may only be in uppercase, so force
} // wxDb::convertUserID()
-/********** wxDb::Open() **********/
-bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthStr)
+bool wxDb::open(bool failOnDataTypeUnsupported)
{
- wxASSERT(Dsn.Length());
- dsn = Dsn;
- uid = Uid;
- authStr = AuthStr;
-
- RETCODE retcode;
-
- if (!FwdOnlyCursors())
- {
- // Specify that the ODBC cursor library be used, if needed. This must be
- // specified before the connection is made.
- retcode = SQLSetConnectOption(hdbc, SQL_ODBC_CURSORS, SQL_CUR_USE_IF_NEEDED);
-
-#ifdef DBDEBUG_CONSOLE
- if (retcode == SQL_SUCCESS)
- cout << wxT("SQLSetConnectOption(CURSOR_LIB) successful") << endl;
- else
- cout << wxT("SQLSetConnectOption(CURSOR_LIB) failed") << endl;
-#endif
- }
-
- // Connect to the data source
- retcode = SQLConnect(hdbc, (UCHAR FAR *) dsn.c_str(), SQL_NTS,
- (UCHAR FAR *) uid.c_str(), SQL_NTS,
- (UCHAR FAR *) authStr.c_str(), SQL_NTS);
-
-/*
- if (retcode == SQL_SUCCESS_WITH_INFO)
- DispAllErrors(henv, hdbc);
- else if (retcode != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
-
- if (retcode == SQL_ERROR)
- return(DispAllErrors(henv, hdbc));
-*/
- if ((retcode != SQL_SUCCESS) &&
- (retcode != SQL_SUCCESS_WITH_INFO))
- return(DispAllErrors(henv, hdbc));
-
/*
If using Intersolv branded ODBC drivers, this is the place where you would substitute
your branded driver license information
*/
// Mark database as open
- dbIsOpen = TRUE;
+ dbIsOpen = true;
// Allocate a statement handle for the database connection
if (SQLAllocStmt(hdbc, &hstmt) != SQL_SUCCESS)
// Set Connection Options
if (!setConnectionOptions())
- return(FALSE);
+ return false;
// Query the data source for inf. about itself
- if (!getDbInfo())
- return(FALSE);
+ if (!getDbInfo(failOnDataTypeUnsupported))
+ return false;
// Query the data source regarding data type information
// VARCHAR = Variable length character string
if (!getDataTypeInfo(SQL_VARCHAR, typeInfVarchar))
if (!getDataTypeInfo(SQL_CHAR, typeInfVarchar))
- return(FALSE);
+ return false;
else
typeInfVarchar.FsqlType = SQL_CHAR;
else
if (!getDataTypeInfo(SQL_FLOAT,typeInfFloat))
if (!getDataTypeInfo(SQL_DECIMAL,typeInfFloat))
if (!getDataTypeInfo(SQL_NUMERIC,typeInfFloat))
- return(FALSE);
+ {
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
else
typeInfFloat.FsqlType = SQL_NUMERIC;
else
// If SQL_INTEGER is not supported, use the floating point
// data type to store integers as well as floats
if (!getDataTypeInfo(typeInfFloat.FsqlType, typeInfInteger))
- return(FALSE);
+ {
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
else
typeInfInteger.FsqlType = typeInfFloat.FsqlType;
}
typeInfInteger.FsqlType = SQL_INTEGER;
// Date/Time
- if (Dbms() != dbmsDBASE)
- {
- if (! getDataTypeInfo(SQL_TIMESTAMP,typeInfDate))
- return(FALSE);
- else
- typeInfDate.FsqlType = SQL_TIMESTAMP;
- }
- else
+ if (!getDataTypeInfo(SQL_TIMESTAMP,typeInfDate))
{
if (!getDataTypeInfo(SQL_DATE,typeInfDate))
- return(FALSE);
+ {
+#ifdef SQL_DATETIME
+ if (getDataTypeInfo(SQL_DATETIME,typeInfDate))
+ {
+ typeInfDate.FsqlType = SQL_TIME;
+ }
+ else
+#endif // SQL_DATETIME defined
+ {
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
+ }
else
typeInfDate.FsqlType = SQL_DATE;
}
+ else
+ typeInfDate.FsqlType = SQL_TIMESTAMP;
+
if (!getDataTypeInfo(SQL_LONGVARBINARY, typeInfBlob))
{
if (!getDataTypeInfo(SQL_VARBINARY,typeInfBlob))
- return(FALSE);
+ {
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
else
typeInfBlob.FsqlType = SQL_VARBINARY;
}
else
typeInfBlob.FsqlType = SQL_LONGVARBINARY;
-//typeInfBlob.TypeName = "BLOB";
#ifdef DBDEBUG_CONSOLE
cout << wxT("VARCHAR DATA TYPE: ") << typeInfVarchar.TypeName << endl;
#endif
// Completed Successfully
- return(TRUE);
+ return true;
+}
+
+bool wxDb::Open(const wxString& inConnectStr, bool failOnDataTypeUnsupported)
+{
+ wxASSERT(inConnectStr.Length());
+ dsn = wxT("");
+ uid = wxT("");
+ authStr = wxT("");
+
+ RETCODE retcode;
+
+ if (!FwdOnlyCursors())
+ {
+ // Specify that the ODBC cursor library be used, if needed. This must be
+ // specified before the connection is made.
+ retcode = SQLSetConnectOption(hdbc, SQL_ODBC_CURSORS, SQL_CUR_USE_IF_NEEDED);
+
+#ifdef DBDEBUG_CONSOLE
+ if (retcode == SQL_SUCCESS)
+ cout << wxT("SQLSetConnectOption(CURSOR_LIB) successful") << endl;
+ else
+ cout << wxT("SQLSetConnectOption(CURSOR_LIB) failed") << endl;
+#else
+ wxUnusedVar(retcode);
+#endif
+ }
+
+ // Connect to the data source
+ SQLTCHAR outConnectBuffer[SQL_MAX_CONNECTSTR_LEN+1]; // MS recommends at least 1k buffer
+ short outConnectBufferLen;
+
+ inConnectionStr = inConnectStr;
+
+ retcode = SQLDriverConnect(hdbc, NULL, (SQLTCHAR FAR *)inConnectionStr.c_str(),
+ inConnectionStr.Length(), (SQLTCHAR FAR *)outConnectBuffer,
+ sizeof(outConnectBuffer), &outConnectBufferLen, SQL_DRIVER_COMPLETE );
+
+ if ((retcode != SQL_SUCCESS) &&
+ (retcode != SQL_SUCCESS_WITH_INFO))
+ return(DispAllErrors(henv, hdbc));
+
+ outConnectBuffer[outConnectBufferLen] = 0;
+ outConnectionStr = outConnectBuffer;
+ dbOpenedWithConnectionString = true;
+
+ return open(failOnDataTypeUnsupported);
+}
+
+/********** wxDb::Open() **********/
+bool wxDb::Open(const wxString &Dsn, const wxString &Uid, const wxString &AuthStr, bool failOnDataTypeUnsupported)
+{
+ wxASSERT(Dsn.Length());
+ dsn = Dsn;
+ uid = Uid;
+ authStr = AuthStr;
+
+ inConnectionStr = wxT("");
+ outConnectionStr = wxT("");
+
+ RETCODE retcode;
+
+ if (!FwdOnlyCursors())
+ {
+ // Specify that the ODBC cursor library be used, if needed. This must be
+ // specified before the connection is made.
+ retcode = SQLSetConnectOption(hdbc, SQL_ODBC_CURSORS, SQL_CUR_USE_IF_NEEDED);
+
+#ifdef DBDEBUG_CONSOLE
+ if (retcode == SQL_SUCCESS)
+ cout << wxT("SQLSetConnectOption(CURSOR_LIB) successful") << endl;
+ else
+ cout << wxT("SQLSetConnectOption(CURSOR_LIB) failed") << endl;
+#else
+ wxUnusedVar( retcode );
+#endif
+ }
+
+ // Connect to the data source
+ retcode = SQLConnect(hdbc, (SQLTCHAR FAR *) dsn.c_str(), SQL_NTS,
+ (SQLTCHAR FAR *) uid.c_str(), SQL_NTS,
+ (SQLTCHAR FAR *) authStr.c_str(), SQL_NTS);
+
+ if ((retcode != SQL_SUCCESS) &&
+ (retcode != SQL_SUCCESS_WITH_INFO))
+ return(DispAllErrors(henv, hdbc));
+
+ return open(failOnDataTypeUnsupported);
} // wxDb::Open()
-bool wxDb::Open(wxDbConnectInf *dbConnectInf)
+bool wxDb::Open(wxDbConnectInf *dbConnectInf, bool failOnDataTypeUnsupported)
{
- return Open(dbConnectInf->GetDsn(), dbConnectInf->GetUserID(),
- dbConnectInf->GetPassword());
+ wxASSERT(dbConnectInf);
+
+ // Use the connection string if one is present
+ if (dbConnectInf->UseConnectionStr())
+ return Open(GetConnectionInStr(), failOnDataTypeUnsupported);
+ else
+ return Open(dbConnectInf->GetDsn(), dbConnectInf->GetUserID(),
+ dbConnectInf->GetPassword(), failOnDataTypeUnsupported);
} // wxDb::Open()
bool wxDb::Open(wxDb *copyDb)
{
- dsn = copyDb->GetDatasourceName();
- uid = copyDb->GetUsername();
- authStr = copyDb->GetPassword();
+ dsn = copyDb->GetDatasourceName();
+ uid = copyDb->GetUsername();
+ authStr = copyDb->GetPassword();
+ inConnectionStr = copyDb->GetConnectionInStr();
+ outConnectionStr = copyDb->GetConnectionOutStr();
RETCODE retcode;
cout << wxT("SQLSetConnectOption(CURSOR_LIB) successful") << endl;
else
cout << wxT("SQLSetConnectOption(CURSOR_LIB) failed") << endl;
+#else
+ wxUnusedVar( retcode );
#endif
}
- // Connect to the data source
- retcode = SQLConnect(hdbc, (UCHAR FAR *) dsn.c_str(), SQL_NTS,
- (UCHAR FAR *) uid.c_str(), SQL_NTS,
- (UCHAR FAR *) authStr.c_str(), SQL_NTS);
+ if (copyDb->OpenedWithConnectionString())
+ {
+ // Connect to the data source
+ SQLTCHAR outConnectBuffer[SQL_MAX_CONNECTSTR_LEN+1];
+ short outConnectBufferLen;
+
+ inConnectionStr = copyDb->GetConnectionInStr();
+
+ retcode = SQLDriverConnect(hdbc, NULL, (SQLTCHAR FAR *)inConnectionStr.c_str(),
+ inConnectionStr.Length(), (SQLTCHAR FAR *)outConnectBuffer,
+ sizeof(outConnectBuffer), &outConnectBufferLen, SQL_DRIVER_COMPLETE);
- if (retcode == SQL_ERROR)
- return(DispAllErrors(henv, hdbc));
+ if ((retcode != SQL_SUCCESS) &&
+ (retcode != SQL_SUCCESS_WITH_INFO))
+ return(DispAllErrors(henv, hdbc));
+
+ outConnectBuffer[outConnectBufferLen] = 0;
+ outConnectionStr = outConnectBuffer;
+ dbOpenedWithConnectionString = true;
+ }
+ else
+ {
+ // Connect to the data source
+ retcode = SQLConnect(hdbc, (SQLTCHAR FAR *) dsn.c_str(), SQL_NTS,
+ (SQLTCHAR FAR *) uid.c_str(), SQL_NTS,
+ (SQLTCHAR FAR *) authStr.c_str(), SQL_NTS);
+ }
+
+ if ((retcode != SQL_SUCCESS) &&
+ (retcode != SQL_SUCCESS_WITH_INFO))
+ return(DispAllErrors(henv, hdbc));
/*
If using Intersolv branded ODBC drivers, this is the place where you would substitute
*/
// Mark database as open
- dbIsOpen = TRUE;
+ dbIsOpen = true;
// Allocate a statement handle for the database connection
if (SQLAllocStmt(hdbc, &hstmt) != SQL_SUCCESS)
// Set Connection Options
if (!setConnectionOptions())
- return(FALSE);
+ return false;
// Instead of Querying the data source for info about itself, it can just be copied
// from the wxDb instance that was passed in (copyDb).
#endif
// Completed Successfully
- return(TRUE);
+ return true;
} // wxDb::Open() 2
SQLSetConnectOption(hdbc, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF);
SQLSetConnectOption(hdbc, SQL_OPT_TRACE, SQL_OPT_TRACE_OFF);
-// SQLSetConnectOption(hdbc, SQL_TXN_ISOLATION, SQL_TXN_READ_COMMITTED); // No dirty reads
+// SQLSetConnectOption(hdbc, SQL_TXN_ISOLATION, SQL_TXN_READ_COMMITTED); // No dirty reads
// By default, MS Sql Server closes cursors on commit and rollback. The following
// call to SQLSetConnectOption() is needed to force SQL Server to preserve cursors
#endif
// Completed Successfully
- return(TRUE);
+ return true;
} // wxDb::setConnectionOptions()
/********** wxDb::getDbInfo() **********/
-bool wxDb::getDbInfo(void)
+bool wxDb::getDbInfo(bool failOnDataTypeUnsupported)
{
SWORD cb;
RETCODE retcode;
- if (SQLGetInfo(hdbc, SQL_SERVER_NAME, (UCHAR*) dbInf.serverName, 80, &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_SERVER_NAME, (UCHAR*) dbInf.serverName, 80, &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_DATABASE_NAME, (UCHAR*) dbInf.databaseName, 128, &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_DATABASE_NAME, (UCHAR*) dbInf.databaseName, 128, &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_DBMS_NAME, (UCHAR*) dbInf.dbmsName, 40, &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_DBMS_NAME, (UCHAR*) dbInf.dbmsName, 40, &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
// 16-Mar-1999
// After upgrading to MSVC6, the original 20 char buffer below was insufficient,
// causing database connectivity to fail in some cases.
retcode = SQLGetInfo(hdbc, SQL_DBMS_VER, (UCHAR*) dbInf.dbmsVer, 64, &cb);
-
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
- return(DispAllErrors(henv, hdbc));
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_ACTIVE_CONNECTIONS, (UCHAR*) &dbInf.maxConnections, sizeof(dbInf.maxConnections), &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_ACTIVE_CONNECTIONS, (UCHAR*) &dbInf.maxConnections, sizeof(dbInf.maxConnections), &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_ACTIVE_STATEMENTS, (UCHAR*) &dbInf.maxStmts, sizeof(dbInf.maxStmts), &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_ACTIVE_STATEMENTS, (UCHAR*) &dbInf.maxStmts, sizeof(dbInf.maxStmts), &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_DRIVER_NAME, (UCHAR*) dbInf.driverName, 40, &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_DRIVER_NAME, (UCHAR*) dbInf.driverName, 40, &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_DRIVER_ODBC_VER, (UCHAR*) dbInf.odbcVer, 60, &cb) == SQL_ERROR)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_DRIVER_ODBC_VER, (UCHAR*) dbInf.odbcVer, 60, &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
retcode = SQLGetInfo(hdbc, SQL_ODBC_VER, (UCHAR*) dbInf.drvMgrOdbcVer, 60, &cb);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
- return(DispAllErrors(henv, hdbc));
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_DRIVER_VER, (UCHAR*) dbInf.driverVer, 60, &cb) == SQL_ERROR)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_DRIVER_VER, (UCHAR*) dbInf.driverVer, 60, &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_ODBC_API_CONFORMANCE, (UCHAR*) &dbInf.apiConfLvl, sizeof(dbInf.apiConfLvl), &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_ODBC_API_CONFORMANCE, (UCHAR*) &dbInf.apiConfLvl, sizeof(dbInf.apiConfLvl), &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_ODBC_SAG_CLI_CONFORMANCE, (UCHAR*) &dbInf.cliConfLvl, sizeof(dbInf.cliConfLvl), &cb) != SQL_SUCCESS)
-// return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_ODBC_SAG_CLI_CONFORMANCE, (UCHAR*) &dbInf.cliConfLvl, sizeof(dbInf.cliConfLvl), &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
{
// Not all drivers support this call - Nick Gorham(unixODBC)
dbInf.cliConfLvl = 0;
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
}
- if (SQLGetInfo(hdbc, SQL_ODBC_SQL_CONFORMANCE, (UCHAR*) &dbInf.sqlConfLvl, sizeof(dbInf.sqlConfLvl), &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_ODBC_SQL_CONFORMANCE, (UCHAR*) &dbInf.sqlConfLvl, sizeof(dbInf.sqlConfLvl), &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_OUTER_JOINS, (UCHAR*) dbInf.outerJoins, 2, &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_OUTER_JOINS, (UCHAR*) dbInf.outerJoins, 2, &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_PROCEDURES, (UCHAR*) dbInf.procedureSupport, 2, &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_PROCEDURES, (UCHAR*) dbInf.procedureSupport, 2, &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_ACCESSIBLE_TABLES, (UCHAR*) dbInf.accessibleTables, 2, &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_ACCESSIBLE_TABLES, (UCHAR*) dbInf.accessibleTables, 2, &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_CURSOR_COMMIT_BEHAVIOR, (UCHAR*) &dbInf.cursorCommitBehavior, sizeof(dbInf.cursorCommitBehavior), &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_CURSOR_COMMIT_BEHAVIOR, (UCHAR*) &dbInf.cursorCommitBehavior, sizeof(dbInf.cursorCommitBehavior), &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_CURSOR_ROLLBACK_BEHAVIOR, (UCHAR*) &dbInf.cursorRollbackBehavior, sizeof(dbInf.cursorRollbackBehavior), &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_CURSOR_ROLLBACK_BEHAVIOR, (UCHAR*) &dbInf.cursorRollbackBehavior, sizeof(dbInf.cursorRollbackBehavior), &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_NON_NULLABLE_COLUMNS, (UCHAR*) &dbInf.supportNotNullClause, sizeof(dbInf.supportNotNullClause), &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_NON_NULLABLE_COLUMNS, (UCHAR*) &dbInf.supportNotNullClause, sizeof(dbInf.supportNotNullClause), &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_ODBC_SQL_OPT_IEF, (UCHAR*) dbInf.supportIEF, 2, &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_ODBC_SQL_OPT_IEF, (UCHAR*) dbInf.supportIEF, 2, &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_DEFAULT_TXN_ISOLATION, (UCHAR*) &dbInf.txnIsolation, sizeof(dbInf.txnIsolation), &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_DEFAULT_TXN_ISOLATION, (UCHAR*) &dbInf.txnIsolation, sizeof(dbInf.txnIsolation), &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_TXN_ISOLATION_OPTION, (UCHAR*) &dbInf.txnIsolationOptions, sizeof(dbInf.txnIsolationOptions), &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_TXN_ISOLATION_OPTION, (UCHAR*) &dbInf.txnIsolationOptions, sizeof(dbInf.txnIsolationOptions), &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_FETCH_DIRECTION, (UCHAR*) &dbInf.fetchDirections, sizeof(dbInf.fetchDirections), &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_FETCH_DIRECTION, (UCHAR*) &dbInf.fetchDirections, sizeof(dbInf.fetchDirections), &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_LOCK_TYPES, (UCHAR*) &dbInf.lockTypes, sizeof(dbInf.lockTypes), &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_LOCK_TYPES, (UCHAR*) &dbInf.lockTypes, sizeof(dbInf.lockTypes), &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_POS_OPERATIONS, (UCHAR*) &dbInf.posOperations, sizeof(dbInf.posOperations), &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_POS_OPERATIONS, (UCHAR*) &dbInf.posOperations, sizeof(dbInf.posOperations), &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_POSITIONED_STATEMENTS, (UCHAR*) &dbInf.posStmts, sizeof(dbInf.posStmts), &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_POSITIONED_STATEMENTS, (UCHAR*) &dbInf.posStmts, sizeof(dbInf.posStmts), &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_SCROLL_CONCURRENCY, (UCHAR*) &dbInf.scrollConcurrency, sizeof(dbInf.scrollConcurrency), &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_SCROLL_CONCURRENCY, (UCHAR*) &dbInf.scrollConcurrency, sizeof(dbInf.scrollConcurrency), &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_SCROLL_OPTIONS, (UCHAR*) &dbInf.scrollOptions, sizeof(dbInf.scrollOptions), &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_SCROLL_OPTIONS, (UCHAR*) &dbInf.scrollOptions, sizeof(dbInf.scrollOptions), &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_STATIC_SENSITIVITY, (UCHAR*) &dbInf.staticSensitivity, sizeof(dbInf.staticSensitivity), &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_STATIC_SENSITIVITY, (UCHAR*) &dbInf.staticSensitivity, sizeof(dbInf.staticSensitivity), &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_TXN_CAPABLE, (UCHAR*) &dbInf.txnCapable, sizeof(dbInf.txnCapable), &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_TXN_CAPABLE, (UCHAR*) &dbInf.txnCapable, sizeof(dbInf.txnCapable), &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
- if (SQLGetInfo(hdbc, SQL_LOGIN_TIMEOUT, (UCHAR*) &dbInf.loginTimeout, sizeof(dbInf.loginTimeout), &cb) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc));
+ retcode = SQLGetInfo(hdbc, SQL_LOGIN_TIMEOUT, (UCHAR*) &dbInf.loginTimeout, sizeof(dbInf.loginTimeout), &cb);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO )
+ {
+ DispAllErrors(henv, hdbc);
+ if (failOnDataTypeUnsupported)
+ return false;
+ }
#ifdef DBDEBUG_CONSOLE
cout << wxT("***** DATA SOURCE INFORMATION *****") << endl;
#endif
// Completed Successfully
- return(TRUE);
+ return true;
} // wxDb::getDbInfo()
// Get information about the data type specified
if (SQLGetTypeInfo(hstmt, fSqlType) != SQL_SUCCESS)
return(DispAllErrors(henv, hdbc, hstmt));
+
// Fetch the record
- if ((retcode = SQLFetch(hstmt)) != SQL_SUCCESS)
+ retcode = SQLFetch(hstmt);
+ if (retcode != SQL_SUCCESS)
{
#ifdef DBDEBUG_CONSOLE
if (retcode == SQL_NO_DATA_FOUND)
#endif
DispAllErrors(henv, hdbc, hstmt);
SQLFreeStmt(hstmt, SQL_CLOSE);
- return(FALSE);
+ return false;
}
wxChar typeName[DB_TYPE_NAME_LEN+1];
+
// Obtain columns from the record
if (SQLGetData(hstmt, 1, SQL_C_CHAR, (UCHAR*) typeName, DB_TYPE_NAME_LEN, &cbRet) != SQL_SUCCESS)
return(DispAllErrors(henv, hdbc, hstmt));
return(DispAllErrors(henv, hdbc, hstmt));
// Completed Successfully
- return(TRUE);
+ return true;
} // wxDb::getDataTypeInfo()
#ifdef __WXDEBUG__
wxTablesInUse *tiu;
- wxNode *pNode;
- pNode = TablesInUse.First();
+ wxList::compatibility_iterator pNode;
+ pNode = TablesInUse.GetFirst();
wxString s,s2;
while (pNode)
{
- tiu = (wxTablesInUse *)pNode->Data();
+ tiu = (wxTablesInUse *)pNode->GetData();
if (tiu->pDb == this)
{
s.Printf(wxT("(%-20s) tableID:[%6lu] pDb:[%p]"), tiu->tableName,tiu->tableID,tiu->pDb);
- s2.Printf(wxT("Orphaned found using pDb:[%p]"),this);
- wxLogDebug (s,s2);
+ s2.Printf(wxT("Orphaned table found using pDb:[%p]"),this);
+ wxLogDebug(s.c_str(),s2.c_str());
}
- pNode = pNode->Next();
+ pNode = pNode->GetNext();
}
#endif
for (i = 0; i < DB_MAX_ERROR_HISTORY; i++)
wxStrcpy(DBerrorList[i], errorList[i]);
- dbmsType = dbmsUNIDENTIFIED;
- dbIsOpen = FALSE;
+ dbmsType = dbmsUNIDENTIFIED;
+ dbIsOpen = false;
} // wxDb::Close()
}
// Completed successfully
- return(TRUE);
+ return true;
} // wxDb::CommitTrans()
return(DispAllErrors(henv, hdbc));
// Completed successfully
- return(TRUE);
+ return true;
} // wxDb::RollbackTrans()
* If in DBDEBUG_CONSOLE mode, the constructed string will be displayed in the console
* window and program execution will be paused until the user presses a key.
*
- * This function always returns a FALSE, so that functions which call this function
+ * This function always returns a false, so that functions which call this function
* can have a line like "return (DispAllErrors(henv, hdbc));" to indicate the failure
* of the users request, so that the calling code can then process the error msg log
*/
{
wxString odbcErrMsg;
- while (SQLError(aHenv, aHdbc, aHstmt, (UCHAR FAR *) sqlState, &nativeError, (UCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS)
+ while (SQLError(aHenv, aHdbc, aHstmt, (SQLTCHAR FAR *) sqlState, &nativeError, (SQLTCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS)
{
odbcErrMsg.Printf(wxT("SQL State = %s\nNative Error Code = %li\nError Message = %s\n"), sqlState, nativeError, errorMsg);
logError(odbcErrMsg, sqlState);
}
}
- return(FALSE); // This function always returns false.
+ return false; // This function always returns false.
} // wxDb::DispAllErrors()
/********** wxDb::GetNextError() **********/
bool wxDb::GetNextError(HENV aHenv, HDBC aHdbc, HSTMT aHstmt)
{
- if (SQLError(aHenv, aHdbc, aHstmt, (UCHAR FAR *) sqlState, &nativeError, (UCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS)
- return(TRUE);
+ if (SQLError(aHenv, aHdbc, aHstmt, (SQLTCHAR FAR *) sqlState, &nativeError, (SQLTCHAR FAR *) errorMsg, SQL_MAX_MESSAGE_LENGTH - 1, &cbErrorMsg) == SQL_SUCCESS)
+ return true;
else
- return(FALSE);
+ return false;
} // wxDb::GetNextError()
}
sqlStmt += wxT(" ON ");
- sqlStmt += tableName;
+ sqlStmt += SQLTableName(tableName);
sqlStmt += wxT(" TO ");
sqlStmt += userList;
// Drop the view first
if (attemptDrop && !DropView(viewName))
- return FALSE;
+ return false;
// Build the create view statement
sqlStmt = wxT("CREATE VIEW ");
bool wxDb::DropView(const wxString &viewName)
{
/*
- * NOTE: This function returns TRUE if the View does not exist, but
+ * NOTE: This function returns true if the View does not exist, but
* only for identified databases. Code will need to be added
* below for any other databases when those databases are defined
* to handle this situation consistently
cout << endl << sqlStmt.c_str() << endl;
#endif
- if (SQLExecDirect(hstmt, (UCHAR FAR *) sqlStmt.c_str(), SQL_NTS) != SQL_SUCCESS)
+ if (SQLExecDirect(hstmt, (SQLTCHAR FAR *) sqlStmt.c_str(), SQL_NTS) != SQL_SUCCESS)
{
// Check for "Base table not found" error and ignore
GetNextError(henv, hdbc, hstmt);
DispNextError();
DispAllErrors(henv, hdbc, hstmt);
RollbackTrans();
- return(FALSE);
+ return false;
}
}
}
// Commit the transaction
- if (! CommitTrans())
- return(FALSE);
+ if (!CommitTrans())
+ return false;
- return TRUE;
+ return true;
} // wxDb::DropView()
SQLFreeStmt(hstmt, SQL_CLOSE);
- retcode = SQLExecDirect(hstmt, (UCHAR FAR *) pSqlStmt.c_str(), SQL_NTS);
- if (retcode == SQL_SUCCESS ||
+ retcode = SQLExecDirect(hstmt, (SQLTCHAR FAR *) pSqlStmt.c_str(), SQL_NTS);
+ if (retcode == SQL_SUCCESS ||
(Dbms() == dbmsDB2 && (retcode == SQL_SUCCESS_WITH_INFO || retcode == SQL_NO_DATA_FOUND)))
{
- return(TRUE);
+ return true;
}
else
{
DispAllErrors(henv, hdbc, hstmt);
- return(FALSE);
+ return false;
}
} // wxDb::ExecSql()
bool wxDb::GetNext(void)
{
if (SQLFetch(hstmt) == SQL_SUCCESS)
- return(TRUE);
+ return true;
else
{
DispAllErrors(henv, hdbc, hstmt);
- return(FALSE);
+ return false;
}
} // wxDb::GetNext()
wxASSERT(cbReturned);
if (SQLGetData(hstmt, colNo, cType, pData, maxLen, cbReturned) == SQL_SUCCESS)
- return(TRUE);
+ return true;
else
{
DispAllErrors(henv, hdbc, hstmt);
- return(FALSE);
+ return false;
}
} // wxDb::GetData()
retcode = SQLPrimaryKeys(hstmt,
NULL, 0, /* Catalog name */
NULL, 0, /* Schema name */
- (UCHAR FAR *) tableName.c_str(), SQL_NTS); /* Table name */
+ (SQLTCHAR FAR *) tableName.c_str(), SQL_NTS); /* Table name */
/*---------------------------------------------------------------------*/
/* Fetch and display the result set. This will be a list of the */
retcode = SQLForeignKeys(hstmt,
NULL, 0, /* Primary catalog */
NULL, 0, /* Primary schema */
- (UCHAR FAR *)tableName.c_str(), SQL_NTS,/* Primary table */
+ (SQLTCHAR FAR *)tableName.c_str(), SQL_NTS,/* Primary table */
NULL, 0, /* Foreign catalog */
NULL, 0, /* Foreign schema */
NULL, 0); /* Foreign table */
NULL, 0, /* Primary table */
NULL, 0, /* Foreign catalog */
NULL, 0, /* Foreign schema */
- (UCHAR *)tableName.c_str(), SQL_NTS);/* Foreign table */
+ (SQLTCHAR *)tableName.c_str(), SQL_NTS);/* Foreign table */
/*---------------------------------------------------------------------*/
/* Fetch and display the result set. This will be all of the */
/* primary keys in other tables that are referred to by foreign */
/* keys in the tableName table. */
/*---------------------------------------------------------------------*/
- i = 0;
while ((retcode == SQL_SUCCESS) || (retcode == SQL_SUCCESS_WITH_INFO))
{
retcode = SQLFetch(hstmt);
* to avoid undesired unbinding of columns.
*/
{
- UWORD noCols = 0;
- UWORD colNo = 0;
+ UWORD noCols = 0;
+ UWORD colNo = 0;
wxDbColInf *colInf = 0;
RETCODE retcode;
{
retcode = SQLColumns(hstmt,
NULL, 0, // All qualifiers
- (UCHAR *) UserID.c_str(), SQL_NTS, // Owner
- (UCHAR *) TableName.c_str(), SQL_NTS,
+ (SQLTCHAR *) UserID.c_str(), SQL_NTS, // Owner
+ (SQLTCHAR *) TableName.c_str(), SQL_NTS,
NULL, 0); // All columns
}
else
retcode = SQLColumns(hstmt,
NULL, 0, // All qualifiers
NULL, 0, // Owner
- (UCHAR *) TableName.c_str(), SQL_NTS,
+ (SQLTCHAR *) TableName.c_str(), SQL_NTS,
NULL, 0); // All columns
}
if (retcode != SQL_SUCCESS)
{
retcode = SQLColumns(hstmt,
NULL, 0, // All qualifiers
- (UCHAR *) UserID.c_str(), SQL_NTS, // Owner
- (UCHAR *) TableName.c_str(), SQL_NTS,
+ (SQLTCHAR *) UserID.c_str(), SQL_NTS, // Owner
+ (SQLTCHAR *) TableName.c_str(), SQL_NTS,
NULL, 0); // All columns
}
else
retcode = SQLColumns(hstmt,
NULL, 0, // All qualifiers
NULL, 0, // Owner
- (UCHAR *) TableName.c_str(), SQL_NTS,
+ (SQLTCHAR *) TableName.c_str(), SQL_NTS,
NULL, 0); // All columns
}
if (retcode != SQL_SUCCESS)
#ifdef __WXDEBUG__
default:
wxString errMsg;
- errMsg.Printf(wxT("SQL Data type %d currently not supported by wxWindows"), colInf[colNo].sqlDataType);
+ errMsg.Printf(wxT("SQL Data type %d currently not supported by wxWidgets"), colInf[colNo].sqlDataType);
wxLogDebug(errMsg,wxT("ODBC DEBUG MESSAGE"));
#endif
}
// Build a generic SELECT statement which returns 0 rows
wxString Stmt;
- Stmt.Printf(wxT("select * from %s where 0=1"), tableName);
+ Stmt.Printf(wxT("select * from \"%s\" where 0=1"), tableName);
// Execute query
if (SQLExecDirect(hstmt, (UCHAR FAR *) Stmt.c_str(), SQL_NTS) != SQL_SUCCESS)
/********** wxDb::GetColumnCount() **********/
-UWORD wxDb::GetColumnCount(const wxString &tableName, const wxChar *userID)
+int wxDb::GetColumnCount(const wxString &tableName, const wxChar *userID)
/*
* Returns a count of how many columns are in a table.
* If an error occurs in computing the number of columns
{
retcode = SQLColumns(hstmt,
NULL, 0, // All qualifiers
- (UCHAR *) UserID.c_str(), SQL_NTS, // Owner
- (UCHAR *) TableName.c_str(), SQL_NTS,
+ (SQLTCHAR *) UserID.c_str(), SQL_NTS, // Owner
+ (SQLTCHAR *) TableName.c_str(), SQL_NTS,
NULL, 0); // All columns
}
else
retcode = SQLColumns(hstmt,
NULL, 0, // All qualifiers
NULL, 0, // Owner
- (UCHAR *) TableName.c_str(), SQL_NTS,
+ (SQLTCHAR *) TableName.c_str(), SQL_NTS,
NULL, 0); // All columns
}
if (retcode != SQL_SUCCESS)
* to avoid undesired unbinding of columns.
*/
{
- wxDbInf *pDbInf = NULL; // Array of catalog entries
int noTab = 0; // Counter while filling table entries
int pass;
RETCODE retcode;
convertUserID(userID,UserID);
//-------------------------------------------------------------
- pDbInf = new wxDbInf; // Create the Database Array
+ // Create the Database Array of catalog entries
+
+ wxDbInf *pDbInf = new wxDbInf;
+
//-------------------------------------------------------------
// Table Information
// Pass 1 - Determine how many Tables there are.
{
retcode = SQLTables(hstmt,
NULL, 0, // All qualifiers
- (UCHAR *) UserID.c_str(), SQL_NTS, // User specified
+ (SQLTCHAR *) UserID.c_str(), SQL_NTS, // User specified
NULL, 0, // All tables
NULL, 0); // All columns
}
wxChar colName[DB_MAX_COLUMN_NAME_LEN+1];
SWORD sqlDataType;
wxChar typeName[30+1];
- SWORD precision, length;
+ SDWORD precision, length;
- FILE *fp = fopen(fileName.c_str(),wxT("wt"));
+ FILE *fp = wxFopen(fileName.c_str(),wxT("wt"));
if (fp == NULL)
- return(FALSE);
+ return false;
SQLFreeStmt(hstmt, SQL_CLOSE);
if (!UserID.IsEmpty() &&
Dbms() != dbmsMY_SQL &&
Dbms() != dbmsACCESS &&
+ Dbms() != dbmsINTERBASE &&
Dbms() != dbmsMS_SQL_SERVER)
{
retcode = SQLColumns(hstmt,
NULL, 0, // All qualifiers
- (UCHAR *) UserID.c_str(), SQL_NTS, // User specified
+ (SQLTCHAR *) UserID.c_str(), SQL_NTS, // User specified
NULL, 0, // All tables
NULL, 0); // All columns
}
{
DispAllErrors(henv, hdbc, hstmt);
fclose(fp);
- return(FALSE);
+ return false;
}
wxString outStr;
tblNameSave.Empty();
int cnt = 0;
- while ((retcode = SQLFetch(hstmt)) == SQL_SUCCESS)
+ while (true)
{
+ retcode = SQLFetch(hstmt);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
+ break;
+
+ GetData(3,SQL_C_CHAR, (UCHAR *) tblName, DB_MAX_TABLE_NAME_LEN+1, &cb);
+ GetData(4,SQL_C_CHAR, (UCHAR *) colName, DB_MAX_COLUMN_NAME_LEN+1,&cb);
+ GetData(5,SQL_C_SSHORT,(UCHAR *)&sqlDataType, 0, &cb);
+ GetData(6,SQL_C_CHAR, (UCHAR *) typeName, sizeof(typeName), &cb);
+ GetData(7,SQL_C_SLONG, (UCHAR *)&precision, 0, &cb);
+ GetData(8,SQL_C_SLONG, (UCHAR *)&length, 0, &cb);
+
if (wxStrcmp(tblName, tblNameSave.c_str()))
{
if (cnt)
- fputs(wxT("\n"), fp);
- fputs(wxT("================================ "), fp);
- fputs(wxT("================================ "), fp);
- fputs(wxT("===================== "), fp);
- fputs(wxT("========= "), fp);
- fputs(wxT("=========\n"), fp);
+ wxFputs(wxT("\n"), fp);
+ wxFputs(wxT("================================ "), fp);
+ wxFputs(wxT("================================ "), fp);
+ wxFputs(wxT("===================== "), fp);
+ wxFputs(wxT("========= "), fp);
+ wxFputs(wxT("=========\n"), fp);
outStr.Printf(wxT("%-32s %-32s %-21s %9s %9s\n"),
wxT("TABLE NAME"), wxT("COLUMN NAME"), wxT("DATA TYPE"), wxT("PRECISION"), wxT("LENGTH"));
- fputs(outStr.c_str(), fp);
- fputs(wxT("================================ "), fp);
- fputs(wxT("================================ "), fp);
- fputs(wxT("===================== "), fp);
- fputs(wxT("========= "), fp);
- fputs(wxT("=========\n"), fp);
+ wxFputs(outStr.c_str(), fp);
+ wxFputs(wxT("================================ "), fp);
+ wxFputs(wxT("================================ "), fp);
+ wxFputs(wxT("===================== "), fp);
+ wxFputs(wxT("========= "), fp);
+ wxFputs(wxT("=========\n"), fp);
tblNameSave = tblName;
}
- GetData(3,SQL_C_CHAR, (UCHAR *)tblName, DB_MAX_TABLE_NAME_LEN+1, &cb);
- GetData(4,SQL_C_CHAR, (UCHAR *)colName, DB_MAX_COLUMN_NAME_LEN+1,&cb);
- GetData(5,SQL_C_SSHORT,(UCHAR *)&sqlDataType,0, &cb);
- GetData(6,SQL_C_CHAR, (UCHAR *)typeName, sizeof(typeName), &cb);
- GetData(7,SQL_C_SSHORT,(UCHAR *)&precision, 0, &cb);
- GetData(8,SQL_C_SSHORT,(UCHAR *)&length, 0, &cb);
-
- outStr.Printf(wxT("%-32s %-32s (%04d)%-15s %9d %9d\n"),
+ outStr.Printf(wxT("%-32s %-32s (%04d)%-15s %9ld %9ld\n"),
tblName, colName, sqlDataType, typeName, precision, length);
- if (fputs(outStr.c_str(), fp) == EOF)
+ if (wxFputs(outStr.c_str(), fp) == EOF)
{
SQLFreeStmt(hstmt, SQL_CLOSE);
fclose(fp);
- return(FALSE);
+ return false;
}
cnt++;
}
Dbms() != dbmsACCESS &&
Dbms() != dbmsMS_SQL_SERVER &&
Dbms() != dbmsDB2 &&
+ Dbms() != dbmsINTERBASE &&
Dbms() != dbmsPERVASIVE_SQL)
{
retcode = SQLTables(hstmt,
NULL, 0, // All qualifiers
- (UCHAR *) UserID.c_str(), SQL_NTS, // Only tables owned by this user
- (UCHAR FAR *)TableName.c_str(), SQL_NTS,
+ (SQLTCHAR *) UserID.c_str(), SQL_NTS, // Only tables owned by this user
+ (SQLTCHAR FAR *)TableName.c_str(), SQL_NTS,
NULL, 0); // All table types
}
else
retcode = SQLTables(hstmt,
NULL, 0, // All qualifiers
NULL, 0, // All owners
- (UCHAR FAR *)TableName.c_str(), SQL_NTS,
+ (SQLTCHAR FAR *)TableName.c_str(), SQL_NTS,
NULL, 0); // All table types
}
if (retcode != SQL_SUCCESS)
SQLFreeStmt(hstmt, SQL_CLOSE);
- return(TRUE);
+ return true;
} // wxDb::TableExists()
/********** wxDb::TablePrivileges() **********/
bool wxDb::TablePrivileges(const wxString &tableName, const wxString &priv, const wxChar *userID,
- const wxChar *schema, const wxString &tablePath)
+ const wxChar *schema, const wxString &WXUNUSED(tablePath))
{
wxASSERT(tableName.Length());
{
retcode = SQLTablePrivileges(hstmt,
NULL, 0, // Catalog
- (UCHAR FAR *)Schema.c_str(), SQL_NTS, // Schema
- (UCHAR FAR *)TableName.c_str(), SQL_NTS);
+ (SQLTCHAR FAR *)Schema.c_str(), SQL_NTS, // Schema
+ (SQLTCHAR FAR *)TableName.c_str(), SQL_NTS);
}
else
{
retcode = SQLTablePrivileges(hstmt,
NULL, 0, // Catalog
NULL, 0, // Schema
- (UCHAR FAR *)TableName.c_str(), SQL_NTS);
+ (SQLTCHAR FAR *)TableName.c_str(), SQL_NTS);
}
#ifdef DBDEBUG_CONSOLE
- fprintf(stderr ,wxT("SQLTablePrivileges() returned %i \n"),retcode);
+ wxFprintf(stderr ,wxT("SQLTablePrivileges() returned %i \n"),retcode);
#endif
if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO))
return(DispAllErrors(henv, hdbc, hstmt));
+ bool failed = false;
retcode = SQLFetch(hstmt);
while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
if (SQLGetData(hstmt, 1, SQL_C_CHAR, (UCHAR*) result.tableQual, sizeof(result.tableQual), &cbRetVal) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc, hstmt));
+ failed = true;
- if (SQLGetData(hstmt, 2, SQL_C_CHAR, (UCHAR*) result.tableOwner, sizeof(result.tableOwner), &cbRetVal) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc, hstmt));
+ if (!failed && SQLGetData(hstmt, 2, SQL_C_CHAR, (UCHAR*) result.tableOwner, sizeof(result.tableOwner), &cbRetVal) != SQL_SUCCESS)
+ failed = true;
- if (SQLGetData(hstmt, 3, SQL_C_CHAR, (UCHAR*) result.tableName, sizeof(result.tableName), &cbRetVal) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc, hstmt));
+ if (!failed && SQLGetData(hstmt, 3, SQL_C_CHAR, (UCHAR*) result.tableName, sizeof(result.tableName), &cbRetVal) != SQL_SUCCESS)
+ failed = true;
- if (SQLGetData(hstmt, 4, SQL_C_CHAR, (UCHAR*) result.grantor, sizeof(result.grantor), &cbRetVal) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc, hstmt));
+ if (!failed && SQLGetData(hstmt, 4, SQL_C_CHAR, (UCHAR*) result.grantor, sizeof(result.grantor), &cbRetVal) != SQL_SUCCESS)
+ failed = true;
- if (SQLGetData(hstmt, 5, SQL_C_CHAR, (UCHAR*) result.grantee, sizeof(result.grantee), &cbRetVal) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc, hstmt));
+ if (!failed && SQLGetData(hstmt, 5, SQL_C_CHAR, (UCHAR*) result.grantee, sizeof(result.grantee), &cbRetVal) != SQL_SUCCESS)
+ failed = true;
- if (SQLGetData(hstmt, 6, SQL_C_CHAR, (UCHAR*) result.privilege, sizeof(result.privilege), &cbRetVal) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc, hstmt));
+ if (!failed && SQLGetData(hstmt, 6, SQL_C_CHAR, (UCHAR*) result.privilege, sizeof(result.privilege), &cbRetVal) != SQL_SUCCESS)
+ failed = true;
- if (SQLGetData(hstmt, 7, SQL_C_CHAR, (UCHAR*) result.grantable, sizeof(result.grantable), &cbRetVal) != SQL_SUCCESS)
- return(DispAllErrors(henv, hdbc, hstmt));
+ if (!failed && SQLGetData(hstmt, 7, SQL_C_CHAR, (UCHAR*) result.grantable, sizeof(result.grantable), &cbRetVal) != SQL_SUCCESS)
+ failed = true;
+ if (failed)
+ {
+ return(DispAllErrors(henv, hdbc, hstmt));
+ }
#ifdef DBDEBUG_CONSOLE
- fprintf(stderr,wxT("Scanning %s privilege on table %s.%s granted by %s to %s\n"),
+ wxFprintf(stderr,wxT("Scanning %s privilege on table %s.%s granted by %s to %s\n"),
result.privilege,result.tableOwner,result.tableName,
result.grantor, result.grantee);
#endif
- if (UserID.IsSameAs(result.tableOwner,FALSE))
+ if (UserID.IsSameAs(result.tableOwner,false))
{
SQLFreeStmt(hstmt, SQL_CLOSE);
- return TRUE;
+ return true;
}
- if (UserID.IsSameAs(result.grantee,FALSE) &&
+ if (UserID.IsSameAs(result.grantee,false) &&
!wxStrcmp(result.privilege,priv))
{
SQLFreeStmt(hstmt, SQL_CLOSE);
- return TRUE;
+ return true;
}
if (!wxStrcmp(result.grantee,curRole) &&
!wxStrcmp(result.privilege,priv))
{
SQLFreeStmt(hstmt, SQL_CLOSE);
- return TRUE;
+ return true;
}
retcode = SQLFetch(hstmt);
}
SQLFreeStmt(hstmt, SQL_CLOSE);
- return FALSE;
+ return false;
} // wxDb::TablePrivileges
+const wxString wxDb::SQLTableName(const wxChar *tableName)
+{
+ wxString TableName;
+
+ if (Dbms() == dbmsACCESS)
+ TableName = _T("\"");
+ TableName += tableName;
+ if (Dbms() == dbmsACCESS)
+ TableName += _T("\"");
+
+ return TableName;
+} // wxDb::SQLTableName()
+
+
+const wxString wxDb::SQLColumnName(const wxChar *colName)
+{
+ wxString ColName;
+
+ if (Dbms() == dbmsACCESS)
+ ColName = _T("\"");
+ ColName += colName;
+ if (Dbms() == dbmsACCESS)
+ ColName += _T("\"");
+
+ return ColName;
+} // wxDb::SQLColumnName()
+
+
/********** wxDb::SetSqlLogging() **********/
bool wxDb::SetSqlLogging(wxDbSqlLogState state, const wxString &filename, bool append)
{
{
if (fpSqlLog == 0)
{
- fpSqlLog = fopen(filename, (append ? wxT("at") : wxT("wt")));
+ fpSqlLog = wxFopen(filename, (append ? wxT("at") : wxT("wt")));
if (fpSqlLog == NULL)
- return(FALSE);
+ return false;
}
}
else // sqlLogOFF
if (fpSqlLog)
{
if (fclose(fpSqlLog))
- return(FALSE);
+ return false;
fpSqlLog = 0;
}
}
sqlLogState = state;
- return(TRUE);
+ return true;
} // wxDb::SetSqlLogging()
wxASSERT(logMsg.Length());
if (fpSqlLog == 0 || sqlLogState == sqlLogOFF)
- return(FALSE);
+ return false;
- if (fputs(wxT("\n"), fpSqlLog) == EOF)
- return(FALSE);
- if (fputs(logMsg, fpSqlLog) == EOF)
- return(FALSE);
- if (fputs(wxT("\n"), fpSqlLog) == EOF)
- return(FALSE);
+ if (wxFputs(wxT("\n"), fpSqlLog) == EOF)
+ return false;
+ if (wxFputs(logMsg, fpSqlLog) == EOF)
+ return false;
+ if (wxFputs(wxT("\n"), fpSqlLog) == EOF)
+ return false;
- return(TRUE);
+ return true;
} // wxDb::WriteSqlLog()
* - Does not support the SQL_TIMESTAMP structure
* - Supports only one cursor and one connect (apparently? with Microsoft driver only?)
* - Does not automatically create the primary index if the 'keyField' param of SetColDef
- * is TRUE. The user must create ALL indexes from their program.
+ * is true. The user must create ALL indexes from their program.
* - Table names can only be 8 characters long
* - Column names can only be 10 characters long
*
*
* PERVASIVE SQL
*
+ * INTERBASE
+ * - Columns that are part of primary keys must be defined as being NOT NULL
+ * when they are created. Some code is added in ::CreateIndex to try to adjust the
+ * column definition if it is not defined correctly, but it is experimental
*/
{
// Should only need to do this once for each new database connection
{
if (!wxStrncmp(dbInf.driverName, wxT("oplodbc"), 7) ||
!wxStrncmp(dbInf.driverName, wxT("OLOD"), 4))
- return ((wxDBMS)(dbmsMS_SQL_SERVER));
- else
- return ((wxDBMS)(dbmsType = dbmsSYBASE_ASE));
+ return ((wxDBMS)(dbmsMS_SQL_SERVER));
+ else
+ return ((wxDBMS)(dbmsType = dbmsSYBASE_ASE));
}
if (!wxStricmp(dbInf.dbmsName,wxT("Microsoft SQL Server")))
return((wxDBMS)(dbmsType = dbmsMS_SQL_SERVER));
- if (!wxStricmp(dbInf.dbmsName,wxT("MySQL")))
- return((wxDBMS)(dbmsType = dbmsMY_SQL));
- if (!wxStricmp(dbInf.dbmsName,wxT("PostgreSQL"))) // v6.5.0
+
+ baseName[10] = 0;
+ if (!wxStricmp(baseName,wxT("PostgreSQL"))) // v6.5.0
return((wxDBMS)(dbmsType = dbmsPOSTGRES));
baseName[9] = 0;
- if (!wxStricmp(dbInf.dbmsName,wxT("Pervasive")))
- return((wxDBMS)(dbmsType = dbmsPERVASIVE_SQL));
+ if (!wxStricmp(baseName,wxT("Pervasive")))
+ return((wxDBMS)(dbmsType = dbmsPERVASIVE_SQL));
baseName[8] = 0;
if (!wxStricmp(baseName,wxT("Informix")))
baseName[6] = 0;
if (!wxStricmp(baseName,wxT("Oracle")))
return((wxDBMS)(dbmsType = dbmsORACLE));
- if (!wxStricmp(dbInf.dbmsName,wxT("ACCESS")))
+ if (!wxStricmp(baseName,wxT("ACCESS")))
return((wxDBMS)(dbmsType = dbmsACCESS));
- if (!wxStricmp(dbInf.dbmsName,wxT("MySQL")))
- return((wxDBMS)(dbmsType = dbmsMY_SQL));
if (!wxStricmp(baseName,wxT("Sybase")))
return((wxDBMS)(dbmsType = dbmsSYBASE_ASE));
baseName[5] = 0;
if (!wxStricmp(baseName,wxT("DBASE")))
return((wxDBMS)(dbmsType = dbmsDBASE));
+ if (!wxStricmp(baseName,wxT("xBase")))
+ return((wxDBMS)(dbmsType = dbmsXBASE_SEQUITER));
+ if (!wxStricmp(baseName,wxT("MySQL")))
+ return((wxDBMS)(dbmsType = dbmsMY_SQL));
baseName[3] = 0;
if (!wxStricmp(baseName,wxT("DB2")))
// Must specify a columnLength if modifying a VARCHAR type column
if (dataType == DB_DATA_TYPE_VARCHAR && !columnLength)
- return FALSE;
-
+ return false;
+
wxString dataTypeName;
- wxString sqlStmt;
+ wxString sqlStmt;
wxString alterSlashModify;
- switch(dataType)
- {
- case DB_DATA_TYPE_VARCHAR :
- dataTypeName = typeInfVarchar.TypeName;
- break;
- case DB_DATA_TYPE_INTEGER :
- dataTypeName = typeInfInteger.TypeName;
- break;
- case DB_DATA_TYPE_FLOAT :
- dataTypeName = typeInfFloat.TypeName;
- break;
- case DB_DATA_TYPE_DATE :
- dataTypeName = typeInfDate.TypeName;
- break;
- case DB_DATA_TYPE_BLOB :
- dataTypeName = typeInfBlob.TypeName;
- break;
- default:
- return FALSE;
- }
-
- // Set the modify or alter syntax depending on the type of database connected to
- switch (Dbms())
- {
- case dbmsORACLE :
- alterSlashModify = "MODIFY";
- break;
- case dbmsMS_SQL_SERVER :
- alterSlashModify = "ALTER COLUMN";
- break;
- case dbmsUNIDENTIFIED :
- return FALSE;
- case dbmsSYBASE_ASA :
- case dbmsSYBASE_ASE :
- case dbmsMY_SQL :
- case dbmsPOSTGRES :
- case dbmsACCESS :
- case dbmsDBASE :
- default :
- alterSlashModify = "MODIFY";
- break;
- }
-
- // create the SQL statement
- sqlStmt.Printf(wxT("ALTER TABLE %s %s %s %s"), tableName.c_str(), alterSlashModify.c_str(),
- columnName.c_str(), dataTypeName.c_str());
+ switch(dataType)
+ {
+ case DB_DATA_TYPE_VARCHAR :
+ dataTypeName = typeInfVarchar.TypeName;
+ break;
+ case DB_DATA_TYPE_INTEGER :
+ dataTypeName = typeInfInteger.TypeName;
+ break;
+ case DB_DATA_TYPE_FLOAT :
+ dataTypeName = typeInfFloat.TypeName;
+ break;
+ case DB_DATA_TYPE_DATE :
+ dataTypeName = typeInfDate.TypeName;
+ break;
+ case DB_DATA_TYPE_BLOB :
+ dataTypeName = typeInfBlob.TypeName;
+ break;
+ default:
+ return false;
+ }
+
+ // Set the modify or alter syntax depending on the type of database connected to
+ switch (Dbms())
+ {
+ case dbmsORACLE :
+ alterSlashModify = _T("MODIFY");
+ break;
+ case dbmsMS_SQL_SERVER :
+ alterSlashModify = _T("ALTER COLUMN");
+ break;
+ case dbmsUNIDENTIFIED :
+ return false;
+ case dbmsSYBASE_ASA :
+ case dbmsSYBASE_ASE :
+ case dbmsMY_SQL :
+ case dbmsPOSTGRES :
+ case dbmsACCESS :
+ case dbmsDBASE :
+ case dbmsXBASE_SEQUITER :
+ default :
+ alterSlashModify = _T("MODIFY");
+ break;
+ }
+
+ // create the SQL statement
+ if ( Dbms() == dbmsMY_SQL )
+ {
+ sqlStmt.Printf(wxT("ALTER TABLE %s %s %s %s"), tableName.c_str(), alterSlashModify.c_str(),
+ columnName.c_str(), dataTypeName.c_str());
+ }
+ else
+ {
+ sqlStmt.Printf(wxT("ALTER TABLE \"%s\" \"%s\" \"%s\" %s"), tableName.c_str(), alterSlashModify.c_str(),
+ columnName.c_str(), dataTypeName.c_str());
+ }
// For varchars only, append the size of the column
- if (dataType == DB_DATA_TYPE_VARCHAR)
+ if (dataType == DB_DATA_TYPE_VARCHAR &&
+ (Dbms() != dbmsMY_SQL || dataTypeName != _T("text")))
{
wxString s;
- s.Printf(wxT("(%d)"), columnLength);
+ s.Printf(wxT("(%lu)"), columnLength);
sqlStmt += s;
}
sqlStmt += optionalParam;
}
- return ExecSql(sqlStmt);
+ return ExecSql(sqlStmt);
} // wxDb::ModifyColumn()
/********** wxDbGetConnection() **********/
-wxDb WXDLLEXPORT *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnlyCursors)
+wxDb WXDLLIMPEXP_ODBC *wxDbGetConnection(wxDbConnectInf *pDbConfig, bool FwdOnlyCursors)
{
wxDbList *pList;
// The database connection must be for the same datasource
// name and must currently not be in use.
if (pList->Free &&
- (pList->PtrDb->FwdOnlyCursors() == FwdOnlyCursors) &&
- (!wxStrcmp(pDbConfig->GetDsn(), pList->Dsn))) // Found a free connection
+ (pList->PtrDb->FwdOnlyCursors() == FwdOnlyCursors))
{
- pList->Free = FALSE;
- return(pList->PtrDb);
+ if (pDbConfig->UseConnectionStr())
+ {
+ if (pList->PtrDb->OpenedWithConnectionString() &&
+ (!wxStrcmp(pDbConfig->GetConnectionStr(), pList->ConnectionStr)))
+ {
+ // Found a free connection
+ pList->Free = false;
+ return(pList->PtrDb);
+ }
+ }
+ else
+ {
+ if (!pList->PtrDb->OpenedWithConnectionString() &&
+ (!wxStrcmp(pDbConfig->GetDsn(), pList->Dsn)))
+ {
+ // Found a free connection
+ pList->Free = false;
+ return(pList->PtrDb);
+ }
+ }
}
- if (!wxStrcmp(pDbConfig->GetDsn(), pList->Dsn) &&
- !wxStrcmp(pDbConfig->GetUserID(), pList->Uid) &&
- !wxStrcmp(pDbConfig->GetPassword(), pList->AuthStr))
- matchingDbConnection = pList->PtrDb;
+ if (pDbConfig->UseConnectionStr())
+ {
+ if (!wxStrcmp(pDbConfig->GetConnectionStr(), pList->ConnectionStr))
+ matchingDbConnection = pList->PtrDb;
+ }
+ else
+ {
+ if (!wxStrcmp(pDbConfig->GetDsn(), pList->Dsn) &&
+ !wxStrcmp(pDbConfig->GetUserID(), pList->Uid) &&
+ !wxStrcmp(pDbConfig->GetPassword(), pList->AuthStr))
+ matchingDbConnection = pList->PtrDb;
+ }
}
// No available connections. A new connection must be made and
}
// Initialize new node in the linked list
- pList->PtrNext = 0;
- pList->Free = FALSE;
- pList->Dsn = pDbConfig->GetDsn(); //glt - will this assignment work?
- pList->Uid = pDbConfig->GetUserID();
- pList->AuthStr = pDbConfig->GetPassword();
+ pList->PtrNext = 0;
+ pList->Free = false;
+ pList->Dsn = pDbConfig->GetDsn();
+ pList->Uid = pDbConfig->GetUserID();
+ pList->AuthStr = pDbConfig->GetPassword();
+ pList->ConnectionStr = pDbConfig->GetConnectionStr();
pList->PtrDb = new wxDb(pDbConfig->GetHenv(), FwdOnlyCursors);
- bool opened = FALSE;
+ bool opened;
if (!matchingDbConnection)
- opened = pList->PtrDb->Open(pDbConfig->GetDsn(), pDbConfig->GetUserID(), pDbConfig->GetPassword());
+ {
+ if (pDbConfig->UseConnectionStr())
+ {
+ opened = pList->PtrDb->Open(pDbConfig->GetConnectionStr());
+ }
+ else
+ {
+ opened = pList->PtrDb->Open(pDbConfig->GetDsn(), pDbConfig->GetUserID(), pDbConfig->GetPassword());
+ }
+ }
else
opened = pList->PtrDb->Open(matchingDbConnection);
// Connect to the datasource
if (opened)
{
- pList->PtrDb->SetSqlLogging(SQLLOGstate,SQLLOGfn,TRUE);
+ pList->PtrDb->setCached(true); // Prevent a user from deleting a cached connection
+ pList->PtrDb->SetSqlLogging(SQLLOGstate, SQLLOGfn, true);
return(pList->PtrDb);
}
else // Unable to connect, destroy list item
if (pList->PtrPrev)
pList->PtrPrev->PtrNext = 0;
else
- PtrBegDbList = 0; // Empty list again
- pList->PtrDb->CommitTrans(); // Commit any open transactions on wxDb object
- pList->PtrDb->Close(); // Close the wxDb object
- delete pList->PtrDb; // Deletes the wxDb object
- delete pList; // Deletes the linked list object
+ PtrBegDbList = 0; // Empty list again
+
+ pList->PtrDb->CommitTrans(); // Commit any open transactions on wxDb object
+ pList->PtrDb->Close(); // Close the wxDb object
+ delete pList->PtrDb; // Deletes the wxDb object
+ delete pList; // Deletes the linked list object
return(0);
}
/********** wxDbFreeConnection() **********/
-bool WXDLLEXPORT wxDbFreeConnection(wxDb *pDb)
+bool WXDLLIMPEXP_ODBC wxDbFreeConnection(wxDb *pDb)
{
wxDbList *pList;
for (pList = PtrBegDbList; pList; pList = pList->PtrNext)
{
if (pList->PtrDb == pDb) // Found it, now free it!!!
- return (pList->Free = TRUE);
+ return (pList->Free = true);
}
// Never found the database object, return failure
- return(FALSE);
+ return false;
} // wxDbFreeConnection()
/********** wxDbCloseConnections() **********/
-void WXDLLEXPORT wxDbCloseConnections(void)
+void WXDLLIMPEXP_ODBC wxDbCloseConnections(void)
{
wxDbList *pList, *pNext;
pNext = pList->PtrNext; // Save the pointer to next
pList->PtrDb->CommitTrans(); // Commit any open transactions on wxDb object
pList->PtrDb->Close(); // Close the wxDb object
+ pList->PtrDb->setCached(false); // Allows deletion of the wxDb instance
delete pList->PtrDb; // Deletes the wxDb object
delete pList; // Deletes the linked list object
}
/********** wxDbConnectionsInUse() **********/
-int WXDLLEXPORT wxDbConnectionsInUse(void)
+int WXDLLIMPEXP_ODBC wxDbConnectionsInUse(void)
{
wxDbList *pList;
int cnt = 0;
// Scan the linked list counting db connections that are currently in use
for (pList = PtrBegDbList; pList; pList = pList->PtrNext)
{
- if (pList->Free == FALSE)
+ if (pList->Free == false)
cnt++;
}
} // wxDbConnectionsInUse()
+
+/********** wxDbLogExtendedErrorMsg() **********/
+// DEBUG ONLY function
+const wxChar WXDLLIMPEXP_ODBC *wxDbLogExtendedErrorMsg(const wxChar *userText,
+ wxDb *pDb,
+ const wxChar *ErrFile,
+ int ErrLine)
+{
+ static wxString msg;
+ msg = userText;
+
+ wxString tStr;
+
+ if (ErrFile || ErrLine)
+ {
+ msg += wxT("File: ");
+ msg += ErrFile;
+ msg += wxT(" Line: ");
+ tStr.Printf(wxT("%d"),ErrLine);
+ msg += tStr.c_str();
+ msg += wxT("\n");
+ }
+
+ msg.Append (wxT("\nODBC errors:\n"));
+ msg += wxT("\n");
+
+ // Display errors for this connection
+ int i;
+ for (i = 0; i < DB_MAX_ERROR_HISTORY; i++)
+ {
+ if (pDb->errorList[i])
+ {
+ msg.Append(pDb->errorList[i]);
+ if (wxStrcmp(pDb->errorList[i],wxT("")) != 0)
+ msg.Append(wxT("\n"));
+ // Clear the errmsg buffer so the next error will not
+ // end up showing the previous error that have occurred
+ wxStrcpy(pDb->errorList[i],wxT(""));
+ }
+ }
+ msg += wxT("\n");
+
+ wxLogDebug(msg.c_str());
+
+ return msg.c_str();
+} // wxDbLogExtendedErrorMsg()
+
+
/********** wxDbSqlLog() **********/
bool wxDbSqlLog(wxDbSqlLogState state, const wxChar *filename)
{
- bool append = FALSE;
+ bool append = false;
wxDbList *pList;
for (pList = PtrBegDbList; pList; pList = pList->PtrNext)
{
if (!pList->PtrDb->SetSqlLogging(state,filename,append))
- return(FALSE);
- append = TRUE;
+ return false;
+ append = true;
}
SQLLOGstate = state;
SQLLOGfn = filename;
- return(TRUE);
+ return true;
} // wxDbSqlLog()
int k;
do
{
- k = setupStr.Find((wxChar)2,TRUE);
+ k = setupStr.Find((wxChar)2,true);
if (k != wxNOT_FOUND)
setupStr[(UINT)k] = wxT('\0');
}
{
SWORD cb1,cb2;
- if (SQLDataSources(henv, direction, (UCHAR FAR *) Dsn, DsnMax, &cb1,
- (UCHAR FAR *) DsDesc, DsDescMax, &cb2) == SQL_SUCCESS)
- return(TRUE);
+ if (SQLDataSources(henv, direction, (SQLTCHAR FAR *) Dsn, DsnMax, &cb1,
+ (SQLTCHAR FAR *) DsDesc, DsDescMax, &cb2) == SQL_SUCCESS)
+ return true;
else
- return(FALSE);
+ return false;
} // wxDbGetDataSource()
return wxDbGetDataSource(henv, Dsn, DsnMax, DsDesc, DsDescMax, direction);
}
/***** DEPRECATED: use wxDbGetConnection() *****/
-wxDb WXDLLEXPORT *GetDbConnection(DbStuff *pDbStuff, bool FwdOnlyCursors)
+wxDb WXDLLIMPEXP_ODBC *GetDbConnection(DbStuff *pDbStuff, bool FwdOnlyCursors)
{
return wxDbGetConnection((wxDbConnectInf *)pDbStuff, FwdOnlyCursors);
}
/***** DEPRECATED: use wxDbFreeConnection() *****/
-bool WXDLLEXPORT FreeDbConnection(wxDb *pDb)
+bool WXDLLIMPEXP_ODBC FreeDbConnection(wxDb *pDb)
{
return wxDbFreeConnection(pDb);
}
/***** DEPRECATED: use wxDbCloseConnections() *****/
-void WXDLLEXPORT CloseDbConnections(void)
+void WXDLLIMPEXP_ODBC CloseDbConnections(void)
{
wxDbCloseConnections();
}
/***** DEPRECATED: use wxDbConnectionsInUse() *****/
-int WXDLLEXPORT NumberDbConnectionsInUse(void)
+int WXDLLIMPEXP_ODBC NumberDbConnectionsInUse(void)
{
return wxDbConnectionsInUse();
}