?? btr0btr.ic
字號:
/******************************************************The B-tree(c) 1994-1996 Innobase OyCreated 6/2/1994 Heikki Tuuri*******************************************************/#include "mach0data.h"#include "mtr0mtr.h"#include "mtr0log.h"#define BTR_MAX_NODE_LEVEL 50 /* used in debug checking *//******************************************************************Gets a buffer page and declares its latching order level. */UNIV_INLINEpage_t*btr_page_get(/*=========*/ ulint space, /* in: space id */ ulint page_no, /* in: page number */ ulint mode, /* in: latch mode */ mtr_t* mtr) /* in: mtr */{ page_t* page; page = buf_page_get(space, page_no, mode, mtr);#ifdef UNIV_SYNC_DEBUG if (mode != RW_NO_LATCH) { buf_page_dbg_add_level(page, SYNC_TREE_NODE); }#endif return(page);}/******************************************************************Sets the index id field of a page. */UNIV_INLINEvoidbtr_page_set_index_id(/*==================*/ page_t* page, /* in: page to be created */ dulint id, /* in: index id */ mtr_t* mtr) /* in: mtr */{ mlog_write_dulint(page + PAGE_HEADER + PAGE_INDEX_ID, id, mtr);}/******************************************************************Gets the index id field of a page. */UNIV_INLINEdulintbtr_page_get_index_id(/*==================*/ /* out: index id */ page_t* page) /* in: index page */{ return(mach_read_from_8(page + PAGE_HEADER + PAGE_INDEX_ID));}/************************************************************Gets the node level field in an index page. */UNIV_INLINEulintbtr_page_get_level_low(/*===================*/ /* out: level, leaf level == 0 */ page_t* page) /* in: index page */{ ulint level; ut_ad(page); level = mach_read_from_2(page + PAGE_HEADER + PAGE_LEVEL); ut_ad(level <= BTR_MAX_NODE_LEVEL); return(level);}/************************************************************Gets the node level field in an index page. */UNIV_INLINEulintbtr_page_get_level(/*===============*/ /* out: level, leaf level == 0 */ page_t* page, /* in: index page */ mtr_t* mtr __attribute__((unused))) /* in: mini-transaction handle */{ ut_ad(page && mtr); return(btr_page_get_level_low(page)); }/************************************************************Sets the node level field in an index page. */UNIV_INLINEvoidbtr_page_set_level(/*===============*/ page_t* page, /* in: index page */ ulint level, /* in: level, leaf level == 0 */ mtr_t* mtr) /* in: mini-transaction handle */{ ut_ad(page && mtr); ut_ad(level <= BTR_MAX_NODE_LEVEL); mlog_write_ulint(page + PAGE_HEADER + PAGE_LEVEL, level, MLOG_2BYTES, mtr);}/************************************************************Gets the next index page number. */UNIV_INLINEulintbtr_page_get_next(/*==============*/ /* out: next page number */ page_t* page, /* in: index page */ mtr_t* mtr __attribute__((unused))) /* in: mini-transaction handle */{ ut_ad(page && mtr); ut_ad(mtr_memo_contains(mtr, buf_block_align(page), MTR_MEMO_PAGE_X_FIX) || mtr_memo_contains(mtr, buf_block_align(page), MTR_MEMO_PAGE_S_FIX)); return(mach_read_from_4(page + FIL_PAGE_NEXT));}/************************************************************Sets the next index page field. */UNIV_INLINEvoidbtr_page_set_next(/*==============*/ page_t* page, /* in: index page */ ulint next, /* in: next page number */ mtr_t* mtr) /* in: mini-transaction handle */{ ut_ad(page && mtr); mlog_write_ulint(page + FIL_PAGE_NEXT, next, MLOG_4BYTES, mtr);}/************************************************************Gets the previous index page number. */UNIV_INLINEulintbtr_page_get_prev(/*==============*/ /* out: prev page number */ page_t* page, /* in: index page */ mtr_t* mtr __attribute__((unused))) /* in: mini-transaction handle */{ ut_ad(page && mtr); return(mach_read_from_4(page + FIL_PAGE_PREV));}/************************************************************Sets the previous index page field. */UNIV_INLINEvoidbtr_page_set_prev(/*==============*/ page_t* page, /* in: index page */ ulint prev, /* in: previous page number */ mtr_t* mtr) /* in: mini-transaction handle */{ ut_ad(page && mtr); mlog_write_ulint(page + FIL_PAGE_PREV, prev, MLOG_4BYTES, mtr);}/******************************************************************Gets the child node file address in a node pointer. */UNIV_INLINEulintbtr_node_ptr_get_child_page_no(/*===========================*/ /* out: child node address */ rec_t* rec, /* in: node pointer record */ const ulint* offsets)/* in: array returned by rec_get_offsets() */{ byte* field; ulint len; ulint page_no; ut_ad(!rec_offs_comp(offsets) || rec_get_node_ptr_flag(rec)); /* The child address is in the last field */ field = rec_get_nth_field(rec, offsets, rec_offs_n_fields(offsets) - 1, &len); ut_ad(len == 4); page_no = mach_read_from_4(field); if (UNIV_UNLIKELY(page_no == 0)) { fprintf(stderr,"InnoDB: a nonsensical page number 0 in a node ptr record at offset %lu\n", (ulong) ut_align_offset(rec, UNIV_PAGE_SIZE)); buf_page_print(buf_frame_align(rec)); } return(page_no);}/******************************************************************Releases the latches on a leaf page and bufferunfixes it. */UNIV_INLINEvoidbtr_leaf_page_release(/*==================*/ page_t* page, /* in: page */ ulint latch_mode, /* in: BTR_SEARCH_LEAF or BTR_MODIFY_LEAF */ mtr_t* mtr) /* in: mtr */{ ut_ad(!mtr_memo_contains(mtr, buf_block_align(page), MTR_MEMO_MODIFY)); if (latch_mode == BTR_SEARCH_LEAF) { mtr_memo_release(mtr, buf_block_align(page), MTR_MEMO_PAGE_S_FIX); } else { ut_ad(latch_mode == BTR_MODIFY_LEAF); mtr_memo_release(mtr, buf_block_align(page), MTR_MEMO_PAGE_X_FIX); }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -