git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@19592 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			342 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			342 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        odbc.h
 | |
| // Purpose:     ODBC classes
 | |
| // Author:      Olaf Klein, Patrick Halke, Julian Smart
 | |
| // Modified by:
 | |
| // Created:     01/02/97
 | |
| // RCS-ID:      $Id$
 | |
| // Copyright:   (c) Olaf Klein, Patrick Halke, Julian Smart
 | |
| // Licence:     wxWindows licence
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| #include "wx/setup.h"
 | |
| 
 | |
| #if wxUSE_ODBC
 | |
| 
 | |
| #if defined(__GNUG__) && !defined(__APPLE__)
 | |
| #pragma interface "odbc.h"
 | |
| #endif
 | |
| 
 | |
| #ifndef _WX_ODBCH__
 | |
| #define _WX_ODBCH__
 | |
| 
 | |
| //#ifdef __WXMSW__
 | |
| //#include <windows.h>
 | |
| //#endif
 | |
| 
 | |
| 
 | |
| #ifdef __UNIX__
 | |
| extern "C"
 | |
| {
 | |
|     #include "wx/isql.h"
 | |
|     #include "wx/isqlext.h"
 | |
| 
 | |
|     typedef float   SFLOAT;
 | |
|     typedef double  SDOUBLE;
 | |
| 
 | |
|     #define ULONG UDWORD
 | |
|     #define SQL_SQLSTATE_SIZE 5
 | |
| }
 | |
| #else // !Unix
 | |
|     #include <sqlext.h>
 | |
| #endif // Unix/!Unix
 | |
| 
 | |
| #include "wx/defs.h"
 | |
| #include "wx/list.h"
 | |
| #include "wx/string.h"
 | |
| 
 | |
| typedef RETCODE wxRETCODE;
 | |
| 
 | |
| // Recordset open types
 | |
| #define wxOPEN_TYPE_DYNASET         1
 | |
| #define wxOPEN_TYPE_SNAPSHOT        2
 | |
| #define wxOPEN_TYPE_FORWARD_ONLY    3
 | |
| 
 | |
| // Recordset open options
 | |
| #define wxOPTION_DEFAULT            1
 | |
| #define wxOPTION_APPEND_ONLY        2
 | |
| #define wxOPTION_READ_ONLY          3
 | |
| 
 | |
| // Data types
 | |
| class WXDLLEXPORT wxRecordSet;
 | |
| 
 | |
| class WXDLLEXPORT wxDatabase: public wxObject
 | |
| {
 | |
|   DECLARE_DYNAMIC_CLASS(wxDatabase)
 | |
|  protected:
 | |
|   static HENV hEnv;
 | |
|   static int refCount;
 | |
| 
 | |
|   HDBC hDBC;
 | |
|   char* username;
 | |
|   char* password;
 | |
|   char* datasource;
 | |
|   char* dbname;
 | |
|   char* connectstring;
 | |
|   bool isOpen;
 | |
| 
 | |
|   // error-handling variables
 | |
|   wxRETCODE retcode;
 | |
|   char sqlstate[SQL_SQLSTATE_SIZE+1];  // error class and subclass
 | |
|   char errmsg[SQL_MAX_MESSAGE_LENGTH]; // error message
 | |
|   long nat_err;                        // error number by ODBC driver
 | |
|   bool err_occured;
 | |
| 
 | |
|   wxList recordSets; // Record sets: Added by JACS
 | |
| 
 | |
|  public:
 | |
|   wxDatabase();
 | |
|   ~wxDatabase();
 | |
| 
 | |
|   bool Open(char *, bool exclusive =FALSE, bool readOnly =TRUE, char *username ="ODBC", char *password ="");
 | |
|   bool Close();
 | |
| 
 | |
|   // Cleanup operations, added by JACS
 | |
|   void DeleteRecordSets(void); // Called when the database is deleted
 | |
|   void ResetRecordSets(void); // Required if the database is closed
 | |
|   inline wxList& GetRecordSets(void) { return recordSets; }
 | |
| 
 | |
|   inline char *GetUsername(void) { return username; }
 | |
|   inline char *GetPassword(void) { return password; }
 | |
|   inline char *GetDataSource(void) { return datasource; }
 | |
|   inline bool IsOpen(void) { return isOpen; }
 | |
|   inline wxRETCODE GetErrorCode(void) { return retcode; }
 | |
|   inline HDBC GetHDBC(void) { return hDBC; }
 | |
|   inline HENV GetHENV(void) { return hEnv; }
 | |
| 
 | |
|   void SetPassword(char *s);
 | |
|   void SetUsername(char *s);
 | |
|   void SetDataSource(char *s);
 | |
| 
 | |
|   // Database attributes
 | |
|   char *GetDatabaseName();
 | |
|   bool CanUpdate();
 | |
|   bool CanTransact();
 | |
|   bool InWaitForDataSource();
 | |
|   void SetLoginTimeout(long seconds);
 | |
|   void SetQueryTimeout(long seconds);
 | |
|   void SetSynchronousMode(bool synchronous);
 | |
| 
 | |
|   // Database operations
 | |
|   bool BeginTrans();
 | |
|   bool CommitTrans();
 | |
|   bool RollbackTrans();
 | |
|   void Cancel();
 | |
| 
 | |
|   // Error handling
 | |
|   bool ErrorOccured();
 | |
|   char* GetErrorMessage();
 | |
|   long  GetErrorNumber();
 | |
|   char* GetErrorClass();
 | |
|   inline void ErrorSnapshot(HSTMT =SQL_NULL_HSTMT);
 | |
| 
 | |
|   // Overridables
 | |
|   virtual void OnSetOptions(wxRecordSet *recordSet);
 | |
|   virtual void OnWaitForDataSource(bool stillExecuting);
 | |
| 
 | |
|   bool GetInfo(long infoType, long *buf);
 | |
|   bool GetInfo(long infoType, char *buf, int bufSize = -1);
 | |
| 
 | |
|   // implementation = TRUE means get the DLL version.
 | |
|   // Otherwise, returns header file version.
 | |
|   wxString GetODBCVersionString(bool implementation = TRUE);
 | |
|   float GetODBCVersionFloat(bool implementation = TRUE);
 | |
| };
 | |
