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

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 NdbConnection_H
  14. #define NdbConnection_H
  15. #include <ndb_types.h>
  16. #include "NdbError.hpp"
  17. #include "NdbDictionary.hpp"
  18. #include "Ndb.hpp"
  19. class NdbConnection;
  20. class NdbOperation;
  21. class NdbScanOperation;
  22. class NdbIndexScanOperation;
  23. class NdbIndexOperation;
  24. class NdbApiSignal;
  25. class Ndb;
  26. class NdbBlob;
  27. /**
  28.  * NdbAsynchCallback functions are used when executing asynchronous 
  29.  * transactions (using NdbConnection::executeAsynchPrepare, or 
  30.  * NdbConnection::executeAsynch).  
  31.  * The functions are called when the execute has finished.
  32.  * See @ref secAsync for more information.
  33.  */
  34. typedef void (* NdbAsynchCallback)(int, NdbConnection*, void*);
  35. /**
  36.  * Commit type of transaction
  37.  */
  38. enum AbortOption {      
  39. #ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
  40.   CommitIfFailFree = 0,         
  41.   CommitAsMuchAsPossible = 2,   ///< Commit transaction with as many 
  42.   TryCommit = 0,                ///< <i>Missing explanation</i>
  43. #endif
  44.   AbortOnError = 0,             ///< Abort transaction on failed operation
  45.   AO_IgnoreError = 2               ///< Transaction continues on failed operation
  46. };
  47.   
  48. typedef AbortOption CommitType;
  49. /**
  50.  * Execution type of transaction
  51.  */
  52. enum ExecType { 
  53.   NoExecTypeDef = -1,           ///< Erroneous type (Used for debugging only)
  54.   Prepare,                      ///< <i>Missing explanation</i>
  55.   NoCommit,                     ///< Execute the transaction as far as it has
  56.                                 ///< been defined, but do not yet commit it
  57.   Commit,                       ///< Execute and try to commit the transaction
  58.   Rollback                      ///< Rollback transaction
  59. };
  60. /**
  61.  * @class NdbConnection
  62.  * @brief Represents a transaction.
  63.  *
  64.  * A transaction (represented by an NdbConnection object) 
  65.  * belongs to an Ndb object and is typically created using 
  66.  * Ndb::startTransaction.
  67.  * A transaction consists of a list of operations 
  68.  * (represented by NdbOperation objects). 
  69.  * Each operation access exactly one table.
  70.  *
  71.  * After getting the NdbConnection object, 
  72.  * the first step is to get (allocate) an operation given the table name. 
  73.  * Then the operation is defined. 
  74.  * Several operations can be defined in parallel on the same 
  75.  * NdbConnection object. 
  76.  * When all operations are defined, the NdbConnection::execute
  77.  * method sends them to the NDB kernel for execution. 
  78.  *
  79.  * The NdbConnection::execute method returns when the NDB kernel has 
  80.  * completed execution of all operations defined before the call to 
  81.  * NdbConnection::execute. 
  82.  * All allocated operations should be properly defined 
  83.  * before calling NdbConnection::execute.
  84.  *
  85.  * A call to NdbConnection::execute uses one out of three types of execution:
  86.  *  -# ExecType::NoCommit  Executes operations without committing them.
  87.  *  -# ExecType::Commit    Executes remaining operation and commits the 
  88.  *                    complete transaction
  89.  *  -# ExecType::Rollback  Rollbacks the entire transaction.
  90.  *
  91.  * NdbConnection::execute is equipped with an extra error handling parameter 
  92.  * There are two alternatives:
  93.  * -# AbortOption::AbortOnError (default).
  94.  *    The transaction is aborted if there are any error during the
  95.  *    execution
  96.  * -# AbortOption::IgnoreError
  97.  *    Continue execution of transaction even if operation fails
  98.  *
  99.  * NdbConnection::execute can sometimes indicate an error 
  100.  * (return with -1) while the error code on the NdbConnection is 0. 
  101.  * This is an indication that one of the operations found a record 
  102.  * problem. The transaction is still ok and can continue as usual.
  103.  * The NdbConnection::execute returns -1 together with error code 
  104.  * on NdbConnection object equal to 0 always means that an 
  105.  * operation was not successful but that the total transaction was OK. 
  106.  * By checking error codes on the individual operations it is possible 
  107.  * to find out which operation was not successful. 
  108.  *
  109.  * NdbConnection::executeScan is used to setup a scan in the NDB kernel
  110.  * after it has been defined.
  111.  * NdbConnection::nextScanResult is used to iterate through the 
  112.  * scanned tuples. 
  113.  * After each call to NdbConnection::nextScanResult, the pointers
  114.  * of NdbRecAttr objects defined in the NdbOperation::getValue 
  115.  * operations are updated with the values of the new the scanned tuple. 
  116.  */
  117. /* FUTURE IMPLEMENTATION:
  118.  * Later a prepare mode will be added when Ndb supports Prepare-To-Commit
  119.  * The NdbConnection can deliver the Transaction Id of the transaction.
  120.  * After committing a transaction it is also possible to retrieve the 
  121.  * global transaction checkpoint which the transaction was put in.
  122.  *
  123.  * FUTURE IMPLEMENTATION:
  124.  * There are three methods for acquiring the NdbOperation. 
  125.  * -# The first method is the normal where a table name is
  126.  *    provided. In this case the primary key must be supplied through
  127.  *    the use of the NdbOperation::equal methods on the NdbOperation object.
  128.  * -# The second method provides the tuple identity of the tuple to be
  129.  *    read.  The tuple identity contains a table identifier and will
  130.  *    thus be possible to use to ensure the attribute names provided
  131.  *    are correct.  If an object-oriented layer is put on top of NDB
  132.  *    Cluster it is essential that all tables derived from a base
  133.  *    class has the same attributes with the same type and the same
  134.  *    name. Thus the application can use the tuple identity and need
  135.  *    not known the table of the tuple.  As long as the table is
  136.  *    derived from the known base class everything is ok.
  137.  *    It is not possible to provide any primary key since it is 
  138.  *    already supplied with the call to NdbConnection::getNdbOperation. 
  139.  * -# The third method is used when a scanned tuple is to be transferred to 
  140.  *    another transaction. In this case it is not possible to define the 
  141.  *    primary key since it came along from the scanned tuple.
  142.  *
  143.  */
  144. class NdbConnection
  145. {
  146.   friend class Ndb;
  147.   friend class NdbOperation;
  148.   friend class NdbScanOperation;
  149.   friend class NdbIndexOperation;
  150.   friend class NdbIndexScanOperation;
  151.   friend class NdbBlob;
  152.  
  153. public:
  154.   /**
  155.    * Get an NdbOperation for a table.
  156.    * Note that the operation has to be defined before it is executed.
  157.    *
  158.    * @note All operations within the same transaction need to 
  159.    *       be initialized with this method.
  160.    * 
  161.    * @param  aTableName   The table name.
  162.    * @return  Pointer to an NdbOperation object if successful, otherwise NULL.
  163.    */
  164.   NdbOperation* getNdbOperation(const char* aTableName);
  165.   /**
  166.    * Get an operation from NdbScanOperation idlelist and 
  167.    * get the NdbConnection object which
  168.    * was fetched by startTransaction pointing to this operation.
  169.    *
  170.    * @param  aTableName a table name.
  171.    * @return pointer to an NdbOperation object if successful, otherwise NULL
  172.    */
  173.   NdbScanOperation* getNdbScanOperation(const char* aTableName);
  174.   /**
  175.    * Get an operation from NdbScanOperation idlelist and 
  176.    * get the NdbConnection object which
  177.    * was fetched by startTransaction pointing to this operation.
  178.    *
  179.    * @param  anIndexName  The index name.
  180.    * @param  aTableName a table name.
  181.    * @return pointer to an NdbOperation object if successful, otherwise NULL
  182.    */
  183.   NdbIndexScanOperation* getNdbIndexScanOperation(const char* anIndexName,
  184.   const char* aTableName);
  185.   
  186.   /**
  187.    * Get an operation from NdbIndexOperation idlelist and 
  188.    * get the NdbConnection object that
  189.    * was fetched by startTransaction pointing to this operation.
  190.    *
  191.    * @param   indexName   An index name (as created by createIndex).
  192.    * @param   tableName    A table name.
  193.    * @return                Pointer to an NdbIndexOperation object if 
  194.    *                        successful, otherwise NULL
  195.    */
  196.   NdbIndexOperation* getNdbIndexOperation(const char*  indexName,
  197.                                           const char*  tableName);
  198.   /** 
  199.    * @name Execute Transaction
  200.    * @{
  201.    */
  202.   /**
  203.    * Executes transaction.
  204.    *
  205.    * @param execType     Execution type:<br>
  206.    *                     ExecType::NoCommit executes operations without 
  207.    *                                        committing them.<br>
  208.    *                     ExecType::Commit  executes remaining operations and 
  209.    *                                       commits the complete transaction.<br>
  210.    *                     ExecType::Rollback rollbacks the entire transaction.
  211.    * @param abortOption  Handling of error while excuting
  212.    *                     AbortOnError - Abort transaction if an operation fail
  213.    *                     IgnoreError  - Accept failing operations
  214.    * @param force        When operations should be sent to NDB Kernel.
  215.    *                     (See @ref secAdapt.)
  216.    *                     - 0: non-force, adaptive algorithm notices it 
  217.    *                          (default); 
  218.    *                     - 1: force send, adaptive algorithm notices it; 
  219.    *                     - 2: non-force, adaptive algorithm do not notice 
  220.    *                          the send.
  221.    * @return 0 if successful otherwise -1.
  222.    */
  223.   int execute(ExecType execType, 
  224.       AbortOption abortOption = AbortOnError,
  225.       int force = 0 );
  226.   /**
  227.    * Prepare an asynchronous transaction.
  228.    *
  229.    * See @ref secAsync for more information on
  230.    * how to use this method.
  231.    *
  232.    * @param execType   Execution type:<br>
  233.    *        ExecType::NoCommit executes operations without committing them.<br>
  234.    *        ExecType::Commit   executes remaining operations and commits the 
  235.    *                           complete transaction.<br>
  236.    *        ExecType::Rollback rollbacks the entire transaction.
  237.    * @param callback       A callback method.  This method gets 
  238.    *                        called when the transaction has been 
  239.    *                        executed.  See @ref ndbapi_example2.cpp 
  240.    *                        for an example on how to specify and use 
  241.    *                        a callback method.
  242.    * @param anyObject       A void pointer.  This pointer is forwarded to the 
  243.    *                        callback method and can be used to give 
  244.    *                        the callback method some data to work on.
  245.    *                        It is up to the application programmer 
  246.    *                        to decide on the use of this pointer.
  247.    * @param abortOption     see @ref execute
  248.    */
  249.   void executeAsynchPrepare(ExecType          execType,
  250.     NdbAsynchCallback callback,
  251.     void*             anyObject,
  252.     AbortOption abortOption = AbortOnError);
  253.   /**
  254.    * Prepare and send an asynchronous transaction.
  255.    *
  256.    * This method perform the same action as 
  257.    * NdbConnection::executeAsynchPrepare
  258.    * but also sends the operations to the NDB kernel.
  259.    *
  260.    * See NdbConnection::executeAsynchPrepare for information
  261.    * about the parameters of this method.
  262.    *
  263.    * See @ref secAsync for more information on
  264.    * how to use this method.
  265.    */
  266.   void executeAsynch(ExecType            aTypeOfExec,
  267.      NdbAsynchCallback   aCallback,
  268.      void*               anyObject,
  269.      AbortOption abortOption = AbortOnError);
  270.   /**
  271.    * Refresh
  272.    * Update timeout counter of this transaction 
  273.    * in the database. If you want to keep the transaction 
  274.    * active in the database longer than the
  275.    * transaction abort timeout.
  276.    * @note It's not advised to take a lock on a record and keep it
  277.    *       for a extended time since this can impact other transactions.
  278.    *
  279.    */
  280.   int refresh();
  281.   /**
  282.    * Close transaction
  283.    * @note It is not allowed to call NdbConnection::close after sending the
  284.    *       transaction asynchronously before the callback method has 
  285.    *     been called.
  286.    *       (The application should keep track of the number of 
  287.    *       outstanding transactions and wait until all of them 
  288.    *       has completed before calling NdbConnection::close).
  289.    *       If the transaction is not committed it will be aborted.
  290.    */
  291.   void close();
  292.   /**
  293.    * Restart transaction
  294.    *
  295.    *   Once a transaction has been completed successfully
  296.    *     it can be started again wo/ calling closeTransaction/startTransaction
  297.    *
  298.    *   Note this method also releases completed operations
  299.    */
  300.   int restart();
  301.   /** @} *********************************************************************/
  302.   /** 
  303.    * @name Meta Information
  304.    * @{
  305.    */
  306.   /**
  307.    * Get global checkpoint identity (GCI) of transaction.
  308.    *
  309.    * Each committed transaction belong to a GCI.  
  310.    * The log for the committed transaction is saved on 
  311.    * disk when a global checkpoint occurs.
  312.    * 
  313.    * Whether or not the global checkpoint with this GCI has been 
  314.    * saved on disk or not cannot be determined by this method.
  315.    *
  316.    * By comparing the GCI of a transaction with the value 
  317.    * last GCI restored in a restarted NDB Cluster one can determine
  318.    * whether the transaction was restored or not.
  319.    *
  320.    * @note Global Checkpoint Identity is undefined for scan transactions 
  321.    *       (This is because no updates are performed in scan transactions.)
  322.    *
  323.    * @return GCI of transaction or -1 if GCI is not available.
  324.    *         (Note that there has to be an NdbConnection::execute call 
  325.    *         with Ndb::Commit for the GCI to be available.)
  326.    */
  327.   int getGCI();
  328.   /**
  329.    * Get transaction identity.
  330.    *
  331.    * @return  Transaction id.
  332.    */
  333.   Uint64 getTransactionId();
  334.   /**
  335.    * Returns the commit status of the transaction.
  336.    *
  337.    * @return  The commit status of the transaction, i.e. one of
  338.    *          { NotStarted, Started, TimeOut, Committed, Aborted, NeedAbort } 
  339.    */
  340.   enum CommitStatusType { 
  341.     NotStarted,                   ///< Transaction not yet started
  342.     Started,                      ///< <i>Missing explanation</i>
  343.     Committed,                    ///< Transaction has been committed
  344.     Aborted,                      ///< Transaction has been aborted
  345.     NeedAbort                     ///< <i>Missing explanation</i>
  346.   };
  347.   CommitStatusType commitStatus();
  348.   /** @} *********************************************************************/
  349.   /** 
  350.    * @name Error Handling
  351.    * @{
  352.    */
  353.   /**
  354.    * Get error object with information about the latest error.
  355.    *
  356.    * @return An error object with information about the latest error.
  357.    */
  358.   const NdbError & getNdbError() const;
  359.   /**
  360.    * Get the latest NdbOperation which had an error. 
  361.    * This method is used on the NdbConnection object to find the
  362.    * NdbOperation causing an error.  
  363.    * To find more information about the
  364.    * actual error, use method NdbOperation::getNdbError 
  365.    * on the returned NdbOperation object.
  366.    *
  367.    * @return The NdbOperation causing the latest error.
  368.    */
  369.   NdbOperation* getNdbErrorOperation();
  370.   /** 
  371.    * Get the method number where the latest error occured.
  372.    * 
  373.    * @return Line number where latest error occured.
  374.    */
  375.   int getNdbErrorLine();
  376.   /**
  377.    * Get completed (i.e. executed) operations of a transaction
  378.    *
  379.    * This method should only be used <em>after</em> a transaction 
  380.    * has been executed.  
  381.    * - NdbConnection::getNextCompletedOperation(NULL) returns the
  382.    *   first NdbOperation object.
  383.    * - NdbConnection::getNextCompletedOperation(op) returns the
  384.    *   NdbOperation object defined after the NdbOperation "op".
  385.    * 
  386.    * This method is typically used to fetch all NdbOperation:s of 
  387.    * a transaction to check for errors (use NdbOperation::getNdbError 
  388.    * to fetch the NdbError object of an NdbOperation).
  389.    * 
  390.    * @note This method should only be used after the transaction has been 
  391.    *       executed and before the transaction has been closed.
  392.    * 
  393.    * @param   op Operation, NULL means get first operation
  394.    * @return  Operation "after" op
  395.    */
  396.   const NdbOperation * getNextCompletedOperation(const NdbOperation * op)const;
  397.   /** @} *********************************************************************/
  398.   /**
  399.    * Execute the transaction in NoCommit mode if there are any not-yet
  400.    * executed blob part operations of given types.  Otherwise do
  401.    * nothing.  The flags argument is bitwise OR of (1 << optype) where
  402.    * optype comes from NdbOperation::OperationType.  Only the basic PK
  403.    * ops are used (read, insert, update, delete).
  404.    */
  405.   int executePendingBlobOps(Uint8 flags = 0xFF);
  406.   // Fast path calls for MySQL ha_ndbcluster
  407.   NdbOperation* getNdbOperation(const NdbDictionary::Table * table);
  408.   NdbIndexOperation* getNdbIndexOperation(const NdbDictionary::Index *,
  409.   const NdbDictionary::Table * table);
  410.   NdbScanOperation* getNdbScanOperation(const NdbDictionary::Table * table);
  411.   NdbIndexScanOperation* getNdbIndexScanOperation(const NdbDictionary::Index * index,
  412.   const NdbDictionary::Table * table);
  413.   Uint32 getConnectedNodeId();           // Get Connected node id
  414.   
  415. private:
  416.   /**
  417.    * Release completed operations
  418.    */
  419.   void releaseCompletedOperations();
  420.   typedef Uint64 TimeMillis_t;
  421.   /**************************************************************************
  422.    * These methods are service methods to other classes in the NDBAPI.   *
  423.    **************************************************************************/
  424.  
  425.   /**************************************************************************
  426.    * These are the create and delete methods of this class.              *
  427.    **************************************************************************/
  428.   NdbConnection(Ndb* aNdb); 
  429.   ~NdbConnection();
  430.   NdbConnection* next();   // Returns the next pointer
  431.   void next(NdbConnection*);   // Sets the next pointer
  432.   void init();           // Initialize connection object for new transaction
  433.   int executeNoBlobs(ExecType execType, 
  434.              AbortOption abortOption = AbortOnError,
  435.              int force = 0 );
  436.   
  437.   /**
  438.    * Set Connected node id 
  439.    * and sequence no
  440.    */
  441.   void setConnectedNodeId( Uint32 nodeId, Uint32 sequence); 
  442.   void setMyBlockReference( int );   // Set my block refrerence
  443.   void setTC_ConnectPtr( Uint32 );   // Sets TC Connect pointer
  444.   int getTC_ConnectPtr();   // Gets TC Connect pointer
  445.   void          setBuddyConPtr(Uint32);           // Sets Buddy Con Ptr
  446.   Uint32        getBuddyConPtr();                 // Gets Buddy Con Ptr
  447.   enum ConStatusType { 
  448.     NotConnected,
  449.     Connecting,
  450.     Connected,
  451.     DisConnecting,
  452.     ConnectFailure
  453.   };
  454.   ConStatusType Status();                 // Read the status information
  455.   void Status(ConStatusType);   // Set the status information
  456.   Uint32        get_send_size();                  // Get size to send
  457.   void          set_send_size(Uint32);            // Set size to send;
  458.   
  459.   int  receiveDIHNDBTAMPER(NdbApiSignal* anApiSignal);
  460.   int  receiveTCSEIZECONF(NdbApiSignal* anApiSignal); 
  461.   int  receiveTCSEIZEREF(NdbApiSignal* anApiSignal);
  462.   int  receiveTCRELEASECONF(NdbApiSignal* anApiSignal);
  463.   int  receiveTCRELEASEREF(NdbApiSignal* anApiSignal);
  464.   int  receiveTC_COMMITCONF(const class TcCommitConf *);
  465.   int  receiveTCKEYCONF(const class TcKeyConf *, Uint32 aDataLength);
  466.   int  receiveTCKEY_FAILCONF(const class TcKeyFailConf *);
  467.   int  receiveTCKEY_FAILREF(NdbApiSignal* anApiSignal);
  468.   int  receiveTC_COMMITREF(NdbApiSignal* anApiSignal);     
  469.   int  receiveTCROLLBACKCONF(NdbApiSignal* anApiSignal); // Rec TCPREPARECONF ?
  470.   int  receiveTCROLLBACKREF(NdbApiSignal* anApiSignal);  // Rec TCPREPAREREF ?
  471.   int  receiveTCROLLBACKREP(NdbApiSignal* anApiSignal);
  472.   int  receiveTCINDXCONF(const class TcIndxConf *, Uint32 aDataLength);
  473.   int  receiveTCINDXREF(NdbApiSignal*);
  474.   int  receiveSCAN_TABREF(NdbApiSignal*);
  475.   int  receiveSCAN_TABCONF(NdbApiSignal*, const Uint32*, Uint32 len);
  476.   int  doSend();                 // Send all operations
  477.   int  sendROLLBACK();                 // Send of an ROLLBACK
  478.   int  sendTC_HBREP();                 // Send a TCHBREP signal;
  479.   int  sendCOMMIT();                   // Send a TC_COMMITREQ signal;
  480.   void setGCI(int GCI); // Set the global checkpoint identity
  481.  
  482.   int OpCompleteFailure(Uint8 abortoption, bool setFailure = true);
  483.   int OpCompleteSuccess();
  484.   void CompletedOperations();         // Move active ops to list of completed
  485.  
  486.   void OpSent(); // Operation Sent with success
  487.   
  488.   // Free connection related resources and close transaction
  489.   void release();              
  490.   // Release all operations in connection
  491.   void releaseOperations();
  492.   // Release all cursor operations in connection
  493.   void releaseOps(NdbOperation*);
  494.   void releaseScanOperations(NdbIndexScanOperation*);
  495.   void releaseExecutedScanOperation(NdbIndexScanOperation*);
  496.   // Set the transaction identity of the transaction
  497.   void setTransactionId(Uint64 aTransactionId);
  498.   // Indicate something went wrong in the definition phase
  499.   void setErrorCode(int anErrorCode);
  500.   // Indicate something went wrong in the definition phase
  501.   void setOperationErrorCode(int anErrorCode);
  502.   // Indicate something went wrong in the definition phase
  503.   void setOperationErrorCodeAbort(int anErrorCode, int abortOption = -1);
  504.   int checkMagicNumber();        // Verify correct object
  505.   NdbOperation* getNdbOperation(const class NdbTableImpl* aTable,
  506.                                 NdbOperation* aNextOp = 0);
  507.   NdbIndexScanOperation* getNdbScanOperation(const class NdbTableImpl* aTable);
  508.   NdbIndexOperation* getNdbIndexOperation(const class NdbIndexImpl* anIndex, 
  509.                                           const class NdbTableImpl* aTable,
  510.                                           NdbOperation* aNextOp = 0);
  511.   NdbIndexScanOperation* getNdbIndexScanOperation(const NdbIndexImpl* index,
  512.   const NdbTableImpl* table);
  513.   
  514.   void handleExecuteCompletion();
  515.   
  516.   /****************************************************************************
  517.    * These are the private variables of this class.
  518.    ****************************************************************************/
  519.   Uint32 ptr2int();
  520.   Uint32 theId;
  521.   // Keeps track of what the send method should do.
  522.   enum SendStatusType { 
  523.     NotInit,  
  524.     InitState,  
  525.     sendOperations,  
  526.     sendCompleted, 
  527.     sendCOMMITstate, 
  528.     sendABORT, 
  529.     sendABORTfail, 
  530.     sendTC_ROLLBACK,  
  531.     sendTC_COMMIT, 
  532.     sendTC_OP       
  533.   };
  534.   SendStatusType theSendStatus; 
  535.   NdbAsynchCallback  theCallbackFunction;    // Pointer to the callback function
  536.   void*              theCallbackObject;      // The callback object pointer
  537.   Uint32             theTransArrayIndex;     // Current index in a transaction 
  538.                                              // array for this object
  539.   TimeMillis_t       theStartTransTime;      // Start time of the transaction
  540.   NdbError theError;        // Errorcode on transaction
  541.   int    theErrorLine; // Method number of last error in NdbOperation
  542.   NdbOperation* theErrorOperation; // The NdbOperation where the error occurred
  543.   Ndb*  theNdb;      // Pointer to Ndb object    
  544.   NdbConnection* theNext;             // Next pointer. Used in idle list.
  545.   NdbOperation* theFirstOpInList;     // First operation in defining list.
  546.   NdbOperation* theLastOpInList;     // Last operation in defining list.
  547.   NdbOperation* theFirstExecOpInList;     // First executing operation in list
  548.   NdbOperation* theLastExecOpInList;     // Last executing operation in list.
  549.   NdbOperation* theCompletedFirstOp;     // First & last operation in completed 
  550.   NdbOperation* theCompletedLastOp;         // operation list.
  551.   Uint32 theNoOfOpSent; // How many operations have been sent     
  552.   Uint32 theNoOfOpCompleted; // How many operations have completed
  553.   Uint32        theNoOfOpFetched;                    // How many operations was actually fetched
  554.   Uint32 theMyRef; // Our block reference
  555.   Uint32 theTCConPtr; // Transaction Co-ordinator connection pointer.
  556.   Uint64 theTransactionId; // theTransactionId of the transaction
  557.   Uint32 theGlobalCheckpointId; // The gloabl checkpoint identity of the transaction
  558.   ConStatusType theStatus; // The status of the connection
  559.   enum CompletionStatus { 
  560.     NotCompleted,
  561.     CompletedSuccess,
  562.     CompletedFailure,
  563.     DefinitionFailure
  564.   } theCompletionStatus;   // The Completion status of the transaction
  565.   CommitStatusType theCommitStatus; // The commit status of the transaction
  566.   Uint32 theMagicNumber; // Magic Number to verify correct object
  567.   Uint32 thePriority; // Transaction Priority
  568.   enum ReturnType {  ReturnSuccess,  ReturnFailure };
  569.   ReturnType    theReturnStatus; // Did we have any read/update/delete failing
  570. // to find the tuple.
  571.   bool theTransactionIsStarted; 
  572.   bool theInUseState;
  573.   bool theSimpleState;
  574.   Uint8 m_abortOption;           // Type of commit
  575.   enum ListState {  
  576.     NotInList, 
  577.     InPreparedList, 
  578.     InSendList, 
  579.     InCompletedList 
  580.   } theListState;
  581.   Uint32 theDBnode;       // The database node we are connected to  
  582.   Uint32 theNodeSequence; // The sequence no of the db node
  583.   bool theReleaseOnClose;
  584.   /**
  585.    * handle transaction spanning
  586.    *   multiple TC/db nodes
  587.    *
  588.    * 1) Bitmask with used nodes
  589.    * 2) Bitmask with nodes failed during op
  590.    */
  591.   Uint32 m_db_nodes[2];
  592.   Uint32 m_failed_db_nodes[2];
  593.   
  594.   int report_node_failure(Uint32 id);
  595.   // Scan operations
  596.   bool m_waitForReply;     
  597.   NdbIndexScanOperation* m_theFirstScanOperation;
  598.   NdbIndexScanOperation* m_theLastScanOperation;
  599.   
  600.   NdbIndexScanOperation* m_firstExecutedScanOp;
  601.   // Scan operations
  602.   // The operation actually performing the scan
  603.   NdbScanOperation* theScanningOp; 
  604.   Uint32 theBuddyConPtr;
  605.   // optim: any blobs
  606.   bool theBlobFlag;
  607.   Uint8 thePendingBlobOps;
  608.   static void sendTC_COMMIT_ACK(NdbApiSignal *,
  609. Uint32 transId1, Uint32 transId2, 
  610. Uint32 aBlockRef);
  611.   void completedFail(const char * s);
  612. #ifdef VM_TRACE
  613.   void printState();
  614. #endif
  615.   bool checkState_TransId(const Uint32 * transId) const;
  616.   void remove_list(NdbOperation*& head, NdbOperation*);
  617.   void define_scan_op(NdbIndexScanOperation*);
  618.   friend class HugoOperations;
  619.   friend struct Ndb_free_list_t<NdbConnection>;
  620. };
  621. inline
  622. Uint32
  623. NdbConnection::get_send_size()
  624. {
  625.   return 0;
  626. }
  627. inline
  628. void
  629. NdbConnection::set_send_size(Uint32 send_size)
  630. {
  631.   return;
  632. }
  633. #ifdef NDB_NO_DROPPED_SIGNAL
  634. #include <stdlib.h>
  635. #endif
  636. inline
  637. int
  638. NdbConnection::checkMagicNumber()
  639. {
  640.   if (theMagicNumber == 0x37412619)
  641.     return 0;
  642.   else {
  643. #ifdef NDB_NO_DROPPED_SIGNAL
  644.     abort();
  645. #endif
  646.     return -1;
  647.   }
  648. }
  649. inline
  650. bool
  651. NdbConnection::checkState_TransId(const Uint32 * transId) const {
  652.   const Uint32 tTmp1 = transId[0];
  653.   const Uint32 tTmp2 = transId[1];
  654.   Uint64 tRecTransId = (Uint64)tTmp1 + ((Uint64)tTmp2 << 32);
  655.   bool b = theStatus == Connected && theTransactionId == tRecTransId;
  656.   return b;
  657. }
  658. /************************************************************************************************
  659. void setTransactionId(Uint64 aTransactionId);
  660. Remark:        Set the transaction identity. 
  661. ************************************************************************************************/
  662. inline
  663. void
  664. NdbConnection::setTransactionId(Uint64 aTransactionId)
  665. {
  666.   theTransactionId = aTransactionId;
  667. }
  668. inline
  669. void
  670. NdbConnection::setConnectedNodeId(Uint32 aNode, Uint32 aSequenceNo)
  671. {
  672.   theDBnode = aNode;
  673.   theNodeSequence = aSequenceNo;
  674. }
  675. /******************************************************************************
  676. int getConnectedNodeId();
  677. Return Value: Return  theDBnode.
  678. Remark:         Get Connected node id. 
  679. ******************************************************************************/
  680. inline
  681. Uint32
  682. NdbConnection::getConnectedNodeId()
  683. {
  684.   return theDBnode;
  685. }
  686. /******************************************************************************
  687. void setMyBlockReference(int aBlockRef);
  688. Parameters:     aBlockRef: The block refrerence.
  689. Remark:         Set my block refrerence. 
  690. ******************************************************************************/
  691. inline
  692. void
  693. NdbConnection::setMyBlockReference(int aBlockRef)
  694. {
  695.   theMyRef = aBlockRef;
  696. }
  697. /******************************************************************************
  698. void  setTC_ConnectPtr(Uint32 aTCConPtr);
  699. Parameters:     aTCConPtr: The connection pointer.
  700. Remark:         Sets TC Connect pointer. 
  701. ******************************************************************************/
  702. inline
  703. void
  704. NdbConnection::setTC_ConnectPtr(Uint32 aTCConPtr)
  705. {
  706.   theTCConPtr = aTCConPtr;
  707. }
  708. /******************************************************************************
  709. int  getTC_ConnectPtr();
  710. Return Value: Return  theTCConPtr.
  711. Remark:         Gets TC Connect pointer. 
  712. ******************************************************************************/
  713. inline
  714. int
  715. NdbConnection::getTC_ConnectPtr()
  716. {
  717.   return theTCConPtr;
  718. }
  719. inline
  720. void
  721. NdbConnection::setBuddyConPtr(Uint32 aBuddyConPtr)
  722. {
  723.   theBuddyConPtr = aBuddyConPtr;
  724. }
  725. inline
  726. Uint32 NdbConnection::getBuddyConPtr()
  727. {
  728.   return theBuddyConPtr;
  729. }
  730. /******************************************************************************
  731. NdbConnection* next();
  732. inline
  733. void
  734. NdbConnection::setBuddyConPtr(Uint32 aBuddyConPtr)
  735. {
  736.   theBuddyConPtr = aBuddyConPtr;
  737. }
  738. inline
  739. Uint32 NdbConnection::getBuddyConPtr()
  740. {
  741.   return theBuddyConPtr;
  742. }
  743. Return Value: Return  next pointer to NdbConnection object.
  744. Remark:         Get the next pointer. 
  745. ******************************************************************************/
  746. inline
  747. NdbConnection*
  748. NdbConnection::next()
  749. {
  750.   return theNext;
  751. }
  752. /******************************************************************************
  753. void next(NdbConnection aConnection);
  754. Parameters:     aConnection: The connection object. 
  755. Remark:         Sets the next pointer. 
  756. ******************************************************************************/
  757. inline
  758. void
  759. NdbConnection::next(NdbConnection* aConnection)
  760. {
  761.   theNext = aConnection;
  762. }
  763. /******************************************************************************
  764. ConStatusType  Status();
  765. Return Value    Return the ConStatusType.
  766. Parameters:     aStatus:  The status.
  767. Remark:         Sets Connect status. 
  768. ******************************************************************************/
  769. inline
  770. NdbConnection::ConStatusType
  771. NdbConnection::Status()
  772. {
  773.   return theStatus;
  774. }
  775. /******************************************************************************
  776. void  Status(ConStatusType aStatus);
  777. Parameters:     aStatus: The status.
  778. Remark:         Sets Connect status. 
  779. ******************************************************************************/
  780. inline
  781. void
  782. NdbConnection::Status( ConStatusType aStatus )
  783. {
  784.   theStatus = aStatus;
  785. }
  786. /******************************************************************************
  787.  void     setGCI();
  788. Remark: Set global checkpoint identity of the transaction
  789. ******************************************************************************/
  790. inline
  791. void
  792. NdbConnection::setGCI(int aGlobalCheckpointId)
  793. {
  794.   theGlobalCheckpointId = aGlobalCheckpointId;
  795. }
  796. /******************************************************************************
  797. void OpSent();
  798. Remark:       An operation was sent with success that expects a response.
  799. ******************************************************************************/
  800. inline
  801. void 
  802. NdbConnection::OpSent()
  803. {
  804.   theNoOfOpSent++;
  805. }
  806. /******************************************************************************
  807. void executePendingBlobOps();
  808. ******************************************************************************/
  809. #include <stdlib.h>
  810. inline
  811. int
  812. NdbConnection::executePendingBlobOps(Uint8 flags)
  813. {
  814.   if (thePendingBlobOps & flags) {
  815.     // not executeNoBlobs because there can be new ops with blobs
  816.     return execute(NoCommit);
  817.   }
  818.   return 0;
  819. }
  820. inline
  821. Uint32
  822. NdbConnection::ptr2int(){
  823.   return theId;
  824. }
  825. #endif