~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to storage/innobase/include/btr0cur.ic

Merge of Jay

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/******************************************************
2
 
The index tree cursor
3
 
 
4
 
(c) 1994-1996 Innobase Oy
5
 
 
6
 
Created 10/16/1994 Heikki Tuuri
7
 
*******************************************************/
8
 
 
9
 
#include "btr0btr.h"
10
 
 
11
 
/*************************************************************
12
 
Returns the page cursor component of a tree cursor. */
13
 
UNIV_INLINE
14
 
page_cur_t*
15
 
btr_cur_get_page_cur(
16
 
/*=================*/
17
 
                                /* out: pointer to page cursor component */
18
 
        btr_cur_t*      cursor) /* in: tree cursor */
19
 
{
20
 
        return(&(cursor->page_cur));
21
 
}
22
 
 
23
 
/*************************************************************
24
 
Returns the record pointer of a tree cursor. */
25
 
UNIV_INLINE
26
 
rec_t*
27
 
btr_cur_get_rec(
28
 
/*============*/
29
 
                                /* out: pointer to record */
30
 
        btr_cur_t*      cursor) /* in: tree cursor */
31
 
{
32
 
        return(page_cur_get_rec(&(cursor->page_cur)));
33
 
}
34
 
 
35
 
/*************************************************************
36
 
Invalidates a tree cursor by setting record pointer to NULL. */
37
 
UNIV_INLINE
38
 
void
39
 
btr_cur_invalidate(
40
 
/*===============*/
41
 
        btr_cur_t*      cursor) /* in: tree cursor */
42
 
{
43
 
        page_cur_invalidate(&(cursor->page_cur));
44
 
}
45
 
 
46
 
/*************************************************************
47
 
Returns the page of a tree cursor. */
48
 
UNIV_INLINE
49
 
page_t*
50
 
btr_cur_get_page(
51
 
/*=============*/
52
 
                                /* out: pointer to page */
53
 
        btr_cur_t*      cursor) /* in: tree cursor */
54
 
{
55
 
        return(buf_frame_align(page_cur_get_rec(&(cursor->page_cur))));
56
 
}
57
 
 
58
 
/*************************************************************
59
 
Returns the index of a cursor. */
60
 
UNIV_INLINE
61
 
dict_index_t*
62
 
btr_cur_get_index(
63
 
/*==============*/
64
 
                                /* out: index */
65
 
        btr_cur_t*      cursor) /* in: B-tree cursor */
66
 
{
67
 
        return(cursor->index);
68
 
}
69
 
 
70
 
/*************************************************************
71
 
Positions a tree cursor at a given record. */
72
 
UNIV_INLINE
73
 
void
74
 
btr_cur_position(
75
 
/*=============*/
76
 
        dict_index_t*   index,  /* in: index */
77
 
        rec_t*          rec,    /* in: record in tree */
78
 
        btr_cur_t*      cursor) /* in: cursor */
79
 
{
80
 
        page_cur_position(rec, btr_cur_get_page_cur(cursor));
81
 
 
82
 
        cursor->index = index;
83
 
}
84
 
 
85
 
/*************************************************************************
86
 
Checks if compressing an index page where a btr cursor is placed makes
87
 
sense. */
88
 
UNIV_INLINE
89
 
ibool
90
 
btr_cur_compress_recommendation(
91
 
/*============================*/
92
 
                                /* out: TRUE if compression is recommended */
93
 
        btr_cur_t*      cursor, /* in: btr cursor */
94
 
        mtr_t*          mtr)    /* in: mtr */
95
 
{
96
 
        page_t*         page;
97
 
 
98
 
        ut_ad(mtr_memo_contains(mtr, buf_block_align(btr_cur_get_rec(cursor)),
99
 
                                MTR_MEMO_PAGE_X_FIX));
100
 
 
101
 
        page = btr_cur_get_page(cursor);
102
 
 
103
 
        if ((page_get_data_size(page) < BTR_CUR_PAGE_COMPRESS_LIMIT)
104
 
            || ((btr_page_get_next(page, mtr) == FIL_NULL)
105
 
                && (btr_page_get_prev(page, mtr) == FIL_NULL))) {
106
 
 
107
 
                /* The page fillfactor has dropped below a predefined
108
 
                minimum value OR the level in the B-tree contains just
109
 
                one page: we recommend compression if this is not the
110
 
                root page. */
111
 
 
112
 
                return(dict_index_get_page(cursor->index)
113
 
                       != buf_frame_get_page_no(page));
114
 
        }
115
 
 
116
 
        return(FALSE);
117
 
}
118
 
 
119
 
/*************************************************************************
120
 
Checks if the record on which the cursor is placed can be deleted without
121
 
making tree compression necessary (or, recommended). */
122
 
UNIV_INLINE
123
 
ibool
124
 
btr_cur_can_delete_without_compress(
125
 
/*================================*/
126
 
                                /* out: TRUE if can be deleted without
127
 
                                recommended compression */
128
 
        btr_cur_t*      cursor, /* in: btr cursor */
129
 
        ulint           rec_size,/* in: rec_get_size(btr_cur_get_rec(cursor))*/
130
 
        mtr_t*          mtr)    /* in: mtr */
131
 
{
132
 
        page_t*         page;
133
 
 
134
 
        ut_ad(mtr_memo_contains(mtr, buf_block_align(btr_cur_get_rec(cursor)),
135
 
                                MTR_MEMO_PAGE_X_FIX));
136
 
 
137
 
        page = btr_cur_get_page(cursor);
138
 
 
139
 
        if ((page_get_data_size(page) - rec_size < BTR_CUR_PAGE_COMPRESS_LIMIT)
140
 
            || ((btr_page_get_next(page, mtr) == FIL_NULL)
141
 
                && (btr_page_get_prev(page, mtr) == FIL_NULL))
142
 
            || (page_get_n_recs(page) < 2)) {
143
 
 
144
 
                /* The page fillfactor will drop below a predefined
145
 
                minimum value, OR the level in the B-tree contains just
146
 
                one page, OR the page will become empty: we recommend
147
 
                compression if this is not the root page. */
148
 
 
149
 
                return(dict_index_get_page(cursor->index)
150
 
                       == buf_frame_get_page_no(page));
151
 
        }
152
 
 
153
 
        return(TRUE);
154
 
}