00001 /* Copyright (C) 2000 MySQL AB 00002 00003 This program is free software; you can redistribute it and/or modify 00004 it under the terms of the GNU General Public License as published by 00005 the Free Software Foundation; either version 2 of the License, or 00006 (at your option) any later version. 00007 00008 This program is distributed in the hope that it will be useful, 00009 but WITHOUT ANY WARRANTY; without even the implied warranty of 00010 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00011 GNU General Public License for more details. 00012 00013 You should have received a copy of the GNU General Public License 00014 along with this program; if not, write to the Free Software 00015 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ 00016 00017 /* This file should be included when using myisam_funktions */ 00018 00019 #ifndef _myisam_h 00020 #define _myisam_h 00021 #ifdef __cplusplus 00022 extern "C" { 00023 #endif 00024 00025 #ifndef _my_base_h 00026 #include <my_base.h> 00027 #endif 00028 #ifndef _m_ctype_h 00029 #include <m_ctype.h> 00030 #endif 00031 #ifndef _keycache_h 00032 #include "keycache.h" 00033 #endif 00034 #include "my_handler.h" 00035 #include <mysql/plugin.h> 00036 00037 /* 00038 There is a hard limit for the maximum number of keys as there are only 00039 8 bits in the index file header for the number of keys in a table. 00040 This means that 0..255 keys can exist for a table. The idea of 00041 MI_MAX_POSSIBLE_KEY is to ensure that one can use myisamchk & tools on 00042 a MyISAM table for which one has more keys than MyISAM is normally 00043 compiled for. If you don't have this, you will get a core dump when 00044 running myisamchk compiled for 128 keys on a table with 255 keys. 00045 */ 00046 #define MI_MAX_POSSIBLE_KEY 255 /* For myisam_chk */ 00047 #if MAX_INDEXES > MI_MAX_POSSIBLE_KEY 00048 #define MI_MAX_KEY MI_MAX_POSSIBLE_KEY /* Max allowed keys */ 00049 #else 00050 #define MI_MAX_KEY MAX_INDEXES /* Max allowed keys */ 00051 #endif 00052 00053 #define MI_MAX_POSSIBLE_KEY_BUFF (1024+6+6) /* For myisam_chk */ 00054 /* 00055 The following defines can be increased if necessary. 00056 But beware the dependency of MI_MAX_POSSIBLE_KEY_BUFF and MI_MAX_KEY_LENGTH. 00057 */ 00058 #define MI_MAX_KEY_LENGTH 1000 /* Max length in bytes */ 00059 #define MI_MAX_KEY_SEG 16 /* Max segments for key */ 00060 00061 #define MI_MAX_KEY_BUFF (MI_MAX_KEY_LENGTH+MI_MAX_KEY_SEG*6+8+8) 00062 #define MI_MAX_MSG_BUF 1024 /* used in CHECK TABLE, REPAIR TABLE */ 00063 #define MI_NAME_IEXT ".MYI" 00064 #define MI_NAME_DEXT ".MYD" 00065 /* Max extra space to use when sorting keys */ 00066 #define MI_MAX_TEMP_LENGTH 2*1024L*1024L*1024L 00067 00068 /* Possible values for myisam_block_size (must be power of 2) */ 00069 #define MI_KEY_BLOCK_LENGTH 1024 /* default key block length */ 00070 #define MI_MIN_KEY_BLOCK_LENGTH 1024 /* Min key block length */ 00071 #define MI_MAX_KEY_BLOCK_LENGTH 16384 00072 00073 #define mi_portable_sizeof_char_ptr 8 00074 00075 /* 00076 In the following macros '_keyno_' is 0 .. keys-1. 00077 If there can be more keys than bits in the key_map, the highest bit 00078 is for all upper keys. They cannot be switched individually. 00079 This means that clearing of high keys is ignored, setting one high key 00080 sets all high keys. 00081 */ 00082 #define MI_KEYMAP_BITS (8 * SIZEOF_LONG_LONG) 00083 #define MI_KEYMAP_HIGH_MASK (ULL(1) << (MI_KEYMAP_BITS - 1)) 00084 #define mi_get_mask_all_keys_active(_keys_) \ 00085 (((_keys_) < MI_KEYMAP_BITS) ? \ 00086 ((ULL(1) << (_keys_)) - ULL(1)) : \ 00087 (~ ULL(0))) 00088 00089 #if MI_MAX_KEY > MI_KEYMAP_BITS 00090 00091 #define mi_is_key_active(_keymap_,_keyno_) \ 00092 (((_keyno_) < MI_KEYMAP_BITS) ? \ 00093 test((_keymap_) & (ULL(1) << (_keyno_))) : \ 00094 test((_keymap_) & MI_KEYMAP_HIGH_MASK)) 00095 #define mi_set_key_active(_keymap_,_keyno_) \ 00096 (_keymap_)|= (((_keyno_) < MI_KEYMAP_BITS) ? \ 00097 (ULL(1) << (_keyno_)) : \ 00098 MI_KEYMAP_HIGH_MASK) 00099 #define mi_clear_key_active(_keymap_,_keyno_) \ 00100 (_keymap_)&= (((_keyno_) < MI_KEYMAP_BITS) ? \ 00101 (~ (ULL(1) << (_keyno_))) : \ 00102 (~ (ULL(0))) /*ignore*/ ) 00103 00104 #else 00105 00106 #define mi_is_key_active(_keymap_,_keyno_) \ 00107 test((_keymap_) & (ULL(1) << (_keyno_))) 00108 #define mi_set_key_active(_keymap_,_keyno_) \ 00109 (_keymap_)|= (ULL(1) << (_keyno_)) 00110 #define mi_clear_key_active(_keymap_,_keyno_) \ 00111 (_keymap_)&= (~ (ULL(1) << (_keyno_))) 00112 00113 #endif 00114 00115 #define mi_is_any_key_active(_keymap_) \ 00116 test((_keymap_)) 00117 #define mi_is_all_keys_active(_keymap_,_keys_) \ 00118 ((_keymap_) == mi_get_mask_all_keys_active(_keys_)) 00119 #define mi_set_all_keys_active(_keymap_,_keys_) \ 00120 (_keymap_)= mi_get_mask_all_keys_active(_keys_) 00121 #define mi_clear_all_keys_active(_keymap_) \ 00122 (_keymap_)= 0 00123 #define mi_intersect_keys_active(_to_,_from_) \ 00124 (_to_)&= (_from_) 00125 #define mi_is_any_intersect_keys_active(_keymap1_,_keys_,_keymap2_) \ 00126 ((_keymap1_) & (_keymap2_) & \ 00127 mi_get_mask_all_keys_active(_keys_)) 00128 #define mi_copy_keys_active(_to_,_maxkeys_,_from_) \ 00129 (_to_)= (mi_get_mask_all_keys_active(_maxkeys_) & \ 00130 (_from_)) 00131 00132 /* Param to/from mi_info */ 00133 00134 typedef struct st_mi_isaminfo /* Struct from h_info */ 00135 { 00136 ha_rows records; /* Records in database */ 00137 ha_rows deleted; /* Deleted records in database */ 00138 my_off_t recpos; /* Pos for last used record */ 00139 my_off_t newrecpos; /* Pos if we write new record */ 00140 my_off_t dupp_key_pos; /* Position to record with dupp key */ 00141 my_off_t data_file_length, /* Length of data file */ 00142 max_data_file_length, 00143 index_file_length, 00144 max_index_file_length, 00145 delete_length; 00146 ulong reclength; /* Recordlength */ 00147 ulong mean_reclength; /* Mean recordlength (if packed) */ 00148 ulonglong auto_increment; 00149 ulonglong key_map; /* Which keys are used */ 00150 char *data_file_name, *index_file_name; 00151 uint keys; /* Number of keys in use */ 00152 uint options; /* HA_OPTION_... used */ 00153 int errkey, /* With key was dupplicated on err */ 00154 sortkey; /* clustered by this key */ 00155 File filenr; /* (uniq) filenr for datafile */ 00156 time_t create_time; /* When table was created */ 00157 time_t check_time; 00158 time_t update_time; 00159 uint reflength; 00160 ulong record_offset; 00161 ulong *rec_per_key; /* for sql optimizing */ 00162 } MI_ISAMINFO; 00163 00164 00165 typedef struct st_mi_create_info 00166 { 00167 const char *index_file_name, *data_file_name; /* If using symlinks */ 00168 ha_rows max_rows; 00169 ha_rows reloc_rows; 00170 ulonglong auto_increment; 00171 ulonglong data_file_length; 00172 ulonglong key_file_length; 00173 uint old_options; 00174 uint8 language; 00175 my_bool with_auto_increment; 00176 } MI_CREATE_INFO; 00177 00178 struct st_myisam_info; /* For referense */ 00179 struct st_mi_isam_share; 00180 typedef struct st_myisam_info MI_INFO; 00181 struct st_mi_s_param; 00182 00183 typedef struct st_mi_keydef /* Key definition with open & info */ 00184 { 00185 struct st_mi_isam_share *share; /* Pointer to base (set in mi_open) */ 00186 uint16 keysegs; /* Number of key-segment */ 00187 uint16 flag; /* NOSAME, PACK_USED */ 00188 00189 uint8 key_alg; /* BTREE, RTREE */ 00190 uint16 block_length; /* Length of keyblock (auto) */ 00191 uint16 underflow_block_length; /* When to execute underflow */ 00192 uint16 keylength; /* Tot length of keyparts (auto) */ 00193 uint16 minlength; /* min length of (packed) key (auto) */ 00194 uint16 maxlength; /* max length of (packed) key (auto) */ 00195 uint16 block_size_index; /* block_size (auto) */ 00196 uint32 version; /* For concurrent read/write */ 00197 uint32 ftparser_nr; /* distinct ftparser number */ 00198 00199 HA_KEYSEG *seg,*end; 00200 struct st_mysql_ftparser *parser; /* Fulltext [pre]parser */ 00201 int (*bin_search)(struct st_myisam_info *info,struct st_mi_keydef *keyinfo, 00202 uchar *page,uchar *key, 00203 uint key_len,uint comp_flag,uchar * *ret_pos, 00204 uchar *buff, my_bool *was_last_key); 00205 uint (*get_key)(struct st_mi_keydef *keyinfo,uint nod_flag,uchar * *page, 00206 uchar *key); 00207 int (*pack_key)(struct st_mi_keydef *keyinfo,uint nod_flag,uchar *next_key, 00208 uchar *org_key, uchar *prev_key, uchar *key, 00209 struct st_mi_s_param *s_temp); 00210 void (*store_key)(struct st_mi_keydef *keyinfo, uchar *key_pos, 00211 struct st_mi_s_param *s_temp); 00212 int (*ck_insert)(struct st_myisam_info *inf, uint k_nr, uchar *k, uint klen); 00213 int (*ck_delete)(struct st_myisam_info *inf, uint k_nr, uchar *k, uint klen); 00214 } MI_KEYDEF; 00215 00216 00217 #define MI_UNIQUE_HASH_LENGTH 4 00218 00219 typedef struct st_unique_def /* Segment definition of unique */ 00220 { 00221 uint16 keysegs; /* Number of key-segment */ 00222 uchar key; /* Mapped to which key */ 00223 uint8 null_are_equal; 00224 HA_KEYSEG *seg,*end; 00225 } MI_UNIQUEDEF; 00226 00227 typedef struct st_mi_decode_tree /* Decode huff-table */ 00228 { 00229 uint16 *table; 00230 uint quick_table_bits; 00231 byte *intervalls; 00232 } MI_DECODE_TREE; 00233 00234 00235 struct st_mi_bit_buff; 00236 00237 /* 00238 Note that null markers should always be first in a row ! 00239 When creating a column, one should only specify: 00240 type, length, null_bit and null_pos 00241 */ 00242 00243 typedef struct st_columndef /* column information */ 00244 { 00245 int16 type; /* en_fieldtype */ 00246 uint16 length; /* length of field */ 00247 uint32 offset; /* Offset to position in row */ 00248 uint8 null_bit; /* If column may be 0 */ 00249 uint16 null_pos; /* position for null marker */ 00250 00251 #ifndef NOT_PACKED_DATABASES 00252 void (*unpack)(struct st_columndef *rec,struct st_mi_bit_buff *buff, 00253 uchar *start,uchar *end); 00254 enum en_fieldtype base_type; 00255 uint space_length_bits,pack_type; 00256 MI_DECODE_TREE *huff_tree; 00257 #endif 00258 } MI_COLUMNDEF; 00259 00260 /* invalidator function reference for Query Cache */ 00261 typedef void (* invalidator_by_filename)(const char * filename); 00262 00263 extern my_string myisam_log_filename; /* Name of logfile */ 00264 extern ulong myisam_block_size; 00265 extern ulong myisam_concurrent_insert; 00266 extern my_bool myisam_flush,myisam_delay_key_write,myisam_single_user; 00267 extern my_off_t myisam_max_temp_length; 00268 extern ulong myisam_bulk_insert_tree_size, myisam_data_pointer_size; 00269 00270 /* Prototypes for myisam-functions */ 00271 00272 extern int mi_close(struct st_myisam_info *file); 00273 extern int mi_delete(struct st_myisam_info *file,const byte *buff); 00274 extern struct st_myisam_info *mi_open(const char *name,int mode, 00275 uint wait_if_locked); 00276 extern int mi_panic(enum ha_panic_function function); 00277 extern int mi_rfirst(struct st_myisam_info *file,byte *buf,int inx); 00278 extern int mi_rkey(struct st_myisam_info *file,byte *buf,int inx, 00279 const byte *key, 00280 uint key_len, enum ha_rkey_function search_flag); 00281 extern int mi_rlast(struct st_myisam_info *file,byte *buf,int inx); 00282 extern int mi_rnext(struct st_myisam_info *file,byte *buf,int inx); 00283 extern int mi_rnext_same(struct st_myisam_info *info, byte *buf); 00284 extern int mi_rprev(struct st_myisam_info *file,byte *buf,int inx); 00285 extern int mi_rrnd(struct st_myisam_info *file,byte *buf, my_off_t pos); 00286 extern int mi_scan_init(struct st_myisam_info *file); 00287 extern int mi_scan(struct st_myisam_info *file,byte *buf); 00288 extern int mi_rsame(struct st_myisam_info *file,byte *record,int inx); 00289 extern int mi_rsame_with_pos(struct st_myisam_info *file,byte *record, 00290 int inx, my_off_t pos); 00291 extern int mi_update(struct st_myisam_info *file,const byte *old, 00292 byte *new_record); 00293 extern int mi_write(struct st_myisam_info *file,byte *buff); 00294 extern my_off_t mi_position(struct st_myisam_info *file); 00295 extern int mi_status(struct st_myisam_info *info, MI_ISAMINFO *x, uint flag); 00296 extern int mi_lock_database(struct st_myisam_info *file,int lock_type); 00297 extern int mi_create(const char *name,uint keys,MI_KEYDEF *keydef, 00298 uint columns, MI_COLUMNDEF *columndef, 00299 uint uniques, MI_UNIQUEDEF *uniquedef, 00300 MI_CREATE_INFO *create_info, uint flags); 00301 extern int mi_delete_table(const char *name); 00302 extern int mi_rename(const char *from, const char *to); 00303 extern int mi_extra(struct st_myisam_info *file, 00304 enum ha_extra_function function, 00305 void *extra_arg); 00306 extern int mi_reset(struct st_myisam_info *file); 00307 extern ha_rows mi_records_in_range(struct st_myisam_info *info,int inx, 00308 key_range *min_key, key_range *max_key); 00309 extern int mi_log(int activate_log); 00310 extern int mi_is_changed(struct st_myisam_info *info); 00311 extern int mi_delete_all_rows(struct st_myisam_info *info); 00312 extern ulong _mi_calc_blob_length(uint length , const byte *pos); 00313 extern uint mi_get_pointer_length(ulonglong file_length, uint def); 00314 00315 /* this is used to pass to mysql_myisamchk_table -- by Sasha Pachev */ 00316 00317 #define MYISAMCHK_REPAIR 1 /* equivalent to myisamchk -r */ 00318 #define MYISAMCHK_VERIFY 2 /* Verify, run repair if failure */ 00319 00320 /* 00321 Definitions needed for myisamchk.c 00322 00323 Entries marked as "QQ to be removed" are NOT used to 00324 pass check/repair options to mi_check.c. They are used 00325 internally by myisamchk.c or/and ha_myisam.cc and should NOT 00326 be stored together with other flags. They should be removed 00327 from the following list to make addition of new flags possible. 00328 */ 00329 00330 #define T_AUTO_INC 1 00331 #define T_AUTO_REPAIR 2 /* QQ to be removed */ 00332 #define T_BACKUP_DATA 4 00333 #define T_CALC_CHECKSUM 8 00334 #define T_CHECK 16 /* QQ to be removed */ 00335 #define T_CHECK_ONLY_CHANGED 32 /* QQ to be removed */ 00336 #define T_CREATE_MISSING_KEYS 64 00337 #define T_DESCRIPT 128 00338 #define T_DONT_CHECK_CHECKSUM 256 00339 #define T_EXTEND 512 00340 #define T_FAST (1L << 10) /* QQ to be removed */ 00341 #define T_FORCE_CREATE (1L << 11) /* QQ to be removed */ 00342 #define T_FORCE_UNIQUENESS (1L << 12) 00343 #define T_INFO (1L << 13) 00344 #define T_MEDIUM (1L << 14) 00345 #define T_QUICK (1L << 15) /* QQ to be removed */ 00346 #define T_READONLY (1L << 16) /* QQ to be removed */ 00347 #define T_REP (1L << 17) 00348 #define T_REP_BY_SORT (1L << 18) /* QQ to be removed */ 00349 #define T_REP_PARALLEL (1L << 19) /* QQ to be removed */ 00350 #define T_RETRY_WITHOUT_QUICK (1L << 20) 00351 #define T_SAFE_REPAIR (1L << 21) 00352 #define T_SILENT (1L << 22) 00353 #define T_SORT_INDEX (1L << 23) /* QQ to be removed */ 00354 #define T_SORT_RECORDS (1L << 24) /* QQ to be removed */ 00355 #define T_STATISTICS (1L << 25) 00356 #define T_UNPACK (1L << 26) 00357 #define T_UPDATE_STATE (1L << 27) 00358 #define T_VERBOSE (1L << 28) 00359 #define T_VERY_SILENT (1L << 29) 00360 #define T_WAIT_FOREVER (1L << 30) 00361 #define T_WRITE_LOOP ((ulong) 1L << 31) 00362 00363 #define T_REP_ANY (T_REP | T_REP_BY_SORT | T_REP_PARALLEL) 00364 00365 /* 00366 Flags used by myisamchk.c or/and ha_myisam.cc that are NOT passed 00367 to mi_check.c follows: 00368 */ 00369 00370 #define TT_USEFRM 1 00371 #define TT_FOR_UPGRADE 2 00372 00373 #define O_NEW_INDEX 1 /* Bits set in out_flag */ 00374 #define O_NEW_DATA 2 00375 #define O_DATA_LOST 4 00376 00377 /* these struct is used by my_check to tell it what to do */ 00378 00379 typedef struct st_sort_key_blocks /* Used when sorting */ 00380 { 00381 uchar *buff,*end_pos; 00382 uchar lastkey[MI_MAX_POSSIBLE_KEY_BUFF]; 00383 uint last_length; 00384 int inited; 00385 } SORT_KEY_BLOCKS; 00386 00387 00388 /* 00389 MyISAM supports several statistics collection methods. Currently statistics 00390 collection method is not stored in MyISAM file and has to be specified for 00391 each table analyze/repair operation in MI_CHECK::stats_method. 00392 */ 00393 00394 typedef enum 00395 { 00396 /* Treat NULLs as inequal when collecting statistics (default for 4.1/5.0) */ 00397 MI_STATS_METHOD_NULLS_NOT_EQUAL, 00398 /* Treat NULLs as equal when collecting statistics (like 4.0 did) */ 00399 MI_STATS_METHOD_NULLS_EQUAL, 00400 /* Ignore NULLs - count only tuples without NULLs in the index components */ 00401 MI_STATS_METHOD_IGNORE_NULLS 00402 } enum_mi_stats_method; 00403 00404 typedef struct st_mi_check_param 00405 { 00406 ulonglong auto_increment_value; 00407 ulonglong max_data_file_length; 00408 ulonglong keys_in_use; 00409 ulonglong max_record_length; 00410 my_off_t search_after_block; 00411 my_off_t new_file_pos,key_file_blocks; 00412 my_off_t keydata,totaldata,key_blocks,start_check_pos; 00413 ha_rows total_records,total_deleted; 00414 ha_checksum record_checksum,glob_crc; 00415 ulong use_buffers,read_buffer_length,write_buffer_length, 00416 sort_buffer_length,sort_key_blocks; 00417 uint out_flag,warning_printed,error_printed,verbose; 00418 uint opt_sort_key,total_files,max_level; 00419 uint testflag, key_cache_block_size; 00420 uint8 language; 00421 my_bool using_global_keycache, opt_lock_memory, opt_follow_links; 00422 my_bool retry_repair, force_sort, calc_checksum; 00423 char temp_filename[FN_REFLEN],*isam_file_name; 00424 MY_TMPDIR *tmpdir; 00425 int tmpfile_createflag; 00426 myf myf_rw; 00427 IO_CACHE read_cache; 00428 00429 /* 00430 The next two are used to collect statistics, see update_key_parts for 00431 description. 00432 */ 00433 ulonglong unique_count[MI_MAX_KEY_SEG+1]; 00434 ulonglong notnull_count[MI_MAX_KEY_SEG+1]; 00435 00436 ha_checksum key_crc[MI_MAX_POSSIBLE_KEY]; 00437 ulong rec_per_key_part[MI_MAX_KEY_SEG*MI_MAX_POSSIBLE_KEY]; 00438 void *thd; 00439 const char *db_name, *table_name; 00440 const char *op_name; 00441 enum_mi_stats_method stats_method; 00442 } MI_CHECK; 00443 00444 typedef struct st_sort_ft_buf 00445 { 00446 uchar *buf, *end; 00447 int count; 00448 uchar lastkey[MI_MAX_KEY_BUFF]; 00449 } SORT_FT_BUF; 00450 00451 typedef struct st_sort_info 00452 { 00453 my_off_t filelength,dupp,buff_length; 00454 ha_rows max_records; 00455 uint current_key, total_keys; 00456 myf myf_rw; 00457 enum data_file_type new_data_file_type; 00458 MI_INFO *info; 00459 MI_CHECK *param; 00460 char *buff; 00461 SORT_KEY_BLOCKS *key_block,*key_block_end; 00462 SORT_FT_BUF *ft_buf; 00463 /* sync things */ 00464 uint got_error, threads_running; 00465 #ifdef THREAD 00466 pthread_mutex_t mutex; 00467 pthread_cond_t cond; 00468 #endif 00469 } SORT_INFO; 00470 00471 /* functions in mi_check */ 00472 void myisamchk_init(MI_CHECK *param); 00473 int chk_status(MI_CHECK *param, MI_INFO *info); 00474 int chk_del(MI_CHECK *param, register MI_INFO *info, uint test_flag); 00475 int chk_size(MI_CHECK *param, MI_INFO *info); 00476 int chk_key(MI_CHECK *param, MI_INFO *info); 00477 int chk_data_link(MI_CHECK *param, MI_INFO *info,int extend); 00478 int mi_repair(MI_CHECK *param, register MI_INFO *info, 00479 my_string name, int rep_quick); 00480 int mi_sort_index(MI_CHECK *param, register MI_INFO *info, my_string name); 00481 int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info, 00482 const char * name, int rep_quick); 00483 int mi_repair_parallel(MI_CHECK *param, register MI_INFO *info, 00484 const char * name, int rep_quick); 00485 int change_to_newfile(const char * filename, const char * old_ext, 00486 const char * new_ext, uint raid_chunks, 00487 myf myflags); 00488 int lock_file(MI_CHECK *param, File file, my_off_t start, int lock_type, 00489 const char *filetype, const char *filename); 00490 void lock_memory(MI_CHECK *param); 00491 void update_auto_increment_key(MI_CHECK *param, MI_INFO *info, 00492 my_bool repair); 00493 int update_state_info(MI_CHECK *param, MI_INFO *info,uint update); 00494 void update_key_parts(MI_KEYDEF *keyinfo, ulong *rec_per_key_part, 00495 ulonglong *unique, ulonglong *notnull, 00496 ulonglong records); 00497 int filecopy(MI_CHECK *param, File to,File from,my_off_t start, 00498 my_off_t length, const char *type); 00499 int movepoint(MI_INFO *info,byte *record,my_off_t oldpos, 00500 my_off_t newpos, uint prot_key); 00501 int write_data_suffix(SORT_INFO *sort_info, my_bool fix_datafile); 00502 int test_if_almost_full(MI_INFO *info); 00503 int recreate_table(MI_CHECK *param, MI_INFO **org_info, char *filename); 00504 void mi_disable_non_unique_index(MI_INFO *info, ha_rows rows); 00505 my_bool mi_test_if_sort_rep(MI_INFO *info, ha_rows rows, ulonglong key_map, 00506 my_bool force); 00507 00508 int mi_init_bulk_insert(MI_INFO *info, ulong cache_size, ha_rows rows); 00509 void mi_flush_bulk_insert(MI_INFO *info, uint inx); 00510 void mi_end_bulk_insert(MI_INFO *info); 00511 int mi_assign_to_key_cache(MI_INFO *info, ulonglong key_map, 00512 KEY_CACHE *key_cache); 00513 void mi_change_key_cache(KEY_CACHE *old_key_cache, 00514 KEY_CACHE *new_key_cache); 00515 int mi_preload(MI_INFO *info, ulonglong key_map, my_bool ignore_leaves); 00516 00517 #ifdef __cplusplus 00518 } 00519 #endif 00520 #endif
1.4.7

