mirror of
https://github.com/MariaDB/server.git
synced 2025-01-26 00:34:18 +01:00
8f18616ef0
and lexer files). From now on, the following Emacs cc-mode settings apply when indenting C function bodies in InnoDB: (setq c-basic-offset 8) (setq c-label-minimum-indentation 0) (add-to-list 'c-offsets-alist '(c . 0)) (add-to-list 'c-offsets-alist '(label . [0])) The indentation rules for function declarations still have not been formalized, and they must be formatted manually. Try to limit all lines to at most 79 characters (assuming TAB stops every 8 characters) by splitting lines before opening parenthesis, or at string constants. Fix some grammar mistakes in diagnostic output: match to, match with -> match found from -> found in trying rename -> trying to rename Fix an error in page_check_dir(): it said "supremum not pointed to" when the infimum was not pointed to. Enclose commented-out code snippets in #if 0 ... #endif instead of /* ... */. Add (void*) casts to some %p parameters in fprintf() calls. Try to split lines before a binary operator, not after one. (These three fixes were not made everywhere.)
168 lines
4.2 KiB
Text
168 lines
4.2 KiB
Text
/******************************************************
|
|
The index tree cursor
|
|
|
|
(c) 1994-1996 Innobase Oy
|
|
|
|
Created 10/16/1994 Heikki Tuuri
|
|
*******************************************************/
|
|
|
|
#include "btr0btr.h"
|
|
|
|
/*************************************************************
|
|
Returns the page cursor component of a tree cursor. */
|
|
UNIV_INLINE
|
|
page_cur_t*
|
|
btr_cur_get_page_cur(
|
|
/*=================*/
|
|
/* out: pointer to page cursor component */
|
|
btr_cur_t* cursor) /* in: tree cursor */
|
|
{
|
|
return(&(cursor->page_cur));
|
|
}
|
|
|
|
/*************************************************************
|
|
Returns the record pointer of a tree cursor. */
|
|
UNIV_INLINE
|
|
rec_t*
|
|
btr_cur_get_rec(
|
|
/*============*/
|
|
/* out: pointer to record */
|
|
btr_cur_t* cursor) /* in: tree cursor */
|
|
{
|
|
return(page_cur_get_rec(&(cursor->page_cur)));
|
|
}
|
|
|
|
/*************************************************************
|
|
Invalidates a tree cursor by setting record pointer to NULL. */
|
|
UNIV_INLINE
|
|
void
|
|
btr_cur_invalidate(
|
|
/*===============*/
|
|
btr_cur_t* cursor) /* in: tree cursor */
|
|
{
|
|
page_cur_invalidate(&(cursor->page_cur));
|
|
}
|
|
|
|
/*************************************************************
|
|
Returns the page of a tree cursor. */
|
|
UNIV_INLINE
|
|
page_t*
|
|
btr_cur_get_page(
|
|
/*=============*/
|
|
/* out: pointer to page */
|
|
btr_cur_t* cursor) /* in: tree cursor */
|
|
{
|
|
return(buf_frame_align(page_cur_get_rec(&(cursor->page_cur))));
|
|
}
|
|
|
|
/*************************************************************
|
|
Returns the tree of a cursor. */
|
|
UNIV_INLINE
|
|
dict_tree_t*
|
|
btr_cur_get_tree(
|
|
/*=============*/
|
|
/* out: tree */
|
|
btr_cur_t* cursor) /* in: tree cursor */
|
|
{
|
|
return((cursor->index)->tree);
|
|
}
|
|
|
|
/*************************************************************
|
|
Positions a tree cursor at a given record. */
|
|
UNIV_INLINE
|
|
void
|
|
btr_cur_position(
|
|
/*=============*/
|
|
dict_index_t* index, /* in: index */
|
|
rec_t* rec, /* in: record in tree */
|
|
btr_cur_t* cursor) /* in: cursor */
|
|
{
|
|
page_cur_position(rec, btr_cur_get_page_cur(cursor));
|
|
|
|
cursor->index = index;
|
|
}
|
|
|
|
/*************************************************************************
|
|
Checks if compressing an index page where a btr cursor is placed makes
|
|
sense. */
|
|
UNIV_INLINE
|
|
ibool
|
|
btr_cur_compress_recommendation(
|
|
/*============================*/
|
|
/* out: TRUE if compression is recommended */
|
|
btr_cur_t* cursor, /* in: btr cursor */
|
|
mtr_t* mtr) /* in: mtr */
|
|
{
|
|
page_t* page;
|
|
|
|
ut_ad(mtr_memo_contains(mtr, buf_block_align(btr_cur_get_rec(cursor)),
|
|
MTR_MEMO_PAGE_X_FIX));
|
|
|
|
page = btr_cur_get_page(cursor);
|
|
|
|
if ((page_get_data_size(page) < BTR_CUR_PAGE_COMPRESS_LIMIT)
|
|
|| ((btr_page_get_next(page, mtr) == FIL_NULL)
|
|
&& (btr_page_get_prev(page, mtr) == FIL_NULL))) {
|
|
|
|
/* The page fillfactor has dropped below a predefined
|
|
minimum value OR the level in the B-tree contains just
|
|
one page: we recommend compression if this is not the
|
|
root page. */
|
|
|
|
if (dict_tree_get_page((cursor->index)->tree)
|
|
== buf_frame_get_page_no(page)) {
|
|
|
|
/* It is the root page */
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
/*************************************************************************
|
|
Checks if the record on which the cursor is placed can be deleted without
|
|
making tree compression necessary (or, recommended). */
|
|
UNIV_INLINE
|
|
ibool
|
|
btr_cur_can_delete_without_compress(
|
|
/*================================*/
|
|
/* out: TRUE if can be deleted without
|
|
recommended compression */
|
|
btr_cur_t* cursor, /* in: btr cursor */
|
|
ulint rec_size,/* in: rec_get_size(btr_cur_get_rec(cursor))*/
|
|
mtr_t* mtr) /* in: mtr */
|
|
{
|
|
page_t* page;
|
|
|
|
ut_ad(mtr_memo_contains(mtr, buf_block_align(btr_cur_get_rec(cursor)),
|
|
MTR_MEMO_PAGE_X_FIX));
|
|
|
|
page = btr_cur_get_page(cursor);
|
|
|
|
if ((page_get_data_size(page) - rec_size < BTR_CUR_PAGE_COMPRESS_LIMIT)
|
|
|| ((btr_page_get_next(page, mtr) == FIL_NULL)
|
|
&& (btr_page_get_prev(page, mtr) == FIL_NULL))
|
|
|| (page_get_n_recs(page) < 2)) {
|
|
|
|
/* The page fillfactor will drop below a predefined
|
|
minimum value, OR the level in the B-tree contains just
|
|
one page, OR the page will become empty: we recommend
|
|
compression if this is not the root page. */
|
|
|
|
if (dict_tree_get_page((cursor->index)->tree)
|
|
== buf_frame_get_page_no(page)) {
|
|
|
|
/* It is the root page */
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
return(TRUE);
|
|
}
|