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

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 NDB_IMPL_HPP
  14. #define NDB_IMPL_HPP
  15. #include <ndb_global.h>
  16. #include <Ndb.hpp>
  17. #include <NdbOut.hpp>
  18. #include <NdbError.hpp>
  19. #include <NdbCondition.h>
  20. #include <NdbReceiver.hpp>
  21. #include <NdbOperation.hpp>
  22. #include <kernel/ndb_limits.h>
  23. #include <NdbTick.h>
  24. #include "ndb_cluster_connection_impl.hpp"
  25. #include "NdbDictionaryImpl.hpp"
  26. #include "ObjectMap.hpp"
  27. template <class T>
  28. struct Ndb_free_list_t 
  29. {
  30.   Ndb_free_list_t();
  31.   ~Ndb_free_list_t();
  32.   
  33.   void fill(Ndb*, Uint32 cnt);
  34.   T* seize(Ndb*);
  35.   void release(T*);
  36.   void clear();
  37.   Uint32 get_sizeof() const { return sizeof(T); }
  38.   T * m_free_list;
  39.   Uint32 m_alloc_cnt, m_free_cnt;
  40. };
  41. /**
  42.  * Private parts of the Ndb object (corresponding to Ndb.hpp in public API)
  43.  */
  44. class NdbImpl {
  45. public:
  46.   NdbImpl(Ndb_cluster_connection *, Ndb&);
  47.   ~NdbImpl();
  48.   Ndb_cluster_connection_impl &m_ndb_cluster_connection;
  49.   NdbDictionaryImpl m_dictionary;
  50.   // Ensure good distribution of connects
  51.   Uint32 theCurrentConnectIndex;
  52.   Ndb_cluster_connection_node_iter m_node_iter;
  53.   NdbObjectIdMap theNdbObjectIdMap;
  54.   Uint32 theNoOfDBnodes; // The number of DB nodes  
  55.   Uint8 theDBnodes[MAX_NDB_NODES]; // The node number of the DB nodes
  56.  // 1 indicates to release all connections to node 
  57.   Uint32 the_release_ind[MAX_NDB_NODES];
  58.   NdbWaiter             theWaiter;
  59.   int m_optimized_node_selection;
  60.   /**
  61.    * NOTE free lists must be _after_ theNdbObjectIdMap take
  62.    *   assure that destructors are run in correct order
  63.    */
  64.   Ndb_free_list_t<NdbConnection> theConIdleList; 
  65.   Ndb_free_list_t<NdbOperation>  theOpIdleList;  
  66.   Ndb_free_list_t<NdbIndexScanOperation> theScanOpIdleList;
  67.   Ndb_free_list_t<NdbIndexOperation> theIndexOpIdleList;
  68.   Ndb_free_list_t<NdbRecAttr> theRecAttrIdleList;  
  69.   Ndb_free_list_t<NdbApiSignal> theSignalIdleList;
  70.   Ndb_free_list_t<NdbLabel> theLabelList;
  71.   Ndb_free_list_t<NdbBranch> theBranchList;
  72.   Ndb_free_list_t<NdbSubroutine> theSubroutineList;
  73.   Ndb_free_list_t<NdbCall> theCallList;
  74.   Ndb_free_list_t<NdbBlob> theNdbBlobIdleList;
  75.   Ndb_free_list_t<NdbReceiver> theScanList;
  76. };
  77. #ifdef VM_TRACE
  78. #define TRACE_DEBUG(x) ndbout << x << endl;
  79. #else
  80. #define TRACE_DEBUG(x)
  81. #endif
  82. #define CHECK_STATUS_MACRO 
  83.    {if (checkInitState() == -1) { theError.code = 4100; return -1;}}
  84. #define CHECK_STATUS_MACRO_VOID 
  85.    {if (checkInitState() == -1) { theError.code = 4100; return;}}
  86. #define CHECK_STATUS_MACRO_ZERO 
  87.    {if (checkInitState() == -1) { theError.code = 4100; return 0;}}
  88. #define CHECK_STATUS_MACRO_NULL 
  89.    {if (checkInitState() == -1) { theError.code = 4100; return NULL;}}
  90. inline
  91. void *
  92. Ndb::int2void(Uint32 val){
  93.   return theImpl->theNdbObjectIdMap.getObject(val);
  94. }
  95. inline
  96. NdbReceiver *
  97. Ndb::void2rec(void* val){
  98.   return (NdbReceiver*)val;
  99. }
  100. inline
  101. NdbConnection *
  102. Ndb::void2con(void* val){
  103.   return (NdbConnection*)val;
  104. }
  105. inline
  106. NdbOperation*
  107. Ndb::void2rec_op(void* val){
  108.   return (NdbOperation*)(void2rec(val)->getOwner());
  109. }
  110. inline
  111. NdbIndexOperation*
  112. Ndb::void2rec_iop(void* val){
  113.   return (NdbIndexOperation*)(void2rec(val)->getOwner());
  114. }
  115. inline 
  116. NdbConnection * 
  117. NdbReceiver::getTransaction(){ 
  118.   return ((NdbOperation*)m_owner)->theNdbCon;
  119. }
  120. inline
  121. int
  122. Ndb::checkInitState()
  123. {
  124.   theError.code = 0;
  125.   if (theInitState != Initialised)
  126.     return -1;
  127.   return 0;
  128. }
  129. Uint32 convertEndian(Uint32 Data);
  130. enum LockMode { 
  131.   Read, 
  132.   Update,
  133.   Insert,
  134.   Delete 
  135. };
  136. template<class T>
  137. inline
  138. Ndb_free_list_t<T>::Ndb_free_list_t()
  139. {
  140.   m_free_list= 0; 
  141.   m_alloc_cnt= m_free_cnt= 0; 
  142. }
  143. template<class T>
  144. inline
  145. Ndb_free_list_t<T>::~Ndb_free_list_t()
  146. {
  147.   clear();
  148. }
  149.     
  150. template<class T>
  151. inline
  152. void
  153. Ndb_free_list_t<T>::fill(Ndb* ndb, Uint32 cnt)
  154. {
  155.   if (m_free_list == 0)
  156.   {
  157.     m_free_cnt++;
  158.     m_alloc_cnt++;
  159.     m_free_list = new T(ndb);
  160.   }
  161.   while(m_alloc_cnt < cnt)
  162.   {
  163.     T* obj= new T(ndb);
  164.     if(obj == 0)
  165.       return;
  166.     
  167.     obj->next(m_free_list);
  168.     m_free_cnt++;
  169.     m_alloc_cnt++;
  170.     m_free_list = obj;
  171.   }
  172. }
  173. template<class T>
  174. inline
  175. T*
  176. Ndb_free_list_t<T>::seize(Ndb* ndb)
  177. {
  178.   T* tmp = m_free_list;
  179.   if (tmp)
  180.   {
  181.     m_free_list = (T*)tmp->next();
  182.     tmp->next(NULL);
  183.     m_free_cnt--;
  184.     return tmp;
  185.   }
  186.   
  187.   if((tmp = new T(ndb)))
  188.   {
  189.     m_alloc_cnt++;
  190.   }
  191.   
  192.   return tmp;
  193. }
  194. template<class T>
  195. inline
  196. void
  197. Ndb_free_list_t<T>::release(T* obj)
  198. {
  199.   obj->next(m_free_list);
  200.   m_free_list = obj;
  201.   m_free_cnt++;
  202. }
  203. template<class T>
  204. inline
  205. void
  206. Ndb_free_list_t<T>::clear()
  207. {
  208.   T* obj = m_free_list;
  209.   while(obj)
  210.   {
  211.     T* curr = obj;
  212.     obj = (T*)obj->next();
  213.     delete curr;
  214.     m_alloc_cnt--;
  215.   }
  216. }
  217. #endif