📄 btr0pcur.ic
字号:
{ ut_ad(cursor->pos_state == BTR_PCUR_IS_POSITIONED); ut_ad(cursor->latch_mode != BTR_NO_LATCHES); cursor->old_stored = BTR_PCUR_OLD_NOT_STORED;loop: if (btr_pcur_is_after_last_on_page(cursor, mtr)) { if (btr_pcur_is_after_last_in_tree(cursor, mtr)) { return(FALSE); } btr_pcur_move_to_next_page(cursor, mtr); } else { btr_pcur_move_to_next_on_page(cursor, mtr); } if (btr_pcur_is_on_user_rec(cursor, mtr)) { return(TRUE); } goto loop;}/*************************************************************Moves the persistent cursor to the next record in the tree. If no records areleft, the cursor stays 'after last in tree'. */UNIV_INLINEiboolbtr_pcur_move_to_next(/*==================*/ /* out: TRUE if the cursor was not after last in tree */ btr_pcur_t* cursor, /* in: persistent cursor; NOTE that the function may release the page latch */ mtr_t* mtr) /* in: mtr */{ ut_ad(cursor->pos_state == BTR_PCUR_IS_POSITIONED); ut_ad(cursor->latch_mode != BTR_NO_LATCHES); cursor->old_stored = BTR_PCUR_OLD_NOT_STORED; if (btr_pcur_is_after_last_on_page(cursor, mtr)) { if (btr_pcur_is_after_last_in_tree(cursor, mtr)) { return(FALSE); } btr_pcur_move_to_next_page(cursor, mtr); return(TRUE); } btr_pcur_move_to_next_on_page(cursor, mtr); return(TRUE); }/******************************************************************Commits the pcur mtr and sets the pcur latch mode to BTR_NO_LATCHES,that is, the cursor becomes detached. If there have been modificationsto the page where pcur is positioned, this can be used instead ofbtr_pcur_release_leaf. Function btr_pcur_store_position should be usedbefore calling this, if restoration of cursor is wanted later. */UNIV_INLINEvoidbtr_pcur_commit(/*============*/ btr_pcur_t* pcur) /* in: persistent cursor */{ ut_a(pcur->pos_state == BTR_PCUR_IS_POSITIONED); pcur->latch_mode = BTR_NO_LATCHES; mtr_commit(pcur->mtr); pcur->pos_state = BTR_PCUR_WAS_POSITIONED;} /******************************************************************Differs from btr_pcur_commit in that we can specify the mtr to commit. */UNIV_INLINEvoidbtr_pcur_commit_specify_mtr(/*========================*/ btr_pcur_t* pcur, /* in: persistent cursor */ mtr_t* mtr) /* in: mtr to commit */{ ut_a(pcur->pos_state == BTR_PCUR_IS_POSITIONED); pcur->latch_mode = BTR_NO_LATCHES; mtr_commit(mtr); pcur->pos_state = BTR_PCUR_WAS_POSITIONED;} /******************************************************************Sets the pcur latch mode to BTR_NO_LATCHES. */UNIV_INLINEvoidbtr_pcur_detach(/*============*/ btr_pcur_t* pcur) /* in: persistent cursor */{ ut_a(pcur->pos_state == BTR_PCUR_IS_POSITIONED); pcur->latch_mode = BTR_NO_LATCHES; pcur->pos_state = BTR_PCUR_WAS_POSITIONED;}/******************************************************************Tests if a cursor is detached: that is the latch mode is BTR_NO_LATCHES. */UNIV_INLINEiboolbtr_pcur_is_detached(/*=================*/ /* out: TRUE if detached */ btr_pcur_t* pcur) /* in: persistent cursor */{ if (pcur->latch_mode == BTR_NO_LATCHES) { return(TRUE); } return(FALSE);}/******************************************************************Sets the old_rec_buf field to NULL. */UNIV_INLINEvoidbtr_pcur_init(/*==========*/ btr_pcur_t* pcur) /* in: persistent cursor */{ pcur->old_stored = BTR_PCUR_OLD_NOT_STORED; pcur->old_rec_buf = NULL; pcur->old_rec = NULL;}/******************************************************************Initializes and opens a persistent cursor to an index tree. It should beclosed with btr_pcur_close. */UNIV_INLINEvoidbtr_pcur_open(/*==========*/ dict_index_t* index, /* in: index */ dtuple_t* tuple, /* in: tuple on which search done */ ulint mode, /* in: PAGE_CUR_L, ...; NOTE that if the search is made using a unique prefix of a record, mode should be PAGE_CUR_LE, not PAGE_CUR_GE, as the latter may end up on the previous page from the record! */ ulint latch_mode,/* in: BTR_SEARCH_LEAF, ... */ btr_pcur_t* cursor, /* in: memory buffer for persistent cursor */ mtr_t* mtr) /* in: mtr */{ btr_cur_t* btr_cursor; /* Initialize the cursor */ btr_pcur_init(cursor); cursor->latch_mode = latch_mode; cursor->search_mode = mode; /* Search with the tree cursor */ btr_cursor = btr_pcur_get_btr_cur(cursor); btr_cur_search_to_nth_level(index, 0, tuple, mode, latch_mode, btr_cursor, 0, mtr); cursor->pos_state = BTR_PCUR_IS_POSITIONED; cursor->trx_if_known = NULL;}/******************************************************************Opens an persistent cursor to an index tree without initializing thecursor. */UNIV_INLINEvoidbtr_pcur_open_with_no_init(/*=======================*/ dict_index_t* index, /* in: index */ dtuple_t* tuple, /* in: tuple on which search done */ ulint mode, /* in: PAGE_CUR_L, ...; NOTE that if the search is made using a unique prefix of a record, mode should be PAGE_CUR_LE, not PAGE_CUR_GE, as the latter may end up on the previous page of the record! */ ulint latch_mode,/* in: BTR_SEARCH_LEAF, ...; NOTE that if has_search_latch != 0 then we maybe do not acquire a latch on the cursor page, but assume that the caller uses his btr search latch to protect the record! */ btr_pcur_t* cursor, /* in: memory buffer for persistent cursor */ ulint has_search_latch,/* in: latch mode the caller currently has on btr_search_latch: RW_S_LATCH, or 0 */ mtr_t* mtr) /* in: mtr */{ btr_cur_t* btr_cursor; cursor->latch_mode = latch_mode; cursor->search_mode = mode; /* Search with the tree cursor */ btr_cursor = btr_pcur_get_btr_cur(cursor); btr_cur_search_to_nth_level(index, 0, tuple, mode, latch_mode, btr_cursor, has_search_latch, mtr); cursor->pos_state = BTR_PCUR_IS_POSITIONED; cursor->old_stored = BTR_PCUR_OLD_NOT_STORED; cursor->trx_if_known = NULL;}/*********************************************************************Opens a persistent cursor at either end of an index. */UNIV_INLINEvoidbtr_pcur_open_at_index_side(/*========================*/ ibool from_left, /* in: TRUE if open to the low end, FALSE if to the high end */ dict_index_t* index, /* in: index */ ulint latch_mode, /* in: latch mode */ btr_pcur_t* pcur, /* in: cursor */ ibool do_init, /* in: TRUE if should be initialized */ mtr_t* mtr) /* in: mtr */{ pcur->latch_mode = latch_mode; if (from_left) { pcur->search_mode = PAGE_CUR_G; } else { pcur->search_mode = PAGE_CUR_L; } if (do_init) { btr_pcur_init(pcur); } btr_cur_open_at_index_side(from_left, index, latch_mode, btr_pcur_get_btr_cur(pcur), mtr); pcur->pos_state = BTR_PCUR_IS_POSITIONED; pcur->old_stored = BTR_PCUR_OLD_NOT_STORED; pcur->trx_if_known = NULL;}/**************************************************************************Positions a cursor at a randomly chosen position within a B-tree. */UNIV_INLINEvoidbtr_pcur_open_at_rnd_pos(/*=====================*/ dict_index_t* index, /* in: index */ ulint latch_mode, /* in: BTR_SEARCH_LEAF, ... */ btr_pcur_t* cursor, /* in/out: B-tree pcur */ mtr_t* mtr) /* in: mtr */{ /* Initialize the cursor */ cursor->latch_mode = latch_mode; cursor->search_mode = PAGE_CUR_G; btr_pcur_init(cursor); btr_cur_open_at_rnd_pos(index, latch_mode, btr_pcur_get_btr_cur(cursor), mtr); cursor->pos_state = BTR_PCUR_IS_POSITIONED; cursor->old_stored = BTR_PCUR_OLD_NOT_STORED; cursor->trx_if_known = NULL;} /******************************************************************Frees the possible memory heap of a persistent cursor and sets the latchmode of the persistent cursor to BTR_NO_LATCHES. */UNIV_INLINEvoidbtr_pcur_close(/*===========*/ btr_pcur_t* cursor) /* in: persistent cursor */{ if (cursor->old_rec_buf != NULL) { mem_free(cursor->old_rec_buf); cursor->old_rec = NULL; cursor->old_rec_buf = NULL; } cursor->btr_cur.page_cur.rec = NULL; cursor->old_rec = NULL; cursor->old_stored = BTR_PCUR_OLD_NOT_STORED; cursor->latch_mode = BTR_NO_LATCHES; cursor->pos_state = BTR_PCUR_NOT_POSITIONED; cursor->trx_if_known = NULL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -