~drizzle-trunk/drizzle/development

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
}