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

MySQL数据库

开发平台:

Visual C++

  1. /************************************************************************
  2. The page cursor
  3. (c) 1994-1996 Innobase Oy
  4. Created 10/4/1994 Heikki Tuuri
  5. *************************************************************************/
  6. #ifndef page0cur_h
  7. #define page0cur_h
  8. #include "univ.i"
  9. #include "page0types.h"
  10. #include "page0page.h"
  11. #include "rem0rec.h"
  12. #include "data0data.h"
  13. #include "mtr0mtr.h"
  14. #define PAGE_CUR_ADAPT
  15. /* Page cursor search modes; the values must be in this order! */
  16. #define PAGE_CUR_G 1
  17. #define PAGE_CUR_GE 2
  18. #define PAGE_CUR_L 3
  19. #define PAGE_CUR_LE 4
  20. #define PAGE_CUR_LE_OR_EXTENDS 5 /* This is a search mode used in
  21.  "column LIKE 'abc%' ORDER BY column DESC";
  22.  we have to find strings which are <= 'abc' or
  23.  which extend it */
  24. #define PAGE_CUR_DBG 6
  25. #ifdef PAGE_CUR_ADAPT
  26. # ifdef UNIV_SEARCH_PERF_STAT
  27. extern ulint page_cur_short_succ;
  28. # endif /* UNIV_SEARCH_PERF_STAT */
  29. #endif /* PAGE_CUR_ADAPT */
  30. /*************************************************************
  31. Gets pointer to the page frame where the cursor is positioned. */
  32. UNIV_INLINE
  33. page_t*
  34. page_cur_get_page(
  35. /*==============*/
  36. /* out: page */
  37. page_cur_t* cur); /* in: page cursor */
  38. /*************************************************************
  39. Gets the record where the cursor is positioned. */
  40. UNIV_INLINE
  41. rec_t*
  42. page_cur_get_rec(
  43. /*=============*/
  44. /* out: record */
  45. page_cur_t* cur); /* in: page cursor */
  46. /*************************************************************
  47. Sets the cursor object to point before the first user record 
  48. on the page. */
  49. UNIV_INLINE
  50. void
  51. page_cur_set_before_first(
  52. /*======================*/
  53. page_t* page, /* in: index page */
  54. page_cur_t* cur); /* in: cursor */
  55. /*************************************************************
  56. Sets the cursor object to point after the last user record on 
  57. the page. */
  58. UNIV_INLINE
  59. void
  60. page_cur_set_after_last(
  61. /*====================*/
  62. page_t* page, /* in: index page */
  63. page_cur_t* cur); /* in: cursor */
  64. /*************************************************************
  65. Returns TRUE if the cursor is before first user record on page. */
  66. UNIV_INLINE
  67. ibool
  68. page_cur_is_before_first(
  69. /*=====================*/
  70. /* out: TRUE if at start */
  71. page_cur_t* cur); /* in: cursor */
  72. /*************************************************************
  73. Returns TRUE if the cursor is after last user record. */
  74. UNIV_INLINE
  75. ibool
  76. page_cur_is_after_last(
  77. /*===================*/
  78. /* out: TRUE if at end */
  79. page_cur_t* cur); /* in: cursor */
  80. /**************************************************************
  81. Positions the cursor on the given record. */
  82. UNIV_INLINE
  83. void
  84. page_cur_position(
  85. /*==============*/
  86. rec_t* rec, /* in: record on a page */
  87. page_cur_t* cur); /* in: page cursor */
  88. /**************************************************************
  89. Invalidates a page cursor by setting the record pointer NULL. */
  90. UNIV_INLINE
  91. void
  92. page_cur_invalidate(
  93. /*================*/
  94. page_cur_t* cur); /* in: page cursor */
  95. /**************************************************************
  96. Moves the cursor to the next record on page. */
  97. UNIV_INLINE
  98. void
  99. page_cur_move_to_next(
  100. /*==================*/
  101. page_cur_t* cur); /* in: cursor; must not be after last */
  102. /**************************************************************
  103. Moves the cursor to the previous record on page. */
  104. UNIV_INLINE
  105. void
  106. page_cur_move_to_prev(
  107. /*==================*/
  108. page_cur_t* cur); /* in: cursor; must not before first */
  109. /***************************************************************
  110. Inserts a record next to page cursor. Returns pointer to inserted record if
  111. succeed, i.e., enough space available, NULL otherwise. The cursor stays at
  112. the same position. */
  113. UNIV_INLINE
  114. rec_t*
  115. page_cur_tuple_insert(
  116. /*==================*/
  117. /* out: pointer to record if succeed, NULL
  118. otherwise */
  119. page_cur_t* cursor, /* in: a page cursor */
  120. dtuple_t*       tuple,  /* in: pointer to a data tuple */
  121. mtr_t* mtr); /* in: mini-transaction handle */
  122. /***************************************************************
  123. Inserts a record next to page cursor. Returns pointer to inserted record if
  124. succeed, i.e., enough space available, NULL otherwise. The cursor stays at
  125. the same position. */
  126. UNIV_INLINE
  127. rec_t*
  128. page_cur_rec_insert(
  129. /*================*/
  130. /* out: pointer to record if succeed, NULL
  131. otherwise */
  132. page_cur_t* cursor, /* in: a page cursor */
  133. rec_t* rec, /* in: record to insert */
  134. mtr_t* mtr); /* in: mini-transaction handle */
  135. /***************************************************************
  136. Inserts a record next to page cursor. Returns pointer to inserted record if
  137. succeed, i.e., enough space available, NULL otherwise. The record to be
  138. inserted can be in a data tuple or as a physical record. The other parameter
  139. must then be NULL. The cursor stays at the same position. */
  140. rec_t*
  141. page_cur_insert_rec_low(
  142. /*====================*/
  143. /* out: pointer to record if succeed, NULL
  144. otherwise */
  145. page_cur_t* cursor, /* in: a page cursor */
  146. dtuple_t*       tuple,  /* in: pointer to a data tuple or NULL */
  147. ulint data_size,/* in: data size of tuple */
  148. rec_t*       rec,   /* in: pointer to a physical record or NULL */
  149. mtr_t* mtr); /* in: mini-transaction handle */
  150. /*****************************************************************
  151. Copies records from page to a newly created page, from a given record onward,
  152. including that record. Infimum and supremum records are not copied. */
  153. void
  154. page_copy_rec_list_end_to_created_page(
  155. /*===================================*/
  156. page_t* new_page, /* in: index page to copy to */
  157. page_t* page, /* in: index page */
  158. rec_t* rec, /* in: first record to copy */
  159. mtr_t* mtr); /* in: mtr */
  160. /***************************************************************
  161. Deletes a record at the page cursor. The cursor is moved to the 
  162. next record after the deleted one. */
  163. void
  164. page_cur_delete_rec(
  165. /*================*/
  166. page_cur_t*   cursor, /* in: a page cursor */
  167. mtr_t* mtr); /* in: mini-transaction handle */
  168. /********************************************************************
  169. Searches the right position for a page cursor. */
  170. UNIV_INLINE
  171. ulint
  172. page_cur_search(
  173. /*============*/
  174. /* out: number of matched fields on the left */
  175. page_t* page, /* in: index page */
  176. dtuple_t* tuple, /* in: data tuple */
  177. ulint mode, /* in: PAGE_CUR_L, PAGE_CUR_LE, PAGE_CUR_G,
  178. or PAGE_CUR_GE */
  179. page_cur_t* cursor);/* out: page cursor */
  180. /********************************************************************
  181. Searches the right position for a page cursor. */
  182. void
  183. page_cur_search_with_match(
  184. /*=======================*/
  185. page_t* page, /* in: index page */
  186. dtuple_t* tuple, /* in: data tuple */
  187. ulint mode, /* in: PAGE_CUR_L, PAGE_CUR_LE, PAGE_CUR_G,
  188. or PAGE_CUR_GE */
  189. ulint* iup_matched_fields,
  190. /* in/out: already matched fields in upper
  191. limit record */
  192. ulint* iup_matched_bytes,
  193. /* in/out: already matched bytes in a field
  194. not yet completely matched */
  195. ulint* ilow_matched_fields,
  196. /* in/out: already matched fields in lower
  197. limit record */
  198. ulint* ilow_matched_bytes,
  199. /* in/out: already matched bytes in a field
  200. not yet completely matched */
  201. page_cur_t* cursor); /* out: page cursor */ 
  202. /***************************************************************
  203. Positions a page cursor on a randomly chosen user record on a page. If there
  204. are no user records, sets the cursor on the infimum record. */
  205. void
  206. page_cur_open_on_rnd_user_rec(
  207. /*==========================*/
  208. page_t* page, /* in: page */
  209. page_cur_t* cursor);/* in/out: page cursor */
  210. /***************************************************************
  211. Parses a log record of a record insert on a page. */
  212. byte*
  213. page_cur_parse_insert_rec(
  214. /*======================*/
  215. /* out: end of log record or NULL */
  216. ibool is_short,/* in: TRUE if short inserts */
  217. byte* ptr, /* in: buffer */
  218. byte* end_ptr,/* in: buffer end */
  219. page_t* page, /* in: page or NULL */
  220. mtr_t* mtr); /* in: mtr or NULL */
  221. /**************************************************************
  222. Parses a log record of copying a record list end to a new created page. */
  223. byte*
  224. page_parse_copy_rec_list_to_created_page(
  225. /*=====================================*/
  226. /* out: end of log record or NULL */
  227. byte* ptr, /* in: buffer */
  228. byte* end_ptr,/* in: buffer end */
  229. page_t* page, /* in: page or NULL */
  230. mtr_t* mtr); /* in: mtr or NULL */
  231. /***************************************************************
  232. Parses log record of a record delete on a page. */
  233. byte*
  234. page_cur_parse_delete_rec(
  235. /*======================*/
  236. /* out: pointer to record end or NULL */
  237. byte* ptr, /* in: buffer */
  238. byte* end_ptr,/* in: buffer end */
  239. page_t* page, /* in: page or NULL */
  240. mtr_t* mtr); /* in: mtr or NULL */
  241. /* Index page cursor */
  242. struct page_cur_struct{
  243. byte* rec; /* pointer to a record on page */
  244. };
  245. #ifndef UNIV_NONINL
  246. #include "page0cur.ic"
  247. #endif
  248. #endif