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

MySQL数据库

开发平台:

Visual C++

  1. /**********************************************************************
  2. File-based list utilities
  3. (c) 1995 Innobase Oy
  4. Created 11/28/1995 Heikki Tuuri
  5. ***********************************************************************/
  6. #include "fut0fut.h"
  7. #include "mtr0log.h"
  8. #include "buf0buf.h"
  9. /* We define the field offsets of a node for the list */
  10. #define FLST_PREV 0 /* 6-byte address of the previous list element;
  11. the page part of address is FIL_NULL, if no
  12. previous element */
  13. #define FLST_NEXT FIL_ADDR_SIZE /* 6-byte address of the next
  14. list element; the page part of address
  15. is FIL_NULL, if no next element */
  16. /* We define the field offsets of a base node for the list */
  17. #define FLST_LEN 0 /* 32-bit list length field */
  18. #define FLST_FIRST 4 /* 6-byte address of the first element
  19. of the list; undefined if empty list */
  20. #define FLST_LAST (4 + FIL_ADDR_SIZE) /* 6-byte address of the
  21. last element of the list; undefined
  22. if empty list */
  23. /************************************************************************
  24. Writes a file address. */
  25. UNIV_INLINE
  26. void
  27. flst_write_addr(
  28. /*============*/
  29. fil_faddr_t* faddr, /* in: pointer to file faddress */
  30. fil_addr_t addr, /* in: file address */
  31. mtr_t* mtr) /* in: mini-transaction handle */
  32. {
  33. ut_ad(faddr && mtr);
  34. ut_ad(mtr_memo_contains(mtr, buf_block_align(faddr),
  35. MTR_MEMO_PAGE_X_FIX));
  36. mlog_write_ulint(faddr + FIL_ADDR_PAGE, addr.page, MLOG_4BYTES, mtr); 
  37. mlog_write_ulint(faddr + FIL_ADDR_BYTE, addr.boffset,
  38. MLOG_2BYTES, mtr); 
  39. }
  40. /************************************************************************
  41. Reads a file address. */
  42. UNIV_INLINE
  43. fil_addr_t
  44. flst_read_addr(
  45. /*===========*/
  46. /* out: file address */
  47. fil_faddr_t* faddr, /* in: pointer to file faddress */
  48. mtr_t* mtr) /* in: mini-transaction handle */
  49. {
  50. fil_addr_t addr;
  51. ut_ad(faddr && mtr);
  52. addr.page = mtr_read_ulint(faddr + FIL_ADDR_PAGE, MLOG_4BYTES, mtr); 
  53. addr.boffset = mtr_read_ulint(faddr + FIL_ADDR_BYTE, MLOG_2BYTES, 
  54. mtr);
  55. return(addr); 
  56. }
  57. /************************************************************************
  58. Initializes a list base node. */
  59. UNIV_INLINE
  60. void
  61. flst_init(
  62. /*======*/
  63. flst_base_node_t* base, /* in: pointer to base node */
  64. mtr_t* mtr) /* in: mini-transaction handle */
  65. {
  66. ut_ad(mtr_memo_contains(mtr, buf_block_align(base),
  67. MTR_MEMO_PAGE_X_FIX));
  68. mlog_write_ulint(base + FLST_LEN, 0, MLOG_4BYTES, mtr); 
  69. flst_write_addr(base + FLST_FIRST, fil_addr_null, mtr); 
  70. flst_write_addr(base + FLST_LAST, fil_addr_null, mtr); 
  71. }
  72. /************************************************************************
  73. Gets list length. */
  74. UNIV_INLINE
  75. ulint
  76. flst_get_len(
  77. /*=========*/
  78. /* out: length */
  79. flst_base_node_t* base, /* in: pointer to base node */
  80. mtr_t* mtr) /* in: mini-transaction handle */
  81. {
  82. return(mtr_read_ulint(base + FLST_LEN, MLOG_4BYTES, mtr));
  83. }
  84. /************************************************************************
  85. Gets list first node address. */
  86. UNIV_INLINE
  87. fil_addr_t
  88. flst_get_first(
  89. /*===========*/
  90. /* out: file address */
  91. flst_base_node_t* base, /* in: pointer to base node */
  92. mtr_t* mtr) /* in: mini-transaction handle */
  93. {
  94. return(flst_read_addr(base + FLST_FIRST, mtr));
  95. }
  96. /************************************************************************
  97. Gets list last node address. */
  98. UNIV_INLINE
  99. fil_addr_t
  100. flst_get_last(
  101. /*==========*/
  102. /* out: file address */
  103. flst_base_node_t* base, /* in: pointer to base node */
  104. mtr_t* mtr) /* in: mini-transaction handle */
  105. {
  106. return(flst_read_addr(base + FLST_LAST, mtr));
  107. }
  108. /************************************************************************
  109. Gets list next node address. */
  110. UNIV_INLINE
  111. fil_addr_t
  112. flst_get_next_addr(
  113. /*===============*/
  114. /* out: file address */
  115. flst_node_t* node, /* in: pointer to node */
  116. mtr_t* mtr) /* in: mini-transaction handle */
  117. {
  118. return(flst_read_addr(node + FLST_NEXT, mtr));
  119. }
  120. /************************************************************************
  121. Gets list prev node address. */
  122. UNIV_INLINE
  123. fil_addr_t
  124. flst_get_prev_addr(
  125. /*===============*/
  126. /* out: file address */
  127. flst_node_t* node, /* in: pointer to node */
  128. mtr_t* mtr) /* in: mini-transaction handle */
  129. {
  130. return(flst_read_addr(node + FLST_PREV, mtr));
  131. }