| 
 | |
| // Represents a data row
 | |
| class WXDLLEXPORT wxQueryField: public wxObject
 | |
| {
 | |
|   // JACS
 | |
|   DECLARE_DYNAMIC_CLASS(wxQueryField)
 | |
|  private:
 | |
|   void *data;
 | |
|   short type;
 | |
|   long size;
 | |
|   bool dirty;
 | |
| 
 | |
|   bool AllocData();
 | |
| 
 | |
|   public:
 | |
|   wxQueryField();
 | |
|   ~wxQueryField();
 | |
| 
 | |
|   bool SetData(void*, long);
 | |
|   void SetDirty(bool =TRUE);
 | |
|   void ClearData();
 | |
|   void SetType(short);
 | |
|   void SetSize(long);
 | |
| 
 | |
|   void* GetData();
 | |
|   short GetType();
 | |
|   long GetSize();
 | |
| 
 | |
|   bool IsDirty();
 | |
| };
 | |
| 
 | |
| // Represents a column description
 | |
| class WXDLLEXPORT wxQueryCol: public wxObject
 | |
| {
 | |
|   // JACS
 | |
|   DECLARE_DYNAMIC_CLASS(wxQueryCol)
 | |
|  private:
 | |
|   short type;
 | |
|   char *name;
 | |
|   bool nullable;
 | |
|   long varsize;
 | |
|   void* var;
 | |
| 
 | |
|   public:
 | |
|   wxList fields;
 | |
| 
 | |
|   wxQueryCol();
 | |
|   ~wxQueryCol();
 | |
| 
 | |
|   void* BindVar(void*, long);
 | |
|   void FillVar(int);
 | |
|   void AppendField(void*, long);
 | |
|   bool SetData(int, void*, long);
 | |
|   void SetName(char*);
 | |
|   void SetNullable(bool);
 | |
|   void SetFieldDirty(int, bool =TRUE);
 | |
|   void SetType(short);
 | |
| 
 | |
|   char* GetName();
 | |
|   short GetType();
 | |
|   bool IsNullable();
 | |
|   void* GetData(int);
 | |
|   long GetSize(int);
 | |
| 
 | |
|   bool IsFieldDirty(int);
 | |
| };
 | |
| 
 | |
| class WXDLLEXPORT wxRecordSet: public wxObject
 | |
