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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. The B-tree
  3. (c) 1994-1996 Innobase Oy
  4. Created 6/2/1994 Heikki Tuuri
  5. *******************************************************/
  6. #include "mach0data.h"
  7. #include "mtr0mtr.h"
  8. #include "mtr0log.h"
  9. #define BTR_MAX_NODE_LEVEL 50 /* used in debug checking */
  10. /******************************************************************
  11. Gets a buffer page and declares its latching order level. */
  12. UNIV_INLINE
  13. page_t*
  14. btr_page_get(
  15. /*=========*/
  16. ulint space, /* in: space id */
  17. ulint page_no, /* in: page number */
  18. ulint mode, /* in: latch mode */
  19. mtr_t* mtr) /* in: mtr */
  20. {
  21. page_t* page;
  22. page = buf_page_get(space, page_no, mode, mtr);
  23. #ifdef UNIV_SYNC_DEBUG
  24. if (mode != RW_NO_LATCH) {
  25. buf_page_dbg_add_level(page, SYNC_TREE_NODE);
  26. }
  27. #endif
  28. return(page);
  29. }
  30. /******************************************************************
  31. Sets the index id field of a page. */
  32. UNIV_INLINE
  33. void
  34. btr_page_set_index_id(
  35. /*==================*/
  36. page_t* page, /* in: page to be created */
  37. dulint id, /* in: index id */
  38. mtr_t* mtr) /* in: mtr */
  39. {
  40. mlog_write_dulint(page + PAGE_HEADER + PAGE_INDEX_ID, id, mtr);
  41. }
  42. /******************************************************************
  43. Gets the index id field of a page. */
  44. UNIV_INLINE
  45. dulint
  46. btr_page_get_index_id(
  47. /*==================*/
  48. /* out: index id */
  49. page_t* page) /* in: index page */
  50. {
  51. return(mach_read_from_8(page + PAGE_HEADER + PAGE_INDEX_ID));
  52. }
  53. /************************************************************
  54. Gets the node level field in an index page. */
  55. UNIV_INLINE
  56. ulint
  57. btr_page_get_level_low(
  58. /*===================*/
  59. /* out: level, leaf level == 0 */
  60. page_t* page) /* in: index page */
  61. {
  62. ulint level;
  63. ut_ad(page);
  64. level = mach_read_from_2(page + PAGE_HEADER + PAGE_LEVEL);
  65. ut_ad(level <= BTR_MAX_NODE_LEVEL);
  66. return(level);
  67. }
  68. /************************************************************
  69. Gets the node level field in an index page. */
  70. UNIV_INLINE
  71. ulint
  72. btr_page_get_level(
  73. /*===============*/
  74. /* out: level, leaf level == 0 */
  75. page_t* page, /* in: index page */
  76. mtr_t* mtr __attribute__((unused))) /* in: mini-transaction handle */
  77. {
  78. ut_ad(page && mtr);
  79. return(btr_page_get_level_low(page));
  80. }
  81. /************************************************************
  82. Sets the node level field in an index page. */
  83. UNIV_INLINE
  84. void
  85. btr_page_set_level(
  86. /*===============*/
  87. page_t* page, /* in: index page */
  88. ulint level, /* in: level, leaf level == 0 */
  89. mtr_t* mtr) /* in: mini-transaction handle */
  90. {
  91. ut_ad(page && mtr);
  92. ut_ad(level <= BTR_MAX_NODE_LEVEL);
  93. mlog_write_ulint(page + PAGE_HEADER + PAGE_LEVEL, level,
  94.  MLOG_2BYTES, mtr);
  95. }
  96. /************************************************************
  97. Gets the next index page number. */
  98. UNIV_INLINE
  99. ulint
  100. btr_page_get_next(
  101. /*==============*/
  102. /* out: next page number */
  103. page_t* page, /* in: index page */
  104. mtr_t* mtr __attribute__((unused))) /* in: mini-transaction handle */
  105. {
  106. ut_ad(page && mtr);
  107. ut_ad(mtr_memo_contains(mtr, buf_block_align(page),
  108.        MTR_MEMO_PAGE_X_FIX)
  109.       || mtr_memo_contains(mtr, buf_block_align(page),
  110.        MTR_MEMO_PAGE_S_FIX));
  111. return(mach_read_from_4(page + FIL_PAGE_NEXT));
  112. }
  113. /************************************************************
  114. Sets the next index page field. */
  115. UNIV_INLINE
  116. void
  117. btr_page_set_next(
  118. /*==============*/
  119. page_t* page, /* in: index page */
  120. ulint next, /* in: next page number */
  121. mtr_t* mtr) /* in: mini-transaction handle */
  122. {
  123. ut_ad(page && mtr);
  124. mlog_write_ulint(page + FIL_PAGE_NEXT, next, MLOG_4BYTES, mtr);
  125. }
  126. /************************************************************
  127. Gets the previous index page number. */
  128. UNIV_INLINE
  129. ulint
  130. btr_page_get_prev(
  131. /*==============*/
  132. /* out: prev page number */
  133. page_t* page, /* in: index page */
  134. mtr_t* mtr __attribute__((unused))) /* in: mini-transaction handle */
  135. {
  136. ut_ad(page && mtr);
  137. return(mach_read_from_4(page + FIL_PAGE_PREV));
  138. }
  139. /************************************************************
  140. Sets the previous index page field. */
  141. UNIV_INLINE
  142. void
  143. btr_page_set_prev(
  144. /*==============*/
  145. page_t* page, /* in: index page */
  146. ulint prev, /* in: previous page number */
  147. mtr_t* mtr) /* in: mini-transaction handle */
  148. {
  149. ut_ad(page && mtr);
  150. mlog_write_ulint(page + FIL_PAGE_PREV, prev, MLOG_4BYTES, mtr);
  151. }
  152. /******************************************************************
  153. Gets the child node file address in a node pointer. */
  154. UNIV_INLINE
  155. ulint
  156. btr_node_ptr_get_child_page_no(
  157. /*===========================*/
  158.     /* out: child node address */
  159. rec_t* rec) /* in: node pointer record */
  160. {
  161. ulint n_fields;
  162. byte* field;
  163. ulint len;
  164. ulint page_no;
  165. n_fields = rec_get_n_fields(rec);
  166. /* The child address is in the last field */
  167. field = rec_get_nth_field(rec, n_fields - 1, &len);
  168. ut_ad(len == 4);
  169. page_no = mach_read_from_4(field);
  170. if (page_no == 0) {
  171. fprintf(stderr,
  172. "InnoDB: a nonsensical page number 0 in a node ptr record at offset %lun",
  173.        (unsigned long)(rec - buf_frame_align(rec)));
  174. buf_page_print(buf_frame_align(rec));
  175. }
  176. return(page_no);
  177. }
  178. /******************************************************************
  179. Releases the latches on a leaf page and bufferunfixes it. */
  180. UNIV_INLINE
  181. void
  182. btr_leaf_page_release(
  183. /*==================*/
  184. page_t* page, /* in: page */
  185. ulint latch_mode, /* in: BTR_SEARCH_LEAF or BTR_MODIFY_LEAF */
  186. mtr_t* mtr) /* in: mtr */
  187. {
  188. ut_ad(!mtr_memo_contains(mtr, buf_block_align(page),
  189. MTR_MEMO_MODIFY));
  190. if (latch_mode == BTR_SEARCH_LEAF) {
  191. mtr_memo_release(mtr, buf_block_align(page), 
  192. MTR_MEMO_PAGE_S_FIX);
  193. } else {
  194. ut_ad(latch_mode == BTR_MODIFY_LEAF);
  195. mtr_memo_release(mtr, buf_block_align(page), 
  196. MTR_MEMO_PAGE_X_FIX);
  197. }
  198. }