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

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: NdbApiSignal.H
  15.  * Include:
  16.  * Link:
  17.  * Author: UABMNST Mona Natterkvist UAB/B/SD
  18.  * Date: 97----
  19.  * Version: 0.1
  20.  * Description: Interface between TIS and NDB
  21.  * Documentation:
  22.  * Adjust: 971204  UABMNST   First version.
  23.  * Adjust:         000705  QABANAB   Changes in Protocol2
  24.  * Comment:
  25.  *****************************************************************************/
  26. #ifndef NdbApiSignal_H
  27. #define NdbApiSignal_H
  28. #include <kernel_types.h>
  29. #include "TransporterFacade.hpp"
  30. #include <TransporterDefinitions.hpp>
  31. #include "Ndb.hpp"
  32. #define CAST_PTR(X,Y) static_cast<X*>(static_cast<void*>(Y))
  33. #define CAST_CONSTPTR(X,Y) static_cast<const X*>(static_cast<const void*>(Y))
  34. /**
  35.  * A NdbApiSignal : public SignalHeader
  36.  *
  37.  * Stores the address to theData in theSignalId
  38.  */
  39. class NdbApiSignal : public SignalHeader
  40.  {
  41. public:  
  42.    NdbApiSignal(Ndb* ndb);
  43.    NdbApiSignal(BlockReference ref);
  44.    NdbApiSignal(const NdbApiSignal &);
  45.                         NdbApiSignal(const SignalHeader &header)
  46.   : SignalHeader(header), theNextSignal(0), theRealData(0) {};
  47.    ~NdbApiSignal();
  48.   void                  set(Uint8  trace,
  49.     Uint16 receiversBlockNumber,
  50.     Uint16 signalNumber,
  51.     Uint32 length);
  52.   
  53.   void  setData(Uint32 aWord, Uint32 aDataNo);  
  54.   Uint32  readData(Uint32 aDataNo) const; // Read word in signal
  55.   
  56.   int  setSignal(int NdbSignalType);   // Set signal header  
  57.   int  readSignalNumber();     // Read signal number  
  58.   Uint32              getLength() const;
  59.   void               setLength(Uint32 aLength);
  60.   void  next(NdbApiSignal* anApiSignal);  
  61.   NdbApiSignal*  next();
  62.  
  63.    const Uint32 *       getDataPtr() const;
  64.          Uint32 *       getDataPtrSend();
  65.   NodeId                get_sender_node();
  66.   /**
  67.    * Fragmentation
  68.    */
  69.   bool isFirstFragment() const { return m_fragmentInfo <= 1;}
  70.   bool isLastFragment() const { 
  71.     return m_fragmentInfo == 0 || m_fragmentInfo == 3; 
  72.   }
  73.   
  74.   Uint32 getFragmentId() const { 
  75.     return (m_fragmentInfo == 0 ? 0 : getDataPtr()[theLength - 1]); 
  76.   }
  77.   
  78. private:
  79.   friend void execute(void * callbackObj, 
  80.       struct SignalHeader * const header, 
  81.       Uint8 prio, Uint32 * const theData, 
  82.       LinearSectionPtr ptr[3]);
  83.    
  84.   void setDataPtr(Uint32 *);
  85.   
  86.   friend class NdbConnection;
  87.   friend class NdbScanReceiver;
  88.   friend class Table;
  89.   void copyFrom(const NdbApiSignal * src);
  90.   /**
  91.    * Only used when creating a signal in the api
  92.    */
  93.   Uint32 theData[25];
  94.   NdbApiSignal *theNextSignal;
  95.   Uint32 *theRealData;
  96. };
  97. /**********************************************************************
  98. NodeId get_sender_node
  99. Remark:        Get the node id of the sender
  100. ***********************************************************************/
  101. inline
  102. NodeId
  103. NdbApiSignal::get_sender_node()
  104. {
  105.   return refToNode(theSendersBlockRef);
  106. }
  107. /**********************************************************************
  108. void getLength
  109. Remark:        Get the length of the signal.
  110. ******************************************************************************/
  111. inline
  112. Uint32
  113. NdbApiSignal::getLength() const{
  114.   return theLength;
  115. }
  116. /**********************************************************************
  117. void setLength
  118. Parameters:    aLength: Signal length
  119. Remark:        Set the length in the signal.
  120. ******************************************************************************/
  121. inline
  122. void
  123. NdbApiSignal::setLength(Uint32 aLength){
  124.   theLength = aLength;
  125. }
  126. /**********************************************************************
  127. void next(NdbApiSignal* aSignal);
  128. Parameters:     aSignal: Signal object.
  129. Remark:         Insert signal rear in a linked list.   
  130. *****************************************************************************/
  131. inline
  132. void 
  133. NdbApiSignal::next(NdbApiSignal* aSignal){
  134.   theNextSignal = aSignal;
  135. }
  136. /**********************************************************************
  137. NdbApiSignal* next();
  138. Return Value:   Return theNext signal object if the next was successful.
  139.                 Return NULL: In all other case.  
  140. Remark:         Read the theNext in signal.   
  141. *****************************************************************************/
  142. inline
  143. NdbApiSignal* 
  144. NdbApiSignal::next(){
  145.   return theNextSignal;
  146. }
  147. /**********************************************************************
  148. int readSignalNo();
  149. Return Value:    Return the signalNumber. 
  150. Remark:          Read signal number 
  151. *****************************************************************************/
  152. inline
  153. int
  154. NdbApiSignal::readSignalNumber()
  155. {
  156.   return (int)theVerId_signalNumber;
  157. }
  158. /**********************************************************************
  159. Uint32 readData(Uint32 aDataNo);
  160. Return Value:   Return Data word in a signal.
  161.                 Return -1: In all other case.
  162.                 aDataNo: Data number in signal.
  163. Remark:         Return the dataWord information in a signal for a dataNo.  
  164. ******************************************************************************/
  165. inline
  166. Uint32
  167. NdbApiSignal::readData(Uint32 aDataNo) const {
  168.   return getDataPtr()[aDataNo-1];
  169. }
  170. /**********************************************************************
  171. int setData(Uint32 aWord, int aDataNo);
  172. Return Value:   Return 0 : setData was successful.
  173.                 Return -1: In all other case.  
  174. Parameters:     aWord: Data word.
  175.                 aDataNo: Data number in signal.
  176. Remark:         Set Data word in signal 1 - 25  
  177. ******************************************************************************/
  178. inline
  179. void
  180. NdbApiSignal::setData(Uint32 aWord, Uint32 aDataNo){
  181.   getDataPtrSend()[aDataNo -1] = aWord;
  182. }
  183. /**
  184.  * Return pointer to data structure
  185.  */
  186. inline
  187. const Uint32 *
  188. NdbApiSignal::getDataPtr() const {
  189.   return theRealData;
  190. }
  191. inline
  192. Uint32 *
  193. NdbApiSignal::getDataPtrSend(){
  194.   return (Uint32*)&theData[0];
  195. }
  196. inline
  197. void
  198. NdbApiSignal::setDataPtr(Uint32 * ptr){
  199.   theRealData = ptr;
  200. }
  201. #endif