Ndbinit.cpp
上传用户: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. #include <ndb_global.h>
  14. #include "NdbApiSignal.hpp"
  15. #include "NdbImpl.hpp"
  16. #include "NdbOperation.hpp"
  17. #include "NdbConnection.hpp"
  18. #include "NdbRecAttr.hpp"
  19. #include "IPCConfig.hpp"
  20. #include "TransporterFacade.hpp"
  21. #include "ConfigRetriever.hpp"
  22. #include <ndb_limits.h>
  23. #include <NdbOut.hpp>
  24. #include <NdbSleep.h>
  25. #include "ObjectMap.hpp"
  26. #include <NdbIndexScanOperation.hpp>
  27. #include <NdbIndexOperation.hpp>
  28. #include "NdbUtil.hpp"
  29. #include <NdbBlob.hpp>
  30. class NdbGlobalEventBufferHandle;
  31. NdbGlobalEventBufferHandle *NdbGlobalEventBuffer_init(int);
  32. void NdbGlobalEventBuffer_drop(NdbGlobalEventBufferHandle *);
  33. /**
  34.  * Static object for NDB
  35.  */
  36. // only needed for backwards compatability, before ndb_cluster_connection
  37. static char *ndbConnectString = 0;
  38. static int theNoOfNdbObjects = 0;
  39. static Ndb_cluster_connection *global_ndb_cluster_connection= 0;
  40. /***************************************************************************
  41. Ndb(const char* aDataBase);
  42. Parameters:    aDataBase : Name of the database.
  43. Remark:        Connect to the database.
  44. ***************************************************************************/
  45. Ndb::Ndb( const char* aDataBase , const char* aSchema)
  46.   : theImpl(NULL)
  47. {
  48.   DBUG_ENTER("Ndb::Ndb()");
  49.   DBUG_PRINT("enter",("(old)Ndb::Ndb this=0x%x", this));
  50.   if (theNoOfNdbObjects < 0)
  51.     abort(); // old and new Ndb constructor used mixed
  52.   theNoOfNdbObjects++;
  53.   if (global_ndb_cluster_connection == 0) {
  54.     global_ndb_cluster_connection= new Ndb_cluster_connection(ndbConnectString);
  55.     global_ndb_cluster_connection->connect(12,5,1);
  56.   }
  57.   setup(global_ndb_cluster_connection, aDataBase, aSchema);
  58.   DBUG_VOID_RETURN;
  59. }
  60. Ndb::Ndb( Ndb_cluster_connection *ndb_cluster_connection,
  61.   const char* aDataBase , const char* aSchema)
  62.   : theImpl(NULL)
  63. {
  64.   DBUG_ENTER("Ndb::Ndb()");
  65.   DBUG_PRINT("enter",("Ndb::Ndb this=0x%x", this));
  66.   if (global_ndb_cluster_connection != 0 &&
  67.       global_ndb_cluster_connection != ndb_cluster_connection)
  68.     abort(); // old and new Ndb constructor used mixed
  69.   theNoOfNdbObjects= -1;
  70.   setup(ndb_cluster_connection, aDataBase, aSchema);
  71.   DBUG_VOID_RETURN;
  72. }
  73. void Ndb::setup(Ndb_cluster_connection *ndb_cluster_connection,
  74.   const char* aDataBase , const char* aSchema)
  75. {
  76.   DBUG_ENTER("Ndb::setup");
  77.   assert(theImpl == NULL);
  78.   theImpl= new NdbImpl(ndb_cluster_connection,*this);
  79.   theDictionary= &(theImpl->m_dictionary);
  80.   thePreparedTransactionsArray= NULL;
  81.   theSentTransactionsArray= NULL;
  82.   theCompletedTransactionsArray= NULL;
  83.   theNoOfPreparedTransactions= 0;
  84.   theNoOfSentTransactions= 0;
  85.   theNoOfCompletedTransactions= 0;
  86.   theNoOfAllocatedTransactions= 0;
  87.   theMaxNoOfTransactions= 0;
  88.   theMinNoOfEventsToWakeUp= 0;
  89.   prefixEnd= NULL;
  90.   theTransactionList= NULL;
  91.   theConnectionArray= NULL;
  92.   the_last_check_time= 0;
  93.   theFirstTransId= 0;
  94.   theRestartGCI= 0;
  95.   theNdbBlockNumber= -1;
  96.   theInitState= NotConstructed;
  97.   theNode= 0;
  98.   theFirstTransId= 0;
  99.   theMyRef= 0;
  100.   fullyQualifiedNames = true;
  101. #ifdef POORMANSPURIFY
  102.   cgetSignals =0;
  103.   cfreeSignals = 0;
  104.   cnewSignals = 0;
  105.   creleaseSignals = 0;
  106. #endif
  107.   theError.code = 0;
  108.   theConnectionArray = new NdbConnection * [MAX_NDB_NODES];
  109.   theCommitAckSignal = NULL;
  110.   
  111.   int i;
  112.   for (i = 0; i < MAX_NDB_NODES ; i++) {
  113.     theConnectionArray[i] = NULL;
  114.   }//forg
  115.   for (i = 0; i < 2048 ; i++) {
  116.     theFirstTupleId[i] = 0;
  117.     theLastTupleId[i] = 0;
  118.   }//for
  119.   
  120.   BaseString::snprintf(theDataBase, sizeof(theDataBase), "%s",
  121.            aDataBase ? aDataBase : "");
  122.   BaseString::snprintf(theDataBaseSchema, sizeof(theDataBaseSchema), "%s",
  123.    aSchema ? aSchema : "");
  124.   int len = BaseString::snprintf(prefixName, sizeof(prefixName), "%s%c%s%c",
  125.                      theDataBase, table_name_separator,
  126.                      theDataBaseSchema, table_name_separator);
  127.   prefixEnd = prefixName + (len < (int) sizeof(prefixName) ? len : 
  128.                             sizeof(prefixName) - 1);
  129.   theImpl->theWaiter.m_mutex =  TransporterFacade::instance()->theMutexPtr;
  130.   // Signal that the constructor has finished OK
  131.   if (theInitState == NotConstructed)
  132.     theInitState = NotInitialised;
  133.   {
  134.     NdbGlobalEventBufferHandle *h=
  135.       NdbGlobalEventBuffer_init(NDB_MAX_ACTIVE_EVENTS);
  136.     if (h == NULL) {
  137.       ndbout_c("Failed NdbGlobalEventBuffer_init(%d)",NDB_MAX_ACTIVE_EVENTS);
  138.       exit(-1);
  139.     }
  140.     theGlobalEventBufferHandle = h;
  141.   }
  142.   DBUG_VOID_RETURN;
  143. }
  144. void Ndb::setConnectString(const char * connectString)
  145. {
  146.   if (ndbConnectString != 0) {
  147.     free(ndbConnectString);
  148.     ndbConnectString = 0;
  149.   }
  150.   if (connectString)
  151.     ndbConnectString = strdup(connectString);
  152. }
  153. /*****************************************************************************
  154.  * ~Ndb();
  155.  *
  156.  * Remark:        Disconnect with the database. 
  157.  *****************************************************************************/
  158. Ndb::~Ndb()
  159.   DBUG_ENTER("Ndb::~Ndb()");
  160.   DBUG_PRINT("enter",("Ndb::~Ndb this=0x%x",this));
  161.   doDisconnect();
  162.   NdbGlobalEventBuffer_drop(theGlobalEventBufferHandle);
  163.   if (TransporterFacade::instance() != NULL && theNdbBlockNumber > 0){
  164.     TransporterFacade::instance()->close(theNdbBlockNumber, theFirstTransId);
  165.   }
  166.   
  167.   releaseTransactionArrays();
  168.   delete []theConnectionArray;
  169.   if(theCommitAckSignal != NULL){
  170.     delete theCommitAckSignal; 
  171.     theCommitAckSignal = NULL;
  172.   }
  173.   delete theImpl;
  174.   /**
  175.    * This needs to be put after delete theImpl
  176.    *  as TransporterFacade::instance is delete by global_ndb_cluster_connection
  177.    *  and used by theImpl
  178.    */
  179.   if (global_ndb_cluster_connection != 0) {
  180.     theNoOfNdbObjects--;
  181.     if(theNoOfNdbObjects == 0){
  182.       delete global_ndb_cluster_connection;
  183.       global_ndb_cluster_connection= 0;
  184.     }
  185.   }//if
  186.   /** 
  187.    *  This sleep is to make sure that the transporter 
  188.    *  send thread will come in and send any
  189.    *  signal buffers that this thread may have allocated.
  190.    *  If that doesn't happen an error will occur in OSE
  191.    *  when trying to restore a signal buffer allocated by a thread
  192.    *  that have been killed.
  193.    */
  194. #ifdef NDB_OSE
  195.   NdbSleep_MilliSleep(50);
  196. #endif
  197. #ifdef POORMANSPURIFY
  198. #ifdef POORMANSGUI
  199.   ndbout << "cnewSignals=" << cnewSignals << endl;
  200.   ndbout << "cfreeSignals=" << cfreeSignals << endl;
  201.   ndbout << "cgetSignals=" << cgetSignals << endl;
  202.   ndbout << "creleaseSignals=" << creleaseSignals << endl;
  203. #endif
  204.   // Poor mans purifier
  205.   assert(cnewSignals == cfreeSignals);
  206.   assert(cgetSignals == creleaseSignals);
  207. #endif
  208.   DBUG_VOID_RETURN;
  209. }
  210. NdbWaiter::NdbWaiter(){
  211.   m_node = 0;
  212.   m_state = NO_WAIT;
  213.   m_mutex = 0;
  214.   m_condition = NdbCondition_Create();
  215. }
  216. NdbWaiter::~NdbWaiter(){
  217.   NdbCondition_Destroy(m_condition);
  218. }
  219. NdbImpl::NdbImpl(Ndb_cluster_connection *ndb_cluster_connection,
  220.  Ndb& ndb)
  221.   : m_ndb_cluster_connection(ndb_cluster_connection->m_impl),
  222.     m_dictionary(ndb),
  223.     theCurrentConnectIndex(0),
  224.     theNdbObjectIdMap(ndb_cluster_connection->m_impl.m_transporter_facade->theMutexPtr,
  225.       1024,1024),
  226.     theNoOfDBnodes(0)
  227. {
  228.   int i;
  229.   for (i = 0; i < MAX_NDB_NODES; i++) {
  230.     the_release_ind[i] = 0;
  231.   }
  232.   m_optimized_node_selection=
  233.     m_ndb_cluster_connection.m_optimized_node_selection;
  234. }
  235. NdbImpl::~NdbImpl()
  236. {
  237. }