NdbEventOperation.hpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:8k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /*****************************************************************************
  14.  * Name:          NdbEventOperation.hpp
  15.  * Include:
  16.  * Link:
  17.  * Author:        Tomas Ulin MySQL AB
  18.  * Date:          2003-11-21
  19.  * Version:       0.1
  20.  * Description:   Event support
  21.  * Documentation:
  22.  * Adjust:  2003-11-21  Tomas Ulin   First version.
  23.  * Adjust:  2003-12-11  Tomas Ulin   Alpha Release.
  24.  ****************************************************************************/
  25. #ifndef NdbEventOperation_H
  26. #define NdbEventOperation_H
  27. class NdbGlobalEventBuffer;
  28. class NdbEventOperationImpl;
  29. /**
  30.  * @class NdbEventOperation
  31.  * @brief Class of operations for getting change events from database.  
  32.  *
  33.  * An NdbEventOperation object is instantiated by 
  34.  * NdbEventOperation *Ndb::createEventOperation(const char *eventName,
  35.  * int bufferLength)
  36.  *
  37.  * Prior to that an event must have been created in the Database through
  38.  * int NdbDictionary::createEvent(NdbDictionary::Event)
  39.  * 
  40.  * bufferLength indicates size of circular buffer to store event info as
  41.  * they occur.
  42.  *
  43.  * The instance is removed by Ndb::dropEventOperation(NdbEventOperation*)
  44.  *
  45.  * For more info see:
  46.  * ndbapi_example5.cpp
  47.  * Ndb.hpp
  48.  * NdbDictionary.hpp
  49.  *
  50.  * Known limitations:
  51.  *
  52.  * Maximum number of active NdbEventOperations are now set at compile time.
  53.  * Today 100.  This will become a configuration parameter later.
  54.  *
  55.  * Maximum number of NdbEventOperations tied to same event are maximum 16
  56.  * per process.
  57.  *
  58.  * Known issues:
  59.  *
  60.  * When several NdbEventOperation s are tied to the same event in the same
  61.  * process they will share the circular buffer. The BufferLength will then
  62.  * be the same for all and decided by the first NdbEventOperation 
  63.  * instantiation. Just make sure to instantiate the "largest" one first.
  64.  *
  65.  * Today all events INSERT/DELETE/UPDATE and all changed attributes are
  66.  * sent to the API, even if only specific attributes have been specified.
  67.  * These are however hidden from the user and only relevant data is shown
  68.  * after next().  However false exits from pollEvents() may occur and thus
  69.  * the subsequent next() will return zero, since there was no available
  70.  * data. Just do pollEvents() again. Will be fixed in later versions.
  71.  *
  72.  * Event code does not check table schema version. Make sure to drop events
  73.  * after table is dropped. Will be fixed in later
  74.  * versions.
  75.  *
  76.  * On a replicated system one will receive each event 2 times, one for each
  77.  * replica.  If a node fails events will not be received twice anymore
  78.  * for data in corresponding fragment. Will be optimized in later versions.
  79.  *
  80.  * If a nodefailiure has occured not all events will be recieved
  81.  * anymore. Drop NdbEventOperation and Create again after nodes are up
  82.  * again. Will be fixed in later versions.
  83.  *
  84.  * Test status:
  85.  * Tests have been run on 1-node and 2-node systems
  86.  *
  87.  * Known bugs:
  88.  *
  89.  * None, except if we can call some of the "isses" above bugs
  90.  *
  91.  * Useful API programs:
  92.  *
  93.  * select_all -d sys 'NDB$EVENTS_0'
  94.  * Will show contents in the system table containing created events.
  95.  *
  96.  */
  97. class NdbEventOperation {
  98. public:
  99.   enum State {CREATED,EXECUTING,ERROR};
  100.   State getState();
  101.   /**
  102.    * Activates the NdbEventOperation to start receiving events. The
  103.    * changed attribute values may be retrieved after next() has returned
  104.    * a value greater than zero. The getValue() methods below must be called
  105.    * prior to execute().
  106.    *
  107.    * @return 0 if successful otherwise -1.
  108.    */
  109.   int execute();
  110.   // about the event operation
  111.   // getting data
  112.   //  NdbResultSet* getResultSet();
  113.   /**
  114.    * Defines a retrieval operation of an attribute value.
  115.    * The NDB API allocate memory for the NdbRecAttr object that
  116.    * will hold the returned attribute value. 
  117.    *
  118.    * @note Note that it is the applications responsibility
  119.    *       to allocate enough memory for aValue (if non-NULL).
  120.    *       The buffer aValue supplied by the application must be
  121.    *       aligned appropriately.  The buffer is used directly
  122.    *       (avoiding a copy penalty) only if it is aligned on a
  123.    *       4-byte boundary and the attribute size in bytes
  124.    *       (i.e. NdbRecAttr::attrSize times NdbRecAttr::arraySize is
  125.    *       a multiple of 4).
  126.    *
  127.    * @note There are two versions, NdbOperation::getValue and
  128.    *       NdbOperation::getPreValue for retrieving the current and
  129.    *       previous value repectively.
  130.    *
  131.    * @note This method does not fetch the attribute value from 
  132.    *       the database!  The NdbRecAttr object returned by this method 
  133.    *       is <em>not</em> readable/printable before the 
  134.    *       NdbEventConnection::execute has been made and
  135.    *       NdbEventConnection::next has returned a value greater than
  136.    *       zero. If a specific attribute has not changed the corresponding 
  137.    *       NdbRecAttr will be in state UNDEFINED.  This is checked by 
  138.    *       NdbRecAttr::isNull which then returns -1.
  139.    *
  140.    * @param anAttrName  Attribute name 
  141.    * @param aValue      If this is non-NULL, then the attribute value 
  142.    *                    will be returned in this parameter.<br>
  143.    *                    If NULL, then the attribute value will only 
  144.    *                    be stored in the returned NdbRecAttr object.
  145.    * @return            An NdbRecAttr object to hold the value of 
  146.    *                    the attribute, or a NULL pointer 
  147.    *                    (indicating error).
  148.    */
  149.   NdbRecAttr *getValue(const char *anAttrName, char *aValue = 0);
  150.   NdbRecAttr *getPreValue(const char *anAttrName, char *aValue = 0);
  151.   /**
  152.    * Retrieves event resultset if available, inserted into the NdbRecAttrs
  153.    * specified in getValue() and getPreValue(). To avoid polling for
  154.    * a resultset, one can use Ndb::pollEvents(int millisecond_timeout)
  155.    * which will wait on a mutex until an event occurs or the specified
  156.    * timeout occurs.
  157.    *
  158.    * @return >=0 if successful otherwise -1. Return value inicates number
  159.    * of available events. By sending pOverRun one may query for buffer
  160.    * overflow and *pOverRun will indicate the number of events that have
  161.    * overwritten.
  162.    */
  163.   int next(int *pOverRun=0);
  164.   /**
  165.    * In the current implementation a nodefailiure may cause loss of events,
  166.    * in which case isConsistent() will return false
  167.    */
  168.   bool isConsistent();
  169.   /**
  170.    * Query for occured event type.
  171.    * NdbDictionary::Event::{TE_INSERT,TE_UPDATE,TE_DELETE}
  172.    * Only valid after next() has returned value >= 0
  173.    */
  174.   NdbDictionary::Event::TableEvent getEventType();
  175.   Uint32 getGCI();
  176.   Uint32 getLatestGCI();
  177.   void print();
  178. private:
  179.   friend class NdbEventOperationImpl;
  180.   friend class Ndb;
  181.   NdbEventOperation(Ndb *theNdb, const char* eventName,int bufferLength);
  182.   ~NdbEventOperation();
  183.   static int wait(void *p, int aMillisecondNumber);
  184.   class NdbEventOperationImpl &m_impl;
  185.   NdbEventOperation(NdbEventOperationImpl& impl);
  186. };
  187. typedef void (* NdbEventCallback)(NdbEventOperation*, Ndb*, void*);
  188. #endif