mariadb/ndb/include/kernel/signaldata/LqhTransConf.hpp
2004-04-14 10:53:21 +02:00

218 lines
6 KiB
C++

/* 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