btr0btr.ic
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:5k
源码类别:

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,
  41. MLOG_8BYTES, mtr);
  42. }
  43. /******************************************************************
  44. Gets the index id field of a page. */
  45. UNIV_INLINE
  46. dulint
  47. btr_page_get_index_id(
  48. /*==================*/
  49. /* out: index id */
  50. page_t* page) /* in: index page */
  51. {
  52. return(mach_read_from_8(page + PAGE_HEADER + PAGE_INDEX_ID));
  53. }
  54. /************************************************************
  55. Gets the node level field in an index page. */
  56. UNIV_INLINE
  57. ulint
  58. btr_page_get_level_low(
  59. /*===================*/
  60. /* out: level, leaf level == 0 */
  61. page_t* page) /* in: index page */
  62. {
  63. ulint level;
  64. ut_ad(page);
  65. level = mach_read_from_2(page + PAGE_HEADER + PAGE_LEVEL);
  66. ut_ad(level <= BTR_MAX_NODE_LEVEL);
  67. return(level);
  68. }
  69. /************************************************************
  70. Gets the node level field in an index page. */
  71. UNIV_INLINE
  72. ulint
  73. btr_page_get_level(
  74. /*===============*/
  75. /* out: level, leaf level == 0 */
  76. page_t* page, /* in: index page */
  77. mtr_t* mtr) /* in: mini-transaction handle */
  78. {
  79. ut_ad(page && mtr);
  80. return(btr_page_get_level_low(page));
  81. }
  82. /************************************************************
  83. Sets the node level field in an index page. */
  84. UNIV_INLINE
  85. void
  86. btr_page_set_level(
  87. /*===============*/
  88. page_t* page, /* in: index page */
  89. ulint level, /* in: level, leaf level == 0 */
  90. mtr_t* mtr) /* in: mini-transaction handle */
  91. {
  92. ut_ad(page && mtr);
  93. ut_ad(level <= BTR_MAX_NODE_LEVEL);
  94. mlog_write_ulint(page + PAGE_HEADER + PAGE_LEVEL, level,
  95.  MLOG_2BYTES, mtr);
  96. }
  97. /************************************************************
  98. Gets the next index page number. */
  99. UNIV_INLINE
  100. ulint
  101. btr_page_get_next(
  102. /*==============*/
  103. /* out: next page number */
  104. page_t* page, /* in: index page */
  105. mtr_t* mtr) /* in: mini-transaction handle */
  106. {
  107. ut_ad(page && mtr);
  108. ut_ad(mtr_memo_contains(mtr, buf_block_align(page),
  109.        MTR_MEMO_PAGE_X_FIX)
  110.       || mtr_memo_contains(mtr, buf_block_align(page),
  111.        MTR_MEMO_PAGE_S_FIX));
  112. return(mach_read_from_4(page + FIL_PAGE_NEXT));
  113. }
  114. /************************************************************
  115. Sets the next index page field. */
  116. UNIV_INLINE
  117. void
  118. btr_page_set_next(
  119. /*==============*/
  120. page_t* page, /* in: index page */
  121. ulint next, /* in: next page number */
  122. mtr_t* mtr) /* in: mini-transaction handle */
  123. {
  124. ut_ad(page && mtr);
  125. mlog_write_ulint(page + FIL_PAGE_NEXT, next, MLOG_4BYTES, mtr);
  126. }
  127. /************************************************************
  128. Gets the previous index page number. */
  129. UNIV_INLINE
  130. ulint
  131. btr_page_get_prev(
  132. /*==============*/
  133. /* out: prev page number */
  134. page_t* page, /* in: index page */
  135. mtr_t* mtr) /* in: mini-transaction handle */
  136. {
  137. ut_ad(page && mtr);
  138. return(mach_read_from_4(page + FIL_PAGE_PREV));
  139. }
  140. /************************************************************
  141. Sets the previous index page field. */
  142. UNIV_INLINE
  143. void
  144. btr_page_set_prev(
  145. /*==============*/
  146. page_t* page, /* in: index page */
  147. ulint prev, /* in: previous page number */
  148. mtr_t* mtr) /* in: mini-transaction handle */
  149. {
  150. ut_ad(page && mtr);
  151. mlog_write_ulint(page + FIL_PAGE_PREV, prev, MLOG_4BYTES, mtr);
  152. }
  153. /******************************************************************
  154. Gets the child node file address in a node pointer. */
  155. UNIV_INLINE
  156. ulint
  157. btr_node_ptr_get_child_page_no(
  158. /*===========================*/
  159.     /* out: child node address */
  160. rec_t* rec) /* in: node pointer record */
  161. {
  162. ulint n_fields;
  163. byte* field;
  164. ulint len;
  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. return(mach_read_from_4(field));
  170. }
  171. /******************************************************************
  172. Releases the latches on a leaf page and bufferunfixes it. */
  173. UNIV_INLINE
  174. void
  175. btr_leaf_page_release(
  176. /*==================*/
  177. page_t* page, /* in: page */
  178. ulint latch_mode, /* in: BTR_SEARCH_LEAF or BTR_MODIFY_LEAF */
  179. mtr_t* mtr) /* in: mtr */
  180. {
  181. ut_ad(!mtr_memo_contains(mtr, buf_block_align(page),
  182. MTR_MEMO_MODIFY));
  183. if (latch_mode == BTR_SEARCH_LEAF) {
  184. mtr_memo_release(mtr, buf_block_align(page), 
  185. MTR_MEMO_PAGE_S_FIX);
  186. } else {
  187. ut_ad(latch_mode == BTR_MODIFY_LEAF);
  188. mtr_memo_release(mtr, buf_block_align(page), 
  189. MTR_MEMO_PAGE_X_FIX);
  190. }
  191. }