Trix.hpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:5k
- /* Copyright (C) 2003 MySQL AB
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
- #ifndef TRIX_H
- #define TRIX_H
- #include <SimulatedBlock.hpp>
- #include <trigger_definitions.h>
- #include <DataBuffer.hpp>
- #include <ArrayList.hpp>
- #include <SimpleProperties.hpp>
- #include <signaldata/DictTabInfo.hpp>
- #include <signaldata/CreateTrig.hpp>
- #include <signaldata/BuildIndx.hpp>
- // Error codes
- #define INTERNAL_ERROR_ILLEGAL_CALL 4344
- #define INTERNAL_ERROR_TRIX_BUSY 4345
- /**
- * TRIX - This block manages triggers and index (in coop with DICT)
- */
- class Trix : public SimulatedBlock
- {
- public:
- Trix(const class Configuration & conf);
- virtual ~Trix();
- public:
- // Subscription data, when communicating with SUMA
- enum RequestType {
- TABLE_REORG = 0,
- INDEX_BUILD = 1
- };
- typedef DataBuffer<11> AttrOrderBuffer;
- private:
- // Private attributes
-
- BLOCK_DEFINES(Trix);
- // Declared but not defined
- //DBtrix(const Trix &obj);
- //void operator = (const Trix &);
- // Block state
- enum BlockState {
- NOT_STARTED,
- STARTED,
- NODE_FAILURE,
- IDLE,
- BUSY
- };
- BlockState c_blockState;
- // Node data needed when communicating with remote TRIX:es
- struct NodeRecord {
- bool alive;
- BlockReference trixRef;
- union {
- Uint32 nextPool;
- Uint32 nextList;
- };
- Uint32 prevList;
- };
-
- typedef Ptr<NodeRecord> NodeRecPtr;
- /**
- * The pool of node records
- */
- ArrayPool<NodeRecord> c_theNodeRecPool;
- /**
- * The list of other NDB nodes
- */
- ArrayList<NodeRecord> c_theNodes;
- Uint32 c_masterNodeId;
- BlockReference c_masterTrixRef;
- Uint16 c_noNodesFailed;
- Uint16 c_noActiveNodes;
- AttrOrderBuffer::DataBufferPool c_theAttrOrderBufferPool;
- struct SubscriptionRecord {
- SubscriptionRecord(AttrOrderBuffer::DataBufferPool & aop):
- attributeOrder(aop)
- {}
- RequestType requestType;
- BlockReference userReference; // For user
- Uint32 connectionPtr; // For user
- Uint32 subscriptionId; // For Suma
- Uint32 subscriptionKey; // For Suma
- Uint32 prepareId; // For DbUtil
- Uint32 indexType;
- Uint32 sourceTableId;
- Uint32 targetTableId;
- AttrOrderBuffer attributeOrder;
- Uint32 noOfIndexColumns;
- Uint32 noOfKeyColumns;
- Uint32 parallelism;
- BuildIndxRef::ErrorCode errorCode;
- bool subscriptionCreated;
- bool pendingSubSyncContinueConf;
- Uint32 expectedConf; // Count in n UTIL_EXECUTE_CONF + 1 SUB_SYNC_CONF
- union {
- Uint32 nextPool;
- Uint32 nextList;
- };
- Uint32 prevList;
- };
-
- typedef Ptr<SubscriptionRecord> SubscriptionRecPtr;
- /**
- * The pool of node records
- */
- ArrayPool<SubscriptionRecord> c_theSubscriptionRecPool;
- /**
- * The list of other subscriptions
- */
- ArrayList<SubscriptionRecord> c_theSubscriptions;
- // System start
- void execSTTOR(Signal* signal);
- void execNDB_STTOR(Signal* signal);
- // Node management
- void execREAD_NODESCONF(Signal* signal);
- void execREAD_NODESREF(Signal* signal);
- void execNODE_FAILREP(Signal* signal);
- void execINCL_NODEREQ(Signal* signal);
- // Debugging
- void execDUMP_STATE_ORD(Signal* signal);
- // Build index
- void execBUILDINDXREQ(Signal* signal);
- void execBUILDINDXCONF(Signal* signal);
- void execBUILDINDXREF(Signal* signal);
- void execUTIL_PREPARE_CONF(Signal* signal);
- void execUTIL_PREPARE_REF(Signal* signal);
- void execUTIL_EXECUTE_CONF(Signal* signal);
- void execUTIL_EXECUTE_REF(Signal* signal);
- void execUTIL_RELEASE_CONF(Signal* signal);
- void execUTIL_RELEASE_REF(Signal* signal);
- // Suma signals
- void execSUB_CREATE_CONF(Signal* signal);
- void execSUB_CREATE_REF(Signal* signal);
- void execSUB_REMOVE_CONF(Signal* signal);
- void execSUB_REMOVE_REF(Signal* signal);
- void execSUB_SYNC_CONF(Signal* signal);
- void execSUB_SYNC_REF(Signal* signal);
- void execSUB_SYNC_CONTINUE_REQ(Signal* signal);
- void execSUB_META_DATA(Signal* signal);
- void execSUB_TABLE_DATA(Signal* signal);
- // Utility functions
- void setupSubscription(Signal* signal, SubscriptionRecPtr subRecPtr);
- void setupTableScan(Signal* signal, SubscriptionRecPtr subRecPtr);
- void startTableScan(Signal* signal, SubscriptionRecPtr subRecPtr);
- void prepareInsertTransactions(Signal* signal, SubscriptionRecPtr subRecPtr);
- void executeInsertTransaction(Signal* signal, SubscriptionRecPtr subRecPtr,
- SegmentedSectionPtr headerPtr,
- SegmentedSectionPtr dataPtr);
- void buildComplete(Signal* signal, SubscriptionRecPtr subRecPtr);
- void buildFailed(Signal* signal,
- SubscriptionRecPtr subRecPtr,
- BuildIndxRef::ErrorCode);
- void checkParallelism(Signal* signal, SubscriptionRecord* subRec);
- };
- #endif