mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
9c20e1e704
manual.texi Changed innodb_unix_file_flush_method to innodb_flush_method in the manual Docs/manual.texi: Changed innodb_unix_file_flush_method to innodb_flush_method in the manual innobase/include/page0cur.ic: Fix a bug in insert buffer and multiversioning BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted
221 lines
5.3 KiB
Text
221 lines
5.3 KiB
Text
/************************************************************************
|
|
The page cursor
|
|
|
|
(c) 1994-1996 Innobase Oy
|
|
|
|
Created 10/4/1994 Heikki Tuuri
|
|
*************************************************************************/
|
|
|
|
#include "page0page.h"
|
|
|
|
|
|
/*************************************************************
|
|
Gets pointer to the page frame where the cursor is positioned. */
|
|
UNIV_INLINE
|
|
page_t*
|
|
page_cur_get_page(
|
|
/*==============*/
|
|
/* out: page */
|
|
page_cur_t* cur) /* in: page cursor */
|
|
{
|
|
ut_ad(cur);
|
|
|
|
return(buf_frame_align(cur->rec));
|
|
}
|
|
|
|
/*************************************************************
|
|
Gets the record where the cursor is positioned. */
|
|
UNIV_INLINE
|
|
rec_t*
|
|
page_cur_get_rec(
|
|
/*=============*/
|
|
/* out: record */
|
|
page_cur_t* cur) /* in: page cursor */
|
|
{
|
|
ut_ad(cur);
|
|
|
|
return(cur->rec);
|
|
}
|
|
|
|
/*************************************************************
|
|
Sets the cursor object to point before the first user record
|
|
on the page. */
|
|
UNIV_INLINE
|
|
void
|
|
page_cur_set_before_first(
|
|
/*======================*/
|
|
page_t* page, /* in: index page */
|
|
page_cur_t* cur) /* in: cursor */
|
|
{
|
|
cur->rec = page_get_infimum_rec(page);
|
|
}
|
|
|
|
/*************************************************************
|
|
Sets the cursor object to point after the last user record on
|
|
the page. */
|
|
UNIV_INLINE
|
|
void
|
|
page_cur_set_after_last(
|
|
/*====================*/
|
|
page_t* page, /* in: index page */
|
|
page_cur_t* cur) /* in: cursor */
|
|
{
|
|
cur->rec = page_get_supremum_rec(page);
|
|
}
|
|
|
|
/*************************************************************
|
|
Returns TRUE if the cursor is before first user record on page. */
|
|
UNIV_INLINE
|
|
ibool
|
|
page_cur_is_before_first(
|
|
/*=====================*/
|
|
/* out: TRUE if at start */
|
|
page_cur_t* cur) /* in: cursor */
|
|
{
|
|
if (page_get_infimum_rec(page_cur_get_page(cur)) == cur->rec) {
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
/*************************************************************
|
|
Returns TRUE if the cursor is after last user record. */
|
|
UNIV_INLINE
|
|
ibool
|
|
page_cur_is_after_last(
|
|
/*===================*/
|
|
/* out: TRUE if at end */
|
|
page_cur_t* cur) /* in: cursor */
|
|
{
|
|
if (page_get_supremum_rec(page_cur_get_page(cur)) == cur->rec) {
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
/**************************************************************
|
|
Positions the cursor on the given record. */
|
|
UNIV_INLINE
|
|
void
|
|
page_cur_position(
|
|
/*==============*/
|
|
rec_t* rec, /* in: record on a page */
|
|
page_cur_t* cur) /* in: page cursor */
|
|
{
|
|
ut_ad(rec && cur);
|
|
|
|
cur->rec = rec;
|
|
}
|
|
|
|
/**************************************************************
|
|
Invalidates a page cursor by setting the record pointer NULL. */
|
|
UNIV_INLINE
|
|
void
|
|
page_cur_invalidate(
|
|
/*================*/
|
|
page_cur_t* cur) /* in: page cursor */
|
|
{
|
|
ut_ad(cur);
|
|
|
|
cur->rec = NULL;
|
|
}
|
|
|
|
/**************************************************************
|
|
Moves the cursor to the next record on page. */
|
|
UNIV_INLINE
|
|
void
|
|
page_cur_move_to_next(
|
|
/*==================*/
|
|
page_cur_t* cur) /* in: cursor; must not be after last */
|
|
{
|
|
ut_ad(!page_cur_is_after_last(cur));
|
|
|
|
cur->rec = page_rec_get_next(cur->rec);
|
|
}
|
|
|
|
/**************************************************************
|
|
Moves the cursor to the previous record on page. */
|
|
UNIV_INLINE
|
|
void
|
|
page_cur_move_to_prev(
|
|
/*==================*/
|
|
page_cur_t* cur) /* in: cursor; must not before first */
|
|
{
|
|
ut_ad(!page_cur_is_before_first(cur));
|
|
|
|
cur->rec = page_rec_get_prev(cur->rec);
|
|
}
|
|
|
|
/********************************************************************
|
|
Searches the right position for a page cursor. */
|
|
UNIV_INLINE
|
|
ulint
|
|
page_cur_search(
|
|
/*============*/
|
|
/* out: number of matched fields on the left */
|
|
page_t* page, /* in: index page */
|
|
dtuple_t* tuple, /* in: data tuple */
|
|
ulint mode, /* in: PAGE_CUR_L, PAGE_CUR_LE, PAGE_CUR_G,
|
|
or PAGE_CUR_GE */
|
|
page_cur_t* cursor) /* out: page cursor */
|
|
{
|
|
ulint low_matched_fields = 0;
|
|
ulint low_matched_bytes = 0;
|
|
ulint up_matched_fields = 0;
|
|
ulint up_matched_bytes = 0;
|
|
|
|
ut_ad(dtuple_check_typed(tuple));
|
|
|
|
page_cur_search_with_match(page, tuple, mode,
|
|
&up_matched_fields,
|
|
&up_matched_bytes,
|
|
&low_matched_fields,
|
|
&low_matched_bytes,
|
|
cursor);
|
|
return(low_matched_fields);
|
|
}
|
|
|
|
/***************************************************************
|
|
Inserts a record next to page cursor. Returns pointer to inserted record if
|
|
succeed, i.e., enough space available, NULL otherwise. The cursor stays at
|
|
the same position. */
|
|
UNIV_INLINE
|
|
rec_t*
|
|
page_cur_tuple_insert(
|
|
/*==================*/
|
|
/* out: pointer to record if succeed, NULL
|
|
otherwise */
|
|
page_cur_t* cursor, /* in: a page cursor */
|
|
dtuple_t* tuple, /* in: pointer to a data tuple */
|
|
mtr_t* mtr) /* in: mini-transaction handle */
|
|
{
|
|
ulint data_size;
|
|
|
|
ut_ad(dtuple_check_typed(tuple));
|
|
|
|
data_size = dtuple_get_data_size(tuple);
|
|
|
|
return(page_cur_insert_rec_low(cursor, tuple, data_size, NULL, mtr));
|
|
}
|
|
|
|
/***************************************************************
|
|
Inserts a record next to page cursor. Returns pointer to inserted record if
|
|
succeed, i.e., enough space available, NULL otherwise. The cursor stays at
|
|
the same position. */
|
|
UNIV_INLINE
|
|
rec_t*
|
|
page_cur_rec_insert(
|
|
/*================*/
|
|
/* out: pointer to record if succeed, NULL
|
|
otherwise */
|
|
page_cur_t* cursor, /* in: a page cursor */
|
|
rec_t* rec, /* in: record to insert */
|
|
mtr_t* mtr) /* in: mini-transaction handle */
|
|
{
|
|
return(page_cur_insert_rec_low(cursor, NULL, 0, rec, mtr));
|
|
}
|
|
|