641.2.2
by Monty Taylor
InnoDB Plugin 1.0.3 |
1 |
/*****************************************************************************
|
2 |
||
3 |
Copyright (c) 1996, 2009, Innobase Oy. All Rights Reserved.
|
|
4 |
||
5 |
This program is free software; you can redistribute it and/or modify it under
|
|
6 |
the terms of the GNU General Public License as published by the Free Software
|
|
7 |
Foundation; version 2 of the License.
|
|
8 |
||
9 |
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
10 |
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
11 |
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
12 |
||
13 |
You should have received a copy of the GNU General Public License along with
|
|
14 |
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
15 |
Place, Suite 330, Boston, MA 02111-1307 USA
|
|
16 |
||
17 |
*****************************************************************************/
|
|
18 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
19 |
/**************************************************//**
|
20 |
@file include/btr0pcur.ic
|
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
21 |
The index tree persistent cursor
|
22 |
||
23 |
Created 2/23/1996 Heikki Tuuri
|
|
24 |
*******************************************************/
|
|
25 |
||
26 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
27 |
/*********************************************************//**
|
28 |
Gets the rel_pos field for a cursor whose position has been stored.
|
|
29 |
@return BTR_PCUR_ON, ... */
|
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
30 |
UNIV_INLINE
|
31 |
ulint
|
|
32 |
btr_pcur_get_rel_pos( |
|
33 |
/*=================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
34 |
const btr_pcur_t* cursor) /*!< in: persistent cursor */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
35 |
{
|
36 |
ut_ad(cursor); |
|
37 |
ut_ad(cursor->old_rec); |
|
38 |
ut_ad(cursor->old_stored == BTR_PCUR_OLD_STORED); |
|
39 |
ut_ad(cursor->pos_state == BTR_PCUR_WAS_POSITIONED |
|
40 |
|| cursor->pos_state == BTR_PCUR_IS_POSITIONED); |
|
41 |
||
42 |
return(cursor->rel_pos); |
|
43 |
}
|
|
44 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
45 |
/*********************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
46 |
Sets the mtr field for a pcur. */
|
47 |
UNIV_INLINE
|
|
48 |
void
|
|
49 |
btr_pcur_set_mtr( |
|
50 |
/*=============*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
51 |
btr_pcur_t* cursor, /*!< in: persistent cursor */ |
52 |
mtr_t* mtr) /*!< in, own: mtr */ |
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
53 |
{
|
54 |
ut_ad(cursor); |
|
55 |
||
56 |
cursor->mtr = mtr; |
|
57 |
}
|
|
58 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
59 |
/*********************************************************//**
|
60 |
Gets the mtr field for a pcur.
|
|
61 |
@return mtr */
|
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
62 |
UNIV_INLINE
|
63 |
mtr_t* |
|
64 |
btr_pcur_get_mtr( |
|
65 |
/*=============*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
66 |
btr_pcur_t* cursor) /*!< in: persistent cursor */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
67 |
{
|
68 |
ut_ad(cursor); |
|
69 |
||
70 |
return(cursor->mtr); |
|
71 |
}
|
|
72 |
||
73 |
#ifdef UNIV_DEBUG |
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
74 |
/*********************************************************//**
|
75 |
Returns the btr cursor component of a persistent cursor.
|
|
76 |
@return pointer to btr cursor component */
|
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
77 |
UNIV_INLINE
|
78 |
btr_cur_t* |
|
79 |
btr_pcur_get_btr_cur( |
|
80 |
/*=================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
81 |
const btr_pcur_t* cursor) /*!< in: persistent cursor */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
82 |
{
|
83 |
const btr_cur_t* btr_cur = &cursor->btr_cur; |
|
84 |
return((btr_cur_t*) btr_cur); |
|
85 |
}
|
|
86 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
87 |
/*********************************************************//**
|
88 |
Returns the page cursor component of a persistent cursor.
|
|
89 |
@return pointer to page cursor component */
|
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
90 |
UNIV_INLINE
|
91 |
page_cur_t* |
|
92 |
btr_pcur_get_page_cur( |
|
93 |
/*==================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
94 |
const btr_pcur_t* cursor) /*!< in: persistent cursor */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
95 |
{
|
96 |
return(btr_cur_get_page_cur(btr_pcur_get_btr_cur(cursor))); |
|
97 |
}
|
|
98 |
#endif /* UNIV_DEBUG */ |
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
99 |
/*********************************************************//**
|
100 |
Returns the page of a persistent cursor.
|
|
101 |
@return pointer to the page */
|
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
102 |
UNIV_INLINE
|
103 |
page_t* |
|
104 |
btr_pcur_get_page( |
|
105 |
/*==============*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
106 |
btr_pcur_t* cursor) /*!< in: persistent cursor */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
107 |
{
|
108 |
ut_ad(cursor->pos_state == BTR_PCUR_IS_POSITIONED); |
|
109 |
||
110 |
return(btr_cur_get_page(btr_pcur_get_btr_cur(cursor))); |
|
111 |
}
|
|
112 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
113 |
/*********************************************************//**
|
114 |
Returns the buffer block of a persistent cursor.
|
|
115 |
@return pointer to the block */
|
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
116 |
UNIV_INLINE
|
117 |
buf_block_t* |
|
118 |
btr_pcur_get_block( |
|
119 |
/*===============*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
120 |
btr_pcur_t* cursor) /*!< in: persistent cursor */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
121 |
{
|
122 |
ut_ad(cursor->pos_state == BTR_PCUR_IS_POSITIONED); |
|
123 |
||
124 |
return(btr_cur_get_block(btr_pcur_get_btr_cur(cursor))); |
|
125 |
}
|
|
126 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
127 |
/*********************************************************//**
|
128 |
Returns the record of a persistent cursor.
|
|
129 |
@return pointer to the record */
|
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
130 |
UNIV_INLINE
|
131 |
rec_t* |
|
132 |
btr_pcur_get_rec( |
|
133 |
/*=============*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
134 |
btr_pcur_t* cursor) /*!< in: persistent cursor */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
135 |
{
|
136 |
ut_ad(cursor->pos_state == BTR_PCUR_IS_POSITIONED); |
|
137 |
ut_ad(cursor->latch_mode != BTR_NO_LATCHES); |
|
138 |
||
139 |
return(btr_cur_get_rec(btr_pcur_get_btr_cur(cursor))); |
|
140 |
}
|
|
141 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
142 |
/**************************************************************//**
|
143 |
Gets the up_match value for a pcur after a search.
|
|
144 |
@return number of matched fields at the cursor or to the right if
|
|
145 |
search mode was PAGE_CUR_GE, otherwise undefined */
|
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
146 |
UNIV_INLINE
|
147 |
ulint
|
|
148 |
btr_pcur_get_up_match( |
|
149 |
/*==================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
150 |
btr_pcur_t* cursor) /*!< in: memory buffer for persistent cursor */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
151 |
{
|
152 |
btr_cur_t* btr_cursor; |
|
153 |
||
154 |
ut_ad((cursor->pos_state == BTR_PCUR_WAS_POSITIONED) |
|
155 |
|| (cursor->pos_state == BTR_PCUR_IS_POSITIONED)); |
|
156 |
||
157 |
btr_cursor = btr_pcur_get_btr_cur(cursor); |
|
158 |
||
159 |
ut_ad(btr_cursor->up_match != ULINT_UNDEFINED); |
|
160 |
||
161 |
return(btr_cursor->up_match); |
|
162 |
}
|
|
163 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
164 |
/**************************************************************//**
|
165 |
Gets the low_match value for a pcur after a search.
|
|
166 |
@return number of matched fields at the cursor or to the right if
|
|
167 |
search mode was PAGE_CUR_LE, otherwise undefined */
|
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
168 |
UNIV_INLINE
|
169 |
ulint
|
|
170 |
btr_pcur_get_low_match( |
|
171 |
/*===================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
172 |
btr_pcur_t* cursor) /*!< in: memory buffer for persistent cursor */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
173 |
{
|
174 |
btr_cur_t* btr_cursor; |
|
175 |
||
176 |
ut_ad((cursor->pos_state == BTR_PCUR_WAS_POSITIONED) |
|
177 |
|| (cursor->pos_state == BTR_PCUR_IS_POSITIONED)); |
|
178 |
||
179 |
btr_cursor = btr_pcur_get_btr_cur(cursor); |
|
180 |
ut_ad(btr_cursor->low_match != ULINT_UNDEFINED); |
|
181 |
||
182 |
return(btr_cursor->low_match); |
|
183 |
}
|
|
184 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
185 |
/*********************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
186 |
Checks if the persistent cursor is after the last user record on
|
187 |
a page. */
|
|
188 |
UNIV_INLINE
|
|
189 |
ibool
|
|
190 |
btr_pcur_is_after_last_on_page( |
|
191 |
/*===========================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
192 |
const btr_pcur_t* cursor) /*!< in: persistent cursor */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
193 |
{
|
194 |
ut_ad(cursor->pos_state == BTR_PCUR_IS_POSITIONED); |
|
195 |
ut_ad(cursor->latch_mode != BTR_NO_LATCHES); |
|
196 |
||
197 |
return(page_cur_is_after_last(btr_pcur_get_page_cur(cursor))); |
|
198 |
}
|
|
199 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
200 |
/*********************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
201 |
Checks if the persistent cursor is before the first user record on
|
202 |
a page. */
|
|
203 |
UNIV_INLINE
|
|
204 |
ibool
|
|
205 |
btr_pcur_is_before_first_on_page( |
|
206 |
/*=============================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
207 |
const btr_pcur_t* cursor) /*!< in: persistent cursor */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
208 |
{
|
209 |
ut_ad(cursor->pos_state == BTR_PCUR_IS_POSITIONED); |
|
210 |
ut_ad(cursor->latch_mode != BTR_NO_LATCHES); |
|
211 |
||
212 |
return(page_cur_is_before_first(btr_pcur_get_page_cur(cursor))); |
|
213 |
}
|
|
214 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
215 |
/*********************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
216 |
Checks if the persistent cursor is on a user record. */
|
217 |
UNIV_INLINE
|
|
218 |
ibool
|
|
219 |
btr_pcur_is_on_user_rec( |
|
220 |
/*====================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
221 |
const btr_pcur_t* cursor) /*!< in: persistent cursor */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
222 |
{
|
223 |
ut_ad(cursor->pos_state == BTR_PCUR_IS_POSITIONED); |
|
224 |
ut_ad(cursor->latch_mode != BTR_NO_LATCHES); |
|
225 |
||
226 |
if (btr_pcur_is_before_first_on_page(cursor) |
|
227 |
|| btr_pcur_is_after_last_on_page(cursor)) { |
|
228 |
||
229 |
return(FALSE); |
|
230 |
} |
|
231 |
||
232 |
return(TRUE); |
|
233 |
}
|
|
234 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
235 |
/*********************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
236 |
Checks if the persistent cursor is before the first user record in
|
237 |
the index tree. */
|
|
238 |
UNIV_INLINE
|
|
239 |
ibool
|
|
240 |
btr_pcur_is_before_first_in_tree( |
|
241 |
/*=============================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
242 |
btr_pcur_t* cursor, /*!< in: persistent cursor */ |
243 |
mtr_t* mtr) /*!< in: mtr */ |
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
244 |
{
|
245 |
ut_ad(cursor->pos_state == BTR_PCUR_IS_POSITIONED); |
|
246 |
ut_ad(cursor->latch_mode != BTR_NO_LATCHES); |
|
247 |
||
248 |
if (btr_page_get_prev(btr_pcur_get_page(cursor), mtr) != FIL_NULL) { |
|
249 |
||
250 |
return(FALSE); |
|
251 |
} |
|
252 |
||
253 |
return(page_cur_is_before_first(btr_pcur_get_page_cur(cursor))); |
|
254 |
}
|
|
255 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
256 |
/*********************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
257 |
Checks if the persistent cursor is after the last user record in
|
258 |
the index tree. */
|
|
259 |
UNIV_INLINE
|
|
260 |
ibool
|
|
261 |
btr_pcur_is_after_last_in_tree( |
|
262 |
/*===========================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
263 |
btr_pcur_t* cursor, /*!< in: persistent cursor */ |
264 |
mtr_t* mtr) /*!< in: mtr */ |
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
265 |
{
|
266 |
ut_ad(cursor->pos_state == BTR_PCUR_IS_POSITIONED); |
|
267 |
ut_ad(cursor->latch_mode != BTR_NO_LATCHES); |
|
268 |
||
269 |
if (btr_page_get_next(btr_pcur_get_page(cursor), mtr) != FIL_NULL) { |
|
270 |
||
271 |
return(FALSE); |
|
272 |
} |
|
273 |
||
274 |
return(page_cur_is_after_last(btr_pcur_get_page_cur(cursor))); |
|
275 |
}
|
|
276 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
277 |
/*********************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
278 |
Moves the persistent cursor to the next record on the same page. */
|
279 |
UNIV_INLINE
|
|
280 |
void
|
|
281 |
btr_pcur_move_to_next_on_page( |
|
282 |
/*==========================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
283 |
btr_pcur_t* cursor) /*!< in/out: persistent cursor */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
284 |
{
|
285 |
ut_ad(cursor->pos_state == BTR_PCUR_IS_POSITIONED); |
|
286 |
ut_ad(cursor->latch_mode != BTR_NO_LATCHES); |
|
287 |
||
288 |
page_cur_move_to_next(btr_pcur_get_page_cur(cursor)); |
|
289 |
||
290 |
cursor->old_stored = BTR_PCUR_OLD_NOT_STORED; |
|
291 |
}
|
|
292 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
293 |
/*********************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
294 |
Moves the persistent cursor to the previous record on the same page. */
|
295 |
UNIV_INLINE
|
|
296 |
void
|
|
297 |
btr_pcur_move_to_prev_on_page( |
|
298 |
/*==========================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
299 |
btr_pcur_t* cursor) /*!< in/out: persistent cursor */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
300 |
{
|
301 |
ut_ad(cursor->pos_state == BTR_PCUR_IS_POSITIONED); |
|
302 |
ut_ad(cursor->latch_mode != BTR_NO_LATCHES); |
|
303 |
||
304 |
page_cur_move_to_prev(btr_pcur_get_page_cur(cursor)); |
|
305 |
||
306 |
cursor->old_stored = BTR_PCUR_OLD_NOT_STORED; |
|
307 |
}
|
|
308 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
309 |
/*********************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
310 |
Moves the persistent cursor to the last record on the same page. */
|
311 |
UNIV_INLINE
|
|
312 |
void
|
|
313 |
btr_pcur_move_to_last_on_page( |
|
314 |
/*==========================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
315 |
btr_pcur_t* cursor, /*!< in: persistent cursor */ |
316 |
mtr_t* mtr) /*!< in: mtr */ |
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
317 |
{
|
318 |
UT_NOT_USED(mtr); |
|
319 |
ut_ad(cursor->latch_mode != BTR_NO_LATCHES); |
|
320 |
||
321 |
page_cur_set_after_last(btr_pcur_get_block(cursor), |
|
322 |
btr_pcur_get_page_cur(cursor)); |
|
323 |
||
324 |
cursor->old_stored = BTR_PCUR_OLD_NOT_STORED; |
|
325 |
}
|
|
326 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
327 |
/*********************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
328 |
Moves the persistent cursor to the next user record in the tree. If no user
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
329 |
records are left, the cursor ends up 'after last in tree'.
|
330 |
@return TRUE if the cursor moved forward, ending on a user record */
|
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
331 |
UNIV_INLINE
|
332 |
ibool
|
|
333 |
btr_pcur_move_to_next_user_rec( |
|
334 |
/*===========================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
335 |
btr_pcur_t* cursor, /*!< in: persistent cursor; NOTE that the |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
336 |
function may release the page latch */
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
337 |
mtr_t* mtr) /*!< in: mtr */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
338 |
{
|
339 |
ut_ad(cursor->pos_state == BTR_PCUR_IS_POSITIONED); |
|
340 |
ut_ad(cursor->latch_mode != BTR_NO_LATCHES); |
|
341 |
cursor->old_stored = BTR_PCUR_OLD_NOT_STORED; |
|
342 |
loop: |
|
343 |
if (btr_pcur_is_after_last_on_page(cursor)) { |
|
344 |
||
345 |
if (btr_pcur_is_after_last_in_tree(cursor, mtr)) { |
|
346 |
||
347 |
return(FALSE); |
|
348 |
} |
|
349 |
||
350 |
btr_pcur_move_to_next_page(cursor, mtr); |
|
351 |
} else { |
|
352 |
btr_pcur_move_to_next_on_page(cursor); |
|
353 |
} |
|
354 |
||
355 |
if (btr_pcur_is_on_user_rec(cursor)) { |
|
356 |
||
357 |
return(TRUE); |
|
358 |
} |
|
359 |
||
360 |
goto loop; |
|
361 |
}
|
|
362 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
363 |
/*********************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
364 |
Moves the persistent cursor to the next record in the tree. If no records are
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
365 |
left, the cursor stays 'after last in tree'.
|
366 |
@return TRUE if the cursor was not after last in tree */
|
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
367 |
UNIV_INLINE
|
368 |
ibool
|
|
369 |
btr_pcur_move_to_next( |
|
370 |
/*==================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
371 |
btr_pcur_t* cursor, /*!< in: persistent cursor; NOTE that the |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
372 |
function may release the page latch */
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
373 |
mtr_t* mtr) /*!< in: mtr */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
374 |
{
|
375 |
ut_ad(cursor->pos_state == BTR_PCUR_IS_POSITIONED); |
|
376 |
ut_ad(cursor->latch_mode != BTR_NO_LATCHES); |
|
377 |
||
378 |
cursor->old_stored = BTR_PCUR_OLD_NOT_STORED; |
|
379 |
||
380 |
if (btr_pcur_is_after_last_on_page(cursor)) { |
|
381 |
||
382 |
if (btr_pcur_is_after_last_in_tree(cursor, mtr)) { |
|
383 |
||
384 |
return(FALSE); |
|
385 |
} |
|
386 |
||
387 |
btr_pcur_move_to_next_page(cursor, mtr); |
|
388 |
||
389 |
return(TRUE); |
|
390 |
} |
|
391 |
||
392 |
btr_pcur_move_to_next_on_page(cursor); |
|
393 |
||
394 |
return(TRUE); |
|
395 |
}
|
|
396 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
397 |
/**************************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
398 |
Commits the pcur mtr and sets the pcur latch mode to BTR_NO_LATCHES,
|
399 |
that is, the cursor becomes detached. If there have been modifications
|
|
400 |
to the page where pcur is positioned, this can be used instead of
|
|
401 |
btr_pcur_release_leaf. Function btr_pcur_store_position should be used
|
|
402 |
before calling this, if restoration of cursor is wanted later. */
|
|
403 |
UNIV_INLINE
|
|
404 |
void
|
|
405 |
btr_pcur_commit( |
|
406 |
/*============*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
407 |
btr_pcur_t* pcur) /*!< in: persistent cursor */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
408 |
{
|
409 |
ut_a(pcur->pos_state == BTR_PCUR_IS_POSITIONED); |
|
410 |
||
411 |
pcur->latch_mode = BTR_NO_LATCHES; |
|
412 |
||
413 |
mtr_commit(pcur->mtr); |
|
414 |
||
415 |
pcur->pos_state = BTR_PCUR_WAS_POSITIONED; |
|
416 |
}
|
|
417 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
418 |
/**************************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
419 |
Differs from btr_pcur_commit in that we can specify the mtr to commit. */
|
420 |
UNIV_INLINE
|
|
421 |
void
|
|
422 |
btr_pcur_commit_specify_mtr( |
|
423 |
/*========================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
424 |
btr_pcur_t* pcur, /*!< in: persistent cursor */ |
425 |
mtr_t* mtr) /*!< in: mtr to commit */ |
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
426 |
{
|
427 |
ut_a(pcur->pos_state == BTR_PCUR_IS_POSITIONED); |
|
428 |
||
429 |
pcur->latch_mode = BTR_NO_LATCHES; |
|
430 |
||
431 |
mtr_commit(mtr); |
|
432 |
||
433 |
pcur->pos_state = BTR_PCUR_WAS_POSITIONED; |
|
434 |
}
|
|
435 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
436 |
/**************************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
437 |
Sets the pcur latch mode to BTR_NO_LATCHES. */
|
438 |
UNIV_INLINE
|
|
439 |
void
|
|
440 |
btr_pcur_detach( |
|
441 |
/*============*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
442 |
btr_pcur_t* pcur) /*!< in: persistent cursor */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
443 |
{
|
444 |
ut_a(pcur->pos_state == BTR_PCUR_IS_POSITIONED); |
|
445 |
||
446 |
pcur->latch_mode = BTR_NO_LATCHES; |
|
447 |
||
448 |
pcur->pos_state = BTR_PCUR_WAS_POSITIONED; |
|
449 |
}
|
|
450 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
451 |
/**************************************************************//**
|
452 |
Tests if a cursor is detached: that is the latch mode is BTR_NO_LATCHES.
|
|
453 |
@return TRUE if detached */
|
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
454 |
UNIV_INLINE
|
455 |
ibool
|
|
456 |
btr_pcur_is_detached( |
|
457 |
/*=================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
458 |
btr_pcur_t* pcur) /*!< in: persistent cursor */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
459 |
{
|
460 |
if (pcur->latch_mode == BTR_NO_LATCHES) { |
|
461 |
||
462 |
return(TRUE); |
|
463 |
} |
|
464 |
||
465 |
return(FALSE); |
|
466 |
}
|
|
467 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
468 |
/**************************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
469 |
Sets the old_rec_buf field to NULL. */
|
470 |
UNIV_INLINE
|
|
471 |
void
|
|
472 |
btr_pcur_init( |
|
473 |
/*==========*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
474 |
btr_pcur_t* pcur) /*!< in: persistent cursor */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
475 |
{
|
476 |
pcur->old_stored = BTR_PCUR_OLD_NOT_STORED; |
|
477 |
pcur->old_rec_buf = NULL; |
|
478 |
pcur->old_rec = NULL; |
|
479 |
}
|
|
480 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
481 |
/**************************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
482 |
Initializes and opens a persistent cursor to an index tree. It should be
|
483 |
closed with btr_pcur_close. */
|
|
484 |
UNIV_INLINE
|
|
485 |
void
|
|
486 |
btr_pcur_open( |
|
487 |
/*==========*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
488 |
dict_index_t* index, /*!< in: index */ |
489 |
const dtuple_t* tuple, /*!< in: tuple on which search done */ |
|
490 |
ulint mode, /*!< in: PAGE_CUR_L, ...; |
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
491 |
NOTE that if the search is made using a unique
|
492 |
prefix of a record, mode should be
|
|
493 |
PAGE_CUR_LE, not PAGE_CUR_GE, as the latter
|
|
494 |
may end up on the previous page from the
|
|
495 |
record! */
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
496 |
ulint latch_mode,/*!< in: BTR_SEARCH_LEAF, ... */ |
497 |
btr_pcur_t* cursor, /*!< in: memory buffer for persistent cursor */ |
|
498 |
mtr_t* mtr) /*!< in: mtr */ |
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
499 |
{
|
500 |
btr_cur_t* btr_cursor; |
|
501 |
||
502 |
/* Initialize the cursor */ |
|
503 |
||
504 |
btr_pcur_init(cursor); |
|
505 |
||
506 |
cursor->latch_mode = latch_mode; |
|
507 |
cursor->search_mode = mode; |
|
508 |
||
509 |
/* Search with the tree cursor */ |
|
510 |
||
511 |
btr_cursor = btr_pcur_get_btr_cur(cursor); |
|
512 |
||
513 |
btr_cur_search_to_nth_level(index, 0, tuple, mode, latch_mode, |
|
514 |
btr_cursor, 0, mtr); |
|
515 |
cursor->pos_state = BTR_PCUR_IS_POSITIONED; |
|
516 |
||
517 |
cursor->trx_if_known = NULL; |
|
518 |
}
|
|
519 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
520 |
/**************************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
521 |
Opens an persistent cursor to an index tree without initializing the
|
522 |
cursor. */
|
|
523 |
UNIV_INLINE
|
|
524 |
void
|
|
525 |
btr_pcur_open_with_no_init( |
|
526 |
/*=======================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
527 |
dict_index_t* index, /*!< in: index */ |
528 |
const dtuple_t* tuple, /*!< in: tuple on which search done */ |
|
529 |
ulint mode, /*!< in: PAGE_CUR_L, ...; |
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
530 |
NOTE that if the search is made using a unique
|
531 |
prefix of a record, mode should be
|
|
532 |
PAGE_CUR_LE, not PAGE_CUR_GE, as the latter
|
|
533 |
may end up on the previous page of the
|
|
534 |
record! */
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
535 |
ulint latch_mode,/*!< in: BTR_SEARCH_LEAF, ...; |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
536 |
NOTE that if has_search_latch != 0 then
|
537 |
we maybe do not acquire a latch on the cursor
|
|
538 |
page, but assume that the caller uses his
|
|
539 |
btr search latch to protect the record! */
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
540 |
btr_pcur_t* cursor, /*!< in: memory buffer for persistent cursor */ |
541 |
ulint has_search_latch,/*!< in: latch mode the caller |
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
542 |
currently has on btr_search_latch:
|
543 |
RW_S_LATCH, or 0 */
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
544 |
mtr_t* mtr) /*!< in: mtr */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
545 |
{
|
546 |
btr_cur_t* btr_cursor; |
|
547 |
||
548 |
cursor->latch_mode = latch_mode; |
|
549 |
cursor->search_mode = mode; |
|
550 |
||
551 |
/* Search with the tree cursor */ |
|
552 |
||
553 |
btr_cursor = btr_pcur_get_btr_cur(cursor); |
|
554 |
||
555 |
btr_cur_search_to_nth_level(index, 0, tuple, mode, latch_mode, |
|
556 |
btr_cursor, has_search_latch, mtr); |
|
557 |
cursor->pos_state = BTR_PCUR_IS_POSITIONED; |
|
558 |
||
559 |
cursor->old_stored = BTR_PCUR_OLD_NOT_STORED; |
|
560 |
||
561 |
cursor->trx_if_known = NULL; |
|
562 |
}
|
|
563 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
564 |
/*****************************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
565 |
Opens a persistent cursor at either end of an index. */
|
566 |
UNIV_INLINE
|
|
567 |
void
|
|
568 |
btr_pcur_open_at_index_side( |
|
569 |
/*========================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
570 |
ibool from_left, /*!< in: TRUE if open to the low end, |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
571 |
FALSE if to the high end */
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
572 |
dict_index_t* index, /*!< in: index */ |
573 |
ulint latch_mode, /*!< in: latch mode */ |
|
574 |
btr_pcur_t* pcur, /*!< in: cursor */ |
|
575 |
ibool do_init, /*!< in: TRUE if should be initialized */ |
|
576 |
mtr_t* mtr) /*!< in: mtr */ |
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
577 |
{
|
578 |
pcur->latch_mode = latch_mode; |
|
579 |
||
580 |
if (from_left) { |
|
581 |
pcur->search_mode = PAGE_CUR_G; |
|
582 |
} else { |
|
583 |
pcur->search_mode = PAGE_CUR_L; |
|
584 |
} |
|
585 |
||
586 |
if (do_init) { |
|
587 |
btr_pcur_init(pcur); |
|
588 |
} |
|
589 |
||
590 |
btr_cur_open_at_index_side(from_left, index, latch_mode, |
|
591 |
btr_pcur_get_btr_cur(pcur), mtr); |
|
592 |
pcur->pos_state = BTR_PCUR_IS_POSITIONED; |
|
593 |
||
594 |
pcur->old_stored = BTR_PCUR_OLD_NOT_STORED; |
|
595 |
||
596 |
pcur->trx_if_known = NULL; |
|
597 |
}
|
|
598 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
599 |
/**********************************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
600 |
Positions a cursor at a randomly chosen position within a B-tree. */
|
601 |
UNIV_INLINE
|
|
602 |
void
|
|
603 |
btr_pcur_open_at_rnd_pos( |
|
604 |
/*=====================*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
605 |
dict_index_t* index, /*!< in: index */ |
606 |
ulint latch_mode, /*!< in: BTR_SEARCH_LEAF, ... */ |
|
607 |
btr_pcur_t* cursor, /*!< in/out: B-tree pcur */ |
|
608 |
mtr_t* mtr) /*!< in: mtr */ |
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
609 |
{
|
610 |
/* Initialize the cursor */ |
|
611 |
||
612 |
cursor->latch_mode = latch_mode; |
|
613 |
cursor->search_mode = PAGE_CUR_G; |
|
614 |
||
615 |
btr_pcur_init(cursor); |
|
616 |
||
617 |
btr_cur_open_at_rnd_pos(index, latch_mode, |
|
618 |
btr_pcur_get_btr_cur(cursor), mtr); |
|
619 |
cursor->pos_state = BTR_PCUR_IS_POSITIONED; |
|
620 |
cursor->old_stored = BTR_PCUR_OLD_NOT_STORED; |
|
621 |
||
622 |
cursor->trx_if_known = NULL; |
|
623 |
}
|
|
624 |
||
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
625 |
/**************************************************************//**
|
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
626 |
Frees the possible memory heap of a persistent cursor and sets the latch
|
627 |
mode of the persistent cursor to BTR_NO_LATCHES. */
|
|
628 |
UNIV_INLINE
|
|
629 |
void
|
|
630 |
btr_pcur_close( |
|
631 |
/*===========*/
|
|
641.2.3
by Monty Taylor
InnoDB Plugin 1.0.4 |
632 |
btr_pcur_t* cursor) /*!< in: persistent cursor */ |
641.1.2
by Monty Taylor
Imported 1.0.1 with clean - with no changes. |
633 |
{
|
634 |
if (cursor->old_rec_buf != NULL) { |
|
635 |
||
636 |
mem_free(cursor->old_rec_buf); |
|
637 |
||
638 |
cursor->old_rec = NULL; |
|
639 |
cursor->old_rec_buf = NULL; |
|
640 |
} |
|
641 |
||
642 |
cursor->btr_cur.page_cur.rec = NULL; |
|
643 |
cursor->btr_cur.page_cur.block = NULL; |
|
644 |
cursor->old_rec = NULL; |
|
645 |
cursor->old_stored = BTR_PCUR_OLD_NOT_STORED; |
|
646 |
||
647 |
cursor->latch_mode = BTR_NO_LATCHES; |
|
648 |
cursor->pos_state = BTR_PCUR_NOT_POSITIONED; |
|
649 |
||
650 |
cursor->trx_if_known = NULL; |
|
651 |
}
|