| {
 | |
|   // JACS
 | |
|   DECLARE_DYNAMIC_CLASS(wxRecordSet)
 | |
|  private:
 | |
|   int cursor;
 | |
|   int type;
 | |
|   int options;
 | |
| 
 | |
|   protected:
 | |
|   HSTMT hStmt;
 | |
|   int nFields;
 | |
|   int nParams;
 | |
|   int nRecords;
 | |
|   short nCols;
 | |
|   char *recordFilter;
 | |
|   char *sortString;
 | |
|   char *defaultSQL;
 | |
|   char* tablename;
 | |
|   wxDatabase *parentdb;
 | |
|   wxRETCODE retcode;
 | |
|   wxList cols;
 | |
|   wxList fetchbuf;
 | |
| 
 | |
|   void FillVars(int);
 | |
| 
 | |
|   public:
 | |
|   // JACS gave parent a default value for benefit of IMPLEMENT_DYNAMIC_CLASS
 | |
|   wxRecordSet(wxDatabase *parent = NULL,
 | |
|               int = wxOPEN_TYPE_DYNASET,
 | |
|               int = wxOPTION_DEFAULT);
 | |
|   ~wxRecordSet();
 | |
| 
 | |
|   // My own, lower-level functions.
 | |
|   bool BeginQuery(int openType, char *sql = NULL, int options = wxOPTION_DEFAULT);
 | |
|   bool EndQuery();
 | |
|   bool Query(char* columns, char* table =NULL, char *filter =NULL);
 | |
| 
 | |
|   // Attributes
 | |
|   inline int GetNumberFields(void) { return nFields; }
 | |
|   inline int GetNumberParams(void) { return nParams; }
 | |
|   long GetNumberRecords();
 | |
|   long GetNumberCols();
 | |
|   inline char *GetFilter(void) { return recordFilter; }
 | |
|   inline char *GetSortString(void) { return sortString; }
 | |
|   inline wxDatabase *GetDatabase(void) { return parentdb; }
 | |
|   inline wxRETCODE GetErrorCode(void) { return retcode; }
 | |
|   bool CanAppend();
 | |
|   bool CanRestart();
 | |
|   bool CanScroll();
 | |
|   bool CanTransact();
 | |
|   bool CanUpdate();
 | |
|   long GetCurrentRecord();
 | |
|   bool RecordCountFinal();
 | |
|   bool GetResultSet();
 | |
|   bool ExecuteSQL(char*);
 | |
|   bool GetTables();
 | |
|   bool GetColumns(char* =NULL);
 | |
|   bool GetPrimaryKeys(char* =NULL);
 | |
|   bool GetForeignKeys(char* , char * );
 | |
|   char *GetTableName();
 | |
|   void SetTableName(char*);
 | |
|   char *GetSQL();
 | |
|   bool IsOpen();
 | |
|   bool IsBOF();
 | |
|   bool IsEOF();
 | |
|   bool IsDeleted();
 | |
| 
 | |
|   bool GetFieldData(int colPos, int dataType, void *dataPtr);
 | |
|   bool GetFieldData(const char*, int dataType, void *dataPtr);
 | |
|   void* GetFieldDataPtr(int, int);
 | |
|   void* GetFieldDataPtr(const char*, int);
 | |
|   char* GetColName(int);
 | |
|   short GetColType(int);
 | |
|   short GetColType(const char*);
 | |
|   void* BindVar(int, void*, long);
 | |
|   void* BindVar(const char*, void*, long);
 | |
| 
 | |
|   void SetType(int);
 | |
|   int GetType();
 | |
|   void SetOptions(int);
 | |
|   int GetOptions();
 | |
| 
 | |
|   // Update operations
 | |
|   void AddNew();
 | |
|   bool Delete();
 | |
|   void Edit();
 | |
|   bool Update();
 | |
| 
 | |
|   // Record navigation
 | |
|   virtual bool Move(long rows);
 | |
|   virtual bool MoveFirst();
 | |
|   virtual bool MoveLast();
 | |
|   virtual bool MoveNext();
 | |
|   virtual bool MovePrev();
 | |
|   virtual bool GoTo(long);
 | |
| 
 | |
|   // Others
 | |
|   bool GetDataSources();
 | |
| 
 | |
|   // Associate a column name/position with a data location
 | |
|   //   bool BindColumn(int colPos, int dataType, void *dataPtr);
 | |
| 
 | |
|   void Cancel();
 | |
|   bool IsFieldDirty(int);
 | |
|   bool IsFieldDirty(const char*);
 | |
|   bool IsFieldNull(int);
 | |
|   bool IsFieldNull(const char*);
 | |
|   bool IsColNullable(int);
 | |
|   bool IsColNullable(const char*);
 | |
|   virtual bool Requery();
 | |
|   virtual void SetFieldDirty(int, bool dirty = TRUE);
 | |
|   virtual void SetFieldDirty(const char*, bool dirty = TRUE);
 | |
|   void SetFieldNull(void *p, bool isNull = TRUE);
 | |
| 
 | |
|   // Overridables
 | |
|   virtual char *GetDefaultConnect();
 | |
|   virtual char *GetDefaultSQL();
 | |
| 
 | |
|   // Internal
 | |
| 
 | |
|   // Build SQL query from column specification
 | |
|   bool ConstructDefaultSQL();
 | |
|   void SetDefaultSQL(char *s);
 | |
|   bool ReleaseHandle(void); // Added JACS
 | |
| };
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #endif  // wxUSE_ODBC
 |