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

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 LQH_KEY_H
  14. #define LQH_KEY_H
  15. #include "SignalData.hpp"
  16. class LqhKeyReq {
  17.   /**
  18.    * Reciver(s)
  19.    */
  20.   friend class Dblqh;         // Reciver
  21.   /**
  22.    * Sender(s)
  23.    */
  24.   friend class Dbtc;      
  25.   /**
  26.    * For printing
  27.    */
  28.   friend bool printLQHKEYREQ(FILE * output, const Uint32 * theData, Uint32 len, Uint16 receiverBlockNo);
  29. public:
  30.   STATIC_CONST( FixedSignalLength = 11 );
  31. private:
  32.   /**
  33.    * DATA VARIABLES
  34.    */
  35. //-------------------------------------------------------------
  36. // Unconditional part. First 10 words
  37. //-------------------------------------------------------------
  38.   UintR clientConnectPtr; // DATA 0
  39.   UintR attrLen;         // DATA 1
  40.   UintR hashValue; // DATA 2
  41.   UintR requestInfo;    // DATA 3
  42.   UintR tcBlockref; // DATA 4
  43.   UintR tableSchemaVersion; // DATA 5
  44.   UintR fragmentData; // DATA 6
  45.   UintR transId1; // DATA 7
  46.   UintR transId2; // DATA 8
  47.   UintR savePointId;            // DATA 9
  48.   union {
  49.     /**
  50.      * When sent from  TC -> LQH this variable contains scanInfo
  51.      * When send from LQH -> LQH this variable contains noFiredTriggers
  52.      */
  53.     UintR noFiredTriggers; // DATA 10 
  54.     Uint32 scanInfo;            // DATA 10
  55.   };
  56. //-------------------------------------------------------------
  57. // Variable sized key part. Those will be placed to
  58. // pack the signal in an appropriate manner.
  59. //-------------------------------------------------------------
  60.   UintR variableData[10];           // DATA 11 - 21
  61.   static UintR getAttrLen(const UintR & scanInfoAttrLen);
  62.   static UintR getScanTakeOverFlag(const UintR & scanInfoAttrLen);
  63.   static UintR getStoredProcFlag(const UintR & scanData);
  64.   static UintR getDistributionKey(const UintR & scanData);
  65.   
  66.   static UintR getTableId(const UintR & tableSchemaVersion);
  67.   static UintR getSchemaVersion(const UintR & tableSchemaVersion);
  68.   static UintR getFragmentId(const UintR & fragmentData);
  69.   static UintR getNextReplicaNodeId(const UintR & fragmentData);
  70.   static Uint8 getLockType(const UintR & requestInfo);
  71.   static Uint8 getDirtyFlag(const UintR & requestInfo);
  72.   static Uint8 getInterpretedFlag(const UintR & requestInfo);
  73.   static Uint8 getSimpleFlag(const UintR & requestInfo);
  74.   static Uint8 getOperation(const UintR & requestInfo);
  75.   static Uint8 getSeqNoReplica(const UintR & requestInfo);
  76.   static Uint8 getLastReplicaNo(const UintR & requestInfo);
  77.   static Uint8 getAIInLqhKeyReq(const UintR & requestInfo);
  78.   static UintR getKeyLen(const UintR & requestInfo);
  79.   static UintR getSameClientAndTcFlag(const UintR & requestInfo);
  80.   static UintR getReturnedReadLenAIFlag(const UintR & requestInfo);
  81.   static UintR getApplicationAddressFlag(const UintR & requestInfo);
  82.   static UintR getMarkerFlag(const UintR & requestInfo);
  83.   /**
  84.    * Setters
  85.    */
  86.   static void setAttrLen(UintR & scanInfoAttrLen, UintR val);
  87.   static void setScanTakeOverFlag(UintR & scanInfoAttrLen, UintR val);
  88.   static void setStoredProcFlag(UintR & scanData, UintR val);
  89.   static void setDistributionKey(UintR & scanData, UintR val);
  90.   
  91.   static void setTableId(UintR & tableSchemaVersion, UintR val);
  92.   static void setSchemaVersion(UintR & tableSchemaVersion, UintR val);
  93.   static void setFragmentId(UintR & fragmentData, UintR val);
  94.   static void setNextReplicaNodeId(UintR & fragmentData, UintR val);
  95.   static void setLockType(UintR & requestInfo, UintR val);
  96.   static void setDirtyFlag(UintR & requestInfo, UintR val);
  97.   static void setInterpretedFlag(UintR & requestInfo, UintR val);
  98.   static void setSimpleFlag(UintR & requestInfo, UintR val);
  99.   static void setOperation(UintR & requestInfo, UintR val);
  100.   static void setSeqNoReplica(UintR & requestInfo, UintR val);
  101.   static void setLastReplicaNo(UintR & requestInfo, UintR val);
  102.   static void setAIInLqhKeyReq(UintR & requestInfo, UintR val);
  103.   static void setKeyLen(UintR & requestInfo, UintR val);
  104.   static void setSameClientAndTcFlag(UintR & requestInfo, UintR val);
  105.   static void setReturnedReadLenAIFlag(UintR & requestInfo, UintR val);
  106.   static void setApplicationAddressFlag(UintR & requestInfo, UintR val);
  107.   static void setMarkerFlag(UintR & requestInfo, UintR val);
  108. };
  109. /**
  110.  * Request Info
  111.  *
  112.  * k = Key len                - 10 Bits (0-9) max 1023
  113.  * l = Last Replica No        - 2  Bits -> Max 3 (10-11)
  114.  * t = Lock type              - 3  Bits -> Max 7 (12-14)
  115.  * p = Application Addr. Ind  - 1  Bit (15)
  116.  * d = Dirty indicator        - 1  Bit (16)
  117.  * i = Interpreted indicator  - 1  Bit (17)
  118.  * s = Simple indicator       - 1  Bit (18)
  119.  * o = Operation              - 3  Bits (19-21)
  120.  * r = Sequence replica       - 2  Bits (22-23)
  121.  * a = Attr Info in LQHKEYREQ - 3  Bits (24-26)
  122.  * c = Same client and tc     - 1  Bit (27)
  123.  * u = Read Len Return Ind    - 1  Bit (28)
  124.  * m = Commit ack marker      - 1  Bit (29)
  125.  * - = Unused                 - 2  Bits (30-31)
  126.  *
  127.  *           1111111111222222222233
  128.  * 01234567890123456789012345678901
  129.  * kkkkkkkkkklltttpdisooorraaacum--
  130.  */
  131. #define RI_KEYLEN_SHIFT      (0)
  132. #define RI_KEYLEN_MASK       (1023)
  133. #define RI_LAST_REPL_SHIFT   (10)
  134. #define RI_LAST_REPL_MASK    (3)
  135. #define RI_LOCK_TYPE_SHIFT   (12)
  136. #define RI_LOCK_TYPE_MASK    (7)
  137. #define RI_APPL_ADDR_SHIFT   (15)
  138. #define RI_DIRTY_SHIFT       (16)
  139. #define RI_INTERPRETED_SHIFT (17)
  140. #define RI_SIMPLE_SHIFT      (18)
  141. #define RI_OPERATION_SHIFT   (19)
  142. #define RI_OPERATION_MASK    (7)
  143. #define RI_SEQ_REPLICA_SHIFT (22)
  144. #define RI_SEQ_REPLICA_MASK  (3)
  145. #define RI_AI_IN_THIS_SHIFT  (24)
  146. #define RI_AI_IN_THIS_MASK   (7)
  147. #define RI_SAME_CLIENT_SHIFT (27)
  148. #define RI_RETURN_AI_SHIFT   (28)
  149. #define RI_MARKER_SHIFT      (29)
  150. /**
  151.  * Scan Info
  152.  *
  153.  * a = Attr Len                 - 16 Bits -> max 65535 (0-15)
  154.  * p = Stored Procedure Ind     -  1 Bit (16)
  155.  * d = Distribution key         -  8 Bit  -> max 255 (17-24)
  156.  * t = Scan take over indicator -  1 Bit (25)
  157.  *
  158.  *           1111111111222222222233
  159.  * 01234567890123456789012345678901
  160.  * aaaaaaaaaaaaaaaapddddddddt             
  161.  */
  162. #define SI_ATTR_LEN_MASK     (65535)
  163. #define SI_ATTR_LEN_SHIFT    (0)
  164. #define SI_STORED_PROC_SHIFT (16)
  165. #define SI_DISTR_KEY_MASK    (255)
  166. #define SI_DISTR_KEY_SHIFT   (17)
  167. #define SI_SCAN_TO_SHIFT     (25)
  168. #define SI_SCAN_INFO_MASK    (63)
  169. #define SI_SCAN_INFO_SHIFT   (26)
  170. inline 
  171. UintR
  172. LqhKeyReq::getAttrLen(const UintR & scanData)
  173. {
  174.   return (scanData >> SI_ATTR_LEN_SHIFT) & SI_ATTR_LEN_MASK;
  175. }
  176. inline 
  177. Uint32
  178. LqhKeyReq::getScanTakeOverFlag(const UintR & scanData)
  179. {
  180.   return (scanData >> SI_SCAN_TO_SHIFT) & 1;
  181. }
  182. inline
  183. UintR
  184. LqhKeyReq::getStoredProcFlag(const UintR & scanData){
  185.   return (scanData >> SI_STORED_PROC_SHIFT) & 1;
  186. }
  187. inline
  188. UintR
  189. LqhKeyReq::getDistributionKey(const UintR & scanData){
  190.   return (scanData >> SI_DISTR_KEY_SHIFT) & SI_DISTR_KEY_MASK;
  191. }
  192. inline 
  193. UintR LqhKeyReq::getTableId(const UintR & tableSchemaVersion)
  194. {
  195.  return tableSchemaVersion & 0xFFFF;
  196. }
  197. inline 
  198. UintR LqhKeyReq::getSchemaVersion(const UintR & tableSchemaVersion)
  199. {
  200.   return tableSchemaVersion >> 16;
  201. }
  202. inline 
  203. UintR LqhKeyReq::getFragmentId(const UintR & fragmentData)
  204. {
  205.   return fragmentData & 0xFFFF;
  206. }
  207. inline 
  208. UintR LqhKeyReq::getNextReplicaNodeId(const UintR & fragmentData)
  209. {
  210.  return fragmentData >> 16;
  211. }
  212. inline 
  213. Uint8 LqhKeyReq::getLastReplicaNo(const UintR & requestInfo)
  214. {
  215.  return (requestInfo >> RI_LAST_REPL_SHIFT) & RI_LAST_REPL_MASK;
  216. }
  217. inline 
  218. Uint8 LqhKeyReq::getLockType(const UintR & requestInfo)
  219. {
  220.   return (requestInfo >> RI_LOCK_TYPE_SHIFT) & RI_LOCK_TYPE_MASK;
  221. }
  222. inline 
  223. Uint8 LqhKeyReq::getDirtyFlag(const UintR & requestInfo)
  224. {
  225.   return (requestInfo >> RI_DIRTY_SHIFT) & 1;
  226. }
  227. inline 
  228. Uint8 LqhKeyReq::getInterpretedFlag(const UintR & requestInfo)
  229. {
  230.   return (requestInfo >> RI_INTERPRETED_SHIFT) & 1;
  231. }
  232. inline 
  233. Uint8 LqhKeyReq::getSimpleFlag(const UintR & requestInfo)
  234. {
  235.   return (requestInfo >> RI_SIMPLE_SHIFT) & 1;
  236. }
  237. inline 
  238. Uint8 LqhKeyReq::getOperation(const UintR & requestInfo)
  239. {
  240.   return (requestInfo >> RI_OPERATION_SHIFT) & RI_OPERATION_MASK;
  241. }
  242. inline 
  243. Uint8 LqhKeyReq::getSeqNoReplica(const UintR & requestInfo)
  244. {
  245.   return (requestInfo >> RI_SEQ_REPLICA_SHIFT) & RI_SEQ_REPLICA_MASK;
  246. }
  247. inline 
  248. Uint8 LqhKeyReq::getAIInLqhKeyReq(const UintR & requestInfo)
  249. {
  250.   return (requestInfo >> RI_AI_IN_THIS_SHIFT) & RI_AI_IN_THIS_MASK;
  251. }
  252. inline 
  253. UintR LqhKeyReq::getKeyLen(const UintR & requestInfo)
  254. {
  255.   return (requestInfo >> RI_KEYLEN_SHIFT) & RI_KEYLEN_MASK;
  256. }
  257. inline 
  258. UintR 
  259. LqhKeyReq::getSameClientAndTcFlag(const UintR & requestInfo)
  260. {
  261.   return (requestInfo >> RI_SAME_CLIENT_SHIFT) & 1;
  262. }
  263. inline 
  264. UintR LqhKeyReq::getReturnedReadLenAIFlag(const UintR & requestInfo)
  265. {
  266.   return (requestInfo >> RI_RETURN_AI_SHIFT) & 1;
  267. }
  268. inline
  269. UintR 
  270. LqhKeyReq::getApplicationAddressFlag(const UintR & requestInfo){
  271.   return (requestInfo >> RI_APPL_ADDR_SHIFT) & 1;
  272. }
  273. inline
  274. void
  275. LqhKeyReq::setAttrLen(UintR & scanInfoAttrLen, UintR val){
  276.   ASSERT_MAX(val, SI_ATTR_LEN_MASK, "LqhKeyReq::setAttrLen");
  277.   scanInfoAttrLen |= (val << SI_ATTR_LEN_SHIFT);
  278. }
  279. inline
  280. void
  281. LqhKeyReq::setScanTakeOverFlag(UintR & scanInfoAttrLen, UintR val){
  282.   ASSERT_BOOL(val, "LqhKeyReq::setScanTakeOverFlag");
  283.   scanInfoAttrLen |= (val << SI_SCAN_TO_SHIFT);
  284. }
  285. inline
  286. void
  287. LqhKeyReq::setStoredProcFlag(UintR & scanData, UintR val){
  288.   ASSERT_BOOL(val, "LqhKeyReq::setStoredProcFlag");
  289.   scanData |= (val << SI_STORED_PROC_SHIFT);
  290. }
  291. inline
  292. void
  293. LqhKeyReq::setDistributionKey(UintR & scanData, UintR val){
  294.   ASSERT_MAX(val, SI_DISTR_KEY_MASK, "LqhKeyReq::setDistributionKey");
  295.   scanData |= (val << SI_DISTR_KEY_SHIFT);
  296. }
  297. #if 0  
  298. inline
  299. void
  300. LqhKeyReq::setTableId(UintR & tableSchemaVersion, UintR val){
  301.   
  302. }
  303. inline
  304. void
  305. LqhKeyReq::setSchemaVersion(UintR & tableSchemaVersion, UintR val);
  306. inline
  307. void
  308. LqhKeyReq::setFragmentId(UintR & fragmentData, UintR val);
  309. inline
  310. void
  311. LqhKeyReq::setNextReplicaNodeId(UintR & fragmentData, UintR val);
  312. #endif
  313. inline
  314. void
  315. LqhKeyReq::setLockType(UintR & requestInfo, UintR val){
  316.   ASSERT_MAX(val, RI_LOCK_TYPE_MASK, "LqhKeyReq::setLockType");
  317.   requestInfo |= (val << RI_LOCK_TYPE_SHIFT);
  318. }
  319. inline
  320. void
  321. LqhKeyReq::setDirtyFlag(UintR & requestInfo, UintR val){
  322.   ASSERT_BOOL(val, "LqhKeyReq::setDirtyFlag");
  323.   requestInfo |= (val << RI_DIRTY_SHIFT);
  324. }
  325. inline
  326. void
  327. LqhKeyReq::setInterpretedFlag(UintR & requestInfo, UintR val){
  328.   ASSERT_BOOL(val, "LqhKeyReq::setInterpretedFlag");
  329.   requestInfo |= (val << RI_INTERPRETED_SHIFT);
  330. }
  331. inline
  332. void
  333. LqhKeyReq::setSimpleFlag(UintR & requestInfo, UintR val){
  334.   ASSERT_BOOL(val, "LqhKeyReq::setSimpleFlag");
  335.   requestInfo |= (val << RI_SIMPLE_SHIFT);
  336. }
  337. inline
  338. void
  339. LqhKeyReq::setOperation(UintR & requestInfo, UintR val){
  340.   ASSERT_MAX(val, RI_OPERATION_MASK, "LqhKeyReq::setOperation");
  341.   requestInfo |= (val << RI_OPERATION_SHIFT);
  342. }
  343. inline
  344. void
  345. LqhKeyReq::setSeqNoReplica(UintR & requestInfo, UintR val){
  346.   ASSERT_MAX(val, RI_SEQ_REPLICA_MASK, "LqhKeyReq::setSeqNoReplica");
  347.   requestInfo |= (val << RI_SEQ_REPLICA_SHIFT);
  348. }
  349. inline
  350. void
  351. LqhKeyReq::setLastReplicaNo(UintR & requestInfo, UintR val){
  352.   ASSERT_MAX(val, RI_LAST_REPL_MASK, "LqhKeyReq::setLastReplicaNo");
  353.   requestInfo |= (val << RI_LAST_REPL_SHIFT);
  354. }
  355. inline
  356. void
  357. LqhKeyReq::setAIInLqhKeyReq(UintR & requestInfo, UintR val){
  358.   ASSERT_MAX(val, RI_AI_IN_THIS_MASK, "LqhKeyReq::setAIInLqhKeyReq");
  359.   requestInfo |= (val << RI_AI_IN_THIS_SHIFT);
  360. }
  361. inline
  362. void
  363. LqhKeyReq::setKeyLen(UintR & requestInfo, UintR val){
  364.   ASSERT_MAX(val, RI_KEYLEN_MASK, "LqhKeyReq::setKeyLen");
  365.   requestInfo |= (val << RI_KEYLEN_SHIFT);
  366. }
  367. inline
  368. void
  369. LqhKeyReq::setSameClientAndTcFlag(UintR & requestInfo, UintR val){
  370.   ASSERT_BOOL(val, "LqhKeyReq::setSameClientAndTcFlag");
  371.   requestInfo |= (val << RI_SAME_CLIENT_SHIFT);
  372. }
  373. inline
  374. void
  375. LqhKeyReq::setReturnedReadLenAIFlag(UintR & requestInfo, UintR val){
  376.   ASSERT_BOOL(val, "LqhKeyReq::setReturnedReadLenAIFlag");
  377.   requestInfo |= (val << RI_RETURN_AI_SHIFT);
  378. }
  379. inline
  380. void
  381. LqhKeyReq::setApplicationAddressFlag(UintR & requestInfo, UintR val){
  382.   ASSERT_BOOL(val, "LqhKeyReq::setApplicationAddressFlag");
  383.   requestInfo |= (val << RI_APPL_ADDR_SHIFT);
  384. }
  385. /**** */
  386. inline
  387. void
  388. LqhKeyReq::setMarkerFlag(UintR & requestInfo, UintR val){
  389.   ASSERT_BOOL(val, "LqhKeyReq::setMarkerFlag");
  390.   requestInfo |= (val << RI_MARKER_SHIFT);
  391. }
  392. inline
  393. UintR 
  394. LqhKeyReq::getMarkerFlag(const UintR & requestInfo){
  395.   return (requestInfo >> RI_MARKER_SHIFT) & 1;
  396. }
  397. class LqhKeyConf {
  398.   /**
  399.    * Reciver(s)
  400.    */
  401.   friend class Dbtc;
  402.   /**
  403.    * Sender(s)
  404.    */
  405.   friend class Dblqh;
  406.   // Sent in a packed signal
  407.   friend class PackedSignal;
  408.   /**
  409.    * For printing
  410.    */
  411.   friend bool printPACKED_SIGNAL(FILE * output, const Uint32 * theData, Uint32 len, Uint16 receiverBlockNo);
  412.   friend bool printLQHKEYCONF(FILE * output, const Uint32 * theData, Uint32 len, Uint16 receiverBlockNo);
  413. public:
  414.   STATIC_CONST( SignalLength = 7 );
  415. private:
  416.   /**
  417.    * DATA VARIABLES
  418.    */
  419.   Uint32 connectPtr;
  420.   Uint32 opPtr;
  421.   Uint32 userRef;
  422.   Uint32 readLen;
  423.   Uint32 transId1;
  424.   Uint32 transId2;
  425.   Uint32 noFiredTriggers;
  426. };
  427. class LqhKeyRef {
  428.   /**
  429.    * Reciver(s)
  430.    */
  431.   friend class Dbtc;      
  432.   /**
  433.    * Sender(s)
  434.    */
  435.   friend class Dblqh;
  436.   /**
  437.    * For printing
  438.    */
  439.   friend bool printLQHKEYREF(FILE * output, const Uint32 * theData, Uint32 len, Uint16 receiverBlockNo);
  440. public:
  441.   STATIC_CONST( SignalLength = 5 );
  442. private:
  443.   /**
  444.    * DATA VARIABLES
  445.    */
  446.   Uint32 userRef;
  447.   Uint32 connectPtr;
  448.   Uint32 errorCode;
  449.   Uint32 transId1;
  450.   Uint32 transId2;
  451. };
  452. #endif