From a3439c7d160e2dc2cd0b35b26927902a47316275 Mon Sep 17 00:00:00 2001 From: George Tasker Date: Mon, 29 Nov 1999 19:20:53 +0000 Subject: [PATCH] Added support for creating forward or backward scrolling cursors support at run-time versus compile time. Default behavior will be determined by wxODBC_FWD_ONLY_CURSORS set in setup.h git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4767 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/db.h | 7 +++- include/wx/dbtable.h | 14 ++++--- src/common/db.cpp | 46 +++++++++++---------- src/common/dbtable.cpp | 92 ++++++++++++++++++++++++++++++++---------- 4 files changed, 107 insertions(+), 52 deletions(-) diff --git a/include/wx/db.h b/include/wx/db.h index 844b15de1b..d28a0305a8 100644 --- a/include/wx/db.h +++ b/include/wx/db.h @@ -328,6 +328,8 @@ private: bool setConnectionOptions(void); void logError(const char *errMsg, const char *SQLState); + bool fwdOnlyCursors; + public: // The following structure contains database information gathered from the @@ -393,7 +395,7 @@ public: 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); @@ -423,6 +425,7 @@ public: 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 @@ -456,7 +459,7 @@ class CstructTablesInUse : public wxObject // 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); diff --git a/include/wx/dbtable.h b/include/wx/dbtable.h index b4f15a52fa..79cb77f90c 100644 --- a/include/wx/dbtable.h +++ b/include/wx/dbtable.h @@ -157,12 +157,14 @@ public: 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); diff --git a/src/common/db.cpp b/src/common/db.cpp index 5dfd9ce512..4063cdc163 100644 --- a/src/common/db.cpp +++ b/src/common/db.cpp @@ -111,7 +111,7 @@ char SQLLOGfn[DB_PATH_MAX+1] = "sqllog.txt"; 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; @@ -155,6 +155,7 @@ wxDB::wxDB(HENV &aHenv) // Copy the HENV into the db class henv = aHenv; + fwdOnlyCursors = FwdOnlyCursors; // Allocate a data source connection handle if (SQLAllocConnect(henv, &hdbc) != SQL_SUCCESS) @@ -178,11 +179,11 @@ bool wxDB::Open(char *Dsn, char *Uid, char *AuthStr) 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) @@ -190,8 +191,7 @@ bool wxDB::Open(char *Dsn, char *Uid, char *AuthStr) else cout << "SQLSetConnectOption(CURSOR_LIB) failed" << endl; #endif - -#endif + } // Connect to the data source retcode = SQLConnect(hdbc, (UCHAR FAR *) Dsn, SQL_NTS, @@ -1688,15 +1688,12 @@ bool wxDB::WriteSqlLog(const char *logMsg) */ 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); @@ -1704,24 +1701,29 @@ DBMS wxDB::Dbms(void) 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; @@ -1760,7 +1762,7 @@ wxDB WXDLLEXPORT *GetDbConnection(DbStuff *pDbStuff) 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)) diff --git a/src/common/dbtable.cpp b/src/common/dbtable.cpp index 1e603781ed..edf1a0ce1c 100644 --- a/src/common/dbtable.cpp +++ b/src/common/dbtable.cpp @@ -461,31 +461,31 @@ bool wxTable::getRec(UWORD fetchType) { 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); @@ -660,6 +660,54 @@ bool wxTable::QueryOnKeyFields(bool forUpdate, bool distinct) } // 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) { -- 2.45.2