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

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 DBACC_H
  14. #define DBACC_H
  15. #include <pc.hpp>
  16. #include <SimulatedBlock.hpp>
  17. #ifdef DBACC_C
  18. // Debug Macros
  19. #define dbgWord32(ptr, ind, val) 
  20. /*
  21. #define dbgWord32(ptr, ind, val) 
  22. if(debug_jan){ 
  23. tmp_val = val; 
  24. switch(ind){ 
  25. case 1: strcpy(tmp_string, "ZPOS_PAGE_TYPE   "); 
  26. break; 
  27. case 2: strcpy(tmp_string, "ZPOS_NO_ELEM_IN_PAGE"); 
  28. break; 
  29. case 3: strcpy(tmp_string, "ZPOS_CHECKSUM    "); 
  30. break; 
  31. case 4: strcpy(tmp_string, "ZPOS_OVERFLOWREC  "); 
  32. break; 
  33. case 5: strcpy(tmp_string, "ZPOS_FREE_AREA_IN_PAGE"); 
  34. break; 
  35. case 6: strcpy(tmp_string, "ZPOS_LAST_INDEX   "); 
  36. break; 
  37. case 7: strcpy(tmp_string, "ZPOS_INSERT_INDEX  "); 
  38. break; 
  39. case 8: strcpy(tmp_string, "ZPOS_ARRAY_POS    "); 
  40. break; 
  41. case 9: strcpy(tmp_string, "ZPOS_NEXT_FREE_INDEX"); 
  42. break; 
  43. case 10: strcpy(tmp_string, "ZPOS_NEXT_PAGE   "); 
  44. break; 
  45. case 11: strcpy(tmp_string, "ZPOS_PREV_PAGE   "); 
  46. break; 
  47. default: sprintf(tmp_string, "%-20d", ind);
  48. ndbout << "Ptr: " << ptr.p->word32 << " tIndex: " << tmp_string << " tValue: " << tmp_val << " tLINE: " << __LINE__ << endl; 
  49. }
  50. */
  51. #define dbgUndoword(ptr, ind, val)
  52. // Constants
  53. /** ------------------------------------------------------------------------ 
  54.  *   THESE ARE CONSTANTS THAT ARE USED FOR DEFINING THE SIZE OF BUFFERS, THE
  55.  *   SIZE OF PAGE HEADERS, THE NUMBER OF BUFFERS IN A PAGE AND A NUMBER OF 
  56.  *   OTHER CONSTANTS WHICH ARE CHANGED WHEN THE BUFFER SIZE IS CHANGED. 
  57.  * ----------------------------------------------------------------------- */
  58. #define ZHEAD_SIZE 32
  59. #define ZCON_HEAD_SIZE 2
  60. #define ZBUF_SIZE 28
  61. #define ZEMPTYLIST 72
  62. #define ZUP_LIMIT 14
  63. #define ZDOWN_LIMIT 12
  64. #define ZSHIFT_PLUS 5
  65. #define ZSHIFT_MINUS 2
  66. #define ZFREE_LIMIT 65
  67. #define ZNO_CONTAINERS 64
  68. #define ZELEM_HEAD_SIZE 1
  69. /* ------------------------------------------------------------------------- */
  70. /*  THESE CONSTANTS DEFINE THE USE OF THE PAGE HEADER IN THE INDEX PAGES.    */
  71. /* ------------------------------------------------------------------------- */
  72. #define ZPOS_PAGE_ID 0
  73. #define ZPOS_PAGE_TYPE 1
  74. #define ZPOS_PAGE_TYPE_BIT 14
  75. #define ZPOS_EMPTY_LIST 1
  76. #define ZPOS_ALLOC_CONTAINERS 2
  77. #define ZPOS_CHECKSUM 3
  78. #define ZPOS_OVERFLOWREC 4
  79. #define ZPOS_NO_ELEM_IN_PAGE 2
  80. #define ZPOS_FREE_AREA_IN_PAGE 5
  81. #define ZPOS_LAST_INDEX 6
  82. #define ZPOS_INSERT_INDEX 7
  83. #define ZPOS_ARRAY_POS 8
  84. #define ZPOS_NEXT_FREE_INDEX 9
  85. #define ZPOS_NEXT_PAGE 10
  86. #define ZPOS_PREV_PAGE 11
  87. #define ZNORMAL_PAGE_TYPE 0
  88. #define ZOVERFLOW_PAGE_TYPE 1
  89. #define ZLONG_PAGE_TYPE 2
  90. #define ZDEFAULT_LIST 3
  91. #define ZWORDS_IN_PAGE 2048
  92. /* --------------------------------------------------------------------------------- */
  93. /*       CONSTANTS FOR THE ZERO PAGES                                                */
  94. /* --------------------------------------------------------------------------------- */
  95. #define ZPAGEZERO_PREV_UNDOP 8
  96. #define ZPAGEZERO_NO_OVER_PAGE 9
  97. #define ZPAGEZERO_TABID 10
  98. #define ZPAGEZERO_FRAGID0 11
  99. #define ZPAGEZERO_FRAGID1 12
  100. #define ZPAGEZERO_HASH_CHECK 13
  101. #define ZPAGEZERO_DIRSIZE 14
  102. #define ZPAGEZERO_EXPCOUNTER 15
  103. #define ZPAGEZERO_NEXT_UNDO_FILE 16
  104. #define ZPAGEZERO_SLACK 17
  105. #define ZPAGEZERO_NO_PAGES 18
  106. #define ZPAGEZERO_HASHCHECKBIT 19
  107. #define ZPAGEZERO_K 20
  108. #define ZPAGEZERO_LHFRAGBITS 21
  109. #define ZPAGEZERO_LHDIRBITS 22
  110. #define ZPAGEZERO_LOCALKEYLEN 23
  111. #define ZPAGEZERO_MAXP 24
  112. #define ZPAGEZERO_MAXLOADFACTOR 25
  113. #define ZPAGEZERO_MINLOADFACTOR 26
  114. #define ZPAGEZERO_MYFID 27
  115. #define ZPAGEZERO_LAST_OVER_INDEX 28
  116. #define ZPAGEZERO_P 29
  117. #define ZPAGEZERO_NO_OF_ELEMENTS 30
  118. #define ZPAGEZERO_ELEMENT_LENGTH 31
  119. #define ZPAGEZERO_KEY_LENGTH 32
  120. #define ZPAGEZERO_NODETYPE 33
  121. #define ZPAGEZERO_SLACK_CHECK 34
  122. /* --------------------------------------------------------------------------------- */
  123. /*       CONSTANTS FOR THE LONG KEY PAGES                                            */
  124. /* --------------------------------------------------------------------------------- */
  125. /* --------------------------------------------------------------------------------- */
  126. // Maximum number of elements in long key page = (ZWORDS_IN_PAGE - ZHEAD_SIZE) /
  127. // (MinKeySize + IndexSize) = (2048 - 32) / (8 + 1) = 224. MinKeySize is actually 9
  128. // because 8 is the largest normal key size.
  129. #define ZMAX_NO_OF_LONGKEYS_IN_PAGE 225
  130. #define ZMAX_LONG_KEY_ARRAY_INDEX 3
  131. #define ZACTIVE_LONG_KEY_LEN 1
  132. /* --------------------------------------------------------------------------------- */
  133. /*       CONSTANTS IN ALPHABETICAL ORDER                                             */
  134. /* --------------------------------------------------------------------------------- */
  135. #define ZADDFRAG 0
  136. #define ZCOPY_NEXT 1
  137. #define ZCOPY_NEXT_COMMIT 2
  138. #define ZCOPY_COMMIT 3
  139. #define ZCOPY_REPEAT 4
  140. #define ZCOPY_ABORT 5
  141. #define ZCOPY_CLOSE 6
  142. #define ZDIRARRAY 68
  143. #define ZDIRRANGESIZE 65
  144. //#define ZEMPTY_FRAGMENT 0
  145. #define ZFRAGMENTSIZE 64
  146. #define ZFIRSTTIME 1
  147. #define ZFS_CONNECTSIZE 300
  148. #define ZFS_OPSIZE 100
  149. #define ZKEYINKEYREQ 4
  150. #define ZLCP_CONNECTSIZE 30
  151. #define ZLEFT 1
  152. #define ZLOCALLOGFILE 2
  153. #define ZLOCKED 0
  154. #define ZMAXSCANSIGNALLEN 20
  155. #define ZMAINKEYLEN 8
  156. #define ZMAX_UNDO_VERSION 4
  157. #define ZNO_OF_DISK_VERSION 3
  158. #define ZNO_OF_OP_PER_SIGNAL 20
  159. //#define ZNOT_EMPTY_FRAGMENT 1
  160. #define ZNR_OF_UNDO_PAGE_GROUP 16
  161. #define ZOP_HEAD_INFO_LN 3
  162. #define ZOPRECSIZE 740
  163. #define ZOVERFLOWRECSIZE 5
  164. #define ZPAGE8_BASE_ADD 1
  165. #define ZPAGESIZE 128
  166. #define ZPARALLEL_QUEUE 1
  167. #define ZPDIRECTORY 1
  168. #define ZSCAN_MAX_LOCK 4
  169. #define ZSERIAL_QUEUE 2
  170. #define ZSPH1 1
  171. #define ZSPH2 2
  172. #define ZSPH3 3
  173. #define ZSPH6 6
  174. #define ZREADLOCK 0
  175. #define ZRIGHT 2
  176. #define ZROOTFRAGMENTSIZE 32
  177. #define ZSCAN_LOCK_ALL 3
  178. #define ZSCAN_OP 5
  179. #define ZSCAN_REC_SIZE 256
  180. #define ZSR_VERSION_REC_SIZE 16
  181. #define ZSTAND_BY 2
  182. #define ZTABLESIZE 16
  183. #define ZTABMAXINDEX 3
  184. #define ZUNDEFINED_OP 6
  185. #define ZUNDOHEADSIZE 7
  186. #define ZUNLOCKED 1
  187. #define ZUNDOPAGE_BASE_ADD 2
  188. #define ZUNDOPAGEINDEXBITS 13
  189. #define ZUNDOPAGEINDEX_MASK 0x1fff
  190. #define ZWRITEPAGESIZE 8
  191. #define ZWRITE_UNDOPAGESIZE 2
  192. #define ZMIN_UNDO_PAGES_AT_COMMIT 4
  193. #define ZMIN_UNDO_PAGES_AT_OPERATION 10
  194. #define ZMIN_UNDO_PAGES_AT_EXPAND 16
  195. /* --------------------------------------------------------------------------------- */
  196. /* CONTINUEB CODES                                                                   */
  197. /* --------------------------------------------------------------------------------- */
  198. #define ZLOAD_BAL_LCP_TIMER 0
  199. #define ZINITIALISE_RECORDS 1
  200. #define ZSR_READ_PAGES_ALLOC 2
  201. #define ZSTART_UNDO 3
  202. #define ZSEND_SCAN_HBREP 4
  203. #define ZREL_ROOT_FRAG 5
  204. #define ZREL_FRAG 6
  205. #define ZREL_DIR 7
  206. #define ZREPORT_MEMORY_USAGE 8
  207. #define ZLCP_OP_WRITE_RT_BREAK 9
  208. /* ------------------------------------------------------------------------- */
  209. /* ERROR CODES                                                               */
  210. /* ------------------------------------------------------------------------- */
  211. #define ZLIMIT_OF_ERROR 600 // Limit check for error codes
  212. #define ZCHECKROOT_ERROR 601 // Delete fragment error code
  213. #define ZCONNECT_SIZE_ERROR 602 // ACC_SEIZEREF
  214. #define ZDIR_RANGE_ERROR 603 // Add fragment error code
  215. #define ZFULL_FRAGRECORD_ERROR 604 // Add fragment error code
  216. #define ZFULL_ROOTFRAGRECORD_ERROR 605 // Add fragment error code
  217. #define ZROOTFRAG_STATE_ERROR 606 // Add fragment
  218. #define ZOVERTAB_REC_ERROR 607 // Add fragment
  219. #define ZSCAN_REFACC_CONNECT_ERROR 608 // ACC_SCANREF
  220. #define ZFOUR_ACTIVE_SCAN_ERROR 609 // ACC_SCANREF
  221. #define ZNULL_SCAN_REC_ERROR 610 // ACC_SCANREF
  222. #define ZDIRSIZE_ERROR 623
  223. #define ZOVER_REC_ERROR 624 // Insufficient Space
  224. #define ZPAGESIZE_ERROR 625
  225. #define ZTUPLE_DELETED_ERROR 626
  226. #define ZREAD_ERROR 626
  227. #define ZWRITE_ERROR 630
  228. #define ZTO_OP_STATE_ERROR 631
  229. #define ZTOO_EARLY_ACCESS_ERROR 632
  230. #define ZTEMPORARY_ACC_UNDO_FAILURE 677
  231. #endif
  232. class ElementHeader {
  233.   /**
  234.    * 
  235.    * l = Locked    -- If true contains operation else scan bits + hash value
  236.    * s = Scan bits
  237.    * h = Hash value
  238.    * o = Operation ptr I
  239.    *
  240.    *           1111111111222222222233
  241.    * 01234567890123456789012345678901
  242.    * lssssssssssss   hhhhhhhhhhhhhhhh
  243.    *  ooooooooooooooooooooooooooooooo
  244.    */
  245. public:
  246.   STATIC_CONST( HASH_VALUE_PART_MASK = 0xFFFF );
  247.   
  248.   static bool getLocked(Uint32 data);
  249.   static bool getUnlocked(Uint32 data);
  250.   static Uint32 getScanBits(Uint32 data);
  251.   static Uint32 getHashValuePart(Uint32 data);
  252.   static Uint32 getOpPtrI(Uint32 data);
  253.   static Uint32 setLocked(Uint32 opPtrI);
  254.   static Uint32 setUnlocked(Uint32 hashValuePart, Uint32 scanBits);
  255.   static Uint32 setScanBit(Uint32 header, Uint32 scanBit);
  256.   static Uint32 clearScanBit(Uint32 header, Uint32 scanBit);
  257. };
  258. inline 
  259. bool
  260. ElementHeader::getLocked(Uint32 data){
  261.   return (data & 1) == 0;
  262. }
  263. inline 
  264. bool
  265. ElementHeader::getUnlocked(Uint32 data){
  266.   return (data & 1) == 1;
  267. }
  268. inline 
  269. Uint32 
  270. ElementHeader::getScanBits(Uint32 data){
  271.   assert(getUnlocked(data));
  272.   return (data >> 1) & ((1 << MAX_PARALLEL_SCANS_PER_FRAG) - 1);
  273. }
  274. inline 
  275. Uint32 
  276. ElementHeader::getHashValuePart(Uint32 data){
  277.   assert(getUnlocked(data));
  278.   return data >> 16;
  279. }
  280. inline
  281. Uint32 
  282. ElementHeader::getOpPtrI(Uint32 data){
  283.   assert(getLocked(data));
  284.   return data >> 1;
  285. }
  286. inline 
  287. Uint32 
  288. ElementHeader::setLocked(Uint32 opPtrI){
  289.   return (opPtrI << 1) + 0;
  290. }
  291. inline
  292. Uint32 
  293. ElementHeader::setUnlocked(Uint32 hashValue, Uint32 scanBits){
  294.   return (hashValue << 16) + (scanBits << 1) + 1;
  295. }
  296. inline
  297. Uint32 
  298. ElementHeader::setScanBit(Uint32 header, Uint32 scanBit){
  299.   assert(getUnlocked(header));
  300.   return header | (scanBit << 1);
  301. }
  302. inline
  303. Uint32 
  304. ElementHeader::clearScanBit(Uint32 header, Uint32 scanBit){
  305.   assert(getUnlocked(header));
  306.   return header & (~(scanBit << 1));
  307. }
  308. class Dbacc: public SimulatedBlock {
  309. public:
  310. // State values
  311. enum State {
  312.   FREEFRAG = 0,
  313.   ACTIVEFRAG = 1,
  314.   SEND_QUE_OP = 2,
  315.   WAIT_ACC_LCPREQ = 3,
  316.   LCP_SEND_PAGES = 4,
  317.   LCP_SEND_OVER_PAGES = 5,
  318.   LCP_SEND_ZERO_PAGE = 6,
  319.   SR_READ_PAGES = 7,
  320.   SR_READ_OVER_PAGES = 8,
  321.   WAIT_ZERO_PAGE_STORED = 9,
  322.   WAIT_NOTHING = 10,
  323.   WAIT_OPEN_UNDO_LCP = 11,
  324.   WAIT_OPEN_UNDO_LCP_NEXT = 12,
  325.   WAIT_OPEN_DATA_FILE_FOR_READ = 13,
  326.   WAIT_OPEN_DATA_FILE_FOR_WRITE = 14,
  327.   OPEN_UNDO_FILE_SR = 15,
  328.   READ_UNDO_PAGE = 16,
  329.   READ_UNDO_PAGE_AND_CLOSE = 17,
  330.   WAIT_READ_DATA = 18,
  331.   WAIT_READ_PAGE_ZERO = 19,
  332.   WAIT_WRITE_DATA = 20,
  333.   WAIT_WRITE_UNDO = 21,
  334.   WAIT_WRITE_UNDO_EXIT = 22,
  335.   WAIT_CLOSE_UNDO = 23,
  336.   LCP_CLOSE_DATA = 24,
  337.   SR_CLOSE_DATA = 25,
  338.   WAIT_ONE_CONF = 26,
  339.   WAIT_TWO_CONF = 27,
  340.   LCP_FREE = 28,
  341.   LCP_ACTIVE = 29,
  342.   FREE_OP = 30,
  343.   WAIT_EXE_OP = 32,
  344.   WAIT_IN_QUEUE = 34,
  345.   EXE_OP = 35,
  346.   SCAN_ACTIVE = 36,
  347.   SCAN_WAIT_IN_QUEUE = 37,
  348.   IDLE = 39,
  349.   ACTIVE = 40,
  350.   WAIT_COMMIT_ABORT = 41,
  351.   ABORT = 42,
  352.   ABORTADDFRAG = 43,
  353.   REFUSEADDFRAG = 44,
  354.   DELETEFRAG = 45,
  355.   DELETETABLE = 46,
  356.   UNDEFINEDROOT = 47,
  357.   ADDFIRSTFRAG = 48,
  358.   ADDSECONDFRAG = 49,
  359.   DELETEFIRSTFRAG = 50,
  360.   DELETESECONDFRAG = 51,
  361.   ACTIVEROOT = 52,
  362.   LCP_CREATION = 53
  363. };
  364. // Records
  365. //---------------------------------------------------------------------------------- 
  366. // LONGKEY PAGE RECORD                                                          
  367. //     
  368. // A long key page consist of a header part, a key data part and an index part. The 
  369. // page starts with a header of size HEAD_SIZE. As you can see below, not every word 
  370. // in the header is used. After the header comes the data part, where the actual 
  371. // keys are stored. A key is always inserted after the existing keys in the data 
  372. // part. If we have a fragmented data part and a new key doesn't fit after the 
  373. // existing keys we reorganize the keys. The index part starts at the end of the 
  374. // page and grows towards the end of the data part. This means that the limit 
  375. // between the data part and the index part is floating. Each inserted key have a 
  376. // word in the index part that describes size and position of the key in the data 
  377. // part. The free indexes in the index part are single linked.
  378. //---------------------------------------------------------------------------------- 
  379.   union LongKeyPage {
  380.     struct {
  381.       Uint32 pageId; // ZPOS_PAGE_ID 0
  382.       Uint32 b;
  383.       // The number of keys in page.
  384.       Uint32 noOfElements; // ZPOS_NO_ELEM_IN_PAGE 2
  385.       Uint32 d;
  386.       Uint32 e;
  387.       // The free area in the data part of page.
  388.       Uint32 freeArea; // ZPOS_FREE_AREA_IN_PAGE 5
  389.       // The index position, which defines the limit between the data and the index part.
  390.       Uint32 highestIndex;  // ZPOS_LAST_INDEX 6
  391.       // The position where to insert the actual key in the data part.
  392.       Uint32 insertPos; // ZPOS_INSERT_INDEX 7
  393.       // Position in a page array where the pages are stored in a double linked list.
  394.       // Based on the free area in the page.  Values 0 to 3.
  395.       Uint32 pageArrayPos; // ZPOS_ARRAY_POS 8
  396.       // Next free position in the index part.
  397.       Uint32 nextFreeIndex; // ZPOS_NEXT_FREE_INDEX 9
  398.       // Next page in the double linked list.
  399.       Uint32 nextPage; // ZPOS_NEXT_PAGE  10
  400.       // Previous page in the double linked list.
  401.       Uint32 prevPage; // ZPOS_PREV_PAGE 11
  402.     } header;
  403.     // This is kept to keep the logic and to make changes to a minimum.
  404.     Uint32 word32[2048];
  405.   };
  406. /* --------------------------------------------------------------------------------- */
  407. /* UNDO HEADER RECORD                                                                */
  408. /* --------------------------------------------------------------------------------- */
  409.   struct UndoHeader {
  410.     enum UndoHeaderType{
  411.       ZPAGE_INFO = 0,
  412.       ZOVER_PAGE_INFO = 1,
  413.       ZOP_INFO = 2,
  414.       ZUNDO_INSERT_LONG_KEY = 3,
  415.       ZUNDO_DELETE_LONG_KEY = 4,
  416.       ZNO_UNDORECORD_TYPES = 5
  417.     };
  418.     UintR tableId;
  419.     UintR rootFragId;
  420.     UintR localFragId;
  421.     UintR variousInfo;
  422.     UintR logicalPageId;
  423.     UintR prevUndoAddressForThisFrag;
  424.     UintR prevUndoAddress;
  425.   };
  426. /* --------------------------------------------------------------------------------- */
  427. /* DIRECTORY RANGE                                                                   */
  428. /* --------------------------------------------------------------------------------- */
  429.   struct DirRange {
  430.     Uint32 dirArray[256];
  431.   }; /* p2c: size = 1024 bytes */
  432.   
  433.   typedef Ptr<DirRange> DirRangePtr;
  434. /* --------------------------------------------------------------------------------- */
  435. /* DIRECTORYARRAY                                                                    */
  436. /* --------------------------------------------------------------------------------- */
  437. struct Directoryarray {
  438.   Uint32 pagep[256];
  439. }; /* p2c: size = 1024 bytes */
  440.   typedef Ptr<Directoryarray> DirectoryarrayPtr;
  441. /* --------------------------------------------------------------------------------- */
  442. /* FRAGMENTREC. ALL INFORMATION ABOUT FRAMENT AND HASH TABLE IS SAVED IN FRAGMENT    */
  443. /*         REC  A POINTER TO FRAGMENT RECORD IS SAVED IN ROOTFRAGMENTREC FRAGMENT    */
  444. /* --------------------------------------------------------------------------------- */
  445. struct Fragmentrec {
  446. //-----------------------------------------------------------------------------
  447. // References to long key pages with free area. Some type of buddy structure
  448. // where references in higher index have more free space.
  449. //-----------------------------------------------------------------------------
  450.   Uint32 longKeyPageArray[4];
  451. //-----------------------------------------------------------------------------
  452. // These variables keep track of allocated pages, the number of them and the
  453. // start file page of them. Used during local checkpoints.
  454. //-----------------------------------------------------------------------------
  455.   Uint32 datapages[8];
  456.   Uint32 activeDataPage;
  457.   Uint32 activeDataFilePage;
  458. //-----------------------------------------------------------------------------
  459. // Temporary variables used during shrink and expand process.
  460. //-----------------------------------------------------------------------------
  461.   Uint32 expReceivePageptr;
  462.   Uint32 expReceiveIndex;
  463.   Uint32 expReceiveForward;
  464.   Uint32 expSenderDirIndex;
  465.   Uint32 expSenderDirptr;
  466.   Uint32 expSenderIndex;
  467.   Uint32 expSenderPageptr;
  468. //-----------------------------------------------------------------------------
  469. // List of lock owners and list of lock waiters to support LCP handling
  470. //-----------------------------------------------------------------------------
  471.   Uint32 lockOwnersList;
  472.   Uint32 firstWaitInQueOp;
  473.   Uint32 lastWaitInQueOp;
  474.   Uint32 sentWaitInQueOp;
  475. //-----------------------------------------------------------------------------
  476. // References to Directory Ranges (which in turn references directories, which
  477. // in its turn references the pages) for the bucket pages and the overflow
  478. // bucket pages.
  479. //-----------------------------------------------------------------------------
  480.   Uint32 directory;
  481.   Uint32 dirsize;
  482.   Uint32 overflowdir;
  483.   Uint32 lastOverIndex;
  484. //-----------------------------------------------------------------------------
  485. // These variables are used to support LCP and Restore from disk.
  486. // lcpDirIndex: used during LCP as the frag page id currently stored.
  487. // lcpMaxDirIndex: The dirsize at start of LCP.
  488. // lcpMaxOverDirIndex: The xx at start of LCP
  489. // During a LCP one writes the minimum of the number of pages in the directory
  490. // and the number of pages at the start of the LCP.
  491. // noStoredPages: Number of bucket pages written in LCP used at restore
  492. // noOfOverStoredPages: Number of overflow pages written in LCP used at restore
  493. // This variable is also used during LCP to calculate this number.
  494. //-----------------------------------------------------------------------------
  495.   Uint32 lcpDirIndex;
  496.   Uint32 lcpMaxDirIndex;
  497.   Uint32 lcpMaxOverDirIndex;
  498.   Uint32 noStoredPages;
  499.   Uint32 noOfStoredOverPages;
  500. //-----------------------------------------------------------------------------
  501. // We have a list of overflow pages with free areas. We have a special record,
  502. // the overflow record representing these pages. The reason is that the
  503. // same record is also used to represent pages in the directory array that have
  504. // been released since they were empty (there were however higher indexes with
  505. // data in them). These are put in the firstFreeDirIndexRec-list.
  506. // An overflow record representing a page can only be in one of these lists.
  507. //-----------------------------------------------------------------------------
  508.   Uint32 firstOverflowRec;
  509.   Uint32 lastOverflowRec;
  510.   Uint32 firstFreeDirindexRec;
  511. //-----------------------------------------------------------------------------
  512. // localCheckpId is used during execution of UNDO log to ensure that we only
  513. // apply UNDO log records from the restored LCP of the fragment.
  514. // lcpLqhPtr keeps track of LQH record for this fragment to checkpoint
  515. //-----------------------------------------------------------------------------
  516.   Uint32 localCheckpId;
  517.   Uint32 lcpLqhPtr;
  518. //-----------------------------------------------------------------------------
  519. // Counter keeping track of how many times we have expanded. We need to ensure
  520. // that we do not shrink so many times that this variable becomes negative.
  521. //-----------------------------------------------------------------------------
  522.   Uint32 expandCounter;
  523. //-----------------------------------------------------------------------------
  524. // Reference to record for open file at LCP and restore
  525. //-----------------------------------------------------------------------------
  526.   Uint32 fsConnPtr;
  527. //-----------------------------------------------------------------------------
  528. // These variables are important for the linear hashing algorithm.
  529. // localkeylen is the size of the local key (1 and 2 is currently supported)
  530. // maxloadfactor is the factor specifying when to expand
  531. // minloadfactor is the factor specifying when to shrink (hysteresis model)
  532. // maxp and p
  533. // maxp and p is the variables most central to linear hashing. p + maxp + 1 is the
  534. // current number of buckets. maxp is the largest value of the type 2**n - 1
  535. // which is smaller than the number of buckets. These values are used to find
  536. // correct bucket with the aid of the hash value.
  537. //
  538. // slack is the variable keeping track of whether we have inserted more than
  539. // the current size is suitable for or less. Slack together with the boundaries
  540. // set by maxloadfactor and minloadfactor decides when to expand/shrink
  541. // slackCheck When slack goes over this value it is time to expand.
  542. // slackCheck = (maxp + p + 1)*(maxloadfactor - minloadfactor) or 
  543. // bucketSize * hysteresis
  544. //-----------------------------------------------------------------------------
  545.   Uint32 localkeylen;
  546.   Uint32 maxp;
  547.   Uint32 maxloadfactor;
  548.   Uint32 minloadfactor;
  549.   Uint32 p;
  550.   Uint32 slack;
  551.   Uint32 slackCheck;
  552. //-----------------------------------------------------------------------------
  553. // myfid is the fragment id of the fragment
  554. // myroot is the reference to the root fragment record
  555. // nextfreefrag is the next free fragment if linked into a free list
  556. //-----------------------------------------------------------------------------
  557.   Uint32 myfid;
  558.   Uint32 myroot;
  559.   Uint32 myTableId;
  560.   Uint32 nextfreefrag;
  561. //-----------------------------------------------------------------------------
  562. // This variable is used during restore to keep track of page id of read pages.
  563. // During read of bucket pages this is used to calculate the page id and also
  564. // to verify that the page id of the read page is correct. During read of over-
  565. // flow pages it is only used to keep track of the number of pages read.
  566. //-----------------------------------------------------------------------------
  567.   Uint32 nextAllocPage;
  568. //-----------------------------------------------------------------------------
  569. // Keeps track of undo position for fragment during LCP and restore.
  570. //-----------------------------------------------------------------------------
  571.   Uint32 prevUndoposition;
  572. //-----------------------------------------------------------------------------
  573. // Page reference during LCP and restore of page zero where fragment data is
  574. // saved
  575. //-----------------------------------------------------------------------------
  576.   Uint32 zeroPagePtr;
  577. //-----------------------------------------------------------------------------
  578. // Number of pages read from file during restore
  579. //-----------------------------------------------------------------------------
  580.   Uint32 noOfExpectedPages;
  581. //-----------------------------------------------------------------------------
  582. // Fragment State, mostly applicable during LCP and restore
  583. //-----------------------------------------------------------------------------
  584.   State fragState;
  585. //-----------------------------------------------------------------------------
  586. // Keep track of number of outstanding writes of UNDO log records to ensure that
  587. // we have saved all UNDO info before concluding local checkpoint.
  588. //-----------------------------------------------------------------------------
  589.   Uint32 nrWaitWriteUndoExit;
  590. //-----------------------------------------------------------------------------
  591. // lastUndoIsStored is used to handle parallel writes of UNDO log and pages to
  592. // know when LCP is completed
  593. //-----------------------------------------------------------------------------
  594.   Uint8 lastUndoIsStored;
  595. //-----------------------------------------------------------------------------
  596. // Set to ZTRUE when local checkpoint freeze occurs and set to ZFALSE when
  597. // local checkpoint concludes.
  598. //-----------------------------------------------------------------------------
  599.   Uint8 createLcp;
  600. //-----------------------------------------------------------------------------
  601. // Flag indicating whether we are in the load phase of restore still.
  602. //-----------------------------------------------------------------------------
  603.   Uint8 loadingFlag;
  604. //-----------------------------------------------------------------------------
  605. // elementLength: Length of element in bucket and overflow pages
  606. // keyLength: Length of key (== 0 if long key or variable key length)
  607. //-----------------------------------------------------------------------------
  608.   Uint8 elementLength;
  609.   Uint8 keyLength;
  610. //-----------------------------------------------------------------------------
  611. // This flag is used to avoid sending a big number of expand or shrink signals
  612. // when simultaneously committing many inserts or deletes.
  613. //-----------------------------------------------------------------------------
  614.   Uint8 expandFlag;
  615. //-----------------------------------------------------------------------------
  616. // hashcheckbit is the bit to check whether to send element to split bucket or not
  617. // k (== 6) is the number of buckets per page
  618. // lhfragbits is the number of bits used to calculate the fragment id
  619. // lhdirbits is the number of bits used to calculate the page id
  620. //-----------------------------------------------------------------------------
  621.   Uint8 hashcheckbit;
  622.   Uint8 k;
  623.   Uint8 lhfragbits;
  624.   Uint8 lhdirbits;
  625. //-----------------------------------------------------------------------------
  626. // nodetype can only be STORED in this release. Is currently only set, never read
  627. // stopQueOp is indicator that locked operations will not start until LCP have
  628. // released the lock on the fragment
  629. //-----------------------------------------------------------------------------
  630.   Uint8 nodetype;
  631.   Uint8 stopQueOp;
  632. };
  633.   typedef Ptr<Fragmentrec> FragmentrecPtr;
  634. /* --------------------------------------------------------------------------------- */
  635. /* FS_CONNECTREC                                                                     */
  636. /* --------------------------------------------------------------------------------- */
  637. struct FsConnectrec {
  638.   Uint32 fsNext;
  639.   Uint32 fsPrev;
  640.   Uint32 fragrecPtr;
  641.   Uint32 fsPtr;
  642.   State fsState;
  643.   Uint8 activeFragId;
  644.   Uint8 fsPart;
  645. }; /* p2c: size = 24 bytes */
  646.   typedef Ptr<FsConnectrec> FsConnectrecPtr;
  647. /* --------------------------------------------------------------------------------- */
  648. /* FS_OPREC                                                                          */
  649. /* --------------------------------------------------------------------------------- */
  650. struct FsOprec {
  651.   Uint32 fsOpnext;
  652.   Uint32 fsOpfragrecPtr;
  653.   Uint32 fsConptr;
  654.   State fsOpstate;
  655.   Uint16 fsOpMemPage;
  656. }; /* p2c: size = 20 bytes */
  657.   typedef Ptr<FsOprec> FsOprecPtr;
  658. /* --------------------------------------------------------------------------------- */
  659. /* LCP_CONNECTREC                                                                    */
  660. /* --------------------------------------------------------------------------------- */
  661. struct LcpConnectrec {
  662.   Uint32 nextLcpConn;
  663.   Uint32 lcpUserptr;
  664.   Uint32 rootrecptr;
  665.   State syncUndopageState;
  666.   State lcpstate;
  667.   Uint32 lcpUserblockref;
  668.   Uint16 localCheckPid;
  669.   Uint8 noOfLcpConf;
  670. };
  671.   typedef Ptr<LcpConnectrec> LcpConnectrecPtr;
  672. /* --------------------------------------------------------------------------------- */
  673. /* OPERATIONREC                                                                      */
  674. /* --------------------------------------------------------------------------------- */
  675. struct Operationrec {
  676.   Uint32 keydata[8];
  677.   Uint32 localdata[2];
  678.   Uint32 elementIsforward;
  679.   Uint32 elementPage;
  680.   Uint32 elementPointer;
  681.   Uint32 fid;
  682.   Uint32 fragptr;
  683.   Uint32 hashvaluePart;
  684.   Uint32 hashValue;
  685.   Uint32 insertDeleteLen;
  686.   Uint32 keyinfoPage;
  687.   Uint32 nextLockOwnerOp;
  688.   Uint32 nextOp;
  689.   Uint32 nextParallelQue;
  690.   Uint32 nextQueOp;
  691.   Uint32 nextSerialQue;
  692.   Uint32 prevOp;
  693.   Uint32 prevLockOwnerOp;
  694.   Uint32 prevParallelQue;
  695.   Uint32 prevQueOp;
  696.   Uint32 prevSerialQue;
  697.   Uint32 scanRecPtr;
  698.   Uint32 transId1;
  699.   Uint32 transId2;
  700.   Uint32 longPagePtr;
  701.   Uint32 longKeyPageIndex;
  702.   State opState;
  703.   Uint32 userptr;
  704.   State transactionstate;
  705.   Uint16 elementContainer;
  706.   Uint16 tupkeylen;
  707.   Uint32 userblockref;
  708.   Uint32 scanBits;
  709.   Uint8 elementIsDisappeared;
  710.   Uint8 insertIsDone;
  711.   Uint8 lockMode;
  712.   Uint8 lockOwner;
  713.   Uint8 nodeType;
  714.   Uint8 operation;
  715.   Uint8 opSimple;
  716.   Uint8 dirtyRead;
  717.   Uint8 commitDeleteCheckFlag;
  718.   Uint8 isAccLockReq;
  719.   Uint32 nextOpList;
  720. }; /* p2c: size = 168 bytes */
  721.   typedef Ptr<Operationrec> OperationrecPtr;
  722. /* --------------------------------------------------------------------------------- */
  723. /* OVERFLOW_RECORD                                                                   */
  724. /* --------------------------------------------------------------------------------- */
  725. struct OverflowRecord {
  726.   Uint32 dirindex;
  727.   Uint32 nextOverRec;
  728.   Uint32 nextOverList;
  729.   Uint32 prevOverRec;
  730.   Uint32 prevOverList;
  731.   Uint32 overpage;
  732.   Uint32 nextfreeoverrec;
  733. };
  734.   typedef Ptr<OverflowRecord> OverflowRecordPtr;
  735. /* --------------------------------------------------------------------------------- */
  736. /* PAGE8                                                                             */
  737. /* --------------------------------------------------------------------------------- */
  738. struct Page8 {
  739.   Uint32 word32[2048];
  740. }; /* p2c: size = 8192 bytes */
  741.   typedef Ptr<Page8> Page8Ptr;
  742. /* --------------------------------------------------------------------------------- */
  743. /* ROOTFRAGMENTREC                                                                   */
  744. /*          DURING EXPAND FRAGMENT PROCESS, EACH FRAGMEND WILL BE EXPAND INTO TWO    */
  745. /*          NEW FRAGMENTS.TO MAKE THIS PROCESS EASIER, DURING ADD FRAGMENT PROCESS   */
  746. /*          NEXT FRAGMENT IDENTIIES WILL BE CALCULATED, AND TWO FRAGMENTS WILL BE    */
  747. /*          ADDED IN (NDBACC). THEREBY EXPAND OF FRAGMENT CAN BE PERFORMED QUICK AND */
  748. /*          EASY.THE NEW FRAGMENT ID SENDS TO TUP MANAGER FOR ALL OPERATION PROCESS. */
  749. /* --------------------------------------------------------------------------------- */
  750. struct Rootfragmentrec {
  751.   Uint32 scan[MAX_PARALLEL_SCANS_PER_FRAG];
  752.   Uint32 fragmentptr[2];
  753.   Uint32 fragmentid[2];
  754.   Uint32 lcpPtr;
  755.   Uint32 mytabptr;
  756.   Uint32 nextroot;
  757.   Uint32 roothashcheck;
  758.   Uint32 noOfElements;
  759.   Uint32 m_commit_count;
  760.   State rootState;
  761. }; /* p2c: size = 72 bytes */
  762.   typedef Ptr<Rootfragmentrec> RootfragmentrecPtr;
  763. /* --------------------------------------------------------------------------------- */
  764. /* SCAN_REC                                                                          */
  765. /* --------------------------------------------------------------------------------- */
  766. struct ScanRec {
  767.   enum ScanState {
  768.     WAIT_NEXT,  
  769.     SCAN_DISCONNECT
  770.   };
  771.   enum ScanBucketState {
  772.     FIRST_LAP,
  773.     SECOND_LAP,
  774.     SCAN_COMPLETED
  775.   };
  776.   Uint32 activeLocalFrag;
  777.   Uint32 rootPtr;
  778.   Uint32 nextBucketIndex;
  779.   Uint32 scanNextfreerec;
  780.   Uint32 scanFirstActiveOp;
  781.   Uint32 scanFirstLockedOp;
  782.   Uint32 scanLastLockedOp;
  783.   Uint32 scanFirstQueuedOp;
  784.   Uint32 scanLastQueuedOp;
  785.   Uint32 scanUserptr;
  786.   Uint32 scanTrid1;
  787.   Uint32 scanTrid2;
  788.   Uint32 startNoOfBuckets;
  789.   Uint32 minBucketIndexToRescan;
  790.   Uint32 maxBucketIndexToRescan;
  791.   Uint32 scanOpsAllocated;
  792.   ScanBucketState scanBucketState;
  793.   ScanState scanState;
  794.   Uint16 scanLockHeld;
  795.   Uint32 scanUserblockref;
  796.   Uint32 scanMask;
  797.   Uint8 scanLockMode;
  798.   Uint8 scanKeyinfoFlag;
  799.   Uint8 scanTimer;
  800.   Uint8 scanContinuebCounter;
  801.   Uint8 scanReadCommittedFlag;
  802. }; 
  803.   typedef Ptr<ScanRec> ScanRecPtr;
  804. /* --------------------------------------------------------------------------------- */
  805. /* SR_VERSION_REC                                                                    */
  806. /* --------------------------------------------------------------------------------- */
  807. struct SrVersionRec {
  808.   Uint32 nextFreeSr;
  809.   Uint32 checkPointId;
  810.   Uint32 prevAddress;
  811.   Uint32 srUnused; /* p2c: Not used */
  812. }; /* p2c: size = 16 bytes */
  813.   typedef Ptr<SrVersionRec> SrVersionRecPtr;
  814. /* --------------------------------------------------------------------------------- */
  815. /* TABREC                                                                            */
  816. /* --------------------------------------------------------------------------------- */
  817. struct Tabrec {
  818.   Uint32 fragholder[MAX_FRAG_PER_NODE];
  819.   Uint32 fragptrholder[MAX_FRAG_PER_NODE];
  820.   Uint32 tabUserPtr;
  821.   BlockReference tabUserRef;
  822. };
  823.   typedef Ptr<Tabrec> TabrecPtr;
  824. /* --------------------------------------------------------------------------------- */
  825. /* UNDOPAGE                                                                          */
  826. /* --------------------------------------------------------------------------------- */
  827. struct Undopage {
  828.   Uint32 undoword[8192];
  829. }; /* p2c: size = 32768 bytes */
  830.   typedef Ptr<Undopage> UndopagePtr;
  831. public:
  832.   Dbacc(const class Configuration &);
  833.   virtual ~Dbacc();
  834. private:
  835.   BLOCK_DEFINES(Dbacc);
  836.   // Transit signals
  837.   void execDEBUG_SIG(Signal* signal);
  838.   void execCONTINUEB(Signal* signal);
  839.   void execACC_CHECK_SCAN(Signal* signal);
  840.   void execEXPANDCHECK2(Signal* signal);
  841.   void execSHRINKCHECK2(Signal* signal);
  842.   void execACC_OVER_REC(Signal* signal);
  843.   void execACC_SAVE_PAGES(Signal* signal);
  844.   void execNEXTOPERATION(Signal* signal);
  845.   void execREAD_PSUEDO_REQ(Signal* signal);
  846.   // Received signals
  847.   void execSTTOR(Signal* signal);
  848.   void execSR_FRAGIDREQ(Signal* signal);
  849.   void execLCP_FRAGIDREQ(Signal* signal);
  850.   void execLCP_HOLDOPREQ(Signal* signal);
  851.   void execEND_LCPREQ(Signal* signal);
  852.   void execACC_LCPREQ(Signal* signal);
  853.   void execSTART_RECREQ(Signal* signal);
  854.   void execACC_CONTOPREQ(Signal* signal);
  855.   void execACCKEYREQ(Signal* signal);
  856.   void execACCSEIZEREQ(Signal* signal);
  857.   void execACCFRAGREQ(Signal* signal);
  858.   void execACC_SRREQ(Signal* signal);
  859.   void execNEXT_SCANREQ(Signal* signal);
  860.   void execACC_ABORTREQ(Signal* signal);
  861.   void execACC_SCANREQ(Signal* signal);
  862.   void execACCMINUPDATE(Signal* signal);
  863.   void execACC_COMMITREQ(Signal* signal);
  864.   void execACC_TO_REQ(Signal* signal);
  865.   void execACC_LOCKREQ(Signal* signal);
  866.   void execFSOPENCONF(Signal* signal);
  867.   void execFSCLOSECONF(Signal* signal);
  868.   void execFSWRITECONF(Signal* signal);
  869.   void execFSREADCONF(Signal* signal);
  870.   void execNDB_STTOR(Signal* signal);
  871.   void execDROP_TAB_REQ(Signal* signal);
  872.   void execFSREMOVECONF(Signal* signal);
  873.   void execREAD_CONFIG_REQ(Signal* signal);
  874.   void execSET_VAR_REQ(Signal* signal);
  875.   void execDUMP_STATE_ORD(Signal* signal);
  876.   // Statement blocks
  877.   void ACCKEY_error(Uint32 fromWhere);
  878.   void commitDeleteCheck();
  879.   void initRootFragPageZero(RootfragmentrecPtr, Page8Ptr);
  880.   void initRootFragSr(RootfragmentrecPtr, Page8Ptr);
  881.   void initFragAdd(Signal*, Uint32 rootFragIndex, Uint32 rootIndex, FragmentrecPtr);
  882.   void initFragPageZero(FragmentrecPtr, Page8Ptr);
  883.   void initFragSr(FragmentrecPtr, Page8Ptr);
  884.   void initFragGeneral(FragmentrecPtr);
  885.   void verifyFragCorrect(FragmentrecPtr regFragPtr);
  886.   void sendFSREMOVEREQ(Signal* signal, Uint32 tableId);
  887.   void sendDROP_TABFILECONF(Signal* signal, TabrecPtr tabPtr);
  888.   void releaseFragResources(Signal* signal, Uint32 fragIndex);
  889.   void releaseRootFragRecord(Signal* signal, RootfragmentrecPtr rootPtr);
  890.   void sendREL_TABMEMCONF(Signal* signal, TabrecPtr tabPtr);
  891.   void releaseRootFragResources(Signal* signal, Uint32 tableId);
  892.   void releaseDirResources(Signal* signal,
  893.                            Uint32 fragIndex,
  894.                            Uint32 dirIndex,
  895.                            Uint32 startIndex);
  896.   void releaseDirectoryResources(Signal* signal,
  897.                                  Uint32 fragIndex,
  898.                                  Uint32 dirIndex,
  899.                                  Uint32 startIndex,
  900.                                  Uint32 directoryIndex);
  901.   void releaseOverflowResources(Signal* signal, FragmentrecPtr regFragPtr);
  902.   void releaseDirIndexResources(Signal* signal, FragmentrecPtr regFragPtr);
  903.   void releaseFragRecord(Signal* signal, FragmentrecPtr regFragPtr);
  904.   Uint32 remainingUndoPages();
  905.   void updateLastUndoPageIdWritten(Signal* signal, Uint32 aNewValue);
  906.   void updateUndoPositionPage(Signal* signal, Uint32 aNewValue);
  907.   void srCheckPage(Signal* signal);
  908.   void srCheckContainer(Signal* signal);
  909.   void initScanFragmentPart(Signal* signal);
  910.   Uint32 checkScanExpand(Signal* signal);
  911.   Uint32 checkScanShrink(Signal* signal);
  912.   void initialiseDirRec(Signal* signal);
  913.   void initialiseDirRangeRec(Signal* signal);
  914.   void initialiseFragRec(Signal* signal);
  915.   void initialiseFsConnectionRec(Signal* signal);
  916.   void initialiseFsOpRec(Signal* signal);
  917.   void initialiseLcpConnectionRec(Signal* signal);
  918.   void initialiseOperationRec(Signal* signal);
  919.   void initialiseOverflowRec(Signal* signal);
  920.   void initialisePageRec(Signal* signal);
  921.   void initialiseLcpPages(Signal* signal);
  922.   void initialiseRootfragRec(Signal* signal);
  923.   void initialiseScanRec(Signal* signal);
  924.   void initialiseSrVerRec(Signal* signal);
  925.   void initialiseTableRec(Signal* signal);
  926.   bool addfragtotab(Signal* signal, Uint32 rootIndex, Uint32 fragId);
  927.   void initOpRec(Signal* signal);
  928.   void sendAcckeyconf(Signal* signal);
  929.   Uint32 placeReadInLockQueue(Signal* signal);
  930.   void placeSerialQueueRead(Signal* signal);
  931.   void checkOnlyReadEntry(Signal* signal);
  932.   Uint32 getNoParallelTransaction(const Operationrec*);
  933.   void moveLastParallelQueue(Signal* signal);
  934.   void moveLastParallelQueueWrite(Signal* signal);
  935.   Uint32 placeWriteInLockQueue(Signal* signal);
  936.   void placeSerialQueueWrite(Signal* signal);
  937.   void expandcontainer(Signal* signal);
  938.   void shrinkcontainer(Signal* signal);
  939.   void nextcontainerinfoExp(Signal* signal);
  940.   void lcpCopyPage(Signal* signal);
  941.   void lcpUpdatePage(Signal* signal);
  942.   void checkUndoPages(Signal* signal);
  943.   void undoWritingProcess(Signal* signal);
  944.   void writeUndoDataInfo(Signal* signal);
  945.   void writeUndoHeader(Signal* signal, 
  946.                        Uint32 logicalPageId, 
  947.                        UndoHeader::UndoHeaderType pageType);
  948.   void writeUndoOpInfo(Signal* signal);
  949.   void checksumControl(Signal* signal, Uint32 checkPage);
  950.   void startActiveUndo(Signal* signal);
  951.   void releaseAndCommitActiveOps(Signal* signal);
  952.   void releaseAndCommitQueuedOps(Signal* signal);
  953.   void releaseAndAbortLockedOps(Signal* signal);
  954.   void containerinfo(Signal* signal);
  955.   bool getScanElement(Signal* signal);
  956.   void initScanOpRec(Signal* signal);
  957.   void nextcontainerinfo(Signal* signal);
  958.   void putActiveScanOp(Signal* signal);
  959.   void putOpScanLockQue();
  960.   void putReadyScanQueue(Signal* signal, Uint32 scanRecIndex);
  961.   void releaseScanBucket(Signal* signal);
  962.   void releaseScanContainer(Signal* signal);
  963.   void releaseScanRec(Signal* signal);
  964.   bool searchScanContainer(Signal* signal);
  965.   void sendNextScanConf(Signal* signal);
  966.   void sendScaninfo(Signal* signal);
  967.   void setlock(Signal* signal);
  968.   void takeOutActiveScanOp(Signal* signal);
  969.   void takeOutScanLockQueue(Uint32 scanRecIndex);
  970.   void takeOutReadyScanQueue(Signal* signal);
  971.   void insertElement(Signal* signal);
  972.   void insertContainer(Signal* signal);
  973.   void addnewcontainer(Signal* signal);
  974.   void getfreelist(Signal* signal);
  975.   void increaselistcont(Signal* signal);
  976.   void seizeLeftlist(Signal* signal);
  977.   void seizeRightlist(Signal* signal);
  978.   void allocLongOverflowPage(Signal* signal);
  979.   void allocSpecificLongOverflowPage(Signal* signal);
  980.   void getLongKeyPage(Signal* signal);
  981.   void initLongOverpage(Signal* signal);
  982.   void storeLongKeys(Signal* signal);
  983.   void storeLongKeysAtPos(Signal* signal);
  984.   void reorgLongPage(Signal* signal);
  985.   void getElement(Signal* signal);
  986.   void searchLongKey(Signal* signal, bool verify);
  987.   void getdirindex(Signal* signal);
  988.   void commitdelete(Signal* signal, bool systemRestart);
  989.   void deleteElement(Signal* signal);
  990.   void getLastAndRemove(Signal* signal);
  991.   void releaseLeftlist(Signal* signal);
  992.   void releaseRightlist(Signal* signal);
  993.   void checkoverfreelist(Signal* signal);
  994.   void deleteLongKey(Signal* signal);
  995.   void removeFromPageArrayList(Signal* signal);
  996.   void insertPageArrayList(Signal* signal);
  997.   void checkPageArrayList(Signal* signal, const char *);
  998.   void checkPageB4Insert(Uint32, const char *); 
  999.   void checkPageB4Remove(Uint32, const char *); 
  1000.   void checkIndexInLongKeyPage(Uint32, const char *);
  1001.   void printoutInfoAndShutdown(LongKeyPage *);
  1002.   void releaseLongPage(Signal* signal);
  1003.   void abortOperation(Signal* signal);
  1004.   void accAbortReqLab(Signal* signal, bool sendConf);
  1005.   void commitOperation(Signal* signal);
  1006.   void copyOpInfo(Signal* signal);
  1007.   Uint32 executeNextOperation(Signal* signal);
  1008.   void releaselock(Signal* signal);
  1009.   void takeOutFragWaitQue(Signal* signal);
  1010.   void check_lock_upgrade(Signal* signal, OperationrecPtr lock_owner,
  1011.   OperationrecPtr release_op);
  1012.   void allocOverflowPage(Signal* signal);
  1013.   bool getrootfragmentrec(Signal* signal, RootfragmentrecPtr&, Uint32 fragId);
  1014.   void insertLockOwnersList(Signal* signal, const OperationrecPtr&);
  1015.   void takeOutLockOwnersList(Signal* signal, const OperationrecPtr&);
  1016.   void initFsOpRec(Signal* signal);
  1017.   void initLcpConnRec(Signal* signal);
  1018.   void initOverpage(Signal* signal);
  1019.   void initPage(Signal* signal);
  1020.   void initPageZero(Signal* signal);
  1021.   void initRootfragrec(Signal* signal);
  1022.   void putOpInFragWaitQue(Signal* signal);
  1023.   void putOverflowRecInFrag(Signal* signal);
  1024.   void putRecInFreeOverdir(Signal* signal);
  1025.   void releaseDirectory(Signal* signal);
  1026.   void releaseDirrange(Signal* signal);
  1027.   void releaseFsConnRec(Signal* signal);
  1028.   void releaseFsOpRec(Signal* signal);
  1029.   void releaseLcpConnectRec(Signal* signal);
  1030.   void releaseOpRec(Signal* signal);
  1031.   void releaseOverflowRec(Signal* signal);
  1032.   void releaseOverpage(Signal* signal);
  1033.   void releasePage(Signal* signal);
  1034.   void releaseLcpPage(Signal* signal);
  1035.   void releaseSrRec(Signal* signal);
  1036.   void releaseLogicalPage(Fragmentrec * fragP, Uint32 logicalPageId);
  1037.   void seizeDirectory(Signal* signal);
  1038.   void seizeDirrange(Signal* signal);
  1039.   void seizeFragrec(Signal* signal);
  1040.   void seizeFsConnectRec(Signal* signal);
  1041.   void seizeFsOpRec(Signal* signal);
  1042.   void seizeLcpConnectRec(Signal* signal);
  1043.   void seizeOpRec(Signal* signal);
  1044.   void seizeOverRec(Signal* signal);
  1045.   void seizePage(Signal* signal);
  1046.   void seizeLcpPage(Page8Ptr&);
  1047.   void seizeRootfragrec(Signal* signal);
  1048.   void seizeScanRec(Signal* signal);
  1049.   void seizeSrVerRec(Signal* signal);
  1050.   void sendSystemerror(Signal* signal);
  1051.   void takeRecOutOfFreeOverdir(Signal* signal);
  1052.   void takeRecOutOfFreeOverpage(Signal* signal);
  1053.   void sendScanHbRep(Signal* signal, Uint32);
  1054.   void addFragRefuse(Signal* signal, Uint32 errorCode);
  1055.   void ndbsttorryLab(Signal* signal);
  1056.   void srCloseDataFileLab(Signal* signal);
  1057.   void acckeyref1Lab(Signal* signal, Uint32 result_code);
  1058.   void insertelementLab(Signal* signal);
  1059.   void startUndoLab(Signal* signal);
  1060.   void checkNextFragmentLab(Signal* signal);
  1061.   void endofexpLab(Signal* signal);
  1062.   void endofshrinkbucketLab(Signal* signal);
  1063.   void srStartUndoLab(Signal* signal);
  1064.   void senddatapagesLab(Signal* signal);
  1065.   void undoNext2Lab(Signal* signal);
  1066.   void sttorrysignalLab(Signal* signal);
  1067.   void sendholdconfsignalLab(Signal* signal);
  1068.   void accIsLockedLab(Signal* signal);
  1069.   void insertExistElemLab(Signal* signal);
  1070.   void refaccConnectLab(Signal* signal);
  1071.   void srReadOverPagesLab(Signal* signal);
  1072.   void releaseScanLab(Signal* signal);
  1073.   void exeoperationLab(Signal* signal);
  1074.   void saveKeyDataLab(Signal* signal);
  1075.   void lcpOpenUndofileConfLab(Signal* signal);
  1076.   void srFsOpenConfLab(Signal* signal);
  1077.   void checkSyncUndoPagesLab(Signal* signal);
  1078.   void sendaccSrconfLab(Signal* signal);
  1079.   void checkSendLcpConfLab(Signal* signal);
  1080.   void endsaveoverpageLab(Signal* signal);
  1081.   void lcpCloseDataFileLab(Signal* signal);
  1082.   void srOpenDataFileLoopLab(Signal* signal);
  1083.   void srReadPagesLab(Signal* signal);
  1084.   void srDoUndoLab(Signal* signal);
  1085.   void ndbrestart1Lab(Signal* signal);
  1086.   void initialiseRecordsLab(Signal* signal, Uint32 returnRef, Uint32 retData);
  1087.   void srReadPagesAllocLab(Signal* signal);
  1088.   void checkNextBucketLab(Signal* signal);
  1089.   void endsavepageLab(Signal* signal);
  1090.   void saveZeroPageLab(Signal* signal);
  1091.   void srAllocPage0011Lab(Signal* signal);
  1092.   void allocscanrecLab(Signal* signal);
  1093.   void sendLcpFragidconfLab(Signal* signal);
  1094.   void savepagesLab(Signal* signal);
  1095.   void saveOverPagesLab(Signal* signal);
  1096.   void srReadPageZeroLab(Signal* signal);
  1097.   void storeDataPageInDirectoryLab(Signal* signal);
  1098.   void lcpFsOpenConfLab(Signal* signal);
  1099.   void zpagesize_error(const char* where);
  1100.   void reportMemoryUsage(Signal* signal, int gth);
  1101.   void lcp_write_op_to_undolog(Signal* signal);
  1102.   void reenable_expand_after_redo_log_exection_complete(Signal*);
  1103.   // Initialisation
  1104.   void initData();
  1105.   void initRecords();
  1106.   // Variables
  1107. /* --------------------------------------------------------------------------------- */
  1108. /* DIRECTORY RANGE                                                                   */
  1109. /* --------------------------------------------------------------------------------- */
  1110.   DirRange *dirRange;
  1111.   DirRangePtr expDirRangePtr;
  1112.   DirRangePtr gnsDirRangePtr;
  1113.   DirRangePtr newDirRangePtr;
  1114.   DirRangePtr rdDirRangePtr;
  1115.   DirRangePtr nciOverflowrangeptr;
  1116.   Uint32 cdirrangesize;
  1117.   Uint32 cfirstfreeDirrange;
  1118. /* --------------------------------------------------------------------------------- */
  1119. /* DIRECTORYARRAY                                                                    */
  1120. /* --------------------------------------------------------------------------------- */
  1121.   Directoryarray *directoryarray;
  1122.   DirectoryarrayPtr expDirptr;
  1123.   DirectoryarrayPtr rdDirptr;
  1124.   DirectoryarrayPtr sdDirptr;
  1125.   DirectoryarrayPtr nciOverflowDirptr;
  1126.   Uint32 cdirarraysize;
  1127.   Uint32 cdirmemory;
  1128.   Uint32 cfirstfreedir;
  1129. /* --------------------------------------------------------------------------------- */
  1130. /* FRAGMENTREC. ALL INFORMATION ABOUT FRAMENT AND HASH TABLE IS SAVED IN FRAGMENT    */
  1131. /*         REC  A POINTER TO FRAGMENT RECORD IS SAVED IN ROOTFRAGMENTREC FRAGMENT    */
  1132. /* --------------------------------------------------------------------------------- */
  1133.   Fragmentrec *fragmentrec;
  1134.   FragmentrecPtr fragrecptr;
  1135.   Uint32 cfirstfreefrag;
  1136.   Uint32 cfragmentsize;
  1137. /* --------------------------------------------------------------------------------- */
  1138. /* FS_CONNECTREC                                                                     */
  1139. /* --------------------------------------------------------------------------------- */
  1140.   FsConnectrec *fsConnectrec;
  1141.   FsConnectrecPtr fsConnectptr;
  1142.   Uint32 cfsConnectsize;
  1143.   Uint32 cfsFirstfreeconnect;
  1144. /* --------------------------------------------------------------------------------- */
  1145. /* FS_OPREC                                                                          */
  1146. /* --------------------------------------------------------------------------------- */
  1147.   FsOprec *fsOprec;
  1148.   FsOprecPtr fsOpptr;
  1149.   Uint32 cfsOpsize;
  1150.   Uint32 cfsFirstfreeop;
  1151. /* --------------------------------------------------------------------------------- */
  1152. /* LCP_CONNECTREC                                                                    */
  1153. /* --------------------------------------------------------------------------------- */
  1154.   LcpConnectrec *lcpConnectrec;
  1155.   LcpConnectrecPtr lcpConnectptr;
  1156.   Uint32 clcpConnectsize;
  1157.   Uint32 cfirstfreelcpConnect;
  1158. /* --------------------------------------------------------------------------------- */
  1159. /* OPERATIONREC                                                                      */
  1160. /* --------------------------------------------------------------------------------- */
  1161.   Operationrec *operationrec;
  1162.   OperationrecPtr operationRecPtr;
  1163.   OperationrecPtr idrOperationRecPtr;
  1164.   OperationrecPtr copyInOperPtr;
  1165.   OperationrecPtr copyOperPtr;
  1166.   OperationrecPtr mlpqOperPtr;
  1167.   OperationrecPtr queOperPtr;
  1168.   OperationrecPtr readWriteOpPtr;
  1169.   Uint32 cfreeopRec;
  1170.   Uint32 coprecsize;
  1171. /* --------------------------------------------------------------------------------- */
  1172. /* OVERFLOW_RECORD                                                                   */
  1173. /* --------------------------------------------------------------------------------- */
  1174.   OverflowRecord *overflowRecord;
  1175.   OverflowRecordPtr iopOverflowRecPtr;
  1176.   OverflowRecordPtr tfoOverflowRecPtr;
  1177.   OverflowRecordPtr porOverflowRecPtr;
  1178.   OverflowRecordPtr priOverflowRecPtr;
  1179.   OverflowRecordPtr rorOverflowRecPtr;
  1180.   OverflowRecordPtr sorOverflowRecPtr;
  1181.   OverflowRecordPtr troOverflowRecPtr;
  1182.   Uint32 cfirstfreeoverrec;
  1183.   Uint32 coverflowrecsize;
  1184. /* --------------------------------------------------------------------------------- */
  1185. /* PAGE8                                                                             */
  1186. /* --------------------------------------------------------------------------------- */
  1187.   Page8 *page8;
  1188.   /* 8 KB PAGE                       */
  1189.   Page8Ptr aslpPageptr;
  1190.   Page8Ptr alpPageptr;
  1191.   Page8Ptr ancPageptr;
  1192.   Page8Ptr colPageptr;
  1193.   Page8Ptr ccoPageptr;
  1194.   Page8Ptr datapageptr;
  1195.   Page8Ptr delPageptr;
  1196.   Page8Ptr excPageptr;
  1197.   Page8Ptr expPageptr;
  1198.   Page8Ptr gdiPageptr;
  1199.   Page8Ptr gePageptr;
  1200.   Page8Ptr gflPageptr;
  1201.   Page8Ptr glkPageptr;
  1202.   Page8Ptr idrPageptr;
  1203.   Page8Ptr ilcPageptr;
  1204.   Page8Ptr iloPageptr;
  1205.   Page8Ptr inpPageptr;
  1206.   Page8Ptr iopPageptr;
  1207.   Page8Ptr ipzPageptr;
  1208.   Page8Ptr lastPageptr;
  1209.   Page8Ptr lastPrevpageptr;
  1210.   Page8Ptr lcnPageptr;
  1211.   Page8Ptr lcnCopyPageptr;
  1212.   Page8Ptr lupPageptr;
  1213.   Page8Ptr dlkPageptr;
  1214.   Page8Ptr ipaPagePtr;
  1215.   Page8Ptr priPageptr;
  1216.   Page8Ptr pwiPageptr;
  1217.   Page8Ptr rfpPageptr;
  1218.   Page8Ptr relpPageptr;
  1219.   Page8Ptr rlopPageptr;
  1220.   Page8Ptr slkPageptr;
  1221.   Page8Ptr slkCopyPageptr;
  1222.   Page8Ptr slkapPageptr;
  1223.   Page8Ptr slkapCopyPageptr;
  1224.   Page8Ptr ciPageidptr;
  1225.   Page8Ptr gsePageidptr;
  1226.   Page8Ptr isoPageptr;
  1227.   Page8Ptr nciPageidptr;
  1228.   Page8Ptr rsbPageidptr;
  1229.   Page8Ptr rscPageidptr;
  1230.   Page8Ptr slPageidptr;
  1231.   Page8Ptr sscPageidptr;
  1232.   Page8Ptr rlPageptr;
  1233.   Page8Ptr rlpPageptr;
  1234.   Page8Ptr ropPageptr;
  1235.   Page8Ptr rpPageptr;
  1236.   Page8Ptr slPageptr;
  1237.   Page8Ptr slpPageptr;
  1238.   Page8Ptr spPageptr;
  1239.   Uint32 cfirstfreepage;
  1240.   Uint32 cfreepage;
  1241.   Uint32 cpagesize;
  1242.   Uint32 cfirstfreeLcpPage;
  1243.   Uint32 cnoOfAllocatedPages;
  1244.   Uint32 cnoLcpPages;
  1245. /* --------------------------------------------------------------------------------- */
  1246. /* ROOTFRAGMENTREC                                                                   */
  1247. /*          DURING EXPAND FRAGMENT PROCESS, EACH FRAGMEND WILL BE EXPAND INTO TWO    */
  1248. /*          NEW FRAGMENTS.TO MAKE THIS PROCESS EASIER, DURING ADD FRAGMENT PROCESS   */
  1249. /*          NEXT FRAGMENT IDENTIIES WILL BE CALCULATED, AND TWO FRAGMENTS WILL BE    */
  1250. /*          ADDED IN (NDBACC). THEREBY EXPAND OF FRAGMENT CAN BE PERFORMED QUICK AND */
  1251. /*          EASY.THE NEW FRAGMENT ID SENDS TO TUP MANAGER FOR ALL OPERATION PROCESS. */
  1252. /* --------------------------------------------------------------------------------- */
  1253.   Rootfragmentrec *rootfragmentrec;
  1254.   RootfragmentrecPtr rootfragrecptr;
  1255.   RootfragmentrecPtr tmprootfrgptr;
  1256.   Uint32 crootfragmentsize;
  1257.   Uint32 cfirstfreerootfrag;
  1258. /* --------------------------------------------------------------------------------- */
  1259. /* SCAN_REC                                                                          */
  1260. /* --------------------------------------------------------------------------------- */
  1261.   ScanRec *scanRec;
  1262.   ScanRecPtr scanPtr;
  1263.   Uint32 cscanRecSize;
  1264.   Uint32 cfirstFreeScanRec;
  1265. /* --------------------------------------------------------------------------------- */
  1266. /* SR_VERSION_REC                                                                    */
  1267. /* --------------------------------------------------------------------------------- */
  1268.   SrVersionRec *srVersionRec;
  1269.   SrVersionRecPtr srVersionPtr;
  1270.   Uint32 csrVersionRecSize;
  1271.   Uint32 cfirstFreeSrVersionRec;
  1272. /* --------------------------------------------------------------------------------- */
  1273. /* TABREC                                                                            */
  1274. /* --------------------------------------------------------------------------------- */
  1275.   Tabrec *tabrec;
  1276.   TabrecPtr tabptr;
  1277.   Uint32 ctablesize;
  1278. /* --------------------------------------------------------------------------------- */
  1279. /* UNDOPAGE                                                                          */
  1280. /* --------------------------------------------------------------------------------- */
  1281.   Undopage *undopage;
  1282.                                                    /* 32 KB PAGE                      */
  1283.   UndopagePtr undopageptr;
  1284.   Uint32 tpwiElementptr;
  1285.   Uint32 tpriElementptr;
  1286.   Uint32 tgseElementptr;
  1287.   Uint32 tgseContainerptr;
  1288.   Uint32 tiloIndex;
  1289.   Uint32 trlHead;
  1290.   Uint32 trlRelCon;
  1291.   Uint32 trlNextused;
  1292.   Uint32 trlPrevused;
  1293.   Uint32 tlcnChecksum;
  1294.   Uint32 tlupElemIndex;
  1295.   Uint32 tlupIndex;
  1296.   Uint32 tlupForward;
  1297.   Uint32 tslkPageIndex;
  1298.   Uint32 tslkKeyLen;
  1299.   Uint32 tslkapKeyLen;
  1300.   Uint32 tslkapPageIndex;
  1301.   Uint32 tipaArrayPos;
  1302.   Uint32 trfpArrayPos;
  1303.   Uint32 tdlkLogicalPageIndex;
  1304.   Uint32 tancNext;
  1305.   Uint32 tancBufType;
  1306.   Uint32 tancContainerptr;
  1307.   Uint32 tancPageindex;
  1308.   Uint32 tancPageid;
  1309.   Uint32 tidrResult;
  1310.   Uint32 tidrKeyLen;
  1311.   Uint32 tidrElemhead;
  1312.   Uint32 tidrForward;
  1313.   Uint32 tidrPageindex;
  1314.   Uint32 tidrContainerptr;
  1315.   Uint32 tidrContainerhead;
  1316.   Uint32 tlastForward;
  1317.   Uint32 tlastPageindex;
  1318.   Uint32 tlastContainerlen;
  1319.   Uint32 tlastElementptr;
  1320.   Uint32 tlastContainerptr;
  1321.   Uint32 tlastContainerhead;
  1322.   Uint32 trlPageindex;
  1323.   Uint32 tdelContainerptr;
  1324.   Uint32 tdelElementptr;
  1325.   Uint32 tdelForward;
  1326.   Uint32 tiopPageId;
  1327.   Uint32 tipPageId;
  1328.   Uint32 ttupKeyLength;
  1329.   Uint32 tgeLocked;
  1330.   Uint32 tgeResult;
  1331.   Uint32 tgeContainerptr;
  1332.   Uint32 tgeElementptr;
  1333.   Uint32 tgeForward;
  1334.   Uint32 tslcResult;
  1335.   Uint32 tslcPagedir;
  1336.   Uint32 tslcPageIndex;
  1337.   Uint32 tundoElemIndex;
  1338.   Uint32 texpReceivedBucket;
  1339.   Uint32 texpDirInd;
  1340.   Uint32 texpDirRangeIndex;
  1341.   Uint32 texpDirPageIndex;
  1342.   Uint32 tdata0;
  1343.   Uint32 tcheckpointid;
  1344.   Uint32 tciContainerptr;
  1345.   Uint32 tnciContainerptr;
  1346.   Uint32 tisoContainerptr;
  1347.   Uint32 trscContainerptr;
  1348.   Uint32 tsscContainerptr;
  1349.   Uint32 tciContainerlen;
  1350.   Uint32 trscContainerlen;
  1351.   Uint32 tsscContainerlen;
  1352.   Uint32 tciContainerhead;
  1353.   Uint32 tnciContainerhead;
  1354.   Uint32 tslElementptr;
  1355.   Uint32 tisoElementptr;
  1356.   Uint32 tsscElementptr;
  1357.   Uint32 tfid;
  1358.   Uint32 tscanFlag;
  1359.   Uint32 theadundoindex;
  1360.   Uint32 tgflBufType;
  1361.   Uint32 thashvalue;
  1362.   Uint32 tgseIsforward;
  1363.   Uint32 tsscIsforward;
  1364.   Uint32 trscIsforward;
  1365.   Uint32 tciIsforward;
  1366.   Uint32 tnciIsforward;
  1367.   Uint32 tisoIsforward;
  1368.   Uint32 tgseIsLocked;
  1369.   Uint32 tsscIsLocked;
  1370.   Uint32 tkey1;
  1371.   Uint32 tkey2;
  1372.   Uint32 tkey3;
  1373.   Uint32 tkey4;
  1374.   Uint32 tkeylen;
  1375.   Uint32 tkSize;
  1376.   Uint32 tlhfragbits;
  1377.   Uint32 tlhdirbits;
  1378.   Uint32 tlocalkeylen;
  1379.   Uint32 tmaxloadfactor;
  1380.   Uint32 tminloadfactor;
  1381.   Uint32 tmp;
  1382.   Uint32 tmpP;
  1383.   Uint32 tmpP2;
  1384.   Uint32 taslpDirIndex;
  1385.   Uint32 tmp1;
  1386.   Uint32 tmp2;
  1387.   Uint32 tgflPageindex;
  1388.   Uint32 tmpindex;
  1389.   Uint32 tslNextfree;
  1390.   Uint32 tslPageindex;
  1391.   Uint32 tgsePageindex;
  1392.   Uint32 tnciNextSamePage;
  1393.   Uint32 tslPrevfree;
  1394.   Uint32 tciPageindex;
  1395.   Uint32 trsbPageindex;
  1396.   Uint32 tnciPageindex;
  1397.   Uint32 tlastPrevconptr;
  1398.   Uint32 treqinfo;
  1399.   Uint32 transactionid1;
  1400.   Uint32 transactionid2;
  1401.   Uint32 tresult;
  1402.   Uint32 tslUpdateHeader;
  1403.   Uint32 tuserptr;
  1404.   BlockReference tuserblockref;
  1405.   Uint32 tundoindex;
  1406.   Uint32 tlqhPointer;
  1407.   Uint32 tholdSentOp;
  1408.   Uint32 tholdMore;
  1409.   Uint32 tlcpLqhCheckV;
  1410.   Uint32 tgdiPageindex;
  1411.   Uint32 tiopIndex;
  1412.   Uint32 tnciTmp;
  1413.   Uint32 tlenKeyinfo;
  1414.   Uint32 tullIndex;
  1415.   Uint32 turlIndex;
  1416.   Uint32 tlfrTmp1;
  1417.   Uint32 tlfrTmp2;
  1418.   Uint32 tudqeIndex;
  1419.   Uint32 tscanTrid1;
  1420.   Uint32 tscanTrid2;
  1421.   Uint32 taccscanTmp;
  1422.   Uint16 clastUndoPageIdWritten;
  1423.   Uint32 cactiveCheckpId;
  1424.   Uint32 cactiveRootfrag;
  1425.   Uint32 cactiveSrFsPtr;
  1426.   Uint32 cactiveUndoFilePage;
  1427.   Uint32 cactiveOpenUndoFsPtr;
  1428.   Uint32 cactiveSrUndoPage;
  1429.   Uint32 cprevUndoaddress;
  1430.   Uint32 creadyUndoaddress;
  1431.   Uint32 ctest;
  1432.   Uint32 cundoLogActive;
  1433.   Uint32 clqhPtr;
  1434.   BlockReference clqhBlockRef;
  1435.   Uint32 cminusOne;
  1436.   NodeId cmynodeid;
  1437.   Uint32 cactiveUndoFileVersion;
  1438.   BlockReference cownBlockref;
  1439.   BlockReference cndbcntrRef;
  1440.   Uint16 csignalkey;
  1441.   Uint32 cundopagesize;
  1442.   Uint32 cundoposition;
  1443.   Uint32 cundoElemIndex;
  1444.   Uint32 cundoinfolength;
  1445.   Uint32 czero;
  1446.   Uint32 csrVersList[16];
  1447.   Uint32 clblPageCounter;
  1448.   Uint32 clblPageOver;
  1449.   Uint32 clblPagesPerTick;
  1450.   Uint32 clblPagesPerTickAfterSr;
  1451.   Uint32 csystemRestart;
  1452.   Uint32 cexcForward;
  1453.   Uint32 cexcPageindex;
  1454.   Uint32 cexcContainerptr;
  1455.   Uint32 cexcContainerhead;
  1456.   Uint32 cexcContainerlen;
  1457.   Uint32 cexcElementptr;
  1458.   Uint32 cexcPrevconptr;
  1459.   Uint32 cexcMovedLen;
  1460.   Uint32 cexcPrevpageptr;
  1461.   Uint32 cexcPrevpageindex;
  1462.   Uint32 cexcPrevforward;
  1463.   Uint32 clocalkey[32];
  1464.   Uint32 ckeys[2048];
  1465.   
  1466.   Uint32 c_errorInsert3000_TableId;
  1467.   Uint32 cSrUndoRecords[5];
  1468. };
  1469. #endif