00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #pragma once
00019
00020 #include <drizzled/identifier.h>
00021
00022 #include <drizzled/key_map.h>
00023
00024 #include <drizzled/base.h>
00025 #ifndef _m_ctype_h
00026 #include <drizzled/charset_info.h>
00027 #endif
00028 #ifndef _keycache_h
00029 #include "keycache.h"
00030 #endif
00031 #include <plugin/myisam/my_handler.h>
00032 #include <drizzled/internal/iocache.h>
00033
00034
00035
00036
00037
00038 #if MAX_INDEXES > HA_MAX_POSSIBLE_KEY
00039 #define MI_MAX_KEY HA_MAX_POSSIBLE_KEY
00040 #else
00041 #define MI_MAX_KEY MAX_INDEXES
00042 #endif
00043
00044
00045
00046
00047
00048 #define MI_MAX_KEY_LENGTH 1332
00049 #define MI_MAX_KEY_SEG 16
00050
00051 #define MI_MAX_POSSIBLE_KEY_BUFF (MI_MAX_KEY_LENGTH + 6 + 6)
00052
00053 #define MI_MAX_KEY_BUFF (MI_MAX_KEY_LENGTH+MI_MAX_KEY_SEG*6+8+8)
00054 #define MI_MAX_MSG_BUF 1024
00055 #define MI_NAME_IEXT ".MYI"
00056 #define MI_NAME_DEXT ".MYD"
00057
00058 #define MI_MAX_TEMP_LENGTH 2*1024L*1024L*1024L
00059
00060
00061 #define MI_KEY_BLOCK_LENGTH 1024
00062 #define MI_MIN_KEY_BLOCK_LENGTH 1024
00063 #define MI_MAX_KEY_BLOCK_LENGTH 16384
00064
00065
00066
00067
00068
00069
00070
00071
00072 #define MI_KEYMAP_BITS (64)
00073 #define MI_KEYMAP_HIGH_MASK (1UL << (MI_KEYMAP_BITS - 1))
00074 #define mi_get_mask_all_keys_active(_keys_) \
00075 (((_keys_) < MI_KEYMAP_BITS) ? \
00076 ((1UL << (_keys_)) - 1UL) : \
00077 (~ 0UL))
00078
00079 #if MI_MAX_KEY > MI_KEYMAP_BITS
00080
00081 #define mi_is_key_active(_keymap_,_keyno_) \
00082 (((_keyno_) < MI_KEYMAP_BITS) ? \
00083 test((_keymap_) & (1UL << (_keyno_))) : \
00084 test((_keymap_) & MI_KEYMAP_HIGH_MASK))
00085 #define mi_set_key_active(_keymap_,_keyno_) \
00086 (_keymap_)|= (((_keyno_) < MI_KEYMAP_BITS) ? \
00087 (1UL << (_keyno_)) : \
00088 MI_KEYMAP_HIGH_MASK)
00089 #define mi_clear_key_active(_keymap_,_keyno_) \
00090 (_keymap_)&= (((_keyno_) < MI_KEYMAP_BITS) ? \
00091 (~ (1UL << (_keyno_))) : \
00092 (~ (0UL)) )
00093
00094 #else
00095
00096 #define mi_is_key_active(_keymap_,_keyno_) \
00097 test((_keymap_) & (1UL << (_keyno_)))
00098 #define mi_set_key_active(_keymap_,_keyno_) \
00099 (_keymap_)|= (1UL << (_keyno_))
00100 #define mi_clear_key_active(_keymap_,_keyno_) \
00101 (_keymap_)&= (~ (1UL << (_keyno_)))
00102
00103 #endif
00104
00105 #define mi_is_any_key_active(_keymap_) \
00106 test((_keymap_))
00107 #define mi_is_all_keys_active(_keymap_,_keys_) \
00108 ((_keymap_) == mi_get_mask_all_keys_active(_keys_))
00109 #define mi_set_all_keys_active(_keymap_,_keys_) \
00110 (_keymap_)= mi_get_mask_all_keys_active(_keys_)
00111 #define mi_clear_all_keys_active(_keymap_) \
00112 (_keymap_)= 0
00113 #define mi_intersect_keys_active(_to_,_from_) \
00114 (_to_)&= (_from_)
00115 #define mi_is_any_intersect_keys_active(_keymap1_,_keys_,_keymap2_) \
00116 ((_keymap1_) & (_keymap2_) & \
00117 mi_get_mask_all_keys_active(_keys_))
00118 #define mi_copy_keys_active(_to_,_maxkeys_,_from_) \
00119 (_to_)= (mi_get_mask_all_keys_active(_maxkeys_) & \
00120 (_from_))
00121
00122
00123
00124 typedef struct st_mi_isaminfo
00125 {
00126 drizzled::ha_rows records;
00127 drizzled::ha_rows deleted;
00128 drizzled::internal::my_off_t recpos;
00129 drizzled::internal::my_off_t newrecpos;
00130 drizzled::internal::my_off_t dupp_key_pos;
00131 drizzled::internal::my_off_t data_file_length,
00132 max_data_file_length,
00133 index_file_length,
00134 max_index_file_length,
00135 delete_length;
00136 ulong reclength;
00137 ulong mean_reclength;
00138 uint64_t auto_increment;
00139 uint64_t key_map;
00140 char *data_file_name, *index_file_name;
00141 uint32_t keys;
00142 uint options;
00143 int errkey,
00144 sortkey;
00145 int filenr;
00146 time_t create_time;
00147 time_t check_time;
00148 time_t update_time;
00149 uint32_t reflength;
00150 ulong record_offset;
00151 ulong *rec_per_key;
00152 } MI_ISAMINFO;
00153
00154
00155 typedef struct st_mi_create_info
00156 {
00157 const char *index_file_name, *data_file_name;
00158 drizzled::ha_rows max_rows;
00159 drizzled::ha_rows reloc_rows;
00160 uint64_t auto_increment;
00161 uint64_t data_file_length;
00162 uint64_t key_file_length;
00163 uint32_t old_options;
00164 uint8_t language;
00165 bool with_auto_increment;
00166
00167 st_mi_create_info():
00168 index_file_name(0),
00169 data_file_name(0),
00170 max_rows(0),
00171 reloc_rows(0),
00172 auto_increment(0),
00173 data_file_length(0),
00174 key_file_length(0),
00175 old_options(0),
00176 language(0),
00177 with_auto_increment(0)
00178 { }
00179
00180 } MI_CREATE_INFO;
00181
00182 struct st_myisam_info;
00183 struct st_mi_isam_share;
00184 typedef struct st_myisam_info MI_INFO;
00185 struct st_mi_s_param;
00186
00187 typedef struct st_mi_keydef
00188 {
00189 struct st_mi_isam_share *share;
00190 uint16_t keysegs;
00191 uint16_t flag;
00192
00193 uint8_t key_alg;
00194 uint16_t block_length;
00195 uint16_t underflow_block_length;
00196 uint16_t keylength;
00197 uint16_t minlength;
00198 uint16_t maxlength;
00199 uint16_t block_size_index;
00200 uint32_t version;
00201
00202 HA_KEYSEG *seg,*end;
00203
00204 int (*bin_search)(struct st_myisam_info *info,struct st_mi_keydef *keyinfo,
00205 unsigned char *page,unsigned char *key,
00206 uint32_t key_len,uint32_t comp_flag,unsigned char * *ret_pos,
00207 unsigned char *buff, bool *was_last_key);
00208 uint32_t (*get_key)(struct st_mi_keydef *keyinfo,uint32_t nod_flag,unsigned char * *page,
00209 unsigned char *key);
00210 int (*pack_key)(struct st_mi_keydef *keyinfo,uint32_t nod_flag,unsigned char *next_key,
00211 unsigned char *org_key, unsigned char *prev_key, unsigned char *key,
00212 struct st_mi_s_param *s_temp);
00213 void (*store_key)(struct st_mi_keydef *keyinfo, unsigned char *key_pos,
00214 struct st_mi_s_param *s_temp);
00215 int (*ck_insert)(struct st_myisam_info *inf, uint32_t k_nr, unsigned char *k, uint32_t klen);
00216 int (*ck_delete)(struct st_myisam_info *inf, uint32_t k_nr, unsigned char *k, uint32_t klen);
00217 } MI_KEYDEF;
00218
00219
00220 #define MI_UNIQUE_HASH_LENGTH 4
00221
00222 typedef struct st_unique_def
00223 {
00224 uint16_t keysegs;
00225 unsigned char key;
00226 uint8_t null_are_equal;
00227 HA_KEYSEG *seg,*end;
00228 } MI_UNIQUEDEF;
00229
00230 typedef struct st_mi_decode_tree
00231 {
00232 uint16_t *table;
00233 uint quick_table_bits;
00234 unsigned char *intervalls;
00235 } MI_DECODE_TREE;
00236
00237
00238 struct st_mi_bit_buff;
00239
00240
00241
00242
00243
00244
00245
00246 namespace drizzled
00247 {
00248
00249 typedef struct st_columndef
00250 {
00251 int16_t type;
00252 uint16_t length;
00253 uint32_t offset;
00254 uint8_t null_bit;
00255 uint16_t null_pos;
00256
00257 #ifndef NOT_PACKED_DATABASES
00258 void (*unpack)(struct st_columndef *rec,struct st_mi_bit_buff *buff,
00259 unsigned char *start,unsigned char *end);
00260 enum drizzled::en_fieldtype base_type;
00261 uint32_t space_length_bits,pack_type;
00262 MI_DECODE_TREE *huff_tree;
00263 #endif
00264 } MI_COLUMNDEF;
00265
00266 }
00267
00268
00269 extern char * myisam_log_filename;
00270 extern uint32_t myisam_block_size;
00271 extern uint32_t myisam_concurrent_insert;
00272 extern uint32_t myisam_bulk_insert_tree_size;
00273 extern uint32_t data_pointer_size;
00274
00275
00276
00277 extern int mi_close(struct st_myisam_info *file);
00278 extern int mi_delete(struct st_myisam_info *file,const unsigned char *buff);
00279 extern struct st_myisam_info *mi_open(const drizzled::identifier::Table &identifier,
00280 int mode,
00281 uint32_t wait_if_locked);
00282 extern int mi_panic(enum drizzled::ha_panic_function function);
00283 extern int mi_rfirst(struct st_myisam_info *file,unsigned char *buf,int inx);
00284 extern int mi_rkey(MI_INFO *info, unsigned char *buf, int inx, const unsigned char *key,
00285 drizzled::key_part_map keypart_map, enum drizzled::ha_rkey_function search_flag);
00286 extern int mi_rlast(struct st_myisam_info *file,unsigned char *buf,int inx);
00287 extern int mi_rnext(struct st_myisam_info *file,unsigned char *buf,int inx);
00288 extern int mi_rnext_same(struct st_myisam_info *info, unsigned char *buf);
00289 extern int mi_rprev(struct st_myisam_info *file,unsigned char *buf,int inx);
00290 extern int mi_rrnd(struct st_myisam_info *file,unsigned char *buf, drizzled::internal::my_off_t pos);
00291 extern int mi_scan_init(struct st_myisam_info *file);
00292 extern int mi_scan(struct st_myisam_info *file,unsigned char *buf);
00293 extern int mi_rsame(struct st_myisam_info *file,unsigned char *record,int inx);
00294 extern int mi_update(struct st_myisam_info *file,const unsigned char *old,
00295 unsigned char *new_record);
00296 extern int mi_write(struct st_myisam_info *file,unsigned char *buff);
00297 extern drizzled::internal::my_off_t mi_position(struct st_myisam_info *file);
00298 extern int mi_status(struct st_myisam_info *info, MI_ISAMINFO *x, uint32_t flag);
00299 extern int mi_lock_database(struct st_myisam_info *file,int lock_type);
00300 extern int mi_create(const char *name,uint32_t keys,MI_KEYDEF *keydef,
00301 uint32_t columns, drizzled::MI_COLUMNDEF *columndef,
00302 uint32_t uniques, MI_UNIQUEDEF *uniquedef,
00303 MI_CREATE_INFO *create_info, uint32_t flags);
00304 extern int mi_delete_table(const char *name);
00305 extern int mi_rename(const char *from, const char *to);
00306 extern int mi_extra(struct st_myisam_info *file,
00307 enum drizzled::ha_extra_function function,
00308 void *extra_arg);
00309 extern int mi_reset(struct st_myisam_info *file);
00310 extern drizzled::ha_rows mi_records_in_range(MI_INFO *info, int inx,
00311 drizzled::key_range *min_key, drizzled::key_range *max_key);
00312 extern int mi_log(int activate_log);
00313 extern int mi_delete_all_rows(struct st_myisam_info *info);
00314 extern ulong _mi_calc_blob_length(uint32_t length , const unsigned char *pos);
00315 extern uint32_t mi_get_pointer_length(uint64_t file_length, uint32_t def);
00316
00317
00318
00319 #define MYISAMCHK_REPAIR 1
00320 #define MYISAMCHK_VERIFY 2
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332 #define T_AUTO_INC 1
00333 #define T_AUTO_REPAIR 2
00334 #define T_BACKUP_DATA 4
00335 #define T_CALC_CHECKSUM 8
00336 #define T_CHECK 16
00337 #define T_CHECK_ONLY_CHANGED 32
00338 #define T_CREATE_MISSING_KEYS 64
00339 #define T_DESCRIPT 128
00340 #define T_DONT_CHECK_CHECKSUM 256
00341 #define T_EXTEND 512
00342 #define T_FAST (1L << 10)
00343 #define T_FORCE_CREATE (1L << 11)
00344 #define T_FORCE_UNIQUENESS (1L << 12)
00345 #define T_INFO (1L << 13)
00346 #define T_MEDIUM (1L << 14)
00347 #define T_QUICK (1L << 15)
00348 #define T_READONLY (1L << 16)
00349 #define T_REP (1L << 17)
00350 #define T_REP_BY_SORT (1L << 18)
00351 #define T_REP_PARALLEL (1L << 19)
00352 #define T_RETRY_WITHOUT_QUICK (1L << 20)
00353 #define T_SAFE_REPAIR (1L << 21)
00354 #define T_SILENT (1L << 22)
00355 #define T_SORT_INDEX (1L << 23)
00356 #define T_SORT_RECORDS (1L << 24)
00357 #define T_STATISTICS (1L << 25)
00358 #define T_UNPACK (1L << 26)
00359 #define T_UPDATE_STATE (1L << 27)
00360 #define T_VERBOSE (1L << 28)
00361 #define T_VERY_SILENT (1L << 29)
00362 #define T_WAIT_FOREVER (1L << 30)
00363 #define T_WRITE_LOOP ((ulong) 1L << 31)
00364
00365 #define T_REP_ANY (T_REP | T_REP_BY_SORT | T_REP_PARALLEL)
00366
00367 #define O_NEW_INDEX 1
00368 #define O_NEW_DATA 2
00369 #define O_DATA_LOST 4
00370
00371
00372
00373 typedef struct st_sort_key_blocks
00374 {
00375 unsigned char *buff,*end_pos;
00376 unsigned char lastkey[MI_MAX_POSSIBLE_KEY_BUFF];
00377 uint32_t last_length;
00378 int inited;
00379 } SORT_KEY_BLOCKS;
00380
00381
00382
00383
00384
00385
00386
00387
00388 typedef enum
00389 {
00390
00391 MI_STATS_METHOD_NULLS_NOT_EQUAL,
00392
00393 MI_STATS_METHOD_NULLS_EQUAL,
00394
00395 MI_STATS_METHOD_IGNORE_NULLS
00396 } enum_mi_stats_method;
00397
00398 typedef struct st_mi_check_param
00399 {
00400 uint64_t auto_increment_value;
00401 uint64_t max_data_file_length;
00402 uint64_t keys_in_use;
00403 uint64_t max_record_length;
00404 drizzled::internal::my_off_t search_after_block;
00405 drizzled::internal::my_off_t new_file_pos,key_file_blocks;
00406 drizzled::internal::my_off_t keydata,totaldata,key_blocks,start_check_pos;
00407 drizzled::ha_rows total_records,total_deleted;
00408 drizzled::internal::ha_checksum record_checksum,glob_crc;
00409 uint64_t use_buffers;
00410 size_t read_buffer_length, write_buffer_length,
00411 sort_buffer_length, sort_key_blocks;
00412 uint32_t out_flag,warning_printed,error_printed,verbose;
00413 uint32_t opt_sort_key,total_files,max_level;
00414 uint32_t testflag, key_cache_block_size;
00415 uint8_t language;
00416 bool using_global_keycache, opt_lock_memory, opt_follow_links;
00417 bool retry_repair, force_sort;
00418 char temp_filename[FN_REFLEN],*isam_file_name;
00419 int tmpfile_createflag;
00420 drizzled::myf myf_rw;
00421 drizzled::internal::IO_CACHE read_cache;
00422
00423
00424
00425
00426
00427 uint64_t unique_count[MI_MAX_KEY_SEG+1];
00428 uint64_t notnull_count[MI_MAX_KEY_SEG+1];
00429
00430 drizzled::internal::ha_checksum key_crc[HA_MAX_POSSIBLE_KEY];
00431 ulong rec_per_key_part[MI_MAX_KEY_SEG*HA_MAX_POSSIBLE_KEY];
00432 void *session;
00433 const char *db_name, *table_name;
00434 const char *op_name;
00435 enum_mi_stats_method stats_method;
00436 } MI_CHECK;
00437
00438 typedef struct st_sort_info
00439 {
00440 drizzled::internal::my_off_t filelength,dupp,buff_length;
00441 drizzled::ha_rows max_records;
00442 uint32_t current_key, total_keys;
00443 drizzled::myf myf_rw;
00444 enum drizzled::data_file_type new_data_file_type;
00445 MI_INFO *info;
00446 MI_CHECK *param;
00447 unsigned char *buff;
00448 SORT_KEY_BLOCKS *key_block,*key_block_end;
00449
00450 uint32_t got_error, threads_running;
00451 pthread_mutex_t mutex;
00452 pthread_cond_t cond;
00453 } SORT_INFO;
00454
00455
00456 void myisamchk_init(MI_CHECK *param);
00457 int chk_status(MI_CHECK *param, MI_INFO *info);
00458 int chk_del(MI_CHECK *param, register MI_INFO *info, uint32_t test_flag);
00459 int chk_size(MI_CHECK *param, MI_INFO *info);
00460 int chk_key(MI_CHECK *param, MI_INFO *info);
00461 int chk_data_link(MI_CHECK *param, MI_INFO *info,int extend);
00462 int mi_repair(MI_CHECK *param, register MI_INFO *info,
00463 char * name, int rep_quick);
00464 int mi_sort_index(MI_CHECK *param, register MI_INFO *info, char * name);
00465 int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info,
00466 const char * name, int rep_quick);
00467 int change_to_newfile(const char * filename, const char * old_ext,
00468 const char * new_ext, uint32_t raid_chunks,
00469 drizzled::myf myflags);
00470 void lock_memory(MI_CHECK *param);
00471 void update_auto_increment_key(MI_CHECK *param, MI_INFO *info,
00472 bool repair);
00473 int update_state_info(MI_CHECK *param, MI_INFO *info,uint32_t update);
00474 void update_key_parts(MI_KEYDEF *keyinfo, ulong *rec_per_key_part,
00475 uint64_t *unique, uint64_t *notnull,
00476 uint64_t records);
00477 int filecopy(MI_CHECK *param, int to,int from,drizzled::internal::my_off_t start,
00478 drizzled::internal::my_off_t length, const char *type);
00479 int movepoint(MI_INFO *info,unsigned char *record,drizzled::internal::my_off_t oldpos,
00480 drizzled::internal::my_off_t newpos, uint32_t prot_key);
00481 int write_data_suffix(SORT_INFO *sort_info, bool fix_datafile);
00482 int test_if_almost_full(MI_INFO *info);
00483 bool mi_test_if_sort_rep(MI_INFO *info, drizzled::ha_rows rows, uint64_t key_map,
00484 bool force);
00485
00486 int mi_init_bulk_insert(MI_INFO *info, uint32_t cache_size, drizzled::ha_rows rows);
00487 void mi_flush_bulk_insert(MI_INFO *info, uint32_t inx);
00488 void mi_end_bulk_insert(MI_INFO *info);
00489 int mi_preload(MI_INFO *info, uint64_t key_map, bool ignore_leaves);
00490