]> git.saurik.com Git - wxWidgets.git/commitdiff
Added support for creating forward or backward scrolling cursors support at run-time...
authorGeorge Tasker <gtasker@allenbrook.com>
Mon, 29 Nov 1999 19:20:53 +0000 (19:20 +0000)
committerGeorge Tasker <gtasker@allenbrook.com>
Mon, 29 Nov 1999 19:20:53 +0000 (19:20 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4767 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/db.h
include/wx/dbtable.h
src/common/db.cpp
src/common/dbtable.cpp

index 844b15de1b8e12ee573954067f0e4321ff78b5fa..d28a0305a8e64ea91325ed49ab2bb9cbb0815636 100644 (file)
@@ -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);
index b4f15a52fa4630306679533b1b39c441cf2cb208..79cb77f90cce64e87a36d945c924c3feeb2c55e4 100644 (file)
@@ -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);
index 5dfd9ce512131d884422479a573ab61b7fa9fff7..4063cdc163f7f3bc4a172f5768e40deb82c5eaf4 100644 (file)
@@ -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))
index 1e603781ed48ca660a30dc371be2d4149be4d4cd..edf1a0ce1ca4f4d9075de72b05e942ddeb7b89b6 100644 (file)
@@ -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)
 {