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

MySQL数据库

开发平台:

Visual C++

  1. /************************************************************************
  2. The page cursor
  3. (c) 1994-1996 Innobase Oy
  4. Created 10/4/1994 Heikki Tuuri
  5. *************************************************************************/
  6. #include "page0page.h"
  7. /*************************************************************
  8. Gets pointer to the page frame where the cursor is positioned. */
  9. UNIV_INLINE
  10. page_t*
  11. page_cur_get_page(
  12. /*==============*/
  13. /* out: page */
  14. page_cur_t* cur) /* in: page cursor */
  15. {
  16. ut_ad(cur);
  17. return(buf_frame_align(cur->rec));
  18. }
  19. /*************************************************************
  20. Gets the record where the cursor is positioned. */
  21. UNIV_INLINE
  22. rec_t*
  23. page_cur_get_rec(
  24. /*=============*/
  25. /* out: record */
  26. page_cur_t* cur) /* in: page cursor */
  27. {
  28. ut_ad(cur);
  29. return(cur->rec);
  30. }
  31. /*************************************************************
  32. Sets the cursor object to point before the first user record 
  33. on the page. */
  34. UNIV_INLINE
  35. void
  36. page_cur_set_before_first(
  37. /*======================*/
  38. page_t* page, /* in: index page */
  39. page_cur_t* cur) /* in: cursor */
  40. {
  41. cur->rec = page_get_infimum_rec(page);
  42. }
  43. /*************************************************************
  44. Sets the cursor object to point after the last user record on 
  45. the page. */
  46. UNIV_INLINE
  47. void
  48. page_cur_set_after_last(
  49. /*====================*/
  50. page_t* page, /* in: index page */
  51. page_cur_t* cur) /* in: cursor */
  52. {
  53. cur->rec = page_get_supremum_rec(page);
  54. }
  55. /*************************************************************
  56. Returns TRUE if the cursor is before first user record on page. */
  57. UNIV_INLINE
  58. ibool
  59. page_cur_is_before_first(
  60. /*=====================*/
  61. /* out: TRUE if at start */
  62. page_cur_t* cur) /* in: cursor */
  63. {
  64. if (page_get_infimum_rec(page_cur_get_page(cur)) == cur->rec) {
  65. return(TRUE);
  66. }
  67. return(FALSE);
  68. }
  69. /*************************************************************
  70. Returns TRUE if the cursor is after last user record. */
  71. UNIV_INLINE
  72. ibool
  73. page_cur_is_after_last(
  74. /*===================*/
  75. /* out: TRUE if at end */
  76. page_cur_t* cur) /* in: cursor */
  77. {
  78. if (page_get_supremum_rec(page_cur_get_page(cur)) == cur->rec) {
  79. return(TRUE);
  80. }
  81. return(FALSE);
  82. }
  83. /**************************************************************
  84. Positions the cursor on the given record. */
  85. UNIV_INLINE
  86. void
  87. page_cur_position(
  88. /*==============*/
  89. rec_t* rec, /* in: record on a page */
  90. page_cur_t* cur) /* in: page cursor */
  91. {
  92. ut_ad(rec && cur);
  93. cur->rec = rec;
  94. }
  95. /**************************************************************
  96. Invalidates a page cursor by setting the record pointer NULL. */
  97. UNIV_INLINE
  98. void
  99. page_cur_invalidate(
  100. /*================*/
  101. page_cur_t* cur) /* in: page cursor */
  102. {
  103. ut_ad(cur);
  104. cur->rec = NULL;
  105. }
  106. /**************************************************************
  107. Moves the cursor to the next record on page. */
  108. UNIV_INLINE
  109. void
  110. page_cur_move_to_next(
  111. /*==================*/
  112. page_cur_t* cur) /* in: cursor; must not be after last */
  113. {
  114. ut_ad(!page_cur_is_after_last(cur));
  115. cur->rec = page_rec_get_next(cur->rec);
  116. }
  117. /**************************************************************
  118. Moves the cursor to the previous record on page. */
  119. UNIV_INLINE
  120. void
  121. page_cur_move_to_prev(
  122. /*==================*/
  123. page_cur_t* cur) /* in: cursor; must not before first */
  124. {
  125. ut_ad(!page_cur_is_before_first(cur));
  126. cur->rec = page_rec_get_prev(cur->rec);
  127. }
  128. /********************************************************************
  129. Searches the right position for a page cursor. */
  130. UNIV_INLINE
  131. ulint
  132. page_cur_search(
  133. /*============*/
  134. /* out: number of matched fields on the left */
  135. page_t* page, /* in: index page */
  136. dtuple_t* tuple, /* in: data tuple */
  137. ulint mode, /* in: PAGE_CUR_L, PAGE_CUR_LE, PAGE_CUR_G,
  138. or PAGE_CUR_GE */
  139. page_cur_t* cursor) /* out: page cursor */
  140. {
  141. ulint low_matched_fields = 0;
  142. ulint low_matched_bytes = 0;
  143. ulint up_matched_fields = 0;
  144. ulint up_matched_bytes = 0;
  145. ut_ad(dtuple_check_typed(tuple));
  146. page_cur_search_with_match(page, tuple, mode,
  147. &up_matched_fields,
  148. &up_matched_bytes,
  149. &low_matched_fields,
  150. &low_matched_bytes,
  151. cursor);
  152. return(low_matched_fields);
  153. }
  154. /***************************************************************
  155. Inserts a record next to page cursor. Returns pointer to inserted record if
  156. succeed, i.e., enough space available, NULL otherwise. The cursor stays at
  157. the same position. */
  158. UNIV_INLINE
  159. rec_t*
  160. page_cur_tuple_insert(
  161. /*==================*/
  162. /* out: pointer to record if succeed, NULL
  163. otherwise */
  164. page_cur_t* cursor, /* in: a page cursor */
  165. dtuple_t*       tuple,  /* in: pointer to a data tuple */
  166. mtr_t* mtr) /* in: mini-transaction handle */
  167. {
  168. ulint data_size;
  169. ut_ad(dtuple_check_typed(tuple));
  170. data_size = dtuple_get_data_size(tuple);
  171. return(page_cur_insert_rec_low(cursor, tuple, data_size, NULL, mtr));
  172. }
  173. /***************************************************************
  174. Inserts a record next to page cursor. Returns pointer to inserted record if
  175. succeed, i.e., enough space available, NULL otherwise. The cursor stays at
  176. the same position. */
  177. UNIV_INLINE
  178. rec_t*
  179. page_cur_rec_insert(
  180. /*================*/
  181. /* out: pointer to record if succeed, NULL
  182. otherwise */
  183. page_cur_t* cursor, /* in: a page cursor */
  184. rec_t* rec, /* in: record to insert */
  185. mtr_t* mtr) /* in: mini-transaction handle */
  186. {
  187. return(page_cur_insert_rec_low(cursor, NULL, 0, rec, mtr));
  188. }