diff options
Diffstat (limited to 'ndb/include/kernel/signaldata/TcIndx.hpp')
-rw-r--r-- | ndb/include/kernel/signaldata/TcIndx.hpp | 528 |
1 files changed, 528 insertions, 0 deletions
diff --git a/ndb/include/kernel/signaldata/TcIndx.hpp b/ndb/include/kernel/signaldata/TcIndx.hpp new file mode 100644 index 00000000000..764d4e9fcd7 --- /dev/null +++ b/ndb/include/kernel/signaldata/TcIndx.hpp @@ -0,0 +1,528 @@ +/* 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 TC_INDX_H +#define TC_INDX_H + +#include "SignalData.hpp" + +class TcIndxReq { + /** + * Reciver(s) + */ + friend class Dbtc; // Reciver + + /** + * Sender(s) + */ + friend class NdbIndexOperation; + + /** + * For printing + */ + friend bool printTCINDXREQ(FILE *, const Uint32 *, Uint32, Uint16); + +public: + /** + * Length of signal + */ + STATIC_CONST( StaticLength = 8 ); + STATIC_CONST( SignalLength = 25 ); + STATIC_CONST( MaxKeyInfo = 8 ); + STATIC_CONST( MaxAttrInfo = 5 ); + +private: + + enum CommitType { + CommitIfFailFree = 0, + TryCommit = 1, + CommitAsMuchAsPossible = 2 + }; + + /** + * DATA VARIABLES + */ +//------------------------------------------------------------- +// Unconditional part. First 8 words +//------------------------------------------------------------- + UintR apiConnectPtr; // DATA 0 + UintR senderData; // DATA 1 + UintR attrLen; // DATA 2 (including API Version) + UintR indexId; // DATA 3 + UintR requestInfo; // DATA 4 + UintR indexSchemaVersion; // DATA 5 + UintR transId1; // DATA 6 + UintR transId2; // DATA 7 +//------------------------------------------------------------- +// Conditional part. Those four words will be sent only if their +// indicator is set. +//------------------------------------------------------------- + UintR scanInfo; // DATA 8 + UintR distrGroupHashValue; // DATA 9 + UintR distributionKeySize; // DATA 10 + UintR storedProcId; // DATA 11 + +//------------------------------------------------------------- +// Variable sized key and attrinfo part. Those will be placed to +// pack the signal in an appropriate manner. +//------------------------------------------------------------- + UintR keyInfo[MaxKeyInfo]; // DATA 12 - 19 + UintR attrInfo[MaxAttrInfo]; // DATA 20 - 24 + + static Uint8 getAPIVersion(const UintR & attrLen); + + /** + * Get:ers for requestInfo + */ + static Uint8 getCommitFlag(const UintR & requestInfo); + static Uint8 getCommitType(const UintR & requestInfo); + static Uint8 getStartFlag(const UintR & requestInfo); + static Uint8 getSimpleFlag(const UintR & requestInfo); + static Uint8 getDirtyFlag(const UintR & requestInfo); + static Uint8 getInterpretedFlag(const UintR & requestInfo); + static Uint8 getDistributionGroupFlag(const UintR & requestInfo); + static Uint8 getDistributionGroupTypeFlag(const UintR & requestInfo); + static Uint8 getDistributionKeyFlag(const UintR & requestInfo); + static Uint8 getScanIndFlag(const UintR & requestInfo); + + static Uint8 getOperationType(const UintR & requestInfo); + + static Uint16 getIndexLength(const UintR & requestInfo); + static Uint8 getAIInTcIndxReq(const UintR & requestInfo); + + /** + * Get:ers for scanInfo + */ + + static void setAPIVersion(UintR & attrLen, Uint16 apiVersion); + + /** + * Set:ers for requestInfo + */ + static void clearRequestInfo(UintR & requestInfo); + static void setCommitType(UintR & requestInfo, Uint32 type); + static void setCommitFlag(UintR & requestInfo, Uint32 flag); + static void setStartFlag(UintR & requestInfo, Uint32 flag); + static void setSimpleFlag(UintR & requestInfo, Uint32 flag); + static void setDirtyFlag(UintR & requestInfo, Uint32 flag); + static void setInterpretedFlag(UintR & requestInfo, Uint32 flag); + static void setDistributionGroupFlag(UintR & requestInfo, Uint32 flag); + static void setDistributionGroupTypeFlag(UintR & requestInfo, Uint32 flag); + static void setDistributionKeyFlag(UintR & requestInfo, Uint32 flag); + static void setScanIndFlag(UintR & requestInfo, Uint32 flag); + + static void setOperationType(UintR & requestInfo, Uint32 type); + + static void setIndexLength(UintR & requestInfo, Uint32 len); + static void setAIInTcIndxReq(UintR & requestInfo, Uint32 len); + + /** + * Set:ers for scanInfo + */ + +}; + +#define API_VER_NO_SHIFT (16) +#define API_VER_NO_MASK (65535) + +/** + * Request Info + * + a = Attr Info in TCINDXREQ - 3 Bits -> Max 7 (Bit 16-18) + b = Distribution Key Ind - 1 Bit 2 + c = Commit Indicator - 1 Bit 4 + d = Dirty Indicator - 1 Bit 0 + e = Scan Indicator - 1 Bit 14 + g = Distribution Group Ind - 1 Bit 1 + i = Interpreted Indicator - 1 Bit 15 + k = Index lengt - 12 Bits -> Max 4095 (Bit 20 - 31) + o = Operation Type - 3 Bits -> Max 7 (Bit 5-7) + p = Simple Indicator - 1 Bit 8 + s = Start Indicator - 1 Bit 11 + t = Distribution GroupType - 1 Bit 3 + y = Commit Type - 2 Bit 12-13 + x = Last Op in execute - 1 Bit 19 + + 1111111111222222222233 + 01234567890123456789012345678901 + dgbtcooop syyeiaaa-kkkkkkkkkkkk +*/ + +#define COMMIT_SHIFT (4) +#define START_SHIFT (11) +#define SIMPLE_SHIFT (8) +#define DIRTY_SHIFT (0) +#define INTERPRETED_SHIFT (15) +#define DISTR_GROUP_SHIFT (1) +#define DISTR_GROUP_TYPE_SHIFT (3) +#define DISTR_KEY_SHIFT (2) +#define SCAN_SHIFT (14) + +#define OPERATION_SHIFT (5) +#define OPERATION_MASK (7) + +#define AINFO_SHIFT (16) +#define AINFO_MASK (7) + +#define INDEX_LEN_SHIFT (20) +#define INDEX_LEN_MASK (4095) + +#define COMMIT_TYPE_SHIFT (12) +#define COMMIT_TYPE_MASK (3) + +#define LAST_OP_IN_EXEC_SHIFT (19) + +/** + * Scan Info + * + + + 1111111111222222222233 + 01234567890123456789012345678901 + +*/ + +inline +Uint8 +TcIndxReq::getCommitFlag(const UintR & requestInfo){ + return (Uint8)((requestInfo >> COMMIT_SHIFT) & 1); +} + +inline +Uint8 +TcIndxReq::getCommitType(const UintR & requestInfo){ + return (Uint8)((requestInfo >> COMMIT_TYPE_SHIFT) & COMMIT_TYPE_MASK); +} + +inline +Uint8 +TcIndxReq::getStartFlag(const UintR & requestInfo){ + return (Uint8)((requestInfo >> START_SHIFT) & 1); +} + +inline +Uint8 +TcIndxReq::getSimpleFlag(const UintR & requestInfo){ + return (Uint8)((requestInfo >> SIMPLE_SHIFT) & 1); +} + +inline +Uint8 +TcIndxReq::getDirtyFlag(const UintR & requestInfo){ + return (Uint8)((requestInfo >> DIRTY_SHIFT) & 1); +} + +inline +Uint8 +TcIndxReq::getInterpretedFlag(const UintR & requestInfo){ + return (Uint8)((requestInfo >> INTERPRETED_SHIFT) & 1); +} + +inline +Uint8 +TcIndxReq::getDistributionGroupFlag(const UintR & requestInfo){ + return (Uint8)((requestInfo >> DISTR_GROUP_SHIFT) & 1); +} + +inline +Uint8 +TcIndxReq::getDistributionGroupTypeFlag(const UintR & requestInfo){ + return (Uint8)((requestInfo >> DISTR_GROUP_TYPE_SHIFT) & 1); +} + +inline +Uint8 +TcIndxReq::getDistributionKeyFlag(const UintR & requestInfo){ + return (Uint8)((requestInfo >> DISTR_KEY_SHIFT) & 1); +} + +inline +Uint8 +TcIndxReq::getScanIndFlag(const UintR & requestInfo){ + return (Uint8)((requestInfo >> SCAN_SHIFT) & 1); +} + +inline +Uint8 +TcIndxReq::getOperationType(const UintR & requestInfo){ + return (Uint8)((requestInfo >> OPERATION_SHIFT) & OPERATION_MASK); +} + +inline +Uint16 +TcIndxReq::getIndexLength(const UintR & requestInfo){ + return (Uint16)((requestInfo >> INDEX_LEN_SHIFT) & INDEX_LEN_MASK); +} + +inline +Uint8 +TcIndxReq::getAIInTcIndxReq(const UintR & requestInfo){ + return (Uint8)((requestInfo >> AINFO_SHIFT) & AINFO_MASK); +} + +inline +void +TcIndxReq::clearRequestInfo(UintR & requestInfo){ + requestInfo = 0; +} + +inline +void +TcIndxReq::setCommitType(UintR & requestInfo, Uint32 type){ + ASSERT_MAX(type, COMMIT_TYPE_MASK, "TcIndxReq::setCommitType"); + requestInfo |= (type << COMMIT_TYPE_SHIFT); +} + +inline +void +TcIndxReq::setCommitFlag(UintR & requestInfo, Uint32 flag){ + ASSERT_BOOL(flag, "TcIndxReq::setCommitFlag"); + requestInfo &= ~(1 << COMMIT_SHIFT); + requestInfo |= (flag << COMMIT_SHIFT); +} + +inline +void +TcIndxReq::setStartFlag(UintR & requestInfo, Uint32 flag){ + ASSERT_BOOL(flag, "TcIndxReq::setStartFlag"); + requestInfo &= ~(1 << START_SHIFT); + requestInfo |= (flag << START_SHIFT); +} + +inline +void +TcIndxReq::setSimpleFlag(UintR & requestInfo, Uint32 flag){ + ASSERT_BOOL(flag, "TcIndxReq::setSimpleFlag"); + requestInfo &= ~(1 << SIMPLE_SHIFT); + requestInfo |= (flag << SIMPLE_SHIFT); +} + +inline +void +TcIndxReq::setDirtyFlag(UintR & requestInfo, Uint32 flag){ + ASSERT_BOOL(flag, "TcIndxReq::setDirtyFlag"); + requestInfo &= ~(1 << DIRTY_SHIFT); + requestInfo |= (flag << DIRTY_SHIFT); +} + +inline +void +TcIndxReq::setInterpretedFlag(UintR & requestInfo, Uint32 flag){ + ASSERT_BOOL(flag, "TcIndxReq::setInterpretedFlag"); + requestInfo &= ~(1 << INTERPRETED_SHIFT); + requestInfo |= (flag << INTERPRETED_SHIFT); +} + +inline +void +TcIndxReq::setDistributionGroupTypeFlag(UintR & requestInfo, Uint32 flag){ + ASSERT_BOOL(flag, "TcIndxReq::setDistributionGroupTypeFlag"); + requestInfo &= ~(1 << DISTR_GROUP_TYPE_SHIFT); + requestInfo |= (flag << DISTR_GROUP_TYPE_SHIFT); +} + +inline +void +TcIndxReq::setDistributionGroupFlag(UintR & requestInfo, Uint32 flag){ + ASSERT_BOOL(flag, "TcIndxReq::setDistributionGroupFlag"); + requestInfo &= ~(1 << DISTR_GROUP_SHIFT); + requestInfo |= (flag << DISTR_GROUP_SHIFT); +} + +inline +void +TcIndxReq::setDistributionKeyFlag(UintR & requestInfo, Uint32 flag){ + ASSERT_BOOL(flag, "TcIndxReq::setDistributionKeyFlag"); + requestInfo &= ~(1 << DISTR_KEY_SHIFT); + requestInfo |= (flag << DISTR_KEY_SHIFT); +} + +inline +void +TcIndxReq::setScanIndFlag(UintR & requestInfo, Uint32 flag){ + ASSERT_BOOL(flag, "TcIndxReq::setScanIndFlag"); + requestInfo &= ~(1 << SCAN_SHIFT); + requestInfo |= (flag << SCAN_SHIFT); +} + +inline +void +TcIndxReq::setOperationType(UintR & requestInfo, Uint32 type){ + ASSERT_MAX(type, OPERATION_MASK, "TcIndxReq::setOperationType"); + requestInfo |= (type << OPERATION_SHIFT); +} + +inline +void +TcIndxReq::setIndexLength(UintR & requestInfo, Uint32 len){ + ASSERT_MAX(len, INDEX_LEN_MASK, "TcIndxReq::setKeyLength"); + requestInfo |= (len << INDEX_LEN_SHIFT); +} + +inline +void +TcIndxReq::setAIInTcIndxReq(UintR & requestInfo, Uint32 len){ + ASSERT_MAX(len, AINFO_MASK, "TcIndxReq::setAIInTcIndxReq"); + requestInfo |= (len << AINFO_SHIFT); +} + +inline +Uint8 +TcIndxReq::getAPIVersion(const UintR & anAttrLen){ + return (Uint16)((anAttrLen >> API_VER_NO_SHIFT) & API_VER_NO_MASK); +} + +inline +void +TcIndxReq::setAPIVersion(UintR & anAttrLen, Uint16 apiVersion){ +// ASSERT_MAX(apiVersion, API_VER_NO_MASK, "TcIndxReq::setAPIVersion"); + anAttrLen |= (apiVersion << API_VER_NO_SHIFT); +} + +class TcIndxConf { + + /** + * Reciver(s) + */ + friend class Ndb; + friend class NdbConnection; + + /** + * Sender(s) + */ + friend class Dbtc; + + /** + * For printing + */ + friend bool printTCINDXCONF(FILE *, const Uint32 *, Uint32, Uint16); + +public: + /** + * Length of signal + */ + STATIC_CONST( SignalLength = 5 ); + +private: + /** + * DATA VARIABLES + */ + //------------------------------------------------------------- + // Unconditional part. First 5 words + //------------------------------------------------------------- + + Uint32 apiConnectPtr; + Uint32 gci; + Uint32 confInfo; + Uint32 transId1; + Uint32 transId2; + + struct OperationConf { + Uint32 apiOperationPtr; + Uint32 attrInfoLen; + }; + //------------------------------------------------------------- + // Operations confirmations, + // No of actually sent = getNoOfOperations(confInfo) + //------------------------------------------------------------- + OperationConf operations[10]; + + /** + * Get:ers for confInfo + */ + static Uint32 getNoOfOperations(const Uint32 & confInfo); + static Uint32 getCommitFlag(const Uint32 & confInfo); + static bool getMarkerFlag(const Uint32 & confInfo); + + /** + * Set:ers for confInfo + */ + static void setCommitFlag(Uint32 & confInfo, Uint8 flag); + static void setNoOfOperations(Uint32 & confInfo, Uint32 noOfOps); + static void setMarkerFlag(Uint32 & confInfo, Uint32 flag); +}; + +inline +Uint32 +TcIndxConf::getNoOfOperations(const Uint32 & confInfo){ + return confInfo & 65535; +} + +inline +Uint32 +TcIndxConf::getCommitFlag(const Uint32 & confInfo){ + return ((confInfo >> 16) & 1); +} + +inline +bool +TcIndxConf::getMarkerFlag(const Uint32 & confInfo){ + const Uint32 bits = 3 << 16; // Marker only valid when doing commit + return (confInfo & bits) == bits; +} + +inline +void +TcIndxConf::setNoOfOperations(Uint32 & confInfo, Uint32 noOfOps){ + ASSERT_MAX(noOfOps, 65535, "TcIndxConf::setNoOfOperations"); + confInfo |= noOfOps; +} + +inline +void +TcIndxConf::setCommitFlag(Uint32 & confInfo, Uint8 flag){ + ASSERT_BOOL(flag, "TcIndxConf::setCommitFlag"); + confInfo |= (flag << 16); +} + +inline +void +TcIndxConf::setMarkerFlag(Uint32 & confInfo, Uint32 flag){ + ASSERT_BOOL(flag, "TcIndxConf::setMarkerFlag"); + confInfo |= (flag << 17); +} + +class TcIndxRef { + + /** + * Reciver(s) + */ + friend class NdbIndexOperation; + + /** + * Sender(s) + */ + friend class Dbtc; + + /** + * For printing + */ + friend bool printTCINDXREF(FILE *, const Uint32 *, Uint32, Uint16); + +public: + /** + * Length of signal + */ +public: + STATIC_CONST( SignalLength = 4 ); + +private: + Uint32 connectPtr; + Uint32 transId[2]; + Uint32 errorCode; +}; + +#endif |