bool setConnectionOptions(void);
void logError(const char *errMsg, const char *SQLState);
+ bool fwdOnlyCursors;
+
public:
// The following structure contains database information gathered from the
SqlTypeInfo typeInfVarchar, typeInfInteger, typeInfFloat, typeInfDate;
// Public member functions
- wxDB(HENV &aHenv);
+ wxDB(HENV &aHenv, bool FwdOnlyCursors=(bool)wxODBC_FWD_ONLY_CURSORS);
bool Open(char *Dsn, char *Uid, char *AuthStr); // Data Source Name, User ID, Password
void Close(void);
bool CommitTrans(void);
bool SqlLog(enum sqlLog state, const char *filename = "sqllog.txt", bool append = FALSE);
bool WriteSqlLog(const char *logMsg);
DBMS Dbms(void);
+ bool FwdOnlyCursors(void) {return fwdOnlyCursors;}
}; // wxDB
// for other code segments to use, or close all of them when the application has
// completed.
-wxDB WXDLLEXPORT *GetDbConnection(DbStuff *pDbStuff);
+wxDB WXDLLEXPORT *GetDbConnection(DbStuff *pDbStuff, bool FwdOnlyCursors=(bool)wxODBC_FWD_ONLY_CURSORS);
bool WXDLLEXPORT FreeDbConnection(wxDB *pDb);
void WXDLLEXPORT CloseDbConnections(void);
int WXDLLEXPORT NumberDbConnectionsInUse(void);
bool QueryOnKeyFields(bool forUpdate = FALSE, bool distinct = FALSE);
bool GetNext(void) { return(getRec(SQL_FETCH_NEXT)); }
bool operator++(int) { return(getRec(SQL_FETCH_NEXT)); }
-#if !wxODBC_FWD_ONLY_CURSORS
- bool GetPrev(void) { return(getRec(SQL_FETCH_PRIOR)); }
- bool operator--(int) { return(getRec(SQL_FETCH_PRIOR)); }
- bool GetFirst(void) { return(getRec(SQL_FETCH_FIRST)); }
- bool GetLast(void) { return(getRec(SQL_FETCH_LAST)); }
-#endif
+
+ /***** These four functions only work with wxDB instances that are defined *****
+ ***** as not being FwdOnlyCursors *****/
+ bool GetPrev(void);
+ bool operator--(int);
+ bool GetFirst(void);
+ bool GetLast(void);
+
bool IsCursorClosedOnCommit(void);
bool IsColNull(int colNo);
UWORD GetRowNum(void);
char DBerrorList[DB_MAX_ERROR_HISTORY][DB_MAX_ERROR_MSG_LEN];
/********** wxDB Constructor **********/
-wxDB::wxDB(HENV &aHenv)
+wxDB::wxDB(HENV &aHenv, bool FwdOnlyCursors)
{
int i;
// Copy the HENV into the db class
henv = aHenv;
+ fwdOnlyCursors = FwdOnlyCursors;
// Allocate a data source connection handle
if (SQLAllocConnect(henv, &hdbc) != SQL_SUCCESS)
RETCODE retcode;
-#if !wxODBC_FWD_ONLY_CURSORS
-
- // 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);
+ 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)
else
cout << "SQLSetConnectOption(CURSOR_LIB) failed" << endl;
#endif
-
-#endif
+ }
// Connect to the data source
retcode = SQLConnect(hdbc, (UCHAR FAR *) Dsn, SQL_NTS,
*/
DBMS wxDB::Dbms(void)
{
- wxChar baseName[25];
+ wxChar baseName[25+1];
- wxStrncpy(baseName,dbInf.dbmsName,6);
- baseName[6] = 0;
- if (!wxStricmp(baseName,"Oracle"))
- return(dbmsORACLE);
+ wxStrncpy(baseName,dbInf.dbmsName,25);
if (!wxStricmp(dbInf.dbmsName,"Adaptive Server Anywhere"))
return(dbmsSYBASE_ASA);
- if (!wxStricmp(dbInf.dbmsName,"SQL Server")) // Sybase Adaptive Server Enterprise
+ if (!wxStricmp(dbInf.dbmsName,"SQL Server")) // Sybase Adaptive Server
return(dbmsSYBASE_ASE);
if (!wxStricmp(dbInf.dbmsName,"Microsoft SQL Server"))
return(dbmsMS_SQL_SERVER);
return(dbmsMY_SQL);
if (!wxStricmp(dbInf.dbmsName,"PostgreSQL")) // v6.5.0
return(dbmsPOSTGRES);
+
+ baseName[8] = 0;
+ if (!wxStricmp(baseName,"Informix"))
+ return(dbmsINFORMIX);
+
+ baseName[6] = 0;
+ if (!wxStricmp(baseName,"Oracle"))
+ return(dbmsORACLE);
if (!wxStricmp(dbInf.dbmsName,"ACCESS"))
return(dbmsACCESS);
- wxStrncpy(baseName,dbInf.dbmsName,5);
+ if (!wxStricmp(dbInf.dbmsName,"MySQL"))
+ return(dbmsMY_SQL);
+
baseName[5] = 0;
if (!wxStricmp(baseName,"DBASE"))
return(dbmsDBASE);
- wxStrncpy(baseName,dbInf.dbmsName,8);
- baseName[8] = 0;
- if (!wxStricmp(baseName,"Informix"))
- return(dbmsINFORMIX);
return(dbmsUNIDENTIFIED);
-
} // wxDB::Dbms()
/********** GetDbConnection() **********/
-wxDB WXDLLEXPORT *GetDbConnection(DbStuff *pDbStuff)
+wxDB WXDLLEXPORT *GetDbConnection(DbStuff *pDbStuff, bool FwdOnlyCursors)
{
DbList *pList;
pList->PtrNext = 0;
pList->Free = FALSE;
wxStrcpy(pList->Dsn, pDbStuff->Dsn);
- pList->PtrDb = new wxDB(pDbStuff->Henv);
+ pList->PtrDb = new wxDB(pDbStuff->Henv,FwdOnlyCursors);
// Connect to the datasource
if (pList->PtrDb->Open(pDbStuff->Dsn, pDbStuff->Uid, pDbStuff->AuthStr))
{
RETCODE retcode;
-#if !wxODBC_FWD_ONLY_CURSORS
-
- // Fetch the NEXT, PREV, FIRST or LAST record, depending on fetchType
- UDWORD cRowsFetched;
- UWORD rowStatus;
-
-// if ((retcode = SQLExtendedFetch(hstmt, fetchType, 0, &cRowsFetched, &rowStatus)) != SQL_SUCCESS)
- retcode = SQLExtendedFetch(hstmt, fetchType, 0, &cRowsFetched, &rowStatus);
- if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
- if (retcode == SQL_NO_DATA_FOUND)
- return(FALSE);
- else
- return(pDb->DispAllErrors(henv, hdbc, hstmt));
-#else
+ if (!pDb->FwdOnlyCursors())
+ {
+ // Fetch the NEXT, PREV, FIRST or LAST record, depending on fetchType
+ UDWORD cRowsFetched;
+ UWORD rowStatus;
- // Fetch the next record from the record set
- retcode = SQLFetch(hstmt);
- if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
+ retcode = SQLExtendedFetch(hstmt, fetchType, 0, &cRowsFetched, &rowStatus);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
+ if (retcode == SQL_NO_DATA_FOUND)
+ return(FALSE);
+ else
+ return(pDb->DispAllErrors(henv, hdbc, hstmt));
+ }
+ else
{
- if (retcode == SQL_NO_DATA_FOUND)
- return(FALSE);
- else
- return(pDb->DispAllErrors(henv, hdbc, hstmt));
+ // Fetch the next record from the record set
+ retcode = SQLFetch(hstmt);
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
+ {
+ if (retcode == SQL_NO_DATA_FOUND)
+ return(FALSE);
+ else
+ return(pDb->DispAllErrors(henv, hdbc, hstmt));
+ }
}
-#endif
// Completed successfully
return(TRUE);
} // wxTable::QueryOnKeyFields()
+/********** wxTable::GetPrev() **********/
+bool wxTable::GetPrev(void)
+{
+ if (pDb->FwdOnlyCursors())
+ {
+ wxFAIL_MSG(wxT("GetPrev()::Backward scrolling cursors are not enabled for this instance of wxTable"));
+ return FALSE;
+ }
+ else
+ return(getRec(SQL_FETCH_PRIOR));
+} // wxTable::GetPrev()
+
+/********** wxTable::operator-- **********/
+bool wxTable::operator--(int)
+{
+ if (pDb->FwdOnlyCursors())
+ {
+ wxFAIL_MSG(wxT("operator--:Backward scrolling cursors are not enabled for this instance of wxTable"));
+ return FALSE;
+ }
+ else
+ return(getRec(SQL_FETCH_PRIOR));
+} // wxTable::operator--
+
+/********** wxTable::GetFirst() **********/
+bool wxTable::GetFirst(void)
+{
+ if (pDb->FwdOnlyCursors())
+ {
+ wxFAIL_MSG(wxT("GetFirst():Backward scrolling cursors are not enabled for this instance of wxTable"));
+ return FALSE;
+ }
+ else
+ return(getRec(SQL_FETCH_FIRST));
+} // wxTable::GetFirst()
+
+/********** wxTable::GetLast() **********/
+bool wxTable::GetLast(void)
+{
+ if (pDb->FwdOnlyCursors())
+ {
+ wxFAIL_MSG(wxT("GetLast()::Backward scrolling cursors are not enabled for this instance of wxTable"));
+ return FALSE;
+ }
+ else
+ return(getRec(SQL_FETCH_LAST));
+} // wxTable::GetLast()
+
/********** wxTable::GetSelectStmt() **********/
void wxTable::GetSelectStmt(char *pSqlStmt, int typeOfSelect, bool distinct)
{