/* 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 LQH_TRANS_CONF_H #define LQH_TRANS_CONF_H #include "SignalData.hpp" /** * This signal is sent as response to a LQH_TRANSREQ * which is sent as by a take-over TC */ class LqhTransConf { /** * Reciver(s) */ friend class Dbtc; /** * Sender(s) */ friend class Dblqh; friend bool printLQH_TRANSCONF(FILE *, const Uint32 *, Uint32, Uint16); public: STATIC_CONST( SignalLength = 15 ); private: /** * This type describes the state of the operation returned in this signal */ enum OperationStatus { InvalidStatus = 0, /**< This status should never be sent in a signal it is only used for initializing variables so that you can easily later check if they have changed */ LastTransConf = 4, /**< This status indicates that LQH has finished the scan of operations belonging to the died TC. Data 0 - 2 is valid */ Prepared = 2, Committed = 3, Aborted = 1, Marker = 5 /**< This means that the only thing left is a marker, Data 0 - 6 is valid */ }; /** * DATA VARIABLES */ Uint32 tcRef; // 0 Uint32 lqhNodeId; // 1 Uint32 operationStatus; // 2 See enum OperationStatus Uint32 transId1; // 3 Uint32 transId2; // 4 Uint32 apiRef; // 5 Uint32 apiOpRec; // 6 Uint32 lqhConnectPtr; Uint32 oldTcOpRec; Uint32 requestInfo; Uint32 gci; Uint32 nextNodeId1; Uint32 nextNodeId2; Uint32 nextNodeId3; Uint32 tableId; /** * Getters */ static Uint32 getReplicaNo(Uint32 & requestInfo); static Uint32 getReplicaType(Uint32 & requestInfo); static Uint32 getLastReplicaNo(Uint32 & requestInfo); static Uint32 getSimpleFlag(Uint32 & requestInfo); static Uint32 getDirtyFlag(Uint32 & requestInfo); static Uint32 getOperation(Uint32 & requestInfo); static Uint32 getMarkerFlag(Uint32 & requestInfo); static void setReplicaNo(UintR & requestInfo, UintR val); static void setReplicaType(UintR & requestInfo, UintR val); static void setLastReplicaNo(UintR & requestInfo, UintR val); static void setSimpleFlag(UintR & requestInfo, UintR val); static void setDirtyFlag(UintR & requestInfo, UintR val); static void setOperation(UintR & requestInfo, UintR val); static void setMarkerFlag(Uint32 & requestInfo, Uint32 val); }; /** * Request Info * * t = replica type - 2 Bits (0-1) * r = Replica No - 2 Bits (2-3) * l = Last Replica No - 2 Bits (4-5) * s = Simple - 1 Bits (6) * d = Dirty - 1 Bit (7) * o = Operation - 3 Bit (8-9) * m = Marker present - 1 Bit (10) * * 1111111111222222222233 * 01234567890123456789012345678901 * ttrrllsdooom */ #define LTC_REPLICA_TYPE_SHIFT (0) #define LTC_REPLICA_TYPE_MASK (3) #define LTC_REPLICA_NO_SHIFT (2) #define LTC_REPLICA_NO_MASK (3) #define LTC_LAST_REPLICA_SHIFT (4) #define LTC_LAST_REPLICA_MASK (3) #define LTC_SIMPLE_SHIFT (6) #define LTC_DIRTY_SHIFT (7) #define LTC_OPERATION_SHIFT (8) #define LTC_OPERATION_MASK (7) #define LTC_MARKER_SHIFT (10) inline Uint32 LqhTransConf::getReplicaType(Uint32 & requestInfo){ return (requestInfo >> LTC_REPLICA_TYPE_SHIFT) & LTC_REPLICA_TYPE_MASK; } inline Uint32 LqhTransConf::getReplicaNo(Uint32 & requestInfo){ return (requestInfo >> LTC_REPLICA_NO_SHIFT) & LTC_REPLICA_NO_MASK; } inline Uint32 LqhTransConf::getLastReplicaNo(Uint32 & requestInfo){ return (requestInfo >> LTC_LAST_REPLICA_SHIFT) & LTC_LAST_REPLICA_MASK; } inline Uint32 LqhTransConf::getSimpleFlag(Uint32 & requestInfo){ return (requestInfo >> LTC_SIMPLE_SHIFT) & 1; } inline Uint32 LqhTransConf::getDirtyFlag(Uint32 & requestInfo){ return (requestInfo >> LTC_DIRTY_SHIFT) & 1; } inline Uint32 LqhTransConf::getOperation(Uint32 & requestInfo){ return (requestInfo >> LTC_OPERATION_SHIFT) & LTC_OPERATION_MASK; } inline Uint32 LqhTransConf::getMarkerFlag(Uint32 & requestInfo){ return (requestInfo >> LTC_MARKER_SHIFT) & 1; } inline void LqhTransConf::setReplicaNo(UintR & requestInfo, UintR val){ ASSERT_MAX(val, LTC_REPLICA_NO_MASK, "LqhTransConf::setReplicaNo"); requestInfo |= (val << LTC_REPLICA_NO_SHIFT); } inline void LqhTransConf::setReplicaType(UintR & requestInfo, UintR val){ ASSERT_MAX(val, LTC_REPLICA_TYPE_MASK, "LqhTransConf::setReplicaType"); requestInfo |= (val << LTC_REPLICA_TYPE_SHIFT); } inline void LqhTransConf::setLastReplicaNo(UintR & requestInfo, UintR val){ ASSERT_MAX(val, LTC_LAST_REPLICA_MASK, "LqhTransConf::setLastReplicaNo"); requestInfo |= (val << LTC_LAST_REPLICA_SHIFT); } inline void LqhTransConf::setSimpleFlag(UintR & requestInfo, UintR val){ ASSERT_BOOL(val, "LqhTransConf::setSimpleFlag"); requestInfo |= (val << LTC_SIMPLE_SHIFT); } inline void LqhTransConf::setDirtyFlag(UintR & requestInfo, UintR val){ ASSERT_BOOL(val, "LqhTransConf::setDirtyFlag"); requestInfo |= (val << LTC_DIRTY_SHIFT); } inline void LqhTransConf::setOperation(UintR & requestInfo, UintR val){ ASSERT_MAX(val, LTC_OPERATION_MASK, "LqhTransConf::setOperation"); requestInfo |= (val << LTC_OPERATION_SHIFT); } inline void LqhTransConf::setMarkerFlag(UintR & requestInfo, UintR val){ ASSERT_BOOL(val, "LqhTransConf::setMarkerFlag"); requestInfo |= (val << LTC_MARKER_SHIFT); } #endif