CUBRID Engine  latest
slotted_page.h
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Search Solution Corporation
3  * Copyright 2016 CUBRID Corporation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 
20 /*
21  * slotted_page.h - SLOTTED PAGE MANAGEMENT MODULE (AT SERVER)
22  */
23 
24 #ifndef _SLOTTED_PAGE_H_
25 #define _SLOTTED_PAGE_H_
26 
27 #ident "$Id$"
28 
29 #include "config.h"
30 
31 #include "error_manager.h"
32 #include "storage_common.h"
33 #include "log_manager.h"
34 #include "vacuum.h"
35 
36 enum
37 {
38  ANCHORED = 1,
42 };
43 
44 /* Some platform like windows used their own SP_ERROR. */
45 #ifdef SP_ERROR
46 #undef SP_ERROR
47 #endif
48 
49 #define SP_ERROR (-1)
50 #define SP_SUCCESS (1)
51 #define SP_DOESNT_FIT (3)
52 
53 #define SAFEGUARD_RVSPACE true
54 #define DONT_SAFEGUARD_RVSPACE false
55 
56 /* Slotted page header flags */
57 #define SPAGE_HEADER_FLAG_NONE 0x0 /* No flags */
58 #define SPAGE_HEADER_FLAG_ALL_VISIBLE 0x1 /* All records are visible */
59 
60 typedef struct spage_header SPAGE_HEADER;
62 {
63  PGNSLOTS num_slots; /* Number of allocated slots for the page */
64  PGNSLOTS num_records; /* Number of records on page */
65  INT16 anchor_type; /* Valid ANCHORED, ANCHORED_DONT_REUSE_SLOTS UNANCHORED_ANY_SEQUENCE,
66  * UNANCHORED_KEEP_SEQUENCE */
67  unsigned short alignment; /* Alignment for records: Valid values sizeof char, short, int, double */
68  int total_free; /* Total free space on page */
69  int cont_free; /* Contiguous free space on page */
70  int offset_to_free_area; /* Byte offset from the beginning of the page to the first free byte area on the page. */
71  int reserved1;
72  int flags; /* Page flags */
73  unsigned int is_saving:1; /* True if saving is need for recovery (undo) */
74  unsigned int need_update_best_hint:1; /* True if we should update best pages hint for this page. See
75  * heap_stats_update. */
76 
77  /* The followings are reserved for future use. */
78  /* SPAGE_HEADER should be 8 bytes aligned. Packing of bit fields depends on compiler's behavior. It's better to use
79  * 4-bytes type in order not to be affected by the compiler. */
80  unsigned int reserved_bits:30;
81 };
82 
83 /* 4-byte disk storage slot design */
84 typedef struct spage_slot SPAGE_SLOT;
85 struct spage_slot
86 {
87  unsigned int offset_to_record:14; /* Byte Offset from the beginning of the page to the beginning of the record */
88  unsigned int record_length:14; /* Length of record */
89  unsigned int record_type:4; /* Record type (REC_HOME, REC_NEWHOME, ...) described by slot. */
90 };
91 
92 extern void spage_boot (THREAD_ENTRY * thread_p);
93 extern void spage_finalize (THREAD_ENTRY * thread_p);
94 extern void spage_free_saved_spaces (THREAD_ENTRY * thread_p, void *first_save_entry);
95 extern int spage_slot_size (void);
96 extern int spage_header_size (void);
97 extern int spage_get_free_space (THREAD_ENTRY * thread_p, PAGE_PTR pgptr);
98 extern int spage_get_free_space_without_saving (THREAD_ENTRY * thread_p, PAGE_PTR page_p, bool * need_update);
99 extern void spage_set_need_update_best_hint (THREAD_ENTRY * thread_p, PAGE_PTR page_p, bool need_update);
102 extern void spage_initialize (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, INT16 slots_type, unsigned short alignment,
103  bool safeguard_rvspace);
104 extern int spage_insert (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, RECDES * recdes, PGSLOTID * slotid);
105 extern int spage_insert_at (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, PGSLOTID slotid, RECDES * recdes);
106 extern int spage_insert_for_recovery (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, PGSLOTID slotid, RECDES * recdes);
107 extern PGSLOTID spage_delete (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, PGSLOTID slotid);
108 extern PGSLOTID spage_delete_for_recovery (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, PGSLOTID slotid);
109 extern int spage_update (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, PGSLOTID slotid, const RECDES * recdes);
110 extern void spage_update_record_type (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, PGSLOTID slotid, INT16 type);
111 extern bool spage_is_updatable (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, PGSLOTID slotid, int recdes_length);
112 extern bool spage_is_mvcc_updatable (THREAD_ENTRY * thread_p, PAGE_PTR page_p, PGSLOTID slot_id,
113  int delete_record_length, int insert_record_length);
114 extern bool spage_reclaim (THREAD_ENTRY * thread_p, PAGE_PTR pgptr);
115 extern int spage_split (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, PGSLOTID slotid, int offset, PGSLOTID * new_slotid);
116 extern int spage_append (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, PGSLOTID slotid, const RECDES * recdes);
117 extern int spage_take_out (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, PGSLOTID slotid, int takeout_offset,
118  int takeout_length);
119 extern int spage_put (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, PGSLOTID slotid, int offset, const RECDES * recdes);
120 extern int spage_overwrite (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, PGSLOTID slotid, int overwrite_offset,
121  const RECDES * recdes);
122 extern int spage_merge (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, PGSLOTID slotid1, PGSLOTID slotid2);
123 extern SCAN_CODE spage_next_record (PAGE_PTR pgptr, PGSLOTID * slotid, RECDES * recdes, int ispeeking);
124 extern SCAN_CODE spage_next_record_dont_skip_empty (PAGE_PTR pgptr, PGSLOTID * slotid, RECDES * recdes, int ispeeking);
125 extern SCAN_CODE spage_previous_record (PAGE_PTR pgptr, PGSLOTID * slotid, RECDES * recdes, int ispeeking);
127  int ispeeking);
128 extern SCAN_CODE spage_get_page_header_info (PAGE_PTR page_p, DB_VALUE ** page_header_info);
129 extern SCAN_CODE spage_get_record (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, PGSLOTID slotid, RECDES * recdes,
130  int ispeeking);
131 extern bool spage_is_slot_exist (PAGE_PTR pgptr, PGSLOTID slotid);
132 extern void spage_dump (THREAD_ENTRY * thread_p, FILE * fp, PAGE_PTR pgptr, int isrecord_printed);
133 extern SPAGE_SLOT *spage_get_slot (PAGE_PTR page_p, PGSLOTID slot_id);
134 #if !defined(NDEBUG)
135 extern bool spage_check_num_slots (THREAD_ENTRY * thread_p, PAGE_PTR page_p);
136 #endif
137 extern int spage_check (THREAD_ENTRY * thread_p, PAGE_PTR page_p);
138 extern int spage_get_record_length (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, PGSLOTID slotid);
139 extern int spage_get_record_offset (THREAD_ENTRY * thread_p, PAGE_PTR page_p, PGSLOTID slot_id);
140 extern int spage_get_space_for_record (THREAD_ENTRY * thread_p, PAGE_PTR page_p, PGSLOTID slot_id);
141 extern INT16 spage_get_record_type (PAGE_PTR pgptr, PGSLOTID slotid);
142 extern int spage_max_space_for_new_record (THREAD_ENTRY * thread_p, PAGE_PTR pgptr);
143 extern void spage_collect_statistics (PAGE_PTR pgptr, int *npages, int *nrecords, int *rec_length);
144 extern int spage_max_record_size (void);
145 extern int spage_check_slot_owner (THREAD_ENTRY * thread_p, PAGE_PTR pgptr, PGSLOTID slotid);
146 extern int spage_compact (THREAD_ENTRY * thread_p, PAGE_PTR pgptr);
147 extern bool spage_is_valid_anchor_type (const INT16 anchor_type);
148 extern const char *spage_anchor_flag_string (const INT16 anchor_type);
149 extern const char *spage_alignment_string (unsigned short alignment);
150 extern int spage_mark_deleted_slot_as_reusable (THREAD_ENTRY * thread_p, PAGE_PTR page_p, PGSLOTID slot_id);
151 
152 extern PGSLOTID spage_find_free_slot (PAGE_PTR page_p, SPAGE_SLOT ** out_slot_p, PGSLOTID start_id);
153 
154 
155 extern int spage_header_start_scan (THREAD_ENTRY * thread_p, int show_type, DB_VALUE ** arg_values, int arg_cnt,
156  void **ctx);
157 extern SCAN_CODE spage_header_next_scan (THREAD_ENTRY * thread_p, int cursor, DB_VALUE ** out_values, int out_cnt,
158  void *ctx);
159 extern int spage_header_end_scan (THREAD_ENTRY * thread_p, void **ctx);
160 
161 extern int spage_slots_start_scan (THREAD_ENTRY * thread_p, int show_type, DB_VALUE ** arg_values, int arg_cnt,
162  void **ctx);
163 extern SCAN_CODE spage_slots_next_scan (THREAD_ENTRY * thread_p, int cursor, DB_VALUE ** out_values, int out_cnt,
164  void *ctx);
165 extern int spage_slots_end_scan (THREAD_ENTRY * thread_p, void **ctx);
166 
167 extern void spage_vacuum_slot (THREAD_ENTRY * thread_p, PAGE_PTR page_p, PGSLOTID slotid, bool reusable);
168 extern bool spage_need_compact (THREAD_ENTRY * thread_p, PAGE_PTR page_p);
169 #endif /* _SLOTTED_PAGE_H_ */
bool spage_is_slot_exist(PAGE_PTR pgptr, PGSLOTID slotid)
char * PAGE_PTR
PGNSLOTS spage_number_of_slots(PAGE_PTR pgptr)
Definition: slotted_page.c:879
PGSLOTID spage_delete_for_recovery(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PGSLOTID slotid)
int spage_slots_start_scan(THREAD_ENTRY *thread_p, int show_type, DB_VALUE **arg_values, int arg_cnt, void **ctx)
int spage_header_end_scan(THREAD_ENTRY *thread_p, void **ctx)
SCAN_CODE spage_next_record_dont_skip_empty(PAGE_PTR pgptr, PGSLOTID *slotid, RECDES *recdes, int ispeeking)
SCAN_CODE
void spage_collect_statistics(PAGE_PTR pgptr, int *npages, int *nrecords, int *rec_length)
int spage_get_free_space(THREAD_ENTRY *thread_p, PAGE_PTR pgptr)
Definition: slotted_page.c:898
int offset_to_free_area
Definition: slotted_page.h:70
SCAN_CODE spage_next_record(PAGE_PTR pgptr, PGSLOTID *slotid, RECDES *recdes, int ispeeking)
int spage_get_record_length(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PGSLOTID slotid)
bool spage_check_num_slots(THREAD_ENTRY *thread_p, PAGE_PTR page_p)
void spage_vacuum_slot(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slotid, bool reusable)
int spage_insert_at(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PGSLOTID slotid, RECDES *recdes)
int spage_slots_end_scan(THREAD_ENTRY *thread_p, void **ctx)
const char * spage_alignment_string(unsigned short alignment)
PGSLOTID spage_delete(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PGSLOTID slotid)
void spage_finalize(THREAD_ENTRY *thread_p)
Definition: slotted_page.c:816
unsigned int reserved_bits
Definition: slotted_page.h:80
int spage_max_record_size(void)
Definition: slotted_page.c:848
PGNSLOTS num_records
Definition: slotted_page.h:64
INT16 spage_get_record_type(PAGE_PTR pgptr, PGSLOTID slotid)
int spage_overwrite(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PGSLOTID slotid, int overwrite_offset, const RECDES *recdes)
int spage_merge(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PGSLOTID slotid1, PGSLOTID slotid2)
int spage_compact(THREAD_ENTRY *thread_p, PAGE_PTR pgptr)
void THREAD_ENTRY
bool spage_need_compact(THREAD_ENTRY *thread_p, PAGE_PTR page_p)
bool spage_is_updatable(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PGSLOTID slotid, int recdes_length)
unsigned short alignment
Definition: slotted_page.h:67
SCAN_CODE spage_header_next_scan(THREAD_ENTRY *thread_p, int cursor, DB_VALUE **out_values, int out_cnt, void *ctx)
int spage_max_space_for_new_record(THREAD_ENTRY *thread_p, PAGE_PTR pgptr)
Definition: slotted_page.c:984
void spage_dump(THREAD_ENTRY *thread_p, FILE *fp, PAGE_PTR pgptr, int isrecord_printed)
SPAGE_SLOT * spage_get_slot(PAGE_PTR page_p, PGSLOTID slot_id)
int spage_put(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PGSLOTID slotid, int offset, const RECDES *recdes)
void spage_free_saved_spaces(THREAD_ENTRY *thread_p, void *first_save_entry)
Definition: slotted_page.c:382
PGSLOTID PGNSLOTS
int spage_check(THREAD_ENTRY *thread_p, PAGE_PTR page_p)
void spage_update_record_type(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PGSLOTID slotid, INT16 type)
SCAN_CODE spage_previous_record(PAGE_PTR pgptr, PGSLOTID *slotid, RECDES *recdes, int ispeeking)
SCAN_CODE spage_get_record(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PGSLOTID slotid, RECDES *recdes, int ispeeking)
SCAN_CODE spage_slots_next_scan(THREAD_ENTRY *thread_p, int cursor, DB_VALUE **out_values, int out_cnt, void *ctx)
int spage_get_free_space_without_saving(THREAD_ENTRY *thread_p, PAGE_PTR page_p, bool *need_update)
Definition: slotted_page.c:925
int spage_check_slot_owner(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PGSLOTID slotid)
int spage_update(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PGSLOTID slotid, const RECDES *recdes)
bool spage_is_valid_anchor_type(const INT16 anchor_type)
Definition: slotted_page.c:364
SCAN_CODE spage_get_page_header_info(PAGE_PTR page_p, DB_VALUE **page_header_info)
void spage_boot(THREAD_ENTRY *thread_p)
Definition: slotted_page.c:798
int spage_insert_for_recovery(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PGSLOTID slotid, RECDES *recdes)
int spage_append(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PGSLOTID slotid, const RECDES *recdes)
const char * spage_anchor_flag_string(const INT16 anchor_type)
PGSLOTID spage_find_free_slot(PAGE_PTR page_p, SPAGE_SLOT **out_slot_p, PGSLOTID start_id)
INT16 PGSLOTID
int spage_get_record_offset(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id)
unsigned int is_saving
Definition: slotted_page.h:73
SCAN_CODE spage_previous_record_dont_skip_empty(PAGE_PTR pgptr, PGSLOTID *slotid, RECDES *recdes, int ispeeking)
int spage_insert(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, RECDES *recdes, PGSLOTID *slotid)
int spage_slot_size(void)
Definition: slotted_page.c:827
INT16 anchor_type
Definition: slotted_page.h:65
int spage_get_space_for_record(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id)
int spage_header_start_scan(THREAD_ENTRY *thread_p, int show_type, DB_VALUE **arg_values, int arg_cnt, void **ctx)
PGNSLOTS spage_number_of_records(PAGE_PTR pgptr)
Definition: slotted_page.c:860
bool spage_is_mvcc_updatable(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id, int delete_record_length, int insert_record_length)
void spage_set_need_update_best_hint(THREAD_ENTRY *thread_p, PAGE_PTR page_p, bool need_update)
Definition: slotted_page.c:962
int spage_mark_deleted_slot_as_reusable(THREAD_ENTRY *thread_p, PAGE_PTR page_p, PGSLOTID slot_id)
bool spage_reclaim(THREAD_ENTRY *thread_p, PAGE_PTR pgptr)
int spage_header_size(void)
Definition: slotted_page.c:837
int spage_split(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PGSLOTID slotid, int offset, PGSLOTID *new_slotid)
int spage_take_out(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, PGSLOTID slotid, int takeout_offset, int takeout_length)
PGNSLOTS num_slots
Definition: slotted_page.h:63
unsigned int need_update_best_hint
Definition: slotted_page.h:74
void spage_initialize(THREAD_ENTRY *thread_p, PAGE_PTR pgptr, INT16 slots_type, unsigned short alignment, bool safeguard_rvspace)