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

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. #ifndef NdbReceiver_H
  14. #define NdbReceiver_H
  15. #ifndef DOXYGEN_SHOULD_SKIP_INTERNAL  // Not part of public interface
  16. #include <ndb_types.h>
  17. class Ndb;
  18. class NdbConnection;
  19. class NdbReceiver
  20. {
  21.   friend class Ndb;
  22.   friend class NdbOperation;
  23.   friend class NdbScanOperation;
  24.   friend class NdbIndexOperation;
  25.   friend class NdbIndexScanOperation;
  26.   friend class NdbConnection;
  27. public:
  28.   enum ReceiverType { NDB_UNINITIALIZED,
  29.   NDB_OPERATION = 1,
  30.   NDB_SCANRECEIVER = 2,
  31.   NDB_INDEX_OPERATION = 3
  32.   };
  33.   
  34.   NdbReceiver(Ndb *aNdb);
  35.   void init(ReceiverType type, void* owner);
  36.   void release();
  37.   ~NdbReceiver();
  38.   
  39.   Uint32 getId(){
  40.     return m_id;
  41.   }
  42.   ReceiverType getType(){
  43.     return m_type;
  44.   }
  45.   
  46.   inline NdbConnection * getTransaction();
  47.   void* getOwner(){
  48.     return m_owner;
  49.   }
  50.   
  51.   bool checkMagicNumber() const;
  52.   inline void next(NdbReceiver* next) { m_next = next;}
  53.   inline NdbReceiver* next() { return m_next; }
  54.   
  55.   void setErrorCode(int);
  56. private:
  57.   Uint32 theMagicNumber;
  58.   Ndb* m_ndb;
  59.   Uint32 m_id;
  60.   Uint32 m_tcPtrI;
  61.   Uint32 m_key_info;
  62.   ReceiverType m_type;
  63.   void* m_owner;
  64.   NdbReceiver* m_next;
  65.   /**
  66.    * At setup
  67.    */
  68.   class NdbRecAttr * getValue(const class NdbColumnImpl*, char * user_dst_ptr);
  69.   void do_get_value(NdbReceiver*, Uint32 rows, Uint32 key_size);
  70.   void prepareSend();
  71.   void calculate_batch_size(Uint32, Uint32, Uint32&, Uint32&, Uint32&);
  72.   int execKEYINFO20(Uint32 info, const Uint32* ptr, Uint32 len);
  73.   int execTRANSID_AI(const Uint32* ptr, Uint32 len); 
  74.   int execTCOPCONF(Uint32 len);
  75.   int execSCANOPCONF(Uint32 tcPtrI, Uint32 len, Uint32 rows);
  76.   class NdbRecAttr* theFirstRecAttr;
  77.   class NdbRecAttr* theCurrentRecAttr;
  78.   class NdbRecAttr** m_rows;
  79.   
  80.   Uint32 m_list_index; // When using multiple
  81.   Uint32 m_current_row;
  82.   Uint32 m_result_rows;
  83.   Uint32 m_defined_rows;
  84.   Uint32 m_expected_result_length;
  85.   Uint32 m_received_result_length;
  86.   
  87.   bool nextResult() const { return m_current_row < m_result_rows; }
  88.   void copyout(NdbReceiver&);
  89. };
  90. #ifdef NDB_NO_DROPPED_SIGNAL
  91. #include <stdlib.h>
  92. #endif
  93. inline
  94. bool 
  95. NdbReceiver::checkMagicNumber() const {
  96.   bool retVal = (theMagicNumber == 0x11223344);
  97. #ifdef NDB_NO_DROPPED_SIGNAL
  98.   if(!retVal){
  99.     abort();
  100.   }
  101. #endif
  102.   return retVal;
  103. }
  104. inline
  105. void
  106. NdbReceiver::prepareSend(){
  107.   m_current_row = 0;
  108.   m_received_result_length = 0;
  109.   m_expected_result_length = 0;
  110.   theCurrentRecAttr = theFirstRecAttr;
  111. }
  112. inline
  113. int
  114. NdbReceiver::execTCOPCONF(Uint32 len){
  115.   Uint32 tmp = m_received_result_length;
  116.   m_expected_result_length = len;
  117. #ifdef assert
  118.   assert(!(tmp && !len));
  119. #endif
  120.   return ((bool)len ^ (bool)tmp ? 0 : 1);
  121. }
  122. inline
  123. int
  124. NdbReceiver::execSCANOPCONF(Uint32 tcPtrI, Uint32 len, Uint32 rows){
  125.   m_tcPtrI = tcPtrI;
  126.   m_result_rows = rows;
  127.   Uint32 tmp = m_received_result_length;
  128.   m_expected_result_length = len;
  129.   return (tmp == len ? 1 : 0);
  130. }
  131. #endif
  132. #endif