20 #include <drizzled/common_fwd.h>
21 #include <drizzled/key_map.h>
22 #include <drizzled/base.h>
23 #include <plugin/myisam/my_handler.h>
24 #include <drizzled/internal/iocache.h>
30 #if MAX_INDEXES > HA_MAX_POSSIBLE_KEY
31 #define MI_MAX_KEY HA_MAX_POSSIBLE_KEY
33 #define MI_MAX_KEY MAX_INDEXES
40 #define MI_MAX_KEY_LENGTH 1332
41 #define MI_MAX_KEY_SEG 16
43 #define MI_MAX_POSSIBLE_KEY_BUFF (MI_MAX_KEY_LENGTH + 6 + 6)
45 #define MI_MAX_KEY_BUFF (MI_MAX_KEY_LENGTH+MI_MAX_KEY_SEG*6+8+8)
46 #define MI_MAX_MSG_BUF 1024
47 #define MI_NAME_IEXT ".MYI"
48 #define MI_NAME_DEXT ".MYD"
50 #define MI_MAX_TEMP_LENGTH 2*1024L*1024L*1024L
53 #define MI_KEY_BLOCK_LENGTH 1024
54 #define MI_MIN_KEY_BLOCK_LENGTH 1024
55 #define MI_MAX_KEY_BLOCK_LENGTH 16384
64 #define MI_KEYMAP_BITS (64)
65 #define MI_KEYMAP_HIGH_MASK (1UL << (MI_KEYMAP_BITS - 1))
66 #define mi_get_mask_all_keys_active(_keys_) \
67 (((_keys_) < MI_KEYMAP_BITS) ? \
68 ((1UL << (_keys_)) - 1UL) : \
71 #if MI_MAX_KEY > MI_KEYMAP_BITS
73 #define mi_is_key_active(_keymap_,_keyno_) \
74 (((_keyno_) < MI_KEYMAP_BITS) ? \
75 test((_keymap_) & (1UL << (_keyno_))) : \
76 test((_keymap_) & MI_KEYMAP_HIGH_MASK))
77 #define mi_set_key_active(_keymap_,_keyno_) \
78 (_keymap_)|= (((_keyno_) < MI_KEYMAP_BITS) ? \
79 (1UL << (_keyno_)) : \
81 #define mi_clear_key_active(_keymap_,_keyno_) \
82 (_keymap_)&= (((_keyno_) < MI_KEYMAP_BITS) ? \
83 (~ (1UL << (_keyno_))) : \
88 #define mi_is_key_active(_keymap_,_keyno_) \
89 test((_keymap_) & (1UL << (_keyno_)))
90 #define mi_set_key_active(_keymap_,_keyno_) \
91 (_keymap_)|= (1UL << (_keyno_))
92 #define mi_clear_key_active(_keymap_,_keyno_) \
93 (_keymap_)&= (~ (1UL << (_keyno_)))
97 #define mi_is_any_key_active(_keymap_) \
99 #define mi_is_all_keys_active(_keymap_,_keys_) \
100 ((_keymap_) == mi_get_mask_all_keys_active(_keys_))
101 #define mi_set_all_keys_active(_keymap_,_keys_) \
102 (_keymap_)= mi_get_mask_all_keys_active(_keys_)
103 #define mi_clear_all_keys_active(_keymap_) \
105 #define mi_intersect_keys_active(_to_,_from_) \
107 #define mi_is_any_intersect_keys_active(_keymap1_,_keys_,_keymap2_) \
108 ((_keymap1_) & (_keymap2_) & \
109 mi_get_mask_all_keys_active(_keys_))
110 #define mi_copy_keys_active(_to_,_maxkeys_,_from_) \
111 (_to_)= (mi_get_mask_all_keys_active(_maxkeys_) & \
114 typedef uint32_t ha_checksum;
119 drizzled::ha_rows records;
120 drizzled::ha_rows deleted;
121 drizzled::internal::my_off_t recpos;
122 drizzled::internal::my_off_t newrecpos;
123 drizzled::internal::my_off_t dupp_key_pos;
124 drizzled::internal::my_off_t data_file_length,
125 max_data_file_length,
127 max_index_file_length,
130 ulong mean_reclength;
131 uint64_t auto_increment;
133 char *data_file_name, *index_file_name;
150 const char *index_file_name, *data_file_name;
151 drizzled::ha_rows max_rows;
152 drizzled::ha_rows reloc_rows;
153 uint64_t auto_increment;
154 uint64_t data_file_length;
155 uint64_t key_file_length;
156 uint32_t old_options;
158 bool with_auto_increment;
170 with_auto_increment(0)
187 uint16_t block_length;
188 uint16_t underflow_block_length;
192 uint16_t block_size_index;
198 unsigned char *page,
unsigned char *key,
199 uint32_t key_len,uint32_t comp_flag,
unsigned char * *ret_pos,
200 unsigned char *buff,
bool *was_last_key);
201 uint32_t (*get_key)(
struct st_mi_keydef *keyinfo,uint32_t nod_flag,
unsigned char * *page,
203 int (*pack_key)(
struct st_mi_keydef *keyinfo,uint32_t nod_flag,
unsigned char *next_key,
204 unsigned char *org_key,
unsigned char *prev_key,
unsigned char *key,
206 void (*store_key)(
struct st_mi_keydef *keyinfo,
unsigned char *key_pos,
208 int (*ck_insert)(
struct st_myisam_info *inf, uint32_t k_nr,
unsigned char *k, uint32_t klen);
209 int (*ck_delete)(
struct st_myisam_info *inf, uint32_t k_nr,
unsigned char *k, uint32_t klen);
213 #define MI_UNIQUE_HASH_LENGTH 4
219 uint8_t null_are_equal;
226 uint quick_table_bits;
227 unsigned char *intervalls;
250 #ifndef NOT_PACKED_DATABASES
252 unsigned char *start,
unsigned char *end);
253 enum drizzled::en_fieldtype base_type;
254 uint32_t space_length_bits,pack_type;
262 extern char * myisam_log_filename;
263 extern uint32_t myisam_block_size;
264 extern uint32_t myisam_concurrent_insert;
265 extern uint32_t myisam_bulk_insert_tree_size;
266 extern uint32_t data_pointer_size;
271 extern int mi_delete(
struct st_myisam_info *file,
const unsigned char *buff);
274 uint32_t wait_if_locked);
275 extern int mi_panic(
enum drizzled::ha_panic_function
function);
276 extern int mi_rfirst(
struct st_myisam_info *file,
unsigned char *buf,
int inx);
277 extern int mi_rkey(
MI_INFO *info,
unsigned char *buf,
int inx,
const unsigned char *key,
278 drizzled::key_part_map keypart_map,
enum drizzled::ha_rkey_function search_flag);
279 extern int mi_rlast(
struct st_myisam_info *file,
unsigned char *buf,
int inx);
280 extern int mi_rnext(
struct st_myisam_info *file,
unsigned char *buf,
int inx);
281 extern int mi_rnext_same(
struct st_myisam_info *info,
unsigned char *buf);
282 extern int mi_rprev(
struct st_myisam_info *file,
unsigned char *buf,
int inx);
283 extern int mi_rrnd(
struct st_myisam_info *file,
unsigned char *buf, drizzled::internal::my_off_t pos);
285 extern int mi_scan(
struct st_myisam_info *file,
unsigned char *buf);
286 extern int mi_rsame(
struct st_myisam_info *file,
unsigned char *record,
int inx);
287 extern int mi_update(
struct st_myisam_info *file,
const unsigned char *old,
288 unsigned char *new_record);
289 extern int mi_write(
struct st_myisam_info *file,
unsigned char *buff);
290 extern drizzled::internal::my_off_t mi_position(
struct st_myisam_info *file);
292 extern int mi_lock_database(
struct st_myisam_info *file,
int lock_type);
293 extern int mi_create(
const char *name,uint32_t keys,
MI_KEYDEF *keydef,
297 extern int mi_delete_table(
const char *name);
298 extern int mi_rename(
const char *from,
const char *to);
300 enum drizzled::ha_extra_function
function,
303 extern drizzled::ha_rows mi_records_in_range(
MI_INFO *info,
int inx,
305 extern int mi_log(
int activate_log);
307 extern ulong _mi_calc_blob_length(uint32_t length ,
const unsigned char *pos);
308 extern uint32_t mi_get_pointer_length(uint64_t file_length, uint32_t def);
312 #define MYISAMCHK_REPAIR 1
313 #define MYISAMCHK_VERIFY 2
326 #define T_AUTO_REPAIR 2
327 #define T_CALC_CHECKSUM 8
329 #define T_CHECK_ONLY_CHANGED 32
330 #define T_CREATE_MISSING_KEYS 64
331 #define T_DESCRIPT 128
332 #define T_DONT_CHECK_CHECKSUM 256
334 #define T_FAST (1L << 10)
335 #define T_FORCE_CREATE (1L << 11)
336 #define T_FORCE_UNIQUENESS (1L << 12)
337 #define T_INFO (1L << 13)
338 #define T_MEDIUM (1L << 14)
339 #define T_QUICK (1L << 15)
340 #define T_READONLY (1L << 16)
341 #define T_REP (1L << 17)
342 #define T_REP_BY_SORT (1L << 18)
343 #define T_REP_PARALLEL (1L << 19)
344 #define T_RETRY_WITHOUT_QUICK (1L << 20)
345 #define T_SAFE_REPAIR (1L << 21)
346 #define T_SILENT (1L << 22)
347 #define T_SORT_INDEX (1L << 23)
348 #define T_SORT_RECORDS (1L << 24)
349 #define T_STATISTICS (1L << 25)
350 #define T_UNPACK (1L << 26)
351 #define T_UPDATE_STATE (1L << 27)
352 #define T_VERBOSE (1L << 28)
353 #define T_VERY_SILENT (1L << 29)
354 #define T_WAIT_FOREVER (1L << 30)
355 #define T_WRITE_LOOP ((ulong) 1L << 31)
357 #define T_REP_ANY (T_REP | T_REP_BY_SORT | T_REP_PARALLEL)
359 #define O_NEW_INDEX 1
361 #define O_DATA_LOST 4
367 unsigned char *buff,*end_pos;
368 unsigned char lastkey[MI_MAX_POSSIBLE_KEY_BUFF];
369 uint32_t last_length;
383 MI_STATS_METHOD_NULLS_NOT_EQUAL,
385 MI_STATS_METHOD_NULLS_EQUAL,
387 MI_STATS_METHOD_IGNORE_NULLS
388 } enum_mi_stats_method;
392 uint64_t auto_increment_value;
393 uint64_t max_data_file_length;
394 uint64_t keys_in_use;
395 uint64_t max_record_length;
396 drizzled::internal::my_off_t search_after_block;
397 drizzled::internal::my_off_t new_file_pos,key_file_blocks;
398 drizzled::internal::my_off_t keydata,totaldata,key_blocks,start_check_pos;
399 drizzled::ha_rows total_records,total_deleted;
400 ha_checksum record_checksum,glob_crc;
401 uint64_t use_buffers;
402 size_t read_buffer_length, write_buffer_length,
403 sort_buffer_length, sort_key_blocks;
404 uint32_t out_flag,warning_printed,error_printed,verbose;
405 uint32_t opt_sort_key,total_files,max_level;
406 uint32_t testflag, key_cache_block_size;
408 bool using_global_keycache, opt_lock_memory, opt_follow_links;
409 bool retry_repair, force_sort;
410 char temp_filename[FN_REFLEN],*isam_file_name;
411 int tmpfile_createflag;
412 drizzled::myf myf_rw;
419 uint64_t unique_count[MI_MAX_KEY_SEG+1];
420 uint64_t notnull_count[MI_MAX_KEY_SEG+1];
422 ha_checksum key_crc[HA_MAX_POSSIBLE_KEY];
423 ulong rec_per_key_part[MI_MAX_KEY_SEG*HA_MAX_POSSIBLE_KEY];
425 const char *db_name, *table_name;
427 enum_mi_stats_method stats_method;
432 drizzled::internal::my_off_t filelength,dupp,buff_length;
433 drizzled::ha_rows max_records;
434 uint32_t current_key, total_keys;
435 drizzled::myf myf_rw;
436 enum drizzled::data_file_type new_data_file_type;
442 uint32_t got_error, threads_running;
443 pthread_mutex_t mutex;
448 void myisamchk_init(
MI_CHECK *param);
450 int chk_del(
MI_CHECK *param,
register MI_INFO *info, uint32_t test_flag);
455 char * name,
int rep_quick);
456 int mi_sort_index(
MI_CHECK *param,
register MI_INFO *info,
char * name);
458 const char * name,
int rep_quick);
459 int change_to_newfile(
const char * filename,
const char * old_ext,
460 const char * new_ext, uint32_t raid_chunks,
461 drizzled::myf myflags);
466 void update_key_parts(
MI_KEYDEF *keyinfo, ulong *rec_per_key_part,
467 uint64_t *unique, uint64_t *notnull,
469 int filecopy(
MI_CHECK *param,
int to,
int from,drizzled::internal::my_off_t start,
470 drizzled::internal::my_off_t length,
const char *type);
471 int movepoint(
MI_INFO *info,
unsigned char *record,drizzled::internal::my_off_t oldpos,
472 drizzled::internal::my_off_t newpos, uint32_t prot_key);
473 int write_data_suffix(
SORT_INFO *sort_info,
bool fix_datafile);
474 int test_if_almost_full(
MI_INFO *info);
475 bool mi_test_if_sort_rep(
MI_INFO *info, drizzled::ha_rows rows, uint64_t key_map,
478 int mi_init_bulk_insert(
MI_INFO *info, uint32_t cache_size, drizzled::ha_rows rows);
479 void mi_flush_bulk_insert(
MI_INFO *info, uint32_t inx);
480 void mi_end_bulk_insert(
MI_INFO *info);
481 int mi_preload(
MI_INFO *info, uint64_t key_map,
bool ignore_leaves);
TODO: Rename this file - func.h is stupid.