NdbScanOperation.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. /*****************************************************************************
  14.  * Name:          NdbScanOperation.hpp
  15.  * Include:
  16.  * Link:
  17.  * Author:        Martin Sk鰈d
  18.  * Date:          2002-04-01
  19.  * Version:       0.1
  20.  * Description:   Table scan support
  21.  * Documentation:
  22.  * Adjust:  2002-04-01  Martin Sk鰈d   First version.
  23.  ****************************************************************************/
  24. #ifndef NdbScanOperation_H
  25. #define NdbScanOperation_H
  26. #include <NdbOperation.hpp>
  27. class NdbBlob;
  28. class NdbResultSet;
  29. /**
  30.  * @class NdbScanOperation
  31.  * @brief Class of scan operations for use in transactions.  
  32.  */
  33. class NdbScanOperation : public NdbOperation {
  34.   friend class Ndb;
  35.   friend class NdbConnection;
  36.   friend class NdbResultSet;
  37.   friend class NdbOperation;
  38.   friend class NdbBlob;
  39. public:
  40.   /**
  41.    * Type of cursor
  42.    */
  43.   enum CursorType {
  44.     NoCursor = 0,
  45.     ScanCursor = 1,
  46.     IndexCursor = 2
  47.   };
  48.   /**
  49.    * Type of cursor
  50.    */
  51.   CursorType get_cursor_type() const;
  52.   /**
  53.    * readTuples returns a NdbResultSet where tuples are stored.
  54.    * Tuples are not stored in NdbResultSet until execute(NoCommit) 
  55.    * has been executed and nextResult has been called.
  56.    * 
  57.    * @param parallel  Scan parallelism
  58.    * @param batch No of rows to fetch from each fragment at a time
  59.    * @param LockMode  Scan lock handling   
  60.    * @returns NdbResultSet.
  61.    * @note specifying 0 for batch and parallall means max performance
  62.    */ 
  63.   NdbResultSet* readTuples(LockMode = LM_Read, 
  64.    Uint32 batch = 0, Uint32 parallel = 0);
  65.   
  66.   inline NdbResultSet* readTuples(int parallell){
  67.     return readTuples(LM_Read, 0, parallell);
  68.   }
  69.   
  70.   inline NdbResultSet* readTuplesExclusive(int parallell = 0){
  71.     return readTuples(LM_Exclusive, 0, parallell);
  72.   }
  73.   
  74.   NdbBlob* getBlobHandle(const char* anAttrName);
  75.   NdbBlob* getBlobHandle(Uint32 anAttrId);
  76. protected:
  77.   CursorType m_cursor_type;
  78.   NdbScanOperation(Ndb* aNdb);
  79.   virtual ~NdbScanOperation();
  80.   int nextResult(bool fetchAllowed = true, bool forceSend = false);
  81.   virtual void release();
  82.   
  83.   void closeScan(bool forceSend = false, bool releaseOp = false);
  84.   int close_impl(class TransporterFacade*, bool forceSend = false);
  85.   // Overloaded methods from NdbCursorOperation
  86.   int executeCursor(int ProcessorId);
  87.   // Overloaded private methods from NdbOperation
  88.   int init(const NdbTableImpl* tab, NdbConnection* myConnection);
  89.   int prepareSend(Uint32  TC_ConnectPtr, Uint64  TransactionId);
  90.   int doSend(int ProcessorId);
  91.   void checkForceSend(bool forceSend);
  92.   virtual void setErrorCode(int aErrorCode);
  93.   virtual void setErrorCodeAbort(int aErrorCode);
  94.   NdbResultSet * m_resultSet;
  95.   NdbResultSet* getResultSet();
  96.   NdbConnection *m_transConnection;
  97.   // Scan related variables
  98.   Uint32 theParallelism;
  99.   Uint32 m_keyInfo;
  100.   NdbApiSignal* theSCAN_TABREQ;
  101.   int getFirstATTRINFOScan();
  102.   int doSendScan(int ProcessorId);
  103.   int prepareSendScan(Uint32 TC_ConnectPtr, Uint64 TransactionId);
  104.   
  105.   int fix_receivers(Uint32 parallel);
  106.   void reset_receivers(Uint32 parallel, Uint32 ordered);
  107.   Uint32* m_array; // containing all arrays below
  108.   Uint32 m_allocated_receivers;
  109.   NdbReceiver** m_receivers;      // All receivers
  110.   Uint32* m_prepared_receivers;   // These are to be sent
  111.   /**
  112.    * owned by API/user thread
  113.    */
  114.   Uint32 m_current_api_receiver;
  115.   Uint32 m_api_receivers_count;
  116.   NdbReceiver** m_api_receivers;  // These are currently used by api
  117.   
  118.   /**
  119.    * owned by receiver thread
  120.    */
  121.   Uint32 m_conf_receivers_count;  // NOTE needs mutex to access
  122.   NdbReceiver** m_conf_receivers; // receive thread puts them here
  123.   
  124.   /**
  125.    * owned by receiver thread
  126.    */
  127.   Uint32 m_sent_receivers_count;  // NOTE needs mutex to access
  128.   NdbReceiver** m_sent_receivers; // receive thread puts them here
  129.   
  130.   int send_next_scan(Uint32 cnt, bool close, bool forceSend = false);
  131.   void receiver_delivered(NdbReceiver*);
  132.   void receiver_completed(NdbReceiver*);
  133.   void execCLOSE_SCAN_REP();
  134.   int getKeyFromKEYINFO20(Uint32* data, unsigned size);
  135.   NdbOperation* takeOverScanOp(OperationType opType, NdbConnection*);
  136.   
  137.   Uint32 m_ordered;
  138.   int restart(bool forceSend = false);
  139. };
  140. inline
  141. NdbScanOperation::CursorType
  142. NdbScanOperation::get_cursor_type() const {
  143.   return m_cursor_type;
  144. }
  145. #endif