OBOUND.H
上传用户:sygkzy
上传日期:2013-03-13
资源大小:150k
文件大小:13k
源码类别:

Oracle数据库

开发平台:

Visual C++

  1. /* Copyright (c) Oracle Corporation 1994.  All Rights Reserved */
  2. /* Copyright (c) Oracle Corporation 1994.  All Rights Reserved */
  3. /*
  4.     This source code is provided as a debugging aid for developers
  5.     who have purchased Oracle Objects for OLE    .  Please see the
  6.     online help for documentation of these classes.
  7. */
  8. /*
  9.     Oracle Objects for OLE     C++ Classes
  10.     
  11.     This file is the header for the OBound and OBinder classes
  12.                            
  13.     CREATED    ********   11/22/94
  14.     RWOOLARD MODIFIED 03/20/95
  15.      bug# 262553 Added more methods to access the bound dynaset
  16. */
  17. #ifndef OBOUND_ORACLE
  18. #define OBOUND_ORACLE
  19. #ifndef ORACL_ORACLE
  20. #include "oracl.h"
  21. #endif
  22. // declarations for forward references
  23. class OBinderAdvise;
  24. class OEXPORT OBinder;
  25. // ----- OBound -----------------------------------------------
  26. class OEXPORT OHUGESP OBound
  27. {
  28.     friend class OBinder;
  29.     friend class OBinderAdvise;
  30. public:
  31.     OBound(void);
  32.     ~OBound(void);
  33.     
  34.     // to attach bound object to a binder
  35.     oresult BindToBinder(OBinder *binder, const char *fieldname);
  36.     // to detach
  37.     oresult Unbind(void); 
  38.     oresult Changed(oboolean changed = TRUE);
  39.     
  40.     const char *GetName(void) const;  // get name of field we're attached to
  41.     ODatabase GetDatabase(void) const;
  42.     ODynaset GetDynaset(void) const;
  43.     
  44.     oboolean IsChanged(void) const;
  45.     
  46.     // declarations of methods so that compiler won't implement these (which would be wrong)
  47.     // at present we don't implement these either...
  48.     OBound(const OBound &other);  // copy constructor
  49.     OBound &operator=(const OBound &other);  // overloaded assignment
  50.     
  51. protected:
  52.     // helper routines for subclasses
  53.     oresult GetValue(OValue *val);       // get current value from database
  54.     oresult SetValue(const OValue &val); // set value in database
  55.     oresult RefreshBound(void);              // get value and call Refresh method
  56.     
  57.     // routines subclasses need to implement
  58.     virtual oresult Refresh(const OValue &val) = 0;  // database -> bound
  59.     virtual oresult SaveChange(void) = 0;  // bound -> database
  60. private:
  61.     oboolean m_changed;     // flag indicating we've had a change
  62.     OBinder *m_binder;      // pointer to containing binder
  63.     char    *m_fieldname;   // name of field we're bound to
  64.     int      m_fieldindex;  // index of field we're bound to
  65.     
  66.     oresult SaveChangeBound(void);    
  67.     oresult GetFieldIndex(void);
  68.     oresult UnbindNotify(void); 
  69.     
  70.     oresult ClearChange(void);
  71. protected:    
  72.     /*
  73.         Triggers.  These routines are called by OBinder.  At some in OBinder
  74.         these triggers will be fired for all of the objects in a binder.  The
  75.         triggers fire after the corresponding binder triggers (with the exception
  76.         of the Startup and Shutdown triggers). The firing order of the bound objects
  77.         is the order that they were bound to the binder.  If any trigger in a binder
  78.         does not return OSUCCESS, processing will be halted.
  79.         
  80.         The routines are all listed below as
  81.         method
  82.         Fired:  when the trigger fires
  83.         Default: the action taken by the base OBound class method
  84.     */
  85.     virtual oresult Startup(void);
  86.     // Fired: immediately after bound object is bound to binder.  If the binder has not
  87.     //        been opened then GetValue can't be called  
  88.     // Default: no action
  89.     virtual oresult Shutdown(void);
  90.     // Fired: when bound object is unbound from binder, either by an explicit call to
  91.     //        OBinder::UnbindObject or when OBinder::Close is called
  92.     // Default: no action
  93.     virtual oresult PreQuery(void);
  94.     // Fired: before the SQL statement is executed
  95.     // Default: no action
  96.     virtual oresult PostQuery(void);
  97.     // Fired: after SQL statement is executed and new bindings are established
  98.     // Default: refreshes bound object 
  99.     virtual oresult PreDelete(void);
  100.     // Fired: before record is deleted
  101.     // Default: no action
  102.     virtual oresult PostDelete(void);
  103.     // Fired: after record is deleted (but not committed to database)
  104.     // Default: no action
  105.     virtual oresult PreAdd(void);
  106.     // Fired: before new record is added
  107.     // Default: no action
  108.     virtual oresult PostAdd(void);
  109.     // Fired: after a new record is added
  110.     // Default: refreshes bound object - value will generally be NULL
  111.     virtual oresult PreUpdate(void);
  112.     // Fired: just before database is updated
  113.     // Default: no action
  114.     virtual oresult PostUpdate(void);
  115.     // Fired: immediately after database is updated
  116.     // Default: no action
  117.     virtual oresult PreRollback(void);
  118.     // Fired: immediately before a rollback is attempted
  119.     // Default: no action
  120.     virtual oresult PostRollback(void);
  121.     // Fired: immediately after a rollback
  122.     // Default: refresh bound object 
  123.     virtual oresult PreMove(void);
  124.     // Fired: before OBinder moves to a new record
  125.     // Default: no action
  126.     virtual oresult PostMove(void);
  127.     // Fired: after OBinder moves to a new record
  128.     // Default: refreshes bound object 
  129. };
  130. // ----- OBinder -----------------------------------------------
  131. class OEXPORT OBinder
  132. {
  133.     friend class OBinderAdvise;
  134.     friend OBound::BindToBinder(OBinder *binder, const char *fieldname);  // so can call AddToOBinder 
  135. public:
  136.     OBinder(void);
  137.     ~OBinder(void);
  138.     
  139.     // start (or restart) a query on the binder
  140.     oresult Open(const char *dbname, const char *username, const char *pwd, const char *sqls, long dynoptions = ODYNASET_DEFAULT);  // data control form
  141.  oresult Open(const ODatabase &odb, const char *sqls, long dynoptions = ODYNASET_DEFAULT);  // using an existing database
  142. // Added for V2DEV custom dynaset
  143.  oresult Open(const ODatabase &odb, const char *sql_statement,
  144. unsigned int slicesize, unsigned int perblock,
  145. unsigned int blocks, unsigned int fetchlimit,
  146. unsigned int fetchsize, long options = ODYNASET_DEFAULT);
  147.     oresult Close(oboolean doShutdown = TRUE);
  148.     
  149.     // for resetting the query of the block
  150.     oresult SetSQL(const char *sqls);  // just set the SQL for the next query 
  151. //BUG #262553
  152.     const char *GetSQL(void) const;  // gets sql statement
  153.     oresult RefreshQuery(void);  // refresh query
  154.     
  155.     oresult Refresh(void);  // get values to all bound objects
  156.     
  157.     // navigational methods
  158.     //   (can also call methods on the dynaset returned by GetDynaset)
  159.     oresult MoveFirst(void);
  160.     oresult MovePrev(void);
  161.     oresult MoveNext(void);
  162.     oresult MoveLast(void);
  163. // V2DEV - extra move methods
  164.  oresult MovePrevN(long rows);   // go to previous (n) record
  165.  oresult MoveNextN(long rows);   // go to next (n) record
  166.  oresult MoveRel(long rows); // go to relative record (n)
  167.  oresult MoveTo(long rownum);    // go to record (n)
  168.  oresult MoveToMark(const ODynasetMark &mark);
  169.     // ask for the binder's dynaset
  170.     const ODynaset GetDynaset(void) const;
  171.     const ODatabase GetDatabase(void) const;
  172.     
  173.     // unbind an object
  174.     oresult UnbindObj(OBound *object, oboolean nofail = FALSE);
  175.     
  176.     // get or set the value of a field (primarily used by OBound)
  177.     oresult GetFieldValue(int index, OValue *val) const;
  178.     oresult SetFieldValue(int index, const OValue &val);
  179.     
  180.     // routine called by a child bound object to get it's field
  181.     oresult GetFieldIndex(int *ofldi, const char *fieldname);
  182.     
  183.     oresult DeleteRecord(void);
  184.     oresult AddNewRecord(void);
  185.     oresult DuplicateRecord(void);
  186.  // V2DEV - Find methods
  187.    oresult FindFirst(const char *sql);
  188.  oresult FindNext(const char *sql = 0);
  189.  oresult FindPrevious(const char *sql = 0);
  190.  oresult FindLast(const char *sql);
  191.  oboolean NoMatch(void); // TRUE if find failed
  192.     oresult  Changed(oboolean cflag = TRUE);
  193.     oboolean IsChanged(void) const;
  194. //BUG #262553
  195. oboolean IsOpen(void);
  196.     oboolean IsFirst(void);
  197.     oboolean IsLast(void);
  198.     
  199.     oboolean GetChangedError(long *serr, long *cerr) const; 
  200.     
  201. // save changes, if any
  202.     oresult Update(void);
  203.     // throw away changes, if any
  204.  oresult DiscardChanges(void);
  205.     
  206.     // Error handling methods    
  207. //BUG #262553
  208.     long  ErrorNumber(void) const; // return error "number"
  209.     const char *LookupErrorText(long errnum) const;
  210.   // get error text for given error number
  211.     const char *GetErrorText(void) const;  // get description of last error
  212.     // set error information
  213.     void  ErrorReset(void) const;  // reset error state to "no error"
  214.     oboolean CanMark(void) const;
  215.     ODynasetMark GetMark(void) const;  // bookmark at current position
  216.     ODynasetMark GetLastModifiedMark(void) const ; // get bookmark at last modified record
  217.     // record access
  218. //BUG #262553
  219.  int GetFieldCount(void) const;  // returns # of fields in a record
  220.     long GetRecordCount(void) const;
  221.     // (dangerous!) gets total number of records in dynaset -- downloads the entire dynaset to the client   
  222.     int GetFieldIndex(const char *fieldname) const;
  223.      // gets the index of a field by name
  224.         
  225.     // declarations of methods so that compiler won't implement these (which would be wrong)
  226.     // at present we don't implement these either...
  227.     OBinder(const OBinder &other);  // copy constructor
  228.     OBinder &operator=(const OBinder &other);  // overloaded assignment
  229. protected:
  230.     /*
  231.         Error handling routine.  This routine is called if there is an error during processing
  232.         of Changed.
  233.     */             
  234.     virtual void OnChangedError(void);
  235.     
  236.     /*
  237.         Trigger routines.  These routines are all fired on some action
  238.         They are all documented to show:
  239.         
  240.         Fired: when the trigger fires
  241.         Default: the action of the OBinder base class
  242.         
  243.         The triggers all return an oresult.  If the trigger does not return
  244.         OSUCCESS the current action is cancelled.
  245.         
  246.         After a binder trigger routine is called, the same trigger is called
  247.         on each of the bound objects (routines in OBound), with the exception of
  248.         Startup and Shutdown.  Currently the order
  249.         the triggers are called on the bound objects is not guaranteed.  The
  250.         object triggers will not be called if the binder trigger fails.  If any
  251.         of the object triggers fail, no more processing will be done
  252.     */
  253.     
  254.     virtual oresult Startup(void);
  255.     // Fired: at the time the first bound object is added to the binder
  256.     //        guaranteed to only be called once
  257.     // Default: no action
  258.     virtual oresult Shutdown(void);
  259.     // Fired: when OBinder::Close is called
  260.     // Default: if changes have been made, save them (calls OBound::SaveChange on every object) and
  261.     //          update the record (which as a side effect calls the update triggers)
  262.     virtual oresult PreQuery(void);
  263.     // Fired: before the SQL statement is executed
  264.     // Default: no action
  265.     virtual oresult PostQuery(void);
  266.     // Fired: after SQL statement is executed and new bindings are established
  267.     // Default: no action
  268.     virtual oresult PreDelete(void);
  269.     // Fired: before record is deleted
  270.     // Default: no action
  271.     virtual oresult PostDelete(void);
  272.     // Fired: after record is deleted (but not committed to database)
  273.     // Default: no action
  274.     virtual oresult PreAdd(void);
  275.     // Fired: before new record is added
  276.     // Default: if changes have been made, save them (calls OBound::SaveChange on every object) and
  277.     //          update the record (which as a side effect calls the update triggers)
  278.     virtual oresult PostAdd(void);
  279.     // Fired: after a new record is added
  280.     // Default: no action
  281.     virtual oresult PreUpdate(void);
  282.     // Fired: just before database is updated
  283.     // Default: no action
  284.     virtual oresult PostUpdate(void);
  285.     // Fired: immediately after database is updated
  286.     // Default: no action 
  287.     virtual oresult PreRollback(void);
  288.     // Fired: immediately before a rollback is attempted
  289.     // Default: no action
  290.     virtual oresult PostRollback(void);
  291.     // Fired: immediately after a rollback
  292.     // Default: no action
  293.     virtual oresult PreMove(void);
  294.     // Fired: before OBinder moves to a new record
  295.     // Default: if changes have been made, save them (calls OBound::SaveChange on every object) and
  296.     //          update the record (which as a side effect calls the update triggers)
  297.     virtual oresult PostMove(void);
  298.     // Fired: after OBinder moves to a new record
  299.     // Default: no action
  300.     
  301. private:
  302.     ODynaset      m_dynaset;
  303.     ODatabase     m_database;
  304.     OBound      **m_boundlist;
  305.     void           *m_advise;     // pointer to our special advisory
  306.     
  307.     oboolean        m_changed;  // TRUE if binder has been changed since an update
  308.     int             m_nbound;
  309.     
  310.     // errors saved from change
  311.     long         m_changeerr;  // class lib error
  312.     long         m_schangeerr; // server error
  313.     
  314.     // Bind an object to the binder (called by OBound)
  315.     oresult AddObjectToOBinder(OBound *object);
  316.     // operations on all the bound objects
  317.     oresult DoAllObjects(oresult (OBound::*ff)(void));  // operate on all via dynaset ref
  318.     // routines used to implement default behavior
  319.     oresult SaveRecordChanges(void);
  320. };
  321. #endif // OBOUND_ORACLE