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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. The index tree cursor
  3. (c) 1994-1996 Innobase Oy
  4. Created 10/16/1994 Heikki Tuuri
  5. *******************************************************/
  6. #include "btr0btr.h"
  7. /*************************************************************
  8. Returns the page cursor component of a tree cursor. */
  9. UNIV_INLINE
  10. page_cur_t*
  11. btr_cur_get_page_cur(
  12. /*=================*/
  13. /* out: pointer to page cursor component */
  14. btr_cur_t* cursor) /* in: tree cursor */
  15. {
  16. return(&(cursor->page_cur));
  17. }
  18. /*************************************************************
  19. Returns the record pointer of a tree cursor. */
  20. UNIV_INLINE
  21. rec_t*
  22. btr_cur_get_rec(
  23. /*============*/
  24. /* out: pointer to record */
  25. btr_cur_t* cursor) /* in: tree cursor */
  26. {
  27. return(page_cur_get_rec(&(cursor->page_cur)));
  28. }
  29. /*************************************************************
  30. Invalidates a tree cursor by setting record pointer to NULL. */
  31. UNIV_INLINE
  32. void
  33. btr_cur_invalidate(
  34. /*===============*/
  35. btr_cur_t* cursor) /* in: tree cursor */
  36. {
  37. page_cur_invalidate(&(cursor->page_cur));
  38. }
  39. /*************************************************************
  40. Returns the page of a tree cursor. */
  41. UNIV_INLINE
  42. page_t*
  43. btr_cur_get_page(
  44. /*=============*/
  45. /* out: pointer to page */
  46. btr_cur_t* cursor) /* in: tree cursor */
  47. {
  48. return(buf_frame_align(page_cur_get_rec(&(cursor->page_cur))));
  49. }
  50. /*************************************************************
  51. Returns the tree of a cursor. */
  52. UNIV_INLINE
  53. dict_tree_t*
  54. btr_cur_get_tree(
  55. /*=============*/
  56. /* out: tree */
  57. btr_cur_t* cursor) /* in: tree cursor */
  58. {
  59. return((cursor->index)->tree);
  60. }
  61. /*************************************************************
  62. Positions a tree cursor at a given record. */
  63. UNIV_INLINE
  64. void
  65. btr_cur_position(
  66. /*=============*/
  67. dict_index_t* index,  /* in: index */
  68. rec_t* rec, /* in: record in tree */
  69. btr_cur_t* cursor) /* in: cursor */
  70. {
  71. page_cur_position(rec, btr_cur_get_page_cur(cursor));
  72. cursor->index = index;
  73. }
  74. /*************************************************************************
  75. Checks if compressing an index page where a btr cursor is placed makes
  76. sense. */
  77. UNIV_INLINE
  78. ibool
  79. btr_cur_compress_recommendation(
  80. /*============================*/
  81. /* out: TRUE if compression is recommended */
  82. btr_cur_t* cursor, /* in: btr cursor */
  83. mtr_t* mtr) /* in: mtr */
  84. {
  85. page_t* page;
  86. ut_ad(mtr_memo_contains(mtr, buf_block_align(
  87. btr_cur_get_page(cursor)),
  88. MTR_MEMO_PAGE_X_FIX));
  89. page = btr_cur_get_page(cursor);
  90. if ((page_get_data_size(page) < BTR_CUR_PAGE_COMPRESS_LIMIT)
  91.       || ((btr_page_get_next(page, mtr) == FIL_NULL)
  92. && (btr_page_get_prev(page, mtr) == FIL_NULL))) {
  93. /* The page fillfactor has dropped below a predefined
  94. minimum value OR the level in the B-tree contains just
  95. one page: we recommend compression if this is not the
  96. root page. */
  97. if (dict_tree_get_page((cursor->index)->tree)
  98.     == buf_frame_get_page_no(page)) {
  99.      /* It is the root page */
  100.      return(FALSE);
  101. }
  102. return(TRUE);
  103. }
  104. return(FALSE);
  105. }
  106. /*************************************************************************
  107. Checks if the record on which the cursor is placed can be deleted without
  108. making tree compression necessary (or, recommended). */
  109. UNIV_INLINE
  110. ibool
  111. btr_cur_can_delete_without_compress(
  112. /*================================*/
  113. /* out: TRUE if can be deleted without
  114. recommended compression */
  115. btr_cur_t* cursor, /* in: btr cursor */
  116. mtr_t* mtr) /* in: mtr */
  117. {
  118. ulint rec_size;
  119. page_t* page;
  120. ut_ad(mtr_memo_contains(mtr, buf_block_align(
  121. btr_cur_get_page(cursor)),
  122. MTR_MEMO_PAGE_X_FIX));
  123. rec_size = rec_get_size(btr_cur_get_rec(cursor));
  124. page = btr_cur_get_page(cursor);
  125. if ((page_get_data_size(page) - rec_size < BTR_CUR_PAGE_COMPRESS_LIMIT)
  126.       || ((btr_page_get_next(page, mtr) == FIL_NULL)
  127. && (btr_page_get_prev(page, mtr) == FIL_NULL))
  128.     || (page_get_n_recs(page) < 2)) { 
  129. /* The page fillfactor will drop below a predefined
  130. minimum value, OR the level in the B-tree contains just
  131. one page, OR the page will become empty: we recommend
  132. compression if this is not the root page. */
  133. if (dict_tree_get_page((cursor->index)->tree)
  134.     == buf_frame_get_page_no(page)) {
  135.      /* It is the root page */
  136.      return(TRUE);
  137. }
  138. return(FALSE);
  139. }
  140. return(TRUE);
  141. }