TcKeyReq.hpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:15k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #ifndef TC_KEY_REQ_H
  14. #define TC_KEY_REQ_H
  15. #include "SignalData.hpp"
  16. /**
  17.  * @class TcKeyReq
  18.  * @brief Contains KeyInfo and AttrInfo and is commonly followed by more signals
  19.  *
  20.  * - SENDER:    API, NDBCNTR
  21.  * - RECEIVER:  TC
  22.  */
  23. class TcKeyReq {
  24.   /**
  25.    * Receiver(s)
  26.    */
  27.   friend class Dbtc;         // Receiver
  28.   /**
  29.    * Sender(s)
  30.    */
  31.   friend class Ndbcntr;      
  32.   friend class NdbOperation; 
  33.   friend class NdbIndexOperation;
  34.   friend class NdbScanOperation;
  35.   friend class DbUtil;
  36.   /**
  37.    * For printing
  38.    */
  39.   friend bool printTCKEYREQ(FILE *, const Uint32 *, Uint32, Uint16);
  40.   friend bool printTCINDXREQ(FILE *, const Uint32 *, Uint32, Uint16);
  41. public:
  42.   /**
  43.    * Length of signal
  44.    */
  45.   STATIC_CONST( StaticLength = 8 );
  46.   STATIC_CONST( SignalLength = 25 );
  47.   STATIC_CONST( MaxKeyInfo = 8 );
  48.   STATIC_CONST( MaxAttrInfo = 5 );
  49.   STATIC_CONST( MaxTotalAttrInfo = 0xFFFF );
  50. private:
  51.   enum AbortOption {
  52.     CommitIfFailFree = 0, AbortOnError = 0,
  53.     CommitAsMuchAsPossible = 2, IgnoreError = 2
  54.   };
  55.   
  56.   typedef AbortOption CommitType;
  57.   
  58.   /**
  59.    * DATA VARIABLES
  60.    */
  61.   // ----------------------------------------------------------------------
  62.   //  Unconditional part = must be present in signal.  First 8 words
  63.   // ----------------------------------------------------------------------
  64.   Uint32 apiConnectPtr;        // DATA 0
  65.   union {
  66.     Uint32 senderData;
  67.     UintR apiOperationPtr;      // DATA 1
  68.   };
  69.   /**
  70.    * ATTRIBUTE INFO (attrinfo) LENGTH
  71.    * This is the total length of all attribute info that is sent from
  72.    * the application as part of this operation. 
  73.    * It includes all attribute info sent in possible attrinfo 
  74.    * signals as well as the attribute info sent in TCKEYREQ.
  75.    */
  76.   UintR attrLen;              // DATA 2   (also stores API Version)
  77.   UintR tableId;              // DATA 3
  78.   UintR requestInfo;          // DATA 4   Various transaction flags
  79.   UintR tableSchemaVersion;   // DATA 5
  80.   UintR transId1;             // DATA 6
  81.   UintR transId2;             // DATA 7
  82.   // ----------------------------------------------------------------------
  83.   //  Conditional part = can be present in signal. 
  84.   //  These four words will be sent only if their indicator is set.
  85.   // ----------------------------------------------------------------------
  86.   UintR scanInfo;             // DATA 8   Various flags for scans
  87.   UintR distrGroupHashValue;  // DATA 9
  88.   UintR distributionKeySize;  // DATA 10
  89.   UintR storedProcId;         // DATA 11
  90.   // ----------------------------------------------------------------------
  91.   //  Variable sized KEY and ATTRINFO part. 
  92.   //  These will be placed to pack the signal in an appropriate manner.
  93.   // ----------------------------------------------------------------------
  94.   UintR keyInfo[MaxKeyInfo];           // DATA 12 - 19
  95.   UintR attrInfo[MaxAttrInfo];          // DATA 20 - 24
  96.   
  97.   /**
  98.    * Get:ers for attrLen
  99.    */ 
  100.   static Uint16  getAPIVersion(const UintR & attrLen);
  101.   static Uint16  getAttrinfoLen(const UintR & attrLen);
  102.   static void setAPIVersion(UintR & attrLen, Uint16 apiVersion);
  103.   static void setAttrinfoLen(UintR & attrLen, Uint16 aiLen);
  104.   /**
  105.    * Get:ers for requestInfo
  106.    */
  107.   static Uint8 getCommitFlag(const UintR & requestInfo);
  108.   static Uint8 getAbortOption(const UintR & requestInfo);
  109.   static Uint8 getStartFlag(const UintR & requestInfo);
  110.   static Uint8 getSimpleFlag(const UintR & requestInfo);
  111.   static Uint8 getDirtyFlag(const UintR & requestInfo);
  112.   static Uint8 getInterpretedFlag(const UintR & requestInfo);
  113.   static Uint8 getDistributionGroupFlag(const UintR & requestInfo);
  114.   static Uint8 getDistributionGroupTypeFlag(const UintR & requestInfo);
  115.   static Uint8 getDistributionKeyFlag(const UintR & requestInfo);
  116.   static Uint8 getScanIndFlag(const UintR & requestInfo);
  117.   static Uint8 getOperationType(const UintR & requestInfo);
  118.   static Uint8 getExecuteFlag(const UintR & requestInfo);
  119.   static Uint16 getKeyLength(const UintR & requestInfo);
  120.   static Uint8  getAIInTcKeyReq(const UintR & requestInfo);
  121.   static Uint8  getExecutingTrigger(const UintR & requestInfo);
  122.   /**
  123.    * Get:ers for scanInfo
  124.    */
  125.   static Uint8  getTakeOverScanFlag(const UintR & scanInfo);
  126.   static Uint16 getTakeOverScanNode(const UintR & scanInfo);
  127.   static Uint32 getTakeOverScanInfo(const UintR & scanInfo);
  128.   /**
  129.    * Set:ers for requestInfo
  130.    */
  131.   static void clearRequestInfo(UintR & requestInfo);
  132.   static void setAbortOption(UintR & requestInfo, Uint32 type);
  133.   static void setCommitFlag(UintR & requestInfo, Uint32 flag);
  134.   static void setStartFlag(UintR & requestInfo, Uint32 flag);
  135.   static void setSimpleFlag(UintR & requestInfo, Uint32 flag);
  136.   static void setDirtyFlag(UintR & requestInfo, Uint32 flag);
  137.   static void setInterpretedFlag(UintR & requestInfo, Uint32 flag);
  138.   static void setDistributionGroupFlag(UintR & requestInfo, Uint32 flag);
  139.   static void setDistributionGroupTypeFlag(UintR & requestInfo, Uint32 flag);
  140.   static void setDistributionKeyFlag(UintR & requestInfo, Uint32 flag);
  141.   static void setScanIndFlag(UintR & requestInfo, Uint32 flag);
  142.   static void setExecuteFlag(UintR & requestInfo, Uint32 flag);  
  143.   static void setOperationType(UintR & requestInfo, Uint32 type);
  144.   
  145.   static void setKeyLength(UintR & requestInfo, Uint32 len);
  146.   static void setAIInTcKeyReq(UintR & requestInfo, Uint32 len);
  147.   static void setExecutingTrigger(UintR & requestInfo, Uint32 flag);
  148.   /**
  149.    * Set:ers for scanInfo
  150.    */
  151.   static void setTakeOverScanFlag(UintR & scanInfo, Uint8 flag);
  152.   static void setTakeOverScanNode(UintR & scanInfo, Uint16 node);
  153.   static void setTakeOverScanInfo(UintR & scanInfo, Uint32 aScanInfo);
  154. };
  155. /**
  156.  * Request Info
  157.  *
  158.  a = Attr Info in TCKEYREQ - 3  Bits -> Max 7 (Bit 16-18)
  159.  b = Distribution Key Ind  - 1  Bit 2
  160.  c = Commit Indicator      - 1  Bit 4
  161.  d = Dirty Indicator       - 1  Bit 0
  162.  e = Scan Indicator        - 1  Bit 14
  163.  f = Execute fired trigger - 1  Bit 19 
  164.  g = Distribution Group Ind- 1  Bit 1
  165.  i = Interpreted Indicator - 1  Bit 15
  166.  k = Key length            - 12 Bits -> Max 4095 (Bit 20 - 31)
  167.  o = Operation Type        - 3  Bits -> Max 7 (Bit 5-7)
  168.  l = Execute               - 1  Bit 10
  169.  p = Simple Indicator      - 1  Bit 8
  170.  s = Start Indicator       - 1  Bit 11
  171.  t = Distribution GroupType- 1  Bit 3
  172.  y = Commit Type           - 2  Bit 12-13
  173.            1111111111222222222233
  174.  01234567890123456789012345678901
  175.  dgbtcooop lsyyeiaaafkkkkkkkkkkkk
  176. */
  177. #define COMMIT_SHIFT       (4)
  178. #define START_SHIFT        (11)
  179. #define SIMPLE_SHIFT       (8)
  180. #define DIRTY_SHIFT        (0)
  181. #define EXECUTE_SHIFT      (10)
  182. #define INTERPRETED_SHIFT  (15)
  183. #define DISTR_GROUP_SHIFT  (1)
  184. #define DISTR_GROUP_TYPE_SHIFT  (3)
  185. #define DISTR_KEY_SHIFT    (2)
  186. #define SCAN_SHIFT         (14)
  187. #define OPERATION_SHIFT   (5)
  188. #define OPERATION_MASK    (7)
  189. #define AINFO_SHIFT       (16)
  190. #define AINFO_MASK        (7)
  191. #define KEY_LEN_SHIFT     (20)
  192. #define KEY_LEN_MASK      (4095)
  193. #define COMMIT_TYPE_SHIFT  (12)
  194. #define COMMIT_TYPE_MASK   (3)
  195. #define EXECUTING_TRIGGER_SHIFT (19)
  196. /**
  197.  * Scan Info
  198.  *
  199.  t = Scan take over indicator -  1 Bit
  200.  n = Take over node           - 12 Bits -> max 65535
  201.  p = Scan Info                - 18 Bits -> max 4095
  202.            1111111111222222222233
  203.  01234567890123456789012345678901
  204.  tpppppppppppppppppp nnnnnnnnnnnn
  205. */
  206. #define TAKE_OVER_SHIFT      (0)
  207. #define TAKE_OVER_NODE_SHIFT (20)
  208. #define TAKE_OVER_NODE_MASK  (4095)
  209. #define SCAN_INFO_SHIFT      (1)
  210. #define SCAN_INFO_MASK       (262143)
  211. /**
  212.  * Attr Len
  213.  *
  214.  n = Attrinfo length(words)   - 16 Bits -> max 65535
  215.  a = API version no           - 16 Bits -> max 65535
  216.            1111111111222222222233
  217.  01234567890123456789012345678901
  218.  aaaaaaaaaaaaaaaannnnnnnnnnnnnnnn
  219. */
  220. #define API_VER_NO_SHIFT     (16)
  221. #define API_VER_NO_MASK      (65535)
  222. #define ATTRLEN_SHIFT        (0)
  223. #define ATTRLEN_MASK         (65535)
  224. inline
  225. Uint8
  226. TcKeyReq::getCommitFlag(const UintR & requestInfo){
  227.   return (Uint8)((requestInfo >> COMMIT_SHIFT) & 1);
  228. }
  229. inline
  230. Uint8
  231. TcKeyReq::getAbortOption(const UintR & requestInfo){
  232.   return (Uint8)((requestInfo >> COMMIT_TYPE_SHIFT) & COMMIT_TYPE_MASK);
  233. }
  234. inline
  235. Uint8
  236. TcKeyReq::getStartFlag(const UintR & requestInfo){
  237.   return (Uint8)((requestInfo >> START_SHIFT) & 1);
  238. }
  239. inline
  240. Uint8
  241. TcKeyReq::getSimpleFlag(const UintR & requestInfo){
  242.   return (Uint8)((requestInfo >> SIMPLE_SHIFT) & 1);
  243. }
  244. inline
  245. Uint8
  246. TcKeyReq::getExecuteFlag(const UintR & requestInfo){
  247.   return (Uint8)((requestInfo >> EXECUTE_SHIFT) & 1);
  248. }
  249. inline
  250. Uint8
  251. TcKeyReq::getDirtyFlag(const UintR & requestInfo){
  252.   return (Uint8)((requestInfo >> DIRTY_SHIFT) & 1);
  253. }
  254. inline
  255. Uint8
  256. TcKeyReq::getInterpretedFlag(const UintR & requestInfo){
  257.   return (Uint8)((requestInfo >> INTERPRETED_SHIFT) & 1);
  258. }
  259. inline
  260. Uint8
  261. TcKeyReq::getDistributionGroupFlag(const UintR & requestInfo){
  262.   return (Uint8)((requestInfo >> DISTR_GROUP_SHIFT) & 1);
  263. }
  264. inline
  265. Uint8
  266. TcKeyReq::getDistributionGroupTypeFlag(const UintR & requestInfo){
  267.   return (Uint8)((requestInfo >> DISTR_GROUP_TYPE_SHIFT) & 1);
  268. }
  269. inline
  270. Uint8
  271. TcKeyReq::getDistributionKeyFlag(const UintR & requestInfo){
  272.   return (Uint8)((requestInfo >> DISTR_KEY_SHIFT) & 1);
  273. }
  274. inline
  275. Uint8
  276. TcKeyReq::getScanIndFlag(const UintR & requestInfo){
  277.   return (Uint8)((requestInfo >> SCAN_SHIFT) & 1);
  278. }
  279. inline
  280. Uint8
  281. TcKeyReq::getOperationType(const UintR & requestInfo){
  282.   return (Uint8)((requestInfo >> OPERATION_SHIFT) & OPERATION_MASK);
  283. }
  284. inline
  285. Uint16 
  286. TcKeyReq::getKeyLength(const UintR & requestInfo){
  287.   return (Uint16)((requestInfo >> KEY_LEN_SHIFT) & KEY_LEN_MASK);
  288. }
  289. inline
  290. Uint8
  291. TcKeyReq::getAIInTcKeyReq(const UintR & requestInfo){
  292.   return (Uint8)((requestInfo >> AINFO_SHIFT) & AINFO_MASK);
  293. }
  294. inline
  295. Uint8
  296. TcKeyReq::getExecutingTrigger(const UintR & requestInfo){
  297.   return (Uint8)((requestInfo >> EXECUTING_TRIGGER_SHIFT) & 1);
  298. }
  299. inline
  300. void 
  301. TcKeyReq::clearRequestInfo(UintR & requestInfo){
  302.   requestInfo = 0;
  303. }
  304. inline
  305. void 
  306. TcKeyReq::setAbortOption(UintR & requestInfo, Uint32 type){
  307.   ASSERT_MAX(type, COMMIT_TYPE_MASK, "TcKeyReq::setAbortOption");
  308.   requestInfo &= ~(COMMIT_TYPE_MASK << COMMIT_TYPE_SHIFT);
  309.   requestInfo |= (type << COMMIT_TYPE_SHIFT);
  310. }
  311. inline
  312. void 
  313. TcKeyReq::setCommitFlag(UintR & requestInfo, Uint32 flag){
  314.   ASSERT_BOOL(flag, "TcKeyReq::setCommitFlag");
  315.   requestInfo &= ~(1 << COMMIT_SHIFT);
  316.   requestInfo |= (flag << COMMIT_SHIFT);
  317. }
  318. inline
  319. void 
  320. TcKeyReq::setStartFlag(UintR & requestInfo, Uint32 flag){
  321.   ASSERT_BOOL(flag, "TcKeyReq::setStartFlag");
  322.   requestInfo &= ~(1 << START_SHIFT);
  323.   requestInfo |= (flag << START_SHIFT);
  324. }
  325. inline
  326. void 
  327. TcKeyReq::setSimpleFlag(UintR & requestInfo, Uint32 flag){
  328.   ASSERT_BOOL(flag, "TcKeyReq::setSimpleFlag");
  329.   requestInfo &= ~(1 << SIMPLE_SHIFT);
  330.   requestInfo |= (flag << SIMPLE_SHIFT);
  331. }
  332. inline
  333. void 
  334. TcKeyReq::setDirtyFlag(UintR & requestInfo, Uint32 flag){
  335.   ASSERT_BOOL(flag, "TcKeyReq::setDirstFlag");
  336.   requestInfo &= ~(1 << DIRTY_SHIFT);
  337.   requestInfo |= (flag << DIRTY_SHIFT);
  338. }
  339. inline
  340. void 
  341. TcKeyReq::setExecuteFlag(UintR & requestInfo, Uint32 flag){
  342.   ASSERT_BOOL(flag, "TcKeyReq::setExecuteFlag");
  343.   requestInfo &= ~(1 << EXECUTE_SHIFT);
  344.   requestInfo |= (flag << EXECUTE_SHIFT);
  345. }
  346. inline
  347. void 
  348. TcKeyReq::setInterpretedFlag(UintR & requestInfo, Uint32 flag){
  349.   ASSERT_BOOL(flag, "TcKeyReq::setInterpretedFlag");
  350.   requestInfo &= ~(1 << INTERPRETED_SHIFT);
  351.   requestInfo |= (flag << INTERPRETED_SHIFT);
  352. }
  353. inline
  354. void 
  355. TcKeyReq::setDistributionGroupTypeFlag(UintR & requestInfo, Uint32 flag){
  356.   ASSERT_BOOL(flag, "TcKeyReq::setDistributionGroupTypeFlag");
  357.   requestInfo &= ~(1 << DISTR_GROUP_TYPE_SHIFT);
  358.   requestInfo |= (flag << DISTR_GROUP_TYPE_SHIFT);
  359. }
  360. inline
  361. void 
  362. TcKeyReq::setDistributionGroupFlag(UintR & requestInfo, Uint32 flag){
  363.   ASSERT_BOOL(flag, "TcKeyReq::setDistributionGroupFlag");
  364.   requestInfo &= ~(1 << DISTR_GROUP_SHIFT);
  365.   requestInfo |= (flag << DISTR_GROUP_SHIFT);
  366. }
  367. inline
  368. void 
  369. TcKeyReq::setDistributionKeyFlag(UintR & requestInfo, Uint32 flag){
  370.   ASSERT_BOOL(flag, "TcKeyReq::setDistributionKeyFlag");
  371.   requestInfo &= ~(1 << DISTR_KEY_SHIFT);
  372.   requestInfo |= (flag << DISTR_KEY_SHIFT);
  373. }
  374. inline
  375. void 
  376. TcKeyReq::setScanIndFlag(UintR & requestInfo, Uint32 flag){
  377.   ASSERT_BOOL(flag, "TcKeyReq::setScanIndFlag");
  378.   requestInfo &= ~(1 << SCAN_SHIFT);
  379.   requestInfo |= (flag << SCAN_SHIFT);
  380. }
  381. inline
  382. void 
  383. TcKeyReq::setOperationType(UintR & requestInfo, Uint32 type){
  384.   ASSERT_MAX(type, OPERATION_MASK, "TcKeyReq::setOperationType");
  385.   requestInfo &= ~(OPERATION_MASK << OPERATION_SHIFT);
  386.   requestInfo |= (type << OPERATION_SHIFT);
  387. }
  388. inline
  389. void 
  390. TcKeyReq::setKeyLength(UintR & requestInfo, Uint32 len){
  391.   ASSERT_MAX(len, KEY_LEN_MASK, "TcKeyReq::setKeyLength");
  392.   requestInfo &= ~(KEY_LEN_MASK << KEY_LEN_SHIFT);
  393.   requestInfo |= (len << KEY_LEN_SHIFT);
  394. }
  395. inline
  396. void 
  397. TcKeyReq::setAIInTcKeyReq(UintR & requestInfo, Uint32 len){
  398.   ASSERT_MAX(len, AINFO_MASK, "TcKeyReq::setAIInTcKeyReq");
  399.   requestInfo &= ~(AINFO_MASK << AINFO_SHIFT);
  400.   requestInfo |= (len << AINFO_SHIFT);
  401. }
  402. inline
  403. void 
  404. TcKeyReq::setExecutingTrigger(UintR & requestInfo, Uint32 flag){
  405.   ASSERT_BOOL(flag, "TcKeyReq::setExecutingTrigger");
  406.   requestInfo &= ~(1 << EXECUTING_TRIGGER_SHIFT);
  407.   requestInfo |= (flag << EXECUTING_TRIGGER_SHIFT);
  408. }
  409. inline
  410. Uint8 
  411. TcKeyReq::getTakeOverScanFlag(const UintR & scanInfo){
  412.   return (Uint8)((scanInfo >> TAKE_OVER_SHIFT) & 1);
  413. }
  414. inline
  415. Uint16
  416. TcKeyReq::getTakeOverScanNode(const UintR & scanInfo){
  417.   return (Uint16)((scanInfo >> TAKE_OVER_NODE_SHIFT) & TAKE_OVER_NODE_MASK);
  418. }
  419. inline
  420. Uint32 
  421. TcKeyReq::getTakeOverScanInfo(const UintR & scanInfo){
  422.   return (Uint32)((scanInfo >> SCAN_INFO_SHIFT) & SCAN_INFO_MASK);
  423. }
  424. inline
  425. void
  426. TcKeyReq::setTakeOverScanFlag(UintR & scanInfo, Uint8 flag){
  427.   ASSERT_BOOL(flag, "TcKeyReq::setTakeOverScanFlag");
  428.   scanInfo |= (flag << TAKE_OVER_SHIFT);
  429. }
  430. inline
  431. void
  432. TcKeyReq::setTakeOverScanNode(UintR & scanInfo, Uint16 node){
  433. //  ASSERT_MAX(node, TAKE_OVER_NODE_MASK, "TcKeyReq::setTakeOverScanNode");
  434.   scanInfo |= (node << TAKE_OVER_NODE_SHIFT);
  435. }
  436. inline
  437. void
  438. TcKeyReq::setTakeOverScanInfo(UintR & scanInfo, Uint32 aScanInfo){
  439. //  ASSERT_MAX(aScanInfo, SCAN_INFO_MASK, "TcKeyReq::setTakeOverScanInfo");
  440.   scanInfo |= (aScanInfo << SCAN_INFO_SHIFT);
  441. }
  442. inline
  443. Uint16
  444. TcKeyReq::getAPIVersion(const UintR & anAttrLen){
  445.   return (Uint16)((anAttrLen >> API_VER_NO_SHIFT) & API_VER_NO_MASK);
  446. }
  447. inline
  448. void
  449. TcKeyReq::setAPIVersion(UintR & anAttrLen, Uint16 apiVersion){
  450. // ASSERT_MAX(apiVersion, API_VER_NO_MASK, "TcKeyReq::setAPIVersion");
  451.   anAttrLen |= (apiVersion << API_VER_NO_SHIFT);
  452. }
  453. inline
  454. Uint16
  455. TcKeyReq::getAttrinfoLen(const UintR & anAttrLen){
  456.   return (Uint16)((anAttrLen) & ATTRLEN_MASK);
  457. }
  458. inline
  459. void
  460. TcKeyReq::setAttrinfoLen(UintR & anAttrLen, Uint16 aiLen){
  461. //  ASSERT_MAX(aiLen, ATTRLEN_MASK, "TcKeyReq::setAttrinfoLen");
  462.   anAttrLen |= aiLen;
  463. }
  464. #endif