polardbxengine/storage/ndb/include/kernel/signaldata/TcKeyReq.hpp

720 lines
21 KiB
C++

/*
Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License, version 2.0,
as published by the Free Software Foundation.
This program is also distributed with certain software (including
but not limited to OpenSSL) that is licensed under separate terms,
as designated in a particular file or component or in included license
documentation. The authors of MySQL hereby grant you an additional
permission to link the program and your derivative works with the
separately licensed software that they have included with MySQL.
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, version 2.0, 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef TC_KEY_REQ_H
#define TC_KEY_REQ_H
#include "SignalData.hpp"
#include <transporter/TransporterDefinitions.hpp>
#define JAM_FILE_ID 127
/**
* @class TcKeyReq
* @brief Contains KeyInfo and AttrInfo and is commonly followed by more signals
*
* - SENDER: API, NDBCNTR
* - RECEIVER: TC
*
* Short TCKEYREQ
* Prior to NDB 6.4.0, TCKEYREQ was always sent as a short signal train with
* up to 8 words of KeyInfo and 5 words of AttrInfo in the TCKEYREQ signal, and
* all other Key and AttrInfo sent in separate signal trains. This format is
* supported for non NdbRecord operations, backwards compatibility, and for
* internal TCKEYREQ signals received from non-API clients.
*
* Long TCKEYREQ
* From NDB 6.4.0, for NdbRecord operations the API nodes send long TCKEYREQ
* signals with all KeyInfo and AttrInfo in long sections sent with the
* TCKEYREQ signal. As each section has a section length, and no Key/AttrInfo
* is sent in the TCKEYREQ signal itself, the KeyLength, AttrInfoLen and
* AIInTcKeyReq fields of the header are no longer required, and their bits
* can be reused in future.
*/
class TcKeyReq {
/**
* Receiver(s)
*/
friend class Dbtc; // Receiver
/**
* Sender(s)
*/
friend class Ndbcntr;
friend class NdbQueryImpl;
friend class NdbOperation;
friend class NdbIndexOperation;
friend class NdbScanOperation;
friend class NdbBlob;
friend class DbUtil;
friend class Trix;
/**
* For printing
*/
friend bool printTCKEYREQ(FILE *, const Uint32 *, Uint32, Uint16);
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 );
STATIC_CONST( MaxTotalAttrInfo = ((MAX_SEND_MESSAGE_BYTESIZE / 4) -
SignalLength ));
/**
* Long signal variant of TCKEYREQ
*/
STATIC_CONST( KeyInfoSectionNum = 0 );
STATIC_CONST( AttrInfoSectionNum = 1 );
STATIC_CONST( UnlockKeyLen = 2 );
private:
enum AbortOption {
CommitIfFailFree = 0, AbortOnError = 0,
CommitAsMuchAsPossible = 2, IgnoreError = 2
};
typedef AbortOption CommitType;
/**
* DATA VARIABLES
*/
// ----------------------------------------------------------------------
// Unconditional part = must be present in signal. First 8 words
// ----------------------------------------------------------------------
Uint32 apiConnectPtr; // DATA 0
union {
Uint32 senderData;
UintR apiOperationPtr; // DATA 1
};
/**
* Short TCKEYREQ only :
* ATTRIBUTE INFO (attrinfo) LENGTH
* This is the total length of all attribute info that is sent from
* the application as part of this operation.
* It includes all attribute info sent in possible attrinfo
* signals as well as the attribute info sent in TCKEYREQ.
*
* Long TCKEYREQ
* ATTRIBUTE INFO (attrinfo) LENGTH is unused in signal.
* Get AttrInfoLength from length of section 1, if present.
*
*/
UintR attrLen; // DATA 2
UintR tableId; // DATA 3
UintR requestInfo; // DATA 4 Various transaction flags
UintR tableSchemaVersion; // DATA 5
UintR transId1; // DATA 6
UintR transId2; // DATA 7
// ----------------------------------------------------------------------
// Conditional part = can be present in signal.
// These four words will be sent only if their indicator is set.
// ----------------------------------------------------------------------
UintR scanInfo; // DATA 8 Various flags for scans, see below
UintR distrGroupHashValue; // DATA 9
UintR distributionKeySize; // DATA 10
UintR storedProcId; // DATA 11
// ----------------------------------------------------------------------
// Variable sized KEY and ATTRINFO part.
// These will be placed to pack the signal in an appropriate manner.
// ----------------------------------------------------------------------
UintR keyInfo[MaxKeyInfo]; // DATA 12 - 19
UintR attrInfo[MaxAttrInfo]; // DATA 20 - 24
/**
* Get:ers for attrLen
*/
static Uint16 getAttrinfoLen(const UintR & attrLen);
static void setAttrinfoLen(UintR & attrLen, Uint16 aiLen);
/**
* Get:ers for requestInfo
*/
static Uint8 getCommitFlag(const UintR & requestInfo);
static Uint8 getAbortOption(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 getDistributionKeyFlag(const UintR & requestInfo);
static Uint8 getViaSPJFlag(const UintR & requestInfo);
static Uint8 getScanIndFlag(const UintR & requestInfo);
static Uint8 getOperationType(const UintR & requestInfo);
static Uint8 getExecuteFlag(const UintR & requestInfo);
static Uint8 getReadCommittedBaseFlag(const UintR & TrequestInfo);
static Uint16 getKeyLength(const UintR & requestInfo);
static Uint8 getAIInTcKeyReq(const UintR & requestInfo);
static UintR getNoDiskFlag(const UintR & requestInfo);
static UintR getCoordinatedTransactionFlag(const UintR & requestInfo);
/**
* Get:ers for scanInfo
*/
static Uint8 getTakeOverScanFlag(const UintR & scanInfo);
static Uint16 getTakeOverScanFragment(const UintR & scanInfo);
static Uint32 getTakeOverScanInfo(const UintR & scanInfo);
/**
* Set:ers for requestInfo
*/
static void clearRequestInfo(UintR & requestInfo);
static void setAbortOption(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 setDistributionKeyFlag(UintR & requestInfo, Uint32 flag);
static void setViaSPJFlag(UintR & requestInfo, Uint32 flag);
static void setScanIndFlag(UintR & requestInfo, Uint32 flag);
static void setExecuteFlag(UintR & requestInfo, Uint32 flag);
static void setOperationType(UintR & requestInfo, Uint32 type);
static void setReadCommittedBaseFlag(UintR & requestInfo, Uint32 flag);
static void setKeyLength(UintR & requestInfo, Uint32 len);
static void setAIInTcKeyReq(UintR & requestInfo, Uint32 len);
static void setNoDiskFlag(UintR & requestInfo, UintR val);
static void setReorgFlag(UintR & requestInfo, UintR val);
static UintR getReorgFlag(const UintR & requestInfo);
static void setCoordinatedTransactionFlag(UintR & requestInfo, UintR val);
static void setQueueOnRedoProblemFlag(UintR & requestInfo, UintR val);
static UintR getQueueOnRedoProblemFlag(const UintR & requestInfo);
/**
* Check constraints deferred
*/
static UintR getDeferredConstraints(const UintR & requestInfo);
static void setDeferredConstraints(UintR & requestInfo, UintR val);
/**
* Foreign key constraints disabled
*/
static UintR getDisableFkConstraints(const UintR & requestInfo);
static void setDisableFkConstraints(UintR & requestInfo, UintR val);
/**
* Set:ers for scanInfo
*/
static void setTakeOverScanFlag(UintR & scanInfo, Uint8 flag);
static void setTakeOverScanFragment(UintR & scanInfo, Uint16 fragment);
static void setTakeOverScanInfo(UintR & scanInfo, Uint32 aScanInfo);
/**
* Nowait option
*/
static void setNoWaitFlag(UintR & requestInfo, UintR val);
static UintR getNoWaitFlag(const UintR & requestInfo);
};
/**
* Request Info
*
a = Attr Info in TCKEYREQ - 3 Bits -> Max 7 (Bit 16-18)
(Short TCKEYREQ only, for long req a == 0)
b = Distribution Key Ind - 1 Bit 2
v = Via SPJ - 1 Bit 3
c = Commit Indicator - 1 Bit 4
d = Dirty Indicator - 1 Bit 0
e = Scan Indicator - 1 Bit 14
i = Interpreted Indicator - 1 Bit 15
k = Key length - 12 Bits -> Max 4095 (Bit 20 - 31)
(Short TCKEYREQ only, for long req use length of
section 0)
o = Operation Type - 3 Bits -> Max 7 (Bit 5-7)
l = Execute - 1 Bit 10
p = Simple Indicator - 1 Bit 8
s = Start Indicator - 1 Bit 11
y = Commit Type - 2 Bit 12-13
n = No disk flag - 1 Bit 1
r = reorg flag - 1 Bit 19
x = Coordinated Tx flag - 1 Bit 16
q = Queue on redo problem - 1 Bit 9
D = deferred constraint - 1 Bit 17
f = Disable FK constraint - 1 Bit 18
* Read committed base is using a bit that is only available
* in Long TCKEYREQ signals. So this feature is only available
* when using Long TCKEYREQ signals. Short TCKEYREQ are only
* used for backwards compatability against old nodes not
* supporting Read Committed base flag anyways and in special
* test cases that also don't use Read Committed base.
R = Read Committed base - 1 Bit 20
w = NoWait read - 1 Bit 21
1111111111222222222233
01234567890123456789012345678901
dnb cooop lsyyeiaaarkkkkkkkkkkkk (Short TCKEYREQ)
dnbvcooopqlsyyeixDfrRw (Long TCKEYREQ)
*/
#define TCKEY_NODISK_SHIFT (1)
#define COMMIT_SHIFT (4)
#define START_SHIFT (11)
#define SIMPLE_SHIFT (8)
#define DIRTY_SHIFT (0)
#define EXECUTE_SHIFT (10)
#define INTERPRETED_SHIFT (15)
#define DISTR_KEY_SHIFT (2)
#define VIA_SPJ_SHIFT (3)
#define SCAN_SHIFT (14)
#define OPERATION_SHIFT (5)
#define OPERATION_MASK (7)
#define AINFO_SHIFT (16)
#define AINFO_MASK (7)
#define KEY_LEN_SHIFT (20)
#define KEY_LEN_MASK (4095)
#define COMMIT_TYPE_SHIFT (12)
#define COMMIT_TYPE_MASK (3)
#define TC_REORG_SHIFT (19)
#define QUEUE_ON_REDO_SHIFT (9)
#define TC_COORDINATED_SHIFT (16)
#define TC_DEFERRED_CONSTAINTS_SHIFT (17)
#define TC_DISABLE_FK_SHIFT (18)
#define TC_READ_COMMITTED_BASE_SHIFT (20)
#define TC_NOWAIT_SHIFT (21)
/**
* Scan Info
*
* Scan Info is used to identify the row and lock to take over from a scan.
*
* If "Scan take over indicator" is set, this operation will take over a lock
* currently held on a row being scanned.
* Scan locks not taken over in this way (by same or other transaction) are
* released when fetching the next batch of rows (SCAN_NEXTREQ signal).
* The value for "take over node" and "scan info" are obtained from the
* KEYINFO20 signal sent to NDB API by LQH if requested in SCAN_TABREQ.
*
t = Scan take over indicator - 1 Bit
n = Take over node - 12 Bits -> max 4095
p = Scan Info - 18 Bits -> max 0x3ffff
1111111111222222222233
01234567890123456789012345678901
tpppppppppppppppppp nnnnnnnnnnnn
*/
#define TAKE_OVER_SHIFT (0)
#define TAKE_OVER_FRAG_SHIFT (20)
#define TAKE_OVER_FRAG_MASK (4095)
#define SCAN_INFO_SHIFT (1)
#define SCAN_INFO_MASK (0x3ffff)
/**
* Attr Len
*
n = Attrinfo length(words) - 16 Bits -> max 65535 (Short TCKEYREQ only)
a = removed was API version no - 16 Bits -> max 65535
API version no is more than 16 bits, was not used in kernel
(removed in 7.3.3, 7.2.14, 7.1.29, 7.0.40, 6.3.53)
1111111111222222222233
01234567890123456789012345678901
aaaaaaaaaaaaaaaannnnnnnnnnnnnnnn (Short TCKEYREQ)
aaaaaaaaaaaaaaaa (Long TCKEYREQ)
*/
#define ATTRLEN_SHIFT (0)
#define ATTRLEN_MASK (65535)
inline
Uint8
TcKeyReq::getCommitFlag(const UintR & requestInfo){
return (Uint8)((requestInfo >> COMMIT_SHIFT) & 1);
}
inline
Uint8
TcKeyReq::getAbortOption(const UintR & requestInfo){
return (Uint8)((requestInfo >> COMMIT_TYPE_SHIFT) & COMMIT_TYPE_MASK);
}
inline
Uint8
TcKeyReq::getStartFlag(const UintR & requestInfo){
return (Uint8)((requestInfo >> START_SHIFT) & 1);
}
inline
Uint8
TcKeyReq::getSimpleFlag(const UintR & requestInfo){
return (Uint8)((requestInfo >> SIMPLE_SHIFT) & 1);
}
inline
Uint8
TcKeyReq::getExecuteFlag(const UintR & requestInfo){
return (Uint8)((requestInfo >> EXECUTE_SHIFT) & 1);
}
inline
Uint8
TcKeyReq::getReadCommittedBaseFlag(const UintR & requestInfo){
return (Uint8)((requestInfo >> TC_READ_COMMITTED_BASE_SHIFT) & 1);
}
inline
Uint8
TcKeyReq::getDirtyFlag(const UintR & requestInfo){
return (Uint8)((requestInfo >> DIRTY_SHIFT) & 1);
}
inline
Uint8
TcKeyReq::getInterpretedFlag(const UintR & requestInfo){
return (Uint8)((requestInfo >> INTERPRETED_SHIFT) & 1);
}
inline
Uint8
TcKeyReq::getDistributionKeyFlag(const UintR & requestInfo){
return (Uint8)((requestInfo >> DISTR_KEY_SHIFT) & 1);
}
inline
UintR
TcKeyReq::getCoordinatedTransactionFlag(const UintR & requestInfo){
return (UintR)((requestInfo >> TC_COORDINATED_SHIFT) & 1);
}
inline
Uint8
TcKeyReq::getViaSPJFlag(const UintR & requestInfo){
return (Uint8)((requestInfo >> VIA_SPJ_SHIFT) & 1);
}
inline
Uint8
TcKeyReq::getScanIndFlag(const UintR & requestInfo){
return (Uint8)((requestInfo >> SCAN_SHIFT) & 1);
}
inline
Uint8
TcKeyReq::getOperationType(const UintR & requestInfo){
return (Uint8)((requestInfo >> OPERATION_SHIFT) & OPERATION_MASK);
}
inline
Uint16
TcKeyReq::getKeyLength(const UintR & requestInfo){
return (Uint16)((requestInfo >> KEY_LEN_SHIFT) & KEY_LEN_MASK);
}
inline
Uint8
TcKeyReq::getAIInTcKeyReq(const UintR & requestInfo){
return (Uint8)((requestInfo >> AINFO_SHIFT) & AINFO_MASK);
}
inline
void
TcKeyReq::clearRequestInfo(UintR & requestInfo){
requestInfo = 0;
}
inline
void
TcKeyReq::setAbortOption(UintR & requestInfo, Uint32 type){
ASSERT_MAX(type, COMMIT_TYPE_MASK, "TcKeyReq::setAbortOption");
requestInfo &= ~(COMMIT_TYPE_MASK << COMMIT_TYPE_SHIFT);
requestInfo |= (type << COMMIT_TYPE_SHIFT);
}
inline
void
TcKeyReq::setCommitFlag(UintR & requestInfo, Uint32 flag){
ASSERT_BOOL(flag, "TcKeyReq::setCommitFlag");
requestInfo &= ~(1 << COMMIT_SHIFT);
requestInfo |= (flag << COMMIT_SHIFT);
}
inline
void
TcKeyReq::setStartFlag(UintR & requestInfo, Uint32 flag){
ASSERT_BOOL(flag, "TcKeyReq::setStartFlag");
requestInfo &= ~(1 << START_SHIFT);
requestInfo |= (flag << START_SHIFT);
}
inline
void
TcKeyReq::setSimpleFlag(UintR & requestInfo, Uint32 flag){
ASSERT_BOOL(flag, "TcKeyReq::setSimpleFlag");
requestInfo &= ~(1 << SIMPLE_SHIFT);
requestInfo |= (flag << SIMPLE_SHIFT);
}
inline
void
TcKeyReq::setDirtyFlag(UintR & requestInfo, Uint32 flag){
ASSERT_BOOL(flag, "TcKeyReq::setDirstFlag");
requestInfo &= ~(1 << DIRTY_SHIFT);
requestInfo |= (flag << DIRTY_SHIFT);
}
inline
void
TcKeyReq::setExecuteFlag(UintR & requestInfo, Uint32 flag){
ASSERT_BOOL(flag, "TcKeyReq::setExecuteFlag");
requestInfo &= ~(1 << EXECUTE_SHIFT);
requestInfo |= (flag << EXECUTE_SHIFT);
}
inline
void
TcKeyReq::setReadCommittedBaseFlag(UintR & requestInfo, Uint32 flag){
ASSERT_BOOL(flag, "TcKeyReq::setReadCommittedBaseFlag");
requestInfo &= ~(1 << TC_READ_COMMITTED_BASE_SHIFT);
requestInfo |= (flag << TC_READ_COMMITTED_BASE_SHIFT);
}
inline
void
TcKeyReq::setInterpretedFlag(UintR & requestInfo, Uint32 flag){
ASSERT_BOOL(flag, "TcKeyReq::setInterpretedFlag");
requestInfo &= ~(1 << INTERPRETED_SHIFT);
requestInfo |= (flag << INTERPRETED_SHIFT);
}
inline
void
TcKeyReq::setDistributionKeyFlag(UintR & requestInfo, Uint32 flag){
ASSERT_BOOL(flag, "TcKeyReq::setDistributionKeyFlag");
requestInfo &= ~(1 << DISTR_KEY_SHIFT);
requestInfo |= (flag << DISTR_KEY_SHIFT);
}
inline
void
TcKeyReq::setCoordinatedTransactionFlag(UintR & requestInfo, UintR flag){
ASSERT_BOOL(flag, "TcKeyReq::setCoordinatedTransactionFlag");
requestInfo &= ~(1 << TC_COORDINATED_SHIFT);
requestInfo |= (flag << TC_COORDINATED_SHIFT);
}
inline
void
TcKeyReq::setViaSPJFlag(UintR & requestInfo, Uint32 flag){
ASSERT_BOOL(flag, "TcKeyReq::setViaSPJFlag");
requestInfo &= ~(1 << VIA_SPJ_SHIFT);
requestInfo |= (flag << VIA_SPJ_SHIFT);
}
inline
void
TcKeyReq::setScanIndFlag(UintR & requestInfo, Uint32 flag){
ASSERT_BOOL(flag, "TcKeyReq::setScanIndFlag");
requestInfo &= ~(1 << SCAN_SHIFT);
requestInfo |= (flag << SCAN_SHIFT);
}
inline
void
TcKeyReq::setOperationType(UintR & requestInfo, Uint32 type){
ASSERT_MAX(type, OPERATION_MASK, "TcKeyReq::setOperationType");
requestInfo &= ~(OPERATION_MASK << OPERATION_SHIFT);
requestInfo |= (type << OPERATION_SHIFT);
}
inline
void
TcKeyReq::setKeyLength(UintR & requestInfo, Uint32 len){
ASSERT_MAX(len, KEY_LEN_MASK, "TcKeyReq::setKeyLength");
requestInfo &= ~(KEY_LEN_MASK << KEY_LEN_SHIFT);
requestInfo |= (len << KEY_LEN_SHIFT);
}
inline
void
TcKeyReq::setAIInTcKeyReq(UintR & requestInfo, Uint32 len){
ASSERT_MAX(len, AINFO_MASK, "TcKeyReq::setAIInTcKeyReq");
requestInfo &= ~(AINFO_MASK << AINFO_SHIFT);
requestInfo |= (len << AINFO_SHIFT);
}
inline
Uint8
TcKeyReq::getTakeOverScanFlag(const UintR & scanInfo){
return (Uint8)((scanInfo >> TAKE_OVER_SHIFT) & 1);
}
inline
Uint16
TcKeyReq::getTakeOverScanFragment(const UintR & scanInfo){
return (Uint16)((scanInfo >> TAKE_OVER_FRAG_SHIFT) & TAKE_OVER_FRAG_MASK);
}
inline
Uint32
TcKeyReq::getTakeOverScanInfo(const UintR & scanInfo){
return (Uint32)((scanInfo >> SCAN_INFO_SHIFT) & SCAN_INFO_MASK);
}
inline
void
TcKeyReq::setTakeOverScanFlag(UintR & scanInfo, Uint8 flag){
ASSERT_BOOL(flag, "TcKeyReq::setTakeOverScanFlag");
scanInfo |= (flag << TAKE_OVER_SHIFT);
}
inline
void
TcKeyReq::setTakeOverScanFragment(UintR & scanInfo, Uint16 node){
// ASSERT_MAX(node, TAKE_OVER_NODE_MASK, "TcKeyReq::setTakeOverScanNode");
scanInfo |= (node << TAKE_OVER_FRAG_SHIFT);
}
inline
void
TcKeyReq::setTakeOverScanInfo(UintR & scanInfo, Uint32 aScanInfo){
// ASSERT_MAX(aScanInfo, SCAN_INFO_MASK, "TcKeyReq::setTakeOverScanInfo");
scanInfo |= (aScanInfo << SCAN_INFO_SHIFT);
}
inline
Uint16
TcKeyReq::getAttrinfoLen(const UintR & anAttrLen){
return (Uint16)((anAttrLen) & ATTRLEN_MASK);
}
inline
void
TcKeyReq::setAttrinfoLen(UintR & anAttrLen, Uint16 aiLen){
// ASSERT_MAX(aiLen, ATTRLEN_MASK, "TcKeyReq::setAttrinfoLen");
anAttrLen |= aiLen;
}
inline
UintR
TcKeyReq::getNoDiskFlag(const UintR & requestInfo){
return (requestInfo >> TCKEY_NODISK_SHIFT) & 1;
}
inline
void
TcKeyReq::setNoDiskFlag(UintR & requestInfo, Uint32 flag){
ASSERT_BOOL(flag, "TcKeyReq::setNoDiskFlag");
requestInfo &= ~(1 << TCKEY_NODISK_SHIFT);
requestInfo |= (flag << TCKEY_NODISK_SHIFT);
}
inline
UintR
TcKeyReq::getReorgFlag(const UintR & requestInfo){
return (requestInfo >> TC_REORG_SHIFT) & 1;
}
inline
void
TcKeyReq::setReorgFlag(UintR & requestInfo, Uint32 flag){
ASSERT_BOOL(flag, "TcKeyReq::setReorgFlag");
requestInfo |= (flag << TC_REORG_SHIFT);
}
inline
UintR
TcKeyReq::getQueueOnRedoProblemFlag(const UintR & requestInfo){
return (requestInfo >> QUEUE_ON_REDO_SHIFT) & 1;
}
inline
void
TcKeyReq::setQueueOnRedoProblemFlag(UintR & requestInfo, Uint32 flag){
ASSERT_BOOL(flag, "TcKeyReq::setNoDiskFlag");
requestInfo |= (flag << QUEUE_ON_REDO_SHIFT);
}
inline
void
TcKeyReq::setDeferredConstraints(UintR & requestInfo, UintR val){
ASSERT_BOOL(val, "TcKeyReq::setDeferredConstraints");
requestInfo |= (val << TC_DEFERRED_CONSTAINTS_SHIFT);
}
inline
UintR
TcKeyReq::getDeferredConstraints(const UintR & requestInfo){
return (requestInfo >> TC_DEFERRED_CONSTAINTS_SHIFT) & 1;
}
inline
void
TcKeyReq::setDisableFkConstraints(UintR & requestInfo, UintR val){
ASSERT_BOOL(val, "TcKeyReq::setDisableFkConstraints");
requestInfo |= (val << TC_DISABLE_FK_SHIFT);
}
inline
UintR
TcKeyReq::getDisableFkConstraints(const UintR & requestInfo){
return (requestInfo >> TC_DISABLE_FK_SHIFT) & 1;
}
inline
void
TcKeyReq::setNoWaitFlag(UintR & requestInfo, UintR val){
ASSERT_BOOL(val, "TcKeyReq::setNoWaitFlag");
requestInfo |= (val << TC_NOWAIT_SHIFT);
}
inline
UintR
TcKeyReq::getNoWaitFlag(const UintR & requestInfo){
return (requestInfo >> TC_NOWAIT_SHIFT) & 1;
}
#undef JAM_FILE_ID
#endif