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

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 DBUTIL_H
  14. #define DBUTIL_H
  15. #include <ndb_limits.h>
  16. #include <SimulatedBlock.hpp>
  17. #include <NodeBitmask.hpp>
  18. #include <ArrayList.hpp>
  19. #include <ArrayPool.hpp>
  20. #include <SLList.hpp>
  21. #include <DLList.hpp>
  22. #include <DLFifoList.hpp>
  23. #include <DataBuffer.hpp>
  24. #include <KeyTable.hpp>
  25. #include <signaldata/KeyInfo.hpp>
  26. #include <signaldata/AttrInfo.hpp>
  27. #include <signaldata/TcKeyReq.hpp>
  28. #include <signaldata/UtilPrepare.hpp>
  29. #include <signaldata/UtilExecute.hpp>
  30. #include <signaldata/UtilLock.hpp>
  31. #include <SimpleProperties.hpp>
  32. #define UTIL_WORDS_PER_PAGE 1023
  33. /**
  34.  * @class DbUtil 
  35.  * @brief Database utilities
  36.  *
  37.  * This block implements transactional services which can be used by other 
  38.  * blocks.
  39.  *
  40.  * @section secSequence   Module: The Sequence Service
  41.  *
  42.  * A sequence is a varaible stored in the database.  Each time it is 
  43.  * requested with "NextVal" it returns a unique number.  If requested 
  44.  * with "CurrVal" it returns the current number.
  45.  * 
  46.  * - Request: SEQUENCE_REQ 
  47.  *   Requests the 'NextVal' or 'CurrVal' for sequence variable 'sequenceId'.
  48.  *
  49.  * - Response: SEQUENCE_CONF / REF (if failure)
  50.  *   Returns value requested.
  51.  */
  52. class DbUtil : public SimulatedBlock
  53. {
  54. public:
  55.   DbUtil(const class Configuration & conf);
  56.   virtual ~DbUtil();
  57.   BLOCK_DEFINES(DbUtil);
  58.   
  59. protected:
  60.   /**
  61.    * Startup & Misc
  62.    */
  63.   void execSTTOR(Signal* signal);
  64.   void execNDB_STTOR(Signal* signal);
  65.   void execDUMP_STATE_ORD(Signal* signal);
  66.   void execCONTINUEB(Signal* signal);
  67.   /**
  68.    * Sequence Service : Public interface
  69.    */
  70.   void execUTIL_SEQUENCE_REQ(Signal* signal);
  71.   void execUTIL_SEQUENCE_REF(Signal* signal);
  72.   void execUTIL_SEQUENCE_CONF(Signal* signal);
  73.   /**
  74.    * Prepare Service : Public interface
  75.    */
  76.   void execUTIL_PREPARE_REQ(Signal* signal);
  77.   void execUTIL_PREPARE_CONF(Signal* signal);
  78.   void execUTIL_PREPARE_REF(Signal* signal);
  79.   /**
  80.    * Delete Service : Public interface
  81.    */
  82.   void execUTIL_DELETE_REQ(Signal* signal);
  83.   void execUTIL_DELETE_REF(Signal* signal);
  84.   void execUTIL_DELETE_CONF(Signal* signal);
  85.   /**
  86.    * Execute Service : Public interface
  87.    */
  88.   void execUTIL_EXECUTE_REQ(Signal* signal);
  89.   void execUTIL_EXECUTE_REF(Signal* signal);
  90.   void execUTIL_EXECUTE_CONF(Signal* signal);
  91.   /**
  92.    * Prepare Release Service : Public interface
  93.    */
  94.   void execUTIL_RELEASE_REQ(Signal* signal);
  95.   void execUTIL_RELEASE_CONF(Signal* signal);
  96.   void execUTIL_RELEASE_REF(Signal* signal);
  97.   /**
  98.    * Backend interface to a used TC service 
  99.    */
  100.   void execTCSEIZECONF(Signal* signal);
  101.   void execTCKEYCONF(Signal* signal);
  102.   void execTCKEYREF(Signal* signal);
  103.   void execTCROLLBACKREP(Signal* signal);
  104.   void execTCKEY_FAILCONF(Signal* signal);
  105.   void execTCKEY_FAILREF(Signal* signal);
  106.   void execTRANSID_AI(Signal* signal);
  107.   /**
  108.    * Backend interface to a used DICT service
  109.    */
  110.   void execGET_TABINFOREF(Signal*);
  111.   void execGET_TABINFO_CONF(Signal* signal);
  112. private:
  113.   
  114. public:
  115.   struct PreparedOperation;
  116.   typedef DataBuffer<11> KeyInfoBuffer;
  117.   typedef KeyInfoBuffer::ConstDataBufferIterator KeyInfoIterator;
  118.   typedef DataBuffer<11> AttrInfoBuffer;
  119.   typedef AttrInfoBuffer::ConstDataBufferIterator AttrInfoIterator;
  120.   typedef DataBuffer<11> ResultSetBuffer;
  121.   typedef DataBuffer<11>  ResultSetInfoBuffer;
  122.   typedef DataBuffer<1>  AttrMappingBuffer;
  123.   
  124.   /** 
  125.    * @struct  Page32
  126.    * @brief   For storing SimpleProperties objects and similar temporary data
  127.    */
  128.   struct Page32 {
  129.     Uint32  data[UTIL_WORDS_PER_PAGE];
  130.     Uint32  nextPool;                  // Note: This used as data when seized
  131.   };
  132.   /**
  133.    * @struct  Prepare
  134.    * @brief   Info regarding prepare request (contains a prepared operation)
  135.    *
  136.    * The prepare phase interprets the table and attribute names sent
  137.    * in the prepare request from the client and asks DICT for meta
  138.    * information.
  139.    */
  140.   struct Prepare {
  141.     Prepare(ArrayPool<Page32> & ap) : preparePages(ap) {}
  142.     /*** Client info ***/
  143.     Uint32 clientRef;
  144.     Uint32 clientData;
  145.     /** 
  146.      * SimpleProp sent in UTIL_PREPARE_REQ 
  147.      *
  148.      * Example format:
  149.      * - UtilPrepareReq::NoOfOperations=1
  150.      * - UtilPrepareReq::OperationType=UtilPrepareReq::Delete
  151.      * - UtilPrepareReq::TableName="SYSTAB_0"
  152.      * - UtilPrepareReq::AttributeName="SYSKEY_0"
  153.      */
  154.     Uint32 prepDataLen;
  155.     Array<Page32>  preparePages;  
  156.     /*** PreparedOperation constructed in Prepare phase ***/
  157.     Ptr<PreparedOperation> prepOpPtr;
  158.     union {
  159.       Uint32 nextPool;
  160.       Uint32 nextList;
  161.     };
  162.     Uint32 prevList;
  163.     void print() const {
  164.       ndbout << "[-Prepare-" << endl
  165.      << " clientRef: " << clientRef
  166.      << ", clientData: " << clientData
  167.      << "]" << endl;
  168.     }
  169.   };
  170.     
  171.   /**
  172.    * @struct  PreparedOperation
  173.    * @brief   Contains instantiated TcKeyReq signaldata for operation
  174.    * 
  175.    * The prepare phase is finished by storing the request in a
  176.    * PreparedOperation record.
  177.    */
  178.   struct PreparedOperation {
  179.     PreparedOperation(AttrMappingBuffer::DataBufferPool & am,
  180.       AttrInfoBuffer::DataBufferPool & ai,
  181.       ResultSetInfoBuffer::DataBufferPool & rs) :
  182.       releaseFlag(false), attrMapping(am), attrInfo(ai), rsInfo(rs)
  183.     {
  184.       pkBitmask.clear();
  185.     }
  186.     /*** Various Operation Info ***/
  187.     Uint32    keyLen;          // Length of primary key (fixed size is assumed)
  188.     Uint32    rsLen;           // Size of result set
  189.     Uint32    noOfKeyAttr;     // Number of key attributes
  190.     Uint32    noOfAttr;        // Number of attributes
  191.     bool      releaseFlag;     // flag if operation release after completion
  192.     /**
  193.      * Attribute Mapping
  194.      *
  195.      * This datastructure (buffer of AttributeHeader:s) are used to map 
  196.      * each execute request to a TCKEYREQ train of signals.
  197.      *
  198.      * The datastructure contains (AttributeId, Position) pairs, where
  199.      * - AttributeId  is id used in database, and
  200.      * - Position     is position of attribute value in TCKEYREQ keyinfo
  201.      *                part of the train of signals which will be send to TC.
  202.      *                Position == 0x3fff means it should *not* be sent
  203.      *                in keyinfo part.
  204.      */
  205.     AttrMappingBuffer    attrMapping;
  206.     /*** First signal in tckeyreq train ***/
  207.     Uint32    tckeyLenInBytes;    // TcKeyReq total signal length (in bytes)
  208.     Uint32    keyDataPos;         // Where to store keydata[] in tckey signal
  209.                                   // (in #words from base in tckey signal)
  210.     TcKeyReq  tckey;              // Signaldata for first signal in train
  211.     
  212.     /*** Attrinfo signals sent to TC (part of tckeyreq train) ***/
  213.     AttrInfoBuffer       attrInfo;
  214.     /*** Result of executed operation ***/
  215.     ResultSetInfoBuffer  rsInfo;    
  216.     Bitmask<MAX_ATTRIBUTES_IN_TABLE> pkBitmask;
  217.     union {
  218.       Uint32 nextPool;
  219.       Uint32 nextList;
  220.     };
  221.     Uint32 prevList;
  222.     
  223.     void print() const {
  224.       ndbout << "[-PreparedOperation-" << endl
  225.      << " keyLen: " << keyLen
  226.      << ", rsLen: " << rsLen
  227.      << ", noOfKeyAttr: " << noOfKeyAttr 
  228.      << ", noOfAttr: " << noOfAttr 
  229.      << ", tckeyLenInBytes: " << tckeyLenInBytes 
  230.      << ", keyDataPos: " << keyDataPos << endl
  231.      << "-AttrMapping- (AttrId, KeyPos)-pairs "
  232.      << "(Pos=3fff if non-key attr):" << endl;
  233.       attrMapping.print(stdout);
  234.       ndbout << "[-tckey- ";
  235.       printTCKEYREQ(stdout, (Uint32*)&tckey, 8, 0);
  236.       ndbout << "[-attrInfo- ";
  237.       attrInfo.print(stdout);
  238.       ndbout << "[-rsInfo- ";
  239.       rsInfo.print(stdout);
  240.       ndbout << "]]]]" << endl;
  241.     }
  242.   };
  243.   
  244.   /**
  245.    * @struct  Operation
  246.    * @brief   Used in execution (contains resultset and buffers for result)
  247.    */
  248.   struct Operation {
  249.     Operation(KeyInfoBuffer::DataBufferPool & ki, 
  250.       AttrInfoBuffer::DataBufferPool & ai,
  251.       ResultSetBuffer::DataBufferPool & _rs) :
  252.       prepOp_i(RNIL), keyInfo(ki), attrInfo(ai), rs(_rs) {}
  253.     
  254.     PreparedOperation *            prepOp;
  255.     Uint32                         prepOp_i;
  256.     KeyInfoBuffer                        keyInfo;
  257.     AttrInfoBuffer                       attrInfo;
  258.     ResultSetBuffer                      rs;
  259.     ResultSetBuffer::DataBufferIterator  rsIterator;
  260.     
  261.     Uint32 transPtrI;
  262.     
  263.     Uint32 rsRecv;
  264.     Uint32 rsExpect;
  265.     inline bool complete() const { return rsRecv == rsExpect; }
  266.     
  267.     union {
  268.       Uint32 nextPool;
  269.       Uint32 nextList;
  270.     };
  271.     void print() const {
  272.       ndbout << "[-Operation-" << endl
  273.      << " transPtrI: " << transPtrI
  274.      << ", rsRecv: " << rsRecv;
  275.       ndbout << "[-PreparedOperation-" << endl;
  276.       prepOp->print();
  277.       ndbout << "[-keyInfo-" << endl;
  278.       keyInfo.print(stdout);
  279.       ndbout << "[-attrInfo-" << endl;
  280.       attrInfo.print(stdout);
  281.       ndbout << "]]" << endl;
  282.     }
  283.   };
  284.   /**
  285.    * @struct  Transaction
  286.    * @brief   Used in execution (contains list of operations)
  287.    */
  288.   struct Transaction {
  289.     Transaction(ArrayPool<Page32> & ap, ArrayPool<Operation> & op) :
  290.       executePages(ap), operations(op) {}
  291.     Uint32 clientRef;
  292.     Uint32 clientData;
  293.     Array<Page32>  executePages;  
  294.     Uint32 gsn;         // Request type (SEQUENCE, DELETE, etc)
  295.     union {
  296.       /**
  297.        * Sequence transaction
  298.        */
  299.       struct {
  300. Uint32 sequenceId;
  301. Uint32 requestType;
  302.       } sequence;
  303.     };
  304.     
  305.     Uint32 connectPtr;
  306.     Uint32 transId[2];
  307.     SLList<Operation> operations;
  308.     Uint32 errorCode;
  309.     Uint32 noOfRetries;
  310.     Uint32 sent;        // No of operations sent
  311.     Uint32 recv;        // No of completed operations received
  312.     inline bool complete() const { return sent == recv; };
  313.     union {
  314.       Uint32 nextPool;
  315.       Uint32 nextList;
  316.     };
  317.     Uint32 prevList;
  318.     void print() const {
  319.       ndbout << "[-Transaction-" << endl
  320.      << " clientRef: " << clientRef
  321.      << ", clientData: " << clientData
  322.      << ", gsn: " << gsn 
  323.      << ", errorCode: " << errorCode 
  324.      << endl 
  325.      << " sent: " << sent << " operations" 
  326.      << ", recv: " << recv << " completed operations";
  327.       OperationPtr opPtr;
  328.       this->operations.first(opPtr);
  329.       while(opPtr.i != RNIL){
  330. ndbout << "[-Operation-" << endl;
  331. opPtr.p->print();
  332.         this->operations.next(opPtr);
  333.       }
  334.       ndbout << "]" << endl;
  335.     }
  336.   };
  337.   typedef Ptr<Page32>             Page32Ptr;
  338.   typedef Ptr<Prepare>            PreparePtr;
  339.   typedef Ptr<Transaction>        TransactionPtr;
  340.   typedef Ptr<Operation>          OperationPtr;
  341.   typedef Ptr<PreparedOperation>  PreparedOperationPtr;
  342.   Uint32                          c_transId[2];
  343.   ArrayPool<Page32>               c_pagePool;
  344.   ArrayPool<Prepare>              c_preparePool;
  345.   ArrayPool<Operation>            c_operationPool;
  346.   ArrayPool<PreparedOperation>    c_preparedOperationPool;
  347.   ArrayPool<Transaction>          c_transactionPool;
  348.   DataBuffer<1>::DataBufferPool   c_attrMappingPool;
  349.   DataBuffer<11>::DataBufferPool  c_dataBufPool;
  350.   DLList<Prepare>                 c_runningPrepares;
  351.   DLList<PreparedOperation>       c_runningPreparedOperations;
  352.   DLList<Transaction>             c_seizingTransactions; // Being seized at TC
  353.   DLList<Transaction>             c_runningTransactions; // Seized and now exec.
  354.   
  355.   void getTransId(Transaction *);
  356.   void initResultSet(ResultSetBuffer &, const ResultSetInfoBuffer &);
  357.   void runTransaction(Signal* signal, TransactionPtr);
  358.   void runOperation(Signal* signal, TransactionPtr &, OperationPtr &, Uint32);
  359.   void sendKeyInfo(Signal* signal, 
  360.    KeyInfo* keyInfo,
  361.    const KeyInfoBuffer & keyBuf,
  362.    KeyInfoIterator & kit);
  363.   void sendAttrInfo(Signal*, 
  364.     AttrInfo* attrInfo, 
  365.     const AttrInfoBuffer &,
  366.     AttrInfoIterator & ait);
  367.   int getResultSet(Signal* signal, const Transaction * transP,
  368.    struct LinearSectionPtr sectionsPtr[]);
  369.   void finishTransaction(Signal*, TransactionPtr);
  370.   void releaseTransaction(TransactionPtr transPtr);
  371.   void hardcodedPrepare();
  372.   void connectTc(Signal* signal);
  373.   void reportSequence(Signal*, const Transaction *);
  374.   void readPrepareProps(Signal* signal, 
  375. SimpleProperties::Reader* reader, 
  376. Uint32 senderData);
  377.   void prepareOperation(Signal*, PreparePtr);
  378.   void sendUtilPrepareRef(Signal*, UtilPrepareRef::ErrorCode, Uint32, Uint32);
  379.   void sendUtilExecuteRef(Signal*, UtilExecuteRef::ErrorCode, 
  380.   Uint32, Uint32, Uint32);
  381.   void releasePrepare(PreparePtr);
  382.   void releasePreparedOperation(PreparedOperationPtr);
  383.   /***************************************************************************
  384.    * Lock manager
  385.    */
  386.   struct LockQueueElement {
  387.     Uint32 m_senderData;
  388.     Uint32 m_senderRef;
  389.     union {
  390.       Uint32 nextPool;
  391.       Uint32 nextList;
  392.     };
  393.     Uint32 prevList;
  394.   };
  395.   typedef Ptr<LockQueueElement> LockQueueElementPtr;
  396.   struct LockQueue {
  397.     LockQueue(){}
  398.     LockQueue(Uint32 id) : m_queue() { m_lockId = id; m_lockKey = 0;}
  399.     union {
  400.       Uint32 m_lockId;
  401.       Uint32 key;
  402.     };
  403.     Uint32 m_lockKey;
  404.     DLFifoList<LockQueueElement>::Head m_queue;
  405.     union {
  406.       Uint32 nextHash;
  407.       Uint32 nextPool;
  408.     };
  409.     Uint32 prevHash;
  410.     
  411.     Uint32 hashValue() const {
  412.       return m_lockId;
  413.     }
  414.     bool equal(const LockQueue & rec) const {
  415.       return m_lockId == rec.m_lockId;
  416.     }
  417.   };
  418.   typedef Ptr<LockQueue> LockQueuePtr;
  419.   
  420.   
  421.   ArrayPool<LockQueue> c_lockQueuePool;
  422.   ArrayPool<LockQueueElement> c_lockElementPool;
  423.   KeyTable<LockQueue> c_lockQueues;
  424.   
  425.   void execUTIL_CREATE_LOCK_REQ(Signal* signal);
  426.   void execUTIL_DESTORY_LOCK_REQ(Signal* signal);
  427.   void execUTIL_LOCK_REQ(Signal* signal);
  428.   void execUTIL_UNLOCK_REQ(Signal* signal);
  429.   
  430.   void sendLOCK_REF(Signal*, const UtilLockReq * req, UtilLockRef::ErrorCode);
  431.   void sendLOCK_CONF(Signal*, LockQueue *, LockQueueElement *);
  432.   void sendUNLOCK_REF(Signal*, const UtilUnlockReq*, UtilUnlockRef::ErrorCode);
  433.   void sendUNLOCK_CONF(Signal*, LockQueue *, LockQueueElement *);
  434.   // For testing of mutex:es
  435.   void mutex_created(Signal* signal, Uint32 mutexId, Uint32 retVal);
  436.   void mutex_destroyed(Signal* signal, Uint32 mutexId, Uint32 retVal);
  437.   void mutex_locked(Signal* signal, Uint32 mutexId, Uint32 retVal);
  438.   void mutex_unlocked(Signal* signal, Uint32 mutexId, Uint32 retVal);
  439. };
  440. #endif