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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. The index tree persistent cursor
  3. (c) 1996 Innobase Oy
  4. Created 2/23/1996 Heikki Tuuri
  5. *******************************************************/
  6. #ifndef btr0pcur_h
  7. #define btr0pcur_h
  8. #include "univ.i"
  9. #include "dict0dict.h"
  10. #include "data0data.h"
  11. #include "mtr0mtr.h"
  12. #include "page0cur.h"
  13. #include "btr0cur.h"
  14. #include "btr0btr.h"
  15. #include "btr0types.h"
  16. /* Relative positions for a stored cursor position */
  17. #define BTR_PCUR_ON 1
  18. #define BTR_PCUR_BEFORE 2
  19. #define BTR_PCUR_AFTER 3
  20. /******************************************************************
  21. Allocates memory for a persistent cursor object and initializes the cursor. */
  22. btr_pcur_t*
  23. btr_pcur_create_for_mysql(void);
  24. /*============================*/
  25. /* out, own: persistent cursor */
  26. /******************************************************************
  27. Frees the memory for a persistent cursor object. */
  28. void
  29. btr_pcur_free_for_mysql(
  30. /*====================*/
  31. btr_pcur_t* cursor); /* in, own: persistent cursor */
  32. /******************************************************************
  33. Copies the stored position of a pcur to another pcur. */
  34. void
  35. btr_pcur_copy_stored_position(
  36. /*==========================*/
  37. btr_pcur_t* pcur_receive, /* in: pcur which will receive the
  38. position info */
  39. btr_pcur_t* pcur_donate); /* in: pcur from which the info is
  40. copied */
  41. /******************************************************************
  42. Sets the old_rec_buf field to NULL. */
  43. UNIV_INLINE
  44. void
  45. btr_pcur_init(
  46. /*==========*/
  47. btr_pcur_t* pcur); /* in: persistent cursor */
  48. /******************************************************************
  49. Initializes and opens a persistent cursor to an index tree. It should be
  50. closed with btr_pcur_close. */
  51. UNIV_INLINE
  52. void
  53. btr_pcur_open(
  54. /*==========*/
  55. dict_index_t* index, /* in: index */
  56. dtuple_t* tuple, /* in: tuple on which search done */
  57. ulint mode, /* in: PAGE_CUR_L, ...;
  58. NOTE that if the search is made using a unique
  59. prefix of a record, mode should be
  60. PAGE_CUR_LE, not PAGE_CUR_GE, as the latter
  61. may end up on the previous page from the
  62. record! */
  63. ulint latch_mode,/* in: BTR_SEARCH_LEAF, ... */
  64. btr_pcur_t* cursor, /* in: memory buffer for persistent cursor */
  65. mtr_t* mtr); /* in: mtr */
  66. /******************************************************************
  67. Opens an persistent cursor to an index tree without initializing the
  68. cursor. */
  69. UNIV_INLINE
  70. void
  71. btr_pcur_open_with_no_init(
  72. /*=======================*/
  73. dict_index_t* index, /* in: index */
  74. dtuple_t* tuple, /* in: tuple on which search done */
  75. ulint mode, /* in: PAGE_CUR_L, ...;
  76. NOTE that if the search is made using a unique
  77. prefix of a record, mode should be
  78. PAGE_CUR_LE, not PAGE_CUR_GE, as the latter
  79. may end up on the previous page of the
  80. record! */
  81. ulint latch_mode,/* in: BTR_SEARCH_LEAF, ... */
  82. btr_pcur_t* cursor, /* in: memory buffer for persistent cursor */
  83. ulint has_search_latch,/* in: latch mode the caller
  84. currently has on btr_search_latch:
  85. RW_S_LATCH, or 0 */
  86. mtr_t* mtr); /* in: mtr */
  87. /*********************************************************************
  88. Opens a persistent cursor at either end of an index. */
  89. UNIV_INLINE
  90. void
  91. btr_pcur_open_at_index_side(
  92. /*========================*/
  93. ibool from_left, /* in: TRUE if open to the low end,
  94. FALSE if to the high end */
  95. dict_index_t* index, /* in: index */
  96. ulint latch_mode, /* in: latch mode */
  97. btr_pcur_t* pcur, /* in: cursor */
  98. ibool do_init, /* in: TRUE if should be initialized */
  99. mtr_t* mtr); /* in: mtr */
  100. /******************************************************************
  101. Gets the up_match value for a pcur after a search. */
  102. UNIV_INLINE
  103. ulint
  104. btr_pcur_get_up_match(
  105. /*==================*/
  106. /* out: number of matched fields at the cursor
  107. or to the right if search mode was PAGE_CUR_GE,
  108. otherwise undefined */
  109. btr_pcur_t* cursor); /* in: memory buffer for persistent cursor */
  110. /******************************************************************
  111. Gets the low_match value for a pcur after a search. */
  112. UNIV_INLINE
  113. ulint
  114. btr_pcur_get_low_match(
  115. /*===================*/
  116. /* out: number of matched fields at the cursor
  117. or to the right if search mode was PAGE_CUR_LE,
  118. otherwise undefined */
  119. btr_pcur_t* cursor); /* in: memory buffer for persistent cursor */
  120. /******************************************************************
  121. If mode is PAGE_CUR_G or PAGE_CUR_GE, opens a persistent cursor on the first
  122. user record satisfying the search condition, in the case PAGE_CUR_L or
  123. PAGE_CUR_LE, on the last user record. If no such user record exists, then
  124. in the first case sets the cursor after last in tree, and in the latter case
  125. before first in tree. The latching mode must be BTR_SEARCH_LEAF or
  126. BTR_MODIFY_LEAF. */
  127. void
  128. btr_pcur_open_on_user_rec(
  129. /*======================*/
  130. dict_index_t* index, /* in: index */
  131. dtuple_t* tuple, /* in: tuple on which search done */
  132. ulint mode, /* in: PAGE_CUR_L, ... */
  133. ulint latch_mode, /* in: BTR_SEARCH_LEAF or
  134. BTR_MODIFY_LEAF */
  135. btr_pcur_t* cursor,  /* in: memory buffer for persistent
  136. cursor */
  137. mtr_t* mtr); /* in: mtr */
  138. /**************************************************************************
  139. Positions a cursor at a randomly chosen position within a B-tree. */
  140. UNIV_INLINE
  141. void
  142. btr_pcur_open_at_rnd_pos(
  143. /*=====================*/
  144. dict_index_t* index, /* in: index */
  145. ulint latch_mode, /* in: BTR_SEARCH_LEAF, ... */
  146. btr_pcur_t* cursor, /* in/out: B-tree pcur */
  147. mtr_t* mtr); /* in: mtr */
  148. /******************************************************************
  149. Frees the possible old_rec_buf buffer of a persistent cursor and sets the
  150. latch mode of the persistent cursor to BTR_NO_LATCHES. */
  151. UNIV_INLINE
  152. void
  153. btr_pcur_close(
  154. /*===========*/
  155. btr_pcur_t* cursor); /* in: persistent cursor */
  156. /******************************************************************
  157. The position of the cursor is stored by taking an initial segment of the
  158. record the cursor is positioned on, before, or after, and copying it to the
  159. cursor data structure. NOTE that the page where the cursor is positioned
  160. must not be empty! */
  161. void
  162. btr_pcur_store_position(
  163. /*====================*/
  164. btr_pcur_t* cursor,  /* in: persistent cursor */
  165. mtr_t* mtr); /* in: mtr */
  166. /******************************************************************
  167. If the latch mode of the cursor is BTR_LEAF_SEARCH or BTR_LEAF_MODIFY,
  168. releases the page latch and bufferfix reserved by the cursor.
  169. NOTE! In the case of BTR_LEAF_MODIFY, there should not exist changes
  170. made by the current mini-transaction to the data protected by the
  171. cursor latch, as then the latch must not be released until mtr_commit. */
  172. void
  173. btr_pcur_release_leaf(
  174. /*==================*/
  175. btr_pcur_t* cursor, /* in: persistent cursor */
  176. mtr_t* mtr); /* in: mtr */
  177. /*************************************************************
  178. Gets the rel_pos field for a cursor whose position has been stored. */
  179. UNIV_INLINE
  180. ulint
  181. btr_pcur_get_rel_pos(
  182. /*=================*/
  183. /* out: BTR_PCUR_ON, ... */
  184. btr_pcur_t* cursor);/* in: persistent cursor */
  185. /******************************************************************
  186. Restores the stored position of a persistent cursor bufferfixing the page and
  187. obtaining the specified latches. If the cursor position was saved when the
  188. (1) cursor was positioned on a user record: this function restores the position
  189. to the last record LESS OR EQUAL to the stored record;
  190. (2) cursor was positioned on a page infimum record: restores the position to
  191. the last record LESS than the user record which was the successor of the page
  192. infimum;
  193. (3) cursor was positioned on the page supremum: restores to the first record
  194. GREATER than the user record which was the predecessor of the supremum. */
  195. ibool
  196. btr_pcur_restore_position(
  197. /*======================*/
  198. /* out: TRUE if the cursor position
  199. was stored when it was on a user record
  200. and it can be restored on a user record
  201. whose ordering fields are identical to
  202. the ones of the original user record */
  203. ulint latch_mode, /* in: BTR_SEARCH_LEAF, ... */
  204. btr_pcur_t* cursor,  /* in: detached persistent cursor */
  205. mtr_t* mtr); /* in: mtr */
  206. /*************************************************************
  207. Sets the mtr field for a pcur. */
  208. UNIV_INLINE
  209. void
  210. btr_pcur_set_mtr(
  211. /*=============*/
  212. btr_pcur_t* cursor, /* in: persistent cursor */
  213. mtr_t* mtr); /* in, own: mtr */
  214. /*************************************************************
  215. Gets the mtr field for a pcur. */
  216. UNIV_INLINE
  217. mtr_t*
  218. btr_pcur_get_mtr(
  219. /*=============*/
  220. /* out: mtr */
  221. btr_pcur_t* cursor); /* in: persistent cursor */
  222. /******************************************************************
  223. Commits the pcur mtr and sets the pcur latch mode to BTR_NO_LATCHES,
  224. that is, the cursor becomes detached. If there have been modifications
  225. to the page where pcur is positioned, this can be used instead of
  226. btr_pcur_release_leaf. Function btr_pcur_store_position should be used
  227. before calling this, if restoration of cursor is wanted later. */
  228. UNIV_INLINE
  229. void
  230. btr_pcur_commit(
  231. /*============*/
  232. btr_pcur_t* pcur); /* in: persistent cursor */
  233. /******************************************************************
  234. Differs from btr_pcur_commit in that we can specify the mtr to commit. */
  235. UNIV_INLINE
  236. void
  237. btr_pcur_commit_specify_mtr(
  238. /*========================*/
  239. btr_pcur_t* pcur, /* in: persistent cursor */
  240. mtr_t* mtr); /* in: mtr to commit */
  241. /******************************************************************
  242. Tests if a cursor is detached: that is the latch mode is BTR_NO_LATCHES. */
  243. UNIV_INLINE
  244. ibool
  245. btr_pcur_is_detached(
  246. /*=================*/
  247. /* out: TRUE if detached */
  248. btr_pcur_t* pcur); /* in: persistent cursor */
  249. /*************************************************************
  250. Moves the persistent cursor to the next record in the tree. If no records are
  251. left, the cursor stays 'after last in tree'. */
  252. UNIV_INLINE
  253. ibool
  254. btr_pcur_move_to_next(
  255. /*==================*/
  256. /* out: TRUE if the cursor was not after last
  257. in tree */
  258. btr_pcur_t* cursor, /* in: persistent cursor; NOTE that the
  259. function may release the page latch */
  260. mtr_t* mtr); /* in: mtr */
  261. /*************************************************************
  262. Moves the persistent cursor to the previous record in the tree. If no records
  263. are left, the cursor stays 'before first in tree'. */
  264. ibool
  265. btr_pcur_move_to_prev(
  266. /*==================*/
  267. /* out: TRUE if the cursor was not before first
  268. in tree */
  269. btr_pcur_t* cursor, /* in: persistent cursor; NOTE that the
  270. function may release the page latch */
  271. mtr_t* mtr); /* in: mtr */
  272. /*************************************************************
  273. Moves the persistent cursor to the next user record in the tree. If no user
  274. records are left, the cursor ends up 'after last in tree'. */
  275. UNIV_INLINE
  276. ibool
  277. btr_pcur_move_to_next_user_rec(
  278. /*===========================*/
  279. /* out: TRUE if the cursor moved forward,
  280. ending on a user record */
  281. btr_pcur_t* cursor, /* in: persistent cursor; NOTE that the
  282. function may release the page latch */
  283. mtr_t* mtr); /* in: mtr */
  284. /*************************************************************
  285. Moves the persistent cursor to the first record on the next page.
  286. Releases the latch on the current page, and bufferunfixes it.
  287. Note that there must not be modifications on the current page,
  288. as then the x-latch can be released only in mtr_commit. */
  289. void
  290. btr_pcur_move_to_next_page(
  291. /*=======================*/
  292. btr_pcur_t* cursor, /* in: persistent cursor; must be on the
  293. last record of the current page */
  294. mtr_t* mtr); /* in: mtr */
  295. /*************************************************************
  296. Moves the persistent cursor backward if it is on the first record
  297. of the page. Releases the latch on the current page, and bufferunfixes
  298. it. Note that to prevent a possible deadlock, the operation first
  299. stores the position of the cursor, releases the leaf latch, acquires
  300. necessary latches and restores the cursor position again before returning.
  301. The alphabetical position of the cursor is guaranteed to be sensible
  302. on return, but it may happen that the cursor is not positioned on the
  303. last record of any page, because the structure of the tree may have
  304. changed while the cursor had no latches. */
  305. void
  306. btr_pcur_move_backward_from_page(
  307. /*=============================*/
  308. btr_pcur_t* cursor, /* in: persistent cursor, must be on the
  309. first record of the current page */
  310. mtr_t* mtr); /* in: mtr */
  311. /*************************************************************
  312. Returns the btr cursor component of a persistent cursor. */
  313. UNIV_INLINE
  314. btr_cur_t*
  315. btr_pcur_get_btr_cur(
  316. /*=================*/
  317. /* out: pointer to btr cursor component */
  318. btr_pcur_t* cursor); /* in: persistent cursor */
  319. /*************************************************************
  320. Returns the page cursor component of a persistent cursor. */
  321. UNIV_INLINE
  322. page_cur_t*
  323. btr_pcur_get_page_cur(
  324. /*==================*/
  325. /* out: pointer to page cursor component */
  326. btr_pcur_t* cursor); /* in: persistent cursor */
  327. /*************************************************************
  328. Returns the page of a persistent cursor. */
  329. UNIV_INLINE
  330. page_t*
  331. btr_pcur_get_page(
  332. /*==============*/
  333. /* out: pointer to the page */
  334. btr_pcur_t* cursor);/* in: persistent cursor */
  335. /*************************************************************
  336. Returns the record of a persistent cursor. */
  337. UNIV_INLINE
  338. rec_t*
  339. btr_pcur_get_rec(
  340. /*=============*/
  341. /* out: pointer to the record */
  342. btr_pcur_t* cursor);/* in: persistent cursor */
  343. /*************************************************************
  344. Checks if the persistent cursor is on a user record. */
  345. UNIV_INLINE
  346. ibool
  347. btr_pcur_is_on_user_rec(
  348. /*====================*/
  349. btr_pcur_t* cursor, /* in: persistent cursor */
  350. mtr_t* mtr); /* in: mtr */
  351. /*************************************************************
  352. Checks if the persistent cursor is after the last user record on 
  353. a page. */
  354. UNIV_INLINE
  355. ibool
  356. btr_pcur_is_after_last_on_page(
  357. /*===========================*/
  358. btr_pcur_t* cursor, /* in: persistent cursor */
  359. mtr_t* mtr); /* in: mtr */
  360. /*************************************************************
  361. Checks if the persistent cursor is before the first user record on 
  362. a page. */
  363. UNIV_INLINE
  364. ibool
  365. btr_pcur_is_before_first_on_page(
  366. /*=============================*/
  367. btr_pcur_t* cursor, /* in: persistent cursor */
  368. mtr_t* mtr); /* in: mtr */
  369. /*************************************************************
  370. Checks if the persistent cursor is before the first user record in
  371. the index tree. */
  372. UNIV_INLINE
  373. ibool
  374. btr_pcur_is_before_first_in_tree(
  375. /*=============================*/
  376. btr_pcur_t* cursor, /* in: persistent cursor */
  377. mtr_t* mtr); /* in: mtr */
  378. /*************************************************************
  379. Checks if the persistent cursor is after the last user record in
  380. the index tree. */
  381. UNIV_INLINE
  382. ibool
  383. btr_pcur_is_after_last_in_tree(
  384. /*===========================*/
  385. btr_pcur_t* cursor, /* in: persistent cursor */
  386. mtr_t* mtr); /* in: mtr */
  387. /*************************************************************
  388. Moves the persistent cursor to the next record on the same page. */
  389. UNIV_INLINE
  390. void
  391. btr_pcur_move_to_next_on_page(
  392. /*==========================*/
  393. btr_pcur_t* cursor, /* in: persistent cursor */
  394. mtr_t* mtr); /* in: mtr */
  395. /*************************************************************
  396. Moves the persistent cursor to the previous record on the same page. */
  397. UNIV_INLINE
  398. void
  399. btr_pcur_move_to_prev_on_page(
  400. /*==========================*/
  401. btr_pcur_t* cursor, /* in: persistent cursor */
  402. mtr_t* mtr); /* in: mtr */
  403. /* The persistent B-tree cursor structure. This is used mainly for SQL
  404. selects, updates, and deletes. */
  405. struct btr_pcur_struct{
  406. btr_cur_t btr_cur; /* a B-tree cursor */
  407. ulint latch_mode; /* see FIXME note below!
  408. BTR_SEARCH_LEAF, BTR_MODIFY_LEAF,
  409. BTR_MODIFY_TREE, or BTR_NO_LATCHES,
  410. depending on the latching state of
  411. the page and tree where the cursor is
  412. positioned; the last value means that
  413. the cursor is not currently positioned:
  414. we say then that the cursor is
  415. detached; it can be restored to
  416. attached if the old position was
  417. stored in old_rec */
  418. ulint old_stored; /* BTR_PCUR_OLD_STORED
  419. or BTR_PCUR_OLD_NOT_STORED */
  420. rec_t* old_rec; /* if cursor position is stored,
  421. contains an initial segment of the
  422. latest record cursor was positioned
  423. either on, before, or after */
  424. ulint rel_pos; /* BTR_PCUR_ON, BTR_PCUR_BEFORE, or
  425. BTR_PCUR_AFTER, depending on whether
  426. cursor was on, before, or after the
  427. old_rec record */
  428. dulint modify_clock; /* the modify clock value of the
  429. buffer block when the cursor position
  430. was stored */
  431. ulint pos_state; /* see FIXME note below!
  432. BTR_PCUR_IS_POSITIONED,
  433. BTR_PCUR_WAS_POSITIONED,
  434. BTR_PCUR_NOT_POSITIONED */
  435. ulint search_mode; /* PAGE_CUR_G, ... */
  436. /*-----------------------------*/
  437. /* NOTE that the following fields may possess dynamically allocated
  438. memory, which should be freed if not needed anymore! */
  439. mtr_t* mtr; /* NULL, or this field may contain
  440. a mini-transaction which holds the
  441. latch on the cursor page */
  442. byte* old_rec_buf; /* NULL, or a dynamically allocated
  443. buffer for old_rec */
  444. ulint buf_size; /* old_rec_buf size if old_rec_buf
  445. is not NULL */
  446. };
  447. #define BTR_PCUR_IS_POSITIONED 1997660512 /* FIXME: currently, the state
  448. can be BTR_PCUR_IS_POSITIONED,
  449. though it really should be
  450. BTR_PCUR_WAS_POSITIONED,
  451. because we have no obligation
  452. to commit the cursor with
  453. mtr; similarly latch_mode may
  454. be out of date */
  455. #define BTR_PCUR_WAS_POSITIONED 1187549791
  456. #define BTR_PCUR_NOT_POSITIONED 1328997689
  457. #define BTR_PCUR_OLD_STORED 908467085
  458. #define BTR_PCUR_OLD_NOT_STORED 122766467
  459. #ifndef UNIV_NONINL
  460. #include "btr0pcur.ic"
  461. #endif
  462. #endif