1
/******************************************************
4
(c) 1994-1996 Innobase Oy
6
Created 6/2/1994 Heikki Tuuri
7
*******************************************************/
13
#define BTR_MAX_NODE_LEVEL 50 /* used in debug checking */
15
/******************************************************************
16
Gets a buffer page and declares its latching order level. */
21
ulint space, /* in: space id */
22
ulint page_no, /* in: page number */
23
ulint mode, /* in: latch mode */
24
mtr_t* mtr) /* in: mtr */
28
page = buf_page_get(space, page_no, mode, mtr);
29
#ifdef UNIV_SYNC_DEBUG
30
if (mode != RW_NO_LATCH) {
32
buf_page_dbg_add_level(page, SYNC_TREE_NODE);
38
/******************************************************************
39
Sets the index id field of a page. */
42
btr_page_set_index_id(
43
/*==================*/
44
page_t* page, /* in: page to be created */
45
dulint id, /* in: index id */
46
mtr_t* mtr) /* in: mtr */
48
mlog_write_dulint(page + PAGE_HEADER + PAGE_INDEX_ID, id, mtr);
51
/******************************************************************
52
Gets the index id field of a page. */
55
btr_page_get_index_id(
56
/*==================*/
58
page_t* page) /* in: index page */
60
return(mach_read_from_8(page + PAGE_HEADER + PAGE_INDEX_ID));
63
/************************************************************
64
Gets the node level field in an index page. */
67
btr_page_get_level_low(
68
/*===================*/
69
/* out: level, leaf level == 0 */
70
page_t* page) /* in: index page */
76
level = mach_read_from_2(page + PAGE_HEADER + PAGE_LEVEL);
78
ut_ad(level <= BTR_MAX_NODE_LEVEL);
83
/************************************************************
84
Gets the node level field in an index page. */
89
/* out: level, leaf level == 0 */
90
page_t* page, /* in: index page */
91
mtr_t* mtr __attribute__((unused))) /* in: mini-transaction handle */
95
return(btr_page_get_level_low(page));
98
/************************************************************
99
Sets the node level field in an index page. */
104
page_t* page, /* in: index page */
105
ulint level, /* in: level, leaf level == 0 */
106
mtr_t* mtr) /* in: mini-transaction handle */
109
ut_ad(level <= BTR_MAX_NODE_LEVEL);
111
mlog_write_ulint(page + PAGE_HEADER + PAGE_LEVEL, level,
115
/************************************************************
116
Gets the next index page number. */
121
/* out: next page number */
122
page_t* page, /* in: index page */
123
mtr_t* mtr __attribute__((unused))) /* in: mini-transaction handle */
126
ut_ad(mtr_memo_contains(mtr, buf_block_align(page),
128
|| mtr_memo_contains(mtr, buf_block_align(page),
129
MTR_MEMO_PAGE_S_FIX));
131
return(mach_read_from_4(page + FIL_PAGE_NEXT));
134
/************************************************************
135
Sets the next index page field. */
140
page_t* page, /* in: index page */
141
ulint next, /* in: next page number */
142
mtr_t* mtr) /* in: mini-transaction handle */
146
mlog_write_ulint(page + FIL_PAGE_NEXT, next, MLOG_4BYTES, mtr);
149
/************************************************************
150
Gets the previous index page number. */
155
/* out: prev page number */
156
page_t* page, /* in: index page */
157
mtr_t* mtr __attribute__((unused))) /* in: mini-transaction handle */
161
return(mach_read_from_4(page + FIL_PAGE_PREV));
164
/************************************************************
165
Sets the previous index page field. */
170
page_t* page, /* in: index page */
171
ulint prev, /* in: previous page number */
172
mtr_t* mtr) /* in: mini-transaction handle */
176
mlog_write_ulint(page + FIL_PAGE_PREV, prev, MLOG_4BYTES, mtr);
179
/******************************************************************
180
Gets the child node file address in a node pointer. */
183
btr_node_ptr_get_child_page_no(
184
/*===========================*/
185
/* out: child node address */
186
rec_t* rec, /* in: node pointer record */
187
const ulint* offsets)/* in: array returned by rec_get_offsets() */
193
ut_ad(!rec_offs_comp(offsets) || rec_get_node_ptr_flag(rec));
195
/* The child address is in the last field */
196
field = rec_get_nth_field(rec, offsets,
197
rec_offs_n_fields(offsets) - 1, &len);
201
page_no = mach_read_from_4(field);
203
if (UNIV_UNLIKELY(page_no == 0)) {
205
"InnoDB: a nonsensical page number 0"
206
" in a node ptr record at offset %lu\n",
207
(ulong) page_offset(rec));
208
buf_page_print(buf_frame_align(rec));
214
/******************************************************************
215
Releases the latches on a leaf page and bufferunfixes it. */
218
btr_leaf_page_release(
219
/*==================*/
220
page_t* page, /* in: page */
221
ulint latch_mode, /* in: BTR_SEARCH_LEAF or BTR_MODIFY_LEAF */
222
mtr_t* mtr) /* in: mtr */
224
ut_ad(!mtr_memo_contains(mtr, buf_block_align(page),
226
if (latch_mode == BTR_SEARCH_LEAF) {
227
mtr_memo_release(mtr, buf_block_align(page),
228
MTR_MEMO_PAGE_S_FIX);
230
ut_ad(latch_mode == BTR_MODIFY_LEAF);
231
mtr_memo_release(mtr, buf_block_align(page),
232
MTR_MEMO_PAGE_X_FIX);