23 #include "myisampack.h"
26 #include <drizzled/internal/my_pthread.h>
27 #include <drizzled/thr_lock.h>
28 #include <drizzled/common.h>
29 #include <drizzled/enum.h>
30 #include <drizzled/dynamic_array.h>
31 #include <drizzled/error_t.h>
38 #include <boost/thread/mutex.hpp>
49 static const uint32_t KEY_CACHE_SIZE= 8*1024*1024;
52 static const uint32_t KEY_CACHE_BLOCK_SIZE= 1024;
56 drizzled::ha_rows records;
57 drizzled::ha_rows del;
58 drizzled::internal::my_off_t empty;
59 drizzled::internal::my_off_t key_empty;
60 drizzled::internal::my_off_t key_file_length;
61 drizzled::internal::my_off_t data_file_length;
68 unsigned char file_version[4];
69 unsigned char options[2];
70 unsigned char header_length[2];
71 unsigned char state_info_length[2];
72 unsigned char base_info_length[2];
73 unsigned char base_pos[2];
74 unsigned char key_parts[2];
75 unsigned char unique_key_parts[2];
77 unsigned char uniques;
78 unsigned char language;
79 unsigned char max_block_size_index;
80 unsigned char fulltext_keys;
81 unsigned char not_used;
85 drizzled::ha_rows split;
86 drizzled::internal::my_off_t dellink;
87 uint64_t auto_increment;
92 ulong *rec_per_key_part;
93 drizzled::internal::my_off_t *key_root;
94 drizzled::internal::my_off_t *key_del;
95 drizzled::internal::my_off_t rec_per_key_rows;
97 ulong sec_index_changed;
100 ha_checksum checksum;
110 uint32_t state_diff_length;
115 #define MI_STATE_INFO_SIZE (24+14*8+7*4+2*2+8)
116 #define MI_STATE_KEY_SIZE 8
117 #define MI_STATE_KEYBLOCK_SIZE 8
118 #define MI_STATE_KEYSEG_SIZE 4
119 #define MI_STATE_EXTRA_SIZE ((MI_MAX_KEY+MI_MAX_KEY_BLOCK_SIZE)*MI_STATE_KEY_SIZE + MI_MAX_KEY*MI_MAX_KEY_SEG*MI_STATE_KEYSEG_SIZE)
120 #define MI_KEYDEF_SIZE (2+ 5*2)
121 #define MI_UNIQUEDEF_SIZE (2+1+1)
122 #define HA_KEYSEG_SIZE (6+ 2*2 + 4*2)
123 #define MI_COLUMNDEF_SIZE (2*3+1)
124 #define MI_BASE_INFO_SIZE (5*8 + 8*4 + 4 + 4*2 + 16)
125 #define MI_INDEX_BLOCK_MARGIN 16
129 drizzled::internal::my_off_t keystart;
130 drizzled::internal::my_off_t max_data_file_length;
131 drizzled::internal::my_off_t max_key_file_length;
132 drizzled::internal::my_off_t margin_key_file_length;
133 drizzled::ha_rows records,reloc;
134 ulong mean_row_length;
136 ulong pack_reclength;
137 ulong min_pack_length;
138 ulong max_pack_length;
139 ulong min_block_length;
142 uint32_t rec_reflength;
143 uint32_t key_reflength;
148 uint32_t max_key_block_length;
149 uint32_t max_key_length;
151 uint32_t extra_alloc_bytes;
152 uint32_t extra_alloc_procent;
154 uint32_t raid_type,raid_chunks;
155 uint32_t raid_chunksize;
157 uint32_t key_parts,all_key_parts;
166 uint32_t pack_length;
174 unsigned char version;
177 #define MAX_NONMAPPED_INSERTS 1000
189 std::list<drizzled::Session *> *in_use;
190 char *unique_file_name;
191 char *data_file_name,
193 unsigned char *file_map;
195 uint16_t *decode_tables;
196 int (*read_record)(
struct st_myisam_info*, drizzled::internal::my_off_t,
unsigned char*);
197 int (*write_record)(
struct st_myisam_info*,
const unsigned char*);
198 int (*update_record)(
struct st_myisam_info*, drizzled::internal::my_off_t,
const unsigned char*);
200 int (*read_rnd)(
struct st_myisam_info*,
unsigned char*, drizzled::internal::my_off_t, bool);
201 int (*compare_record)(
struct st_myisam_info*,
const unsigned char *);
203 ha_checksum (*calc_checksum)(
struct st_myisam_info*,
const unsigned char *);
205 const unsigned char *record, drizzled::internal::my_off_t pos);
206 size_t (*file_read)(
MI_INFO *,
unsigned char *, size_t, drizzled::internal::my_off_t, drizzled::myf);
207 size_t (*file_write)(
MI_INFO *,
const unsigned char *, size_t, drizzled::internal::my_off_t, drizzled::myf);
212 ulong min_pack_length;
213 ulong max_pack_length;
214 ulong state_diff_length;
216 uint32_t unique_name_length;
221 uint w_locks,r_locks,tot_locks;
223 drizzled::myf write_flag;
224 enum drizzled::data_file_type data_file_type;
231 temporary,delay_key_write,
233 drizzled::internal::my_off_t mmaped_length;
234 uint32_t nonmmaped_inserts;
239 typedef uint32_t mi_bit_type;
242 mi_bit_type current_byte;
244 unsigned char *pos,*end,*blob_pos,*blob_end;
249 typedef bool (*index_cond_func_t)(
void *param);
262 unsigned char *first_mbr_key;
263 unsigned char *rec_buff;
264 unsigned char *int_keypos,
266 uint32_t int_nod_flag;
267 uint32_t int_keytree_version;
268 int (*read_record)(
struct st_myisam_info*, drizzled::internal::my_off_t,
unsigned char*);
273 drizzled::internal::my_off_t lastpos,
275 drizzled::internal::my_off_t save_lastpos;
276 drizzled::internal::my_off_t pos;
277 drizzled::internal::my_off_t last_keypage;
278 drizzled::internal::my_off_t last_search_keypage;
279 drizzled::internal::my_off_t dupp_key_pos;
280 ha_checksum checksum;
283 ulong packed_length,blob_length;
289 uint last_rkey_length;
290 enum drizzled::ha_rkey_function last_key_func;
291 uint32_t save_lastkey_length;
292 uint32_t pack_key_length;
293 uint16_t last_used_keyseg;
301 uint32_t preload_buff_size;
302 drizzled::myf lock_wait;
304 bool append_insert_at_end;
310 index_cond_func_t index_cond_func;
311 void *index_cond_func_arg;
313 unsigned char *rtree_recursion_state;
314 int rtree_recursion_depth;
319 unsigned char *base,*key;
320 drizzled::ha_rows count;
336 uint64_t unique[MI_MAX_KEY_SEG+1];
337 uint64_t notnull[MI_MAX_KEY_SEG+1];
339 drizzled::internal::my_off_t pos,max_pos,filepos,start_recpos;
340 uint32_t key, key_length,real_key_length,sortbuff_size;
341 uint32_t maxbuffers, keys, find_length, sort_keys_length;
342 bool fix_datafile, master;
347 unsigned char **sort_keys;
348 unsigned char *rec_buff;
349 void *wordlist, *wordptr;
351 unsigned char *record;
359 int (*write_key)(
struct st_mi_sort_param *, drizzled::internal::io_cache_st *,
unsigned char *,
365 #define USE_WHOLE_KEY MI_MAX_KEY_BUFF*2
366 #define F_EXTRA_LCK -1
369 #define MEMMAP_USED 32
370 #define REMEMBER_OLD_POS 64
372 #define WRITEINFO_UPDATE_KEYFILE 1
373 #define WRITEINFO_NO_UNLOCK 2
376 #define USE_PACKED_KEYS 1
377 #define RRND_PRESERVE_LASTINX 2
381 #define STATE_CHANGED 1
382 #define STATE_CRASHED 2
383 #define STATE_CRASHED_ON_REPAIR 4
384 #define STATE_NOT_ANALYZED 8
385 #define STATE_NOT_OPTIMIZED_KEYS 16
386 #define STATE_NOT_SORTED_PAGES 32
390 #define READING_NEXT 1
391 #define READING_HEADER 2
394 #define mi_getint(x) ((uint) mi_uint2korr(x) & 32767)
395 #define mi_putint(x,y,nod) { uint16_t boh=(nod ? (uint16_t) 32768 : 0) + (uint16_t) (y);\
396 mi_int2store(x,boh); }
397 #define mi_test_if_nod(x) (x[0] & 128 ? info->s->base.key_reflength : 0)
398 #define mi_report_crashed(A, B) _mi_report_crashed((A), (B), __FILE__, __LINE__)
399 #define mi_mark_crashed(x) do{(x)->s->state.changed|= STATE_CRASHED; \
400 mi_report_crashed((x), 0); \
402 #define mi_mark_crashed_on_repair(x) do{(x)->s->state.changed|= \
403 STATE_CRASHED|STATE_CRASHED_ON_REPAIR; \
404 (x)->update|= HA_STATE_CHANGED; \
406 #define mi_is_crashed(x) ((x)->s->state.changed & STATE_CRASHED)
407 #define mi_is_crashed_on_repair(x) ((x)->s->state.changed & STATE_CRASHED_ON_REPAIR)
408 #define mi_print_error(SHARE, ERRNO) \
409 mi_report_error((ERRNO), (SHARE)->index_file_name)
413 #define store_key_length(key,length) \
414 { if ((length) < 255) \
415 { *(key)=(length); } \
417 { *(key)=255; mi_int2store((key)+1,(length)); } \
420 #define get_key_full_length(length,key) \
421 { if ((unsigned char) *(key) != 255) \
422 length= ((uint) (unsigned char) *((key)++))+1; \
424 { length=mi_uint2korr((key)+1)+3; (key)+=3; } \
427 #define get_key_full_length_rdonly(length,key) \
428 { if ((unsigned char) *(key) != 255) \
429 length= ((uint) (unsigned char) *((key)))+1; \
431 { length=mi_uint2korr((key)+1)+3; } \
434 #define get_pack_length(length) ((length) >= 255 ? 3 : 1)
436 #define MI_MIN_BLOCK_LENGTH 20
437 #define MI_EXTEND_BLOCK_LENGTH 20
438 #define MI_SPLIT_LENGTH ((MI_EXTEND_BLOCK_LENGTH+4)*2)
439 #define MI_MAX_DYN_BLOCK_HEADER 20
440 #define MI_BLOCK_INFO_HEADER_LENGTH 20
441 #define MI_DYN_DELETE_BLOCK_HEADER 20
442 #define MI_DYN_MAX_BLOCK_LENGTH ((1L << 24)-4L)
443 #define MI_DYN_MAX_ROW_LENGTH (MI_DYN_MAX_BLOCK_LENGTH - MI_SPLIT_LENGTH)
444 #define MI_DYN_ALIGN_SIZE 4
445 #define MI_MAX_DYN_HEADER_BYTE 13
446 #define MI_MAX_BLOCK_LENGTH ((((ulong) 1 << 24)-1) & (~ (ulong) (MI_DYN_ALIGN_SIZE-1)))
447 #define MI_REC_BUFF_OFFSET ALIGN_SIZE(MI_DYN_DELETE_BLOCK_HEADER+sizeof(uint32_t))
449 #define MEMMAP_EXTRA_MARGIN 7
451 #define PACK_TYPE_SELECTED 1
452 #define PACK_TYPE_SPACE_FIELDS 2
453 #define PACK_TYPE_ZERO_FILL 4
454 #define MI_FOUND_WRONG_KEY 32738
456 #define MI_MAX_KEY_BLOCK_SIZE (MI_MAX_KEY_BLOCK_LENGTH/MI_MIN_KEY_BLOCK_LENGTH)
457 #define MI_BLOCK_SIZE(key_length,data_pointer,key_pointer,block_size) (((((key_length)+(data_pointer)+(key_pointer))*4+(key_pointer)+2)/(block_size)+1)*(block_size))
458 #define MI_MAX_KEYPTR_SIZE 5
459 #define MI_MIN_KEYBLOCK_LENGTH 50
461 #define MI_MIN_SIZE_BULK_INSERT_TREE 16384
462 #define MI_MIN_ROWS_TO_USE_BULK_INSERT 100
463 #define MI_MIN_ROWS_TO_DISABLE_INDEXES 100
464 #define MI_MIN_ROWS_TO_USE_WRITE_CACHE 10
468 #define MI_UNIQUE_HASH_TYPE HA_KEYTYPE_ULONG_INT
469 #define mi_unique_store(A,B) mi_int4store((A),(B))
471 extern boost::mutex THR_LOCK_myisam;
475 extern std::list<MI_INFO *> myisam_open_list;
476 extern unsigned char myisam_file_magic[], myisam_pack_file_magic[];
477 extern uint32_t myisam_read_vec[], myisam_readnext_vec[];
478 extern uint32_t myisam_quick_table_bits;
479 extern ulong myisam_pid;
485 uint ref_length,key_length,
489 part_of_prev_key,prev_length,pack_marker;
490 unsigned char *key, *prev_key,*next_key_pos;
496 extern int _mi_read_dynamic_record(
MI_INFO *info,drizzled::internal::my_off_t filepos,
unsigned char *buf);
497 extern int _mi_write_dynamic_record(
MI_INFO*,
const unsigned char*);
498 extern int _mi_update_dynamic_record(
MI_INFO*, drizzled::internal::my_off_t,
const unsigned char*);
499 extern int _mi_delete_dynamic_record(
MI_INFO *info);
500 extern int _mi_cmp_dynamic_record(
MI_INFO *info,
const unsigned char *record);
501 extern int _mi_read_rnd_dynamic_record(
MI_INFO *,
unsigned char *,drizzled::internal::my_off_t,
bool);
502 extern int _mi_write_blob_record(
MI_INFO*,
const unsigned char*);
503 extern int _mi_update_blob_record(
MI_INFO*, drizzled::internal::my_off_t,
const unsigned char*);
504 extern int _mi_read_static_record(
MI_INFO *info, drizzled::internal::my_off_t filepos,
unsigned char *buf);
505 extern int _mi_write_static_record(
MI_INFO*,
const unsigned char*);
506 extern int _mi_update_static_record(
MI_INFO*, drizzled::internal::my_off_t,
const unsigned char*);
507 extern int _mi_delete_static_record(
MI_INFO *info);
508 extern int _mi_cmp_static_record(
MI_INFO *info,
const unsigned char *record);
509 extern int _mi_read_rnd_static_record(
MI_INFO*,
unsigned char *,drizzled::internal::my_off_t,
bool);
510 extern int _mi_ck_write(
MI_INFO *info,uint32_t keynr,
unsigned char *key,uint32_t length);
512 unsigned char *key, uint32_t key_length,
513 drizzled::internal::my_off_t *root, uint32_t comp_flag);
514 extern int _mi_enlarge_root(
MI_INFO *info,
MI_KEYDEF *keyinfo,
unsigned char *key, drizzled::internal::my_off_t *root);
516 unsigned char *anc_buff,
unsigned char *key_pos,
unsigned char *key_buff,
517 unsigned char *father_buff,
unsigned char *father_keypos,
518 drizzled::internal::my_off_t father_page,
bool insert_last);
519 extern int _mi_split_page(
MI_INFO *info,
MI_KEYDEF *keyinfo,
unsigned char *key,
520 unsigned char *buff,
unsigned char *key_buff,
bool insert_last);
521 extern unsigned char *_mi_find_half_pos(uint32_t nod_flag,
MI_KEYDEF *keyinfo,
unsigned char *page,
522 unsigned char *key,uint32_t *return_key_length,
523 unsigned char **after_key);
524 extern int _mi_calc_static_key_length(
MI_KEYDEF *keyinfo,uint32_t nod_flag,
525 unsigned char *key_pos,
unsigned char *org_key,
526 unsigned char *key_buff,
528 extern int _mi_calc_var_key_length(
MI_KEYDEF *keyinfo,uint32_t nod_flag,
529 unsigned char *key_pos,
unsigned char *org_key,
530 unsigned char *key_buff,
532 extern int _mi_calc_var_pack_key_length(
MI_KEYDEF *keyinfo,uint32_t nod_flag,
533 unsigned char *key_pos,
unsigned char *org_key,
534 unsigned char *prev_key,
536 extern int _mi_calc_bin_pack_key_length(
MI_KEYDEF *keyinfo,uint32_t nod_flag,
537 unsigned char *key_pos,
unsigned char *org_key,
538 unsigned char *prev_key,
540 void _mi_store_static_key(
MI_KEYDEF *keyinfo,
unsigned char *key_pos,
542 void _mi_store_var_pack_key(
MI_KEYDEF *keyinfo,
unsigned char *key_pos,
545 void _mi_store_pack_key(
MI_KEYDEF *keyinfo,
unsigned char *key_pos,
548 void _mi_store_bin_pack_key(
MI_KEYDEF *keyinfo,
unsigned char *key_pos,
551 extern int _mi_ck_delete(
MI_INFO *info,uint32_t keynr,
unsigned char *key,uint32_t key_length);
552 int _mi_readinfo(
MI_INFO *info,
int lock_flag,
int check_keybuffer);
553 extern int _mi_writeinfo(
MI_INFO *info,uint32_t options);
554 extern int _mi_test_if_changed(
MI_INFO *info);
555 extern int _mi_mark_file_changed(
MI_INFO *info);
556 extern int _mi_decrement_open_count(
MI_INFO *info);
557 extern int _mi_check_index(
MI_INFO *info,
int inx);
558 extern int _mi_search(
MI_INFO *info,
MI_KEYDEF *keyinfo,
unsigned char *key,uint32_t key_len,
559 uint32_t nextflag,drizzled::internal::my_off_t pos);
561 unsigned char *page,
unsigned char *key,uint32_t key_len,uint32_t comp_flag,
562 unsigned char * *ret_pos,
unsigned char *buff,
bool *was_last_key);
563 extern int _mi_seq_search(
MI_INFO *info,
MI_KEYDEF *keyinfo,
unsigned char *page,
564 unsigned char *key,uint32_t key_len,uint32_t comp_flag,
565 unsigned char **ret_pos,
unsigned char *buff,
bool *was_last_key);
566 extern int _mi_prefix_search(
MI_INFO *info,
MI_KEYDEF *keyinfo,
unsigned char *page,
567 unsigned char *key,uint32_t key_len,uint32_t comp_flag,
568 unsigned char **ret_pos,
unsigned char *buff,
bool *was_last_key);
569 extern drizzled::internal::my_off_t _mi_kpos(uint32_t nod_flag,
unsigned char *after_key);
570 extern void _mi_kpointer(
MI_INFO *info,
unsigned char *buff,drizzled::internal::my_off_t pos);
571 extern drizzled::internal::my_off_t _mi_dpos(
MI_INFO *info, uint32_t nod_flag,
unsigned char *after_key);
572 extern drizzled::internal::my_off_t _mi_rec_pos(
MYISAM_SHARE *info,
unsigned char *ptr);
573 void _mi_dpointer(
MI_INFO *info,
unsigned char *buff,drizzled::internal::my_off_t pos);
574 extern uint32_t _mi_get_static_key(
MI_KEYDEF *keyinfo,uint32_t nod_flag,
unsigned char * *page,
576 extern uint32_t _mi_get_pack_key(
MI_KEYDEF *keyinfo,uint32_t nod_flag,
unsigned char * *page,
578 extern uint32_t _mi_get_binary_pack_key(
MI_KEYDEF *keyinfo, uint32_t nod_flag,
579 unsigned char **page_pos,
unsigned char *key);
580 extern unsigned char *_mi_get_last_key(
MI_INFO *info,
MI_KEYDEF *keyinfo,
unsigned char *keypos,
581 unsigned char *lastkey,
unsigned char *endpos,
582 uint32_t *return_key_length);
583 extern unsigned char *_mi_get_key(
MI_INFO *info,
MI_KEYDEF *keyinfo,
unsigned char *page,
584 unsigned char *key,
unsigned char *keypos, uint32_t *return_key_length);
585 extern uint32_t _mi_keylength(
MI_KEYDEF *keyinfo,
unsigned char *key);
586 extern uint32_t _mi_keylength_part(
MI_KEYDEF *keyinfo,
register unsigned char *key,
588 extern unsigned char *_mi_move_key(
MI_KEYDEF *keyinfo,
unsigned char *to,
unsigned char *from);
589 extern int _mi_search_next(
MI_INFO *info,
MI_KEYDEF *keyinfo,
unsigned char *key,
590 uint32_t key_length,uint32_t nextflag,drizzled::internal::my_off_t pos);
591 extern int _mi_search_first(
MI_INFO *info,
MI_KEYDEF *keyinfo,drizzled::internal::my_off_t pos);
592 extern int _mi_search_last(
MI_INFO *info,
MI_KEYDEF *keyinfo,drizzled::internal::my_off_t pos);
593 extern unsigned char *_mi_fetch_keypage(
MI_INFO *info,
MI_KEYDEF *keyinfo,drizzled::internal::my_off_t page,
594 int level,
unsigned char *buff,
int return_buffer);
595 extern int _mi_write_keypage(
MI_INFO *info,
MI_KEYDEF *keyinfo,drizzled::internal::my_off_t page,
596 int level,
unsigned char *buff);
597 extern int _mi_dispose(
MI_INFO *info,
MI_KEYDEF *keyinfo,drizzled::internal::my_off_t pos,
599 extern drizzled::internal::my_off_t _mi_new(
MI_INFO *info,
MI_KEYDEF *keyinfo,
int level);
600 extern uint32_t _mi_make_key(
MI_INFO *info,uint32_t keynr,
unsigned char *key,
601 const unsigned char *record,drizzled::internal::my_off_t filepos);
602 extern uint32_t _mi_pack_key(
register MI_INFO *info, uint32_t keynr,
unsigned char *key,
603 unsigned char *old, drizzled::key_part_map keypart_map,
605 extern int _mi_read_key_record(
MI_INFO *info,drizzled::internal::my_off_t filepos,
unsigned char *buf);
607 uint32_t length,
int re_read_if_possibly);
608 extern uint64_t retrieve_auto_increment(
MI_INFO *info,
const unsigned char *record);
610 unsigned char *mi_alloc_rec_buff(
MI_INFO *info,
size_t length,
unsigned char **buf);
611 #define mi_get_rec_buff_ptr(info,buf) \
612 ((((info)->s->options & HA_OPTION_PACK_RECORD) && (buf)) ? \
613 (buf) - MI_REC_BUFF_OFFSET : (buf))
614 #define mi_get_rec_buff_len(info,buf) \
615 (*((uint32_t *)(mi_get_rec_buff_ptr(info,buf))))
617 extern ulong _mi_rec_unpack(
MI_INFO *info,
unsigned char *to,
unsigned char *from,
619 extern bool _mi_rec_check(
MI_INFO *info,
const unsigned char *record,
unsigned char *packpos,
620 ulong packed_length,
bool with_checkum);
621 extern int _mi_write_part_record(
MI_INFO *info,drizzled::internal::my_off_t filepos,ulong length,
622 drizzled::internal::my_off_t next_filepos,
unsigned char **record,
623 ulong *reclength,
int *flag);
624 extern void _mi_print_key(FILE *stream,
HA_KEYSEG *keyseg,
const unsigned char *key,
626 extern bool _mi_read_pack_info(
MI_INFO *info,
bool fix_keys);
627 extern int _mi_read_pack_record(
MI_INFO *info,drizzled::internal::my_off_t filepos,
unsigned char *buf);
628 extern int _mi_read_rnd_pack_record(
MI_INFO*,
unsigned char *,drizzled::internal::my_off_t,
bool);
630 unsigned char *to,
unsigned char *from, ulong reclength);
636 unsigned char header[MI_BLOCK_INFO_HEADER_LENGTH];
641 drizzled::internal::my_off_t filepos;
642 drizzled::internal::my_off_t next_filepos;
643 drizzled::internal::my_off_t prev_filepos;
644 uint32_t second_read;
650 #define BLOCK_FIRST 1
652 #define BLOCK_DELETED 4
653 #define BLOCK_ERROR 8
654 #define BLOCK_SYNC_ERROR 16
655 #define BLOCK_FATAL_ERROR 32
657 #define NEED_MEM ((uint) 10*4*(IO_SIZE+32)+32)
659 #define BUFFERS_WHEN_SORTING 16
660 #define WRITE_COUNT 1000
661 #define INDEX_TMP_EXT ".TMM"
662 #define DATA_TMP_EXT ".TMD"
664 #define UPDATE_TIME 1
665 #define UPDATE_STAT 2
666 #define UPDATE_SORT 4
667 #define UPDATE_AUTO_INC 8
668 #define UPDATE_OPEN_COUNT 16
670 #define USE_BUFFER_INIT (((1024L*512L-MALLOC_OVERHEAD)/IO_SIZE)*IO_SIZE)
671 #define READ_BUFFER_INIT (1024L*256L-MALLOC_OVERHEAD)
672 #define SORT_BUFFER_INIT (2048L*1024L-MALLOC_OVERHEAD)
673 #define MIN_SORT_BUFFER (4096-MALLOC_OVERHEAD)
675 #define fast_mi_writeinfo(INFO) if (!(INFO)->s->tot_locks) (void) _mi_writeinfo((INFO),0)
676 #define fast_mi_readinfo(INFO) ((INFO)->lock_type == F_UNLCK) && _mi_readinfo((INFO),F_RDLCK,1)
678 extern uint32_t _mi_get_block_info(
MI_BLOCK_INFO *,
int, drizzled::internal::my_off_t);
679 extern uint32_t _mi_rec_pack(
MI_INFO *info,
unsigned char *to,
const unsigned char *from);
682 int file, drizzled::internal::my_off_t filepos);
683 extern void _my_store_blob_length(
unsigned char *pos,uint32_t pack_length,uint32_t length);
684 extern void mi_report_error(
int errcode,
const char *file_name);
685 extern void mi_report_error(drizzled::error_t errcode,
const char *file_name);
686 extern size_t mi_mmap_pread(
MI_INFO *info,
unsigned char *Buffer,
687 size_t Count, drizzled::internal::my_off_t offset, drizzled::myf MyFlags);
688 extern size_t mi_mmap_pwrite(
MI_INFO *info,
const unsigned char *Buffer,
689 size_t Count, drizzled::internal::my_off_t offset, drizzled::myf MyFlags);
690 extern size_t mi_nommap_pread(
MI_INFO *info,
unsigned char *Buffer,
691 size_t Count, drizzled::internal::my_off_t offset, drizzled::myf MyFlags);
692 extern size_t mi_nommap_pwrite(
MI_INFO *info,
const unsigned char *Buffer,
693 size_t Count, drizzled::internal::my_off_t offset, drizzled::myf MyFlags);
695 uint32_t mi_state_info_write(
int file,
MI_STATE_INFO *state, uint32_t pWrite);
696 uint32_t mi_state_info_read_dsk(
int file,
MI_STATE_INFO *state,
bool pRead);
697 uint32_t mi_base_info_write(
int file,
MI_BASE_INFO *base);
698 int mi_keyseg_write(
int file,
const HA_KEYSEG *keyseg);
699 uint32_t mi_keydef_write(
int file,
MI_KEYDEF *keydef);
700 uint32_t mi_uniquedef_write(
int file,
MI_UNIQUEDEF *keydef);
702 extern int mi_disable_indexes(
MI_INFO *info);
703 extern int mi_enable_indexes(
MI_INFO *info);
704 extern int mi_indexes_are_disabled(
MI_INFO *info);
705 ulong _my_calc_total_blob_length(
MI_INFO *info,
const unsigned char *record);
706 ha_checksum mi_checksum(
MI_INFO *info,
const unsigned char *buf);
707 ha_checksum mi_static_checksum(
MI_INFO *info,
const unsigned char *buf);
709 ha_checksum unique_hash, drizzled::internal::my_off_t pos);
710 ha_checksum mi_unique_hash(
MI_UNIQUEDEF *def,
const unsigned char *buf);
712 const unsigned char *record, drizzled::internal::my_off_t pos);
714 const unsigned char *record, drizzled::internal::my_off_t pos);
715 int mi_unique_comp(
MI_UNIQUEDEF *def,
const unsigned char *a,
const unsigned char *b,
716 bool null_are_equal);
718 extern MI_INFO *test_if_reopen(
char *filename);
719 bool check_table_is_closed(
const char *name,
const char *where);
723 bool mi_dynmap_file(
MI_INFO *info, drizzled::internal::my_off_t size);
724 void mi_remap_file(
MI_INFO *info, drizzled::internal::my_off_t size);
726 int mi_check_index_cond(
register MI_INFO *info, uint32_t keynr,
unsigned char *record);
729 volatile int *killed_ptr(
MI_CHECK *param);
730 void mi_check_print_error(
MI_CHECK *param,
const char *fmt,...);
731 void mi_check_print_warning(
MI_CHECK *param,
const char *fmt,...);
732 void mi_check_print_info(
MI_CHECK *param,
const char *fmt,...);
737 int _create_index_by_sort(
MI_SORT_PARAM *info,
bool no_messages,
size_t);
739 extern void mi_set_index_cond_func(
MI_INFO *info, index_cond_func_t func,
742 extern size_t my_pwrite(
int Filedes,
const unsigned char *Buffer,
size_t Count,
743 drizzled::internal::my_off_t offset,drizzled::myf MyFlags);
744 extern size_t my_pread(
int Filedes,
unsigned char *Buffer,
size_t Count,drizzled::internal::my_off_t offset,
745 drizzled::myf MyFlags);
748 void mi_disable_non_unique_index(
MI_INFO *info, drizzled::ha_rows rows);
749 void _mi_report_crashed(
MI_INFO *file,
const char *message,
const char *sfile,
753 #define DFLT_INIT_HITS 3
TODO: Rename this file - func.h is stupid.
Memory root declarations.