00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #pragma once
00019
00020 #include <config.h>
00021
00022 #include "myisam.h"
00023 #include "myisampack.h"
00024 #include <drizzled/memory/root.h>
00025
00026 #include <drizzled/internal/my_pthread.h>
00027 #include <drizzled/thr_lock.h>
00028 #include <drizzled/common.h>
00029 #include <drizzled/enum.h>
00030 #include <drizzled/dynamic_array.h>
00031 #include <drizzled/error_t.h>
00032
00033 #include <assert.h>
00034 #include <fcntl.h>
00035 #include <string.h>
00036 #include <list>
00037
00038 #include <boost/thread/mutex.hpp>
00039
00040 namespace drizzled {
00041 class Tree;
00042 }
00043
00044 #if defined(my_write)
00045 #undef my_write
00046 #endif
00047
00048
00049 static const uint32_t KEY_CACHE_SIZE= 8*1024*1024;
00050
00051
00052 static const uint32_t KEY_CACHE_BLOCK_SIZE= 1024;
00053
00054 typedef struct st_mi_status_info
00055 {
00056 drizzled::ha_rows records;
00057 drizzled::ha_rows del;
00058 drizzled::internal::my_off_t empty;
00059 drizzled::internal::my_off_t key_empty;
00060 drizzled::internal::my_off_t key_file_length;
00061 drizzled::internal::my_off_t data_file_length;
00062 ha_checksum checksum;
00063 } MI_STATUS_INFO;
00064
00065 typedef struct st_mi_state_info
00066 {
00067 struct {
00068 unsigned char file_version[4];
00069 unsigned char options[2];
00070 unsigned char header_length[2];
00071 unsigned char state_info_length[2];
00072 unsigned char base_info_length[2];
00073 unsigned char base_pos[2];
00074 unsigned char key_parts[2];
00075 unsigned char unique_key_parts[2];
00076 unsigned char keys;
00077 unsigned char uniques;
00078 unsigned char language;
00079 unsigned char max_block_size_index;
00080 unsigned char fulltext_keys;
00081 unsigned char not_used;
00082 } header;
00083
00084 MI_STATUS_INFO state;
00085 drizzled::ha_rows split;
00086 drizzled::internal::my_off_t dellink;
00087 uint64_t auto_increment;
00088 ulong process;
00089 ulong unique;
00090 ulong update_count;
00091 ulong status;
00092 ulong *rec_per_key_part;
00093 drizzled::internal::my_off_t *key_root;
00094 drizzled::internal::my_off_t *key_del;
00095 drizzled::internal::my_off_t rec_per_key_rows;
00096
00097 ulong sec_index_changed;
00098 ulong sec_index_used;
00099 uint64_t key_map;
00100 ha_checksum checksum;
00101 ulong version;
00102 time_t create_time;
00103 time_t recover_time;
00104 time_t check_time;
00105 uint sortkey;
00106 uint32_t open_count;
00107 uint8_t changed;
00108
00109
00110 uint32_t state_diff_length;
00111 uint state_length;
00112 ulong *key_info;
00113 } MI_STATE_INFO;
00114
00115 #define MI_STATE_INFO_SIZE (24+14*8+7*4+2*2+8)
00116 #define MI_STATE_KEY_SIZE 8
00117 #define MI_STATE_KEYBLOCK_SIZE 8
00118 #define MI_STATE_KEYSEG_SIZE 4
00119 #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)
00120 #define MI_KEYDEF_SIZE (2+ 5*2)
00121 #define MI_UNIQUEDEF_SIZE (2+1+1)
00122 #define HA_KEYSEG_SIZE (6+ 2*2 + 4*2)
00123 #define MI_COLUMNDEF_SIZE (2*3+1)
00124 #define MI_BASE_INFO_SIZE (5*8 + 8*4 + 4 + 4*2 + 16)
00125 #define MI_INDEX_BLOCK_MARGIN 16
00126
00127 typedef struct st_mi_base_info
00128 {
00129 drizzled::internal::my_off_t keystart;
00130 drizzled::internal::my_off_t max_data_file_length;
00131 drizzled::internal::my_off_t max_key_file_length;
00132 drizzled::internal::my_off_t margin_key_file_length;
00133 drizzled::ha_rows records,reloc;
00134 ulong mean_row_length;
00135 ulong reclength;
00136 ulong pack_reclength;
00137 ulong min_pack_length;
00138 ulong max_pack_length;
00139 ulong min_block_length;
00140 ulong fields,
00141 pack_fields;
00142 uint32_t rec_reflength;
00143 uint32_t key_reflength;
00144 uint32_t keys;
00145 uint32_t auto_key;
00146 uint32_t blobs;
00147 uint32_t pack_bits;
00148 uint32_t max_key_block_length;
00149 uint32_t max_key_length;
00150
00151 uint32_t extra_alloc_bytes;
00152 uint32_t extra_alloc_procent;
00153
00154 uint32_t raid_type,raid_chunks;
00155 uint32_t raid_chunksize;
00156
00157 uint32_t key_parts,all_key_parts;
00158 } MI_BASE_INFO;
00159
00160
00161
00162
00163 typedef struct st_mi_blob
00164 {
00165 ulong offset;
00166 uint32_t pack_length;
00167 ulong length;
00168 } MI_BLOB;
00169
00170
00171 typedef struct st_mi_isam_pack {
00172 ulong header_length;
00173 uint32_t ref_length;
00174 unsigned char version;
00175 } MI_PACK;
00176
00177 #define MAX_NONMAPPED_INSERTS 1000
00178
00179 typedef struct st_mi_isam_share {
00180 MI_STATE_INFO state;
00181 MI_BASE_INFO base;
00182 MI_KEYDEF ft2_keyinfo;
00183 MI_KEYDEF *keyinfo;
00184 MI_UNIQUEDEF *uniqueinfo;
00185 HA_KEYSEG *keyparts;
00186 drizzled::MI_COLUMNDEF *rec;
00187 MI_PACK pack;
00188 MI_BLOB *blobs;
00189 std::list<drizzled::Session *> *in_use;
00190 char *unique_file_name;
00191 char *data_file_name,
00192 *index_file_name;
00193 unsigned char *file_map;
00194 MI_DECODE_TREE *decode_trees;
00195 uint16_t *decode_tables;
00196 int (*read_record)(struct st_myisam_info*, drizzled::internal::my_off_t, unsigned char*);
00197 int (*write_record)(struct st_myisam_info*, const unsigned char*);
00198 int (*update_record)(struct st_myisam_info*, drizzled::internal::my_off_t, const unsigned char*);
00199 int (*delete_record)(struct st_myisam_info*);
00200 int (*read_rnd)(struct st_myisam_info*, unsigned char*, drizzled::internal::my_off_t, bool);
00201 int (*compare_record)(struct st_myisam_info*, const unsigned char *);
00202
00203 ha_checksum (*calc_checksum)(struct st_myisam_info*, const unsigned char *);
00204 int (*compare_unique)(struct st_myisam_info*, MI_UNIQUEDEF *,
00205 const unsigned char *record, drizzled::internal::my_off_t pos);
00206 size_t (*file_read)(MI_INFO *, unsigned char *, size_t, drizzled::internal::my_off_t, drizzled::myf);
00207 size_t (*file_write)(MI_INFO *, const unsigned char *, size_t, drizzled::internal::my_off_t, drizzled::myf);
00208 ulong this_process;
00209 ulong last_process;
00210 ulong last_version;
00211 uint64_t options;
00212 ulong min_pack_length;
00213 ulong max_pack_length;
00214 ulong state_diff_length;
00215 uint rec_reflength;
00216 uint32_t unique_name_length;
00217 int kfile;
00218 int data_file;
00219 int mode;
00220 uint reopen;
00221 uint w_locks,r_locks,tot_locks;
00222 uint blocksize;
00223 drizzled::myf write_flag;
00224 enum drizzled::data_file_type data_file_type;
00225
00226 bool is_log_table;
00227
00228 bool changed,
00229 global_changed,
00230 not_flushed,
00231 temporary,delay_key_write,
00232 concurrent_insert;
00233 drizzled::internal::my_off_t mmaped_length;
00234 uint32_t nonmmaped_inserts;
00235
00236 } MYISAM_SHARE;
00237
00238
00239 typedef uint32_t mi_bit_type;
00240
00241 typedef struct st_mi_bit_buff {
00242 mi_bit_type current_byte;
00243 uint32_t bits;
00244 unsigned char *pos,*end,*blob_pos,*blob_end;
00245 uint32_t error;
00246 } MI_BIT_BUFF;
00247
00248
00249 typedef bool (*index_cond_func_t)(void *param);
00250
00251 struct st_myisam_info {
00252 MYISAM_SHARE *s;
00253 MI_STATUS_INFO *state,save_state;
00254 MI_BLOB *blobs;
00255 MI_BIT_BUFF bit_buff;
00256
00257 drizzled::Tree *bulk_insert;
00258 drizzled::Session *in_use;
00259 char *filename;
00260 unsigned char *buff,
00261 *lastkey,*lastkey2;
00262 unsigned char *first_mbr_key;
00263 unsigned char *rec_buff;
00264 unsigned char *int_keypos,
00265 *int_maxpos;
00266 uint32_t int_nod_flag;
00267 uint32_t int_keytree_version;
00268 int (*read_record)(struct st_myisam_info*, drizzled::internal::my_off_t, unsigned char*);
00269 ulong this_unique;
00270 ulong last_unique;
00271 ulong this_loop;
00272 ulong last_loop;
00273 drizzled::internal::my_off_t lastpos,
00274 nextpos;
00275 drizzled::internal::my_off_t save_lastpos;
00276 drizzled::internal::my_off_t pos;
00277 drizzled::internal::my_off_t last_keypage;
00278 drizzled::internal::my_off_t last_search_keypage;
00279 drizzled::internal::my_off_t dupp_key_pos;
00280 ha_checksum checksum;
00281
00282
00283 ulong packed_length,blob_length;
00284 int dfile;
00285 uint32_t opt_flag;
00286 uint32_t update;
00287 int lastinx;
00288 uint lastkey_length;
00289 uint last_rkey_length;
00290 enum drizzled::ha_rkey_function last_key_func;
00291 uint32_t save_lastkey_length;
00292 uint32_t pack_key_length;
00293 uint16_t last_used_keyseg;
00294 int errkey;
00295 int lock_type;
00296 int tmp_lock_type;
00297 uint data_changed;
00298 uint save_update;
00299 int save_lastinx;
00300 drizzled::internal::io_cache_st rec_cache;
00301 uint32_t preload_buff_size;
00302 drizzled::myf lock_wait;
00303 bool was_locked;
00304 bool append_insert_at_end;
00305 bool quick_mode;
00306 bool page_changed;
00307 bool buff_used;
00308 bool once_flags;
00309
00310 index_cond_func_t index_cond_func;
00311 void *index_cond_func_arg;
00312 drizzled::THR_LOCK_DATA lock;
00313 unsigned char *rtree_recursion_state;
00314 int rtree_recursion_depth;
00315 };
00316
00317 typedef struct st_buffpek {
00318 off_t file_pos;
00319 unsigned char *base,*key;
00320 drizzled::ha_rows count;
00321 ulong mem_count;
00322 ulong max_keys;
00323 } BUFFPEK;
00324
00325 typedef struct st_mi_sort_param
00326 {
00327 pthread_t thr;
00328 drizzled::internal::io_cache_st read_cache, tempfile, tempfile_for_exceptions;
00329 drizzled::DYNAMIC_ARRAY buffpek;
00330 MI_BIT_BUFF bit_buff;
00331
00332
00333
00334
00335
00336 uint64_t unique[MI_MAX_KEY_SEG+1];
00337 uint64_t notnull[MI_MAX_KEY_SEG+1];
00338
00339 drizzled::internal::my_off_t pos,max_pos,filepos,start_recpos;
00340 uint32_t key, key_length,real_key_length,sortbuff_size;
00341 uint32_t maxbuffers, keys, find_length, sort_keys_length;
00342 bool fix_datafile, master;
00343 bool calc_checksum;
00344 MI_KEYDEF *keyinfo;
00345 HA_KEYSEG *seg;
00346 SORT_INFO *sort_info;
00347 unsigned char **sort_keys;
00348 unsigned char *rec_buff;
00349 void *wordlist, *wordptr;
00350 drizzled::memory::Root wordroot;
00351 unsigned char *record;
00352 int (*key_cmp)(struct st_mi_sort_param *, const void *, const void *);
00353 int (*key_read)(struct st_mi_sort_param *,void *);
00354 int (*key_write)(struct st_mi_sort_param *, const void *);
00355 void (*lock_in_memory)(MI_CHECK *);
00356 int (*write_keys)(struct st_mi_sort_param *, register unsigned char **,
00357 uint32_t , struct st_buffpek *, drizzled::internal::io_cache_st *);
00358 unsigned int (*read_to_buffer)(drizzled::internal::io_cache_st *,struct st_buffpek *, uint);
00359 int (*write_key)(struct st_mi_sort_param *, drizzled::internal::io_cache_st *,unsigned char *,
00360 uint, uint);
00361 } MI_SORT_PARAM;
00362
00363
00364
00365 #define USE_WHOLE_KEY MI_MAX_KEY_BUFF*2
00366 #define F_EXTRA_LCK -1
00367
00368
00369 #define MEMMAP_USED 32
00370 #define REMEMBER_OLD_POS 64
00371
00372 #define WRITEINFO_UPDATE_KEYFILE 1
00373 #define WRITEINFO_NO_UNLOCK 2
00374
00375
00376 #define USE_PACKED_KEYS 1
00377 #define RRND_PRESERVE_LASTINX 2
00378
00379
00380
00381 #define STATE_CHANGED 1
00382 #define STATE_CRASHED 2
00383 #define STATE_CRASHED_ON_REPAIR 4
00384 #define STATE_NOT_ANALYZED 8
00385 #define STATE_NOT_OPTIMIZED_KEYS 16
00386 #define STATE_NOT_SORTED_PAGES 32
00387
00388
00389
00390 #define READING_NEXT 1
00391 #define READING_HEADER 2
00392
00393
00394 #define mi_getint(x) ((uint) mi_uint2korr(x) & 32767)
00395 #define mi_putint(x,y,nod) { uint16_t boh=(nod ? (uint16_t) 32768 : 0) + (uint16_t) (y);\
00396 mi_int2store(x,boh); }
00397 #define mi_test_if_nod(x) (x[0] & 128 ? info->s->base.key_reflength : 0)
00398 #define mi_report_crashed(A, B) _mi_report_crashed((A), (B), __FILE__, __LINE__)
00399 #define mi_mark_crashed(x) do{(x)->s->state.changed|= STATE_CRASHED; \
00400 mi_report_crashed((x), 0); \
00401 }while(0)
00402 #define mi_mark_crashed_on_repair(x) do{(x)->s->state.changed|= \
00403 STATE_CRASHED|STATE_CRASHED_ON_REPAIR; \
00404 (x)->update|= HA_STATE_CHANGED; \
00405 }while(0)
00406 #define mi_is_crashed(x) ((x)->s->state.changed & STATE_CRASHED)
00407 #define mi_is_crashed_on_repair(x) ((x)->s->state.changed & STATE_CRASHED_ON_REPAIR)
00408 #define mi_print_error(SHARE, ERRNO) \
00409 mi_report_error((ERRNO), (SHARE)->index_file_name)
00410
00411
00412
00413 #define store_key_length(key,length) \
00414 { if ((length) < 255) \
00415 { *(key)=(length); } \
00416 else \
00417 { *(key)=255; mi_int2store((key)+1,(length)); } \
00418 }
00419
00420 #define get_key_full_length(length,key) \
00421 { if ((unsigned char) *(key) != 255) \
00422 length= ((uint) (unsigned char) *((key)++))+1; \
00423 else \
00424 { length=mi_uint2korr((key)+1)+3; (key)+=3; } \
00425 }
00426
00427 #define get_key_full_length_rdonly(length,key) \
00428 { if ((unsigned char) *(key) != 255) \
00429 length= ((uint) (unsigned char) *((key)))+1; \
00430 else \
00431 { length=mi_uint2korr((key)+1)+3; } \
00432 }
00433
00434 #define get_pack_length(length) ((length) >= 255 ? 3 : 1)
00435
00436 #define MI_MIN_BLOCK_LENGTH 20
00437 #define MI_EXTEND_BLOCK_LENGTH 20
00438 #define MI_SPLIT_LENGTH ((MI_EXTEND_BLOCK_LENGTH+4)*2)
00439 #define MI_MAX_DYN_BLOCK_HEADER 20
00440 #define MI_BLOCK_INFO_HEADER_LENGTH 20
00441 #define MI_DYN_DELETE_BLOCK_HEADER 20
00442 #define MI_DYN_MAX_BLOCK_LENGTH ((1L << 24)-4L)
00443 #define MI_DYN_MAX_ROW_LENGTH (MI_DYN_MAX_BLOCK_LENGTH - MI_SPLIT_LENGTH)
00444 #define MI_DYN_ALIGN_SIZE 4
00445 #define MI_MAX_DYN_HEADER_BYTE 13
00446 #define MI_MAX_BLOCK_LENGTH ((((ulong) 1 << 24)-1) & (~ (ulong) (MI_DYN_ALIGN_SIZE-1)))
00447 #define MI_REC_BUFF_OFFSET ALIGN_SIZE(MI_DYN_DELETE_BLOCK_HEADER+sizeof(uint32_t))
00448
00449 #define MEMMAP_EXTRA_MARGIN 7
00450
00451 #define PACK_TYPE_SELECTED 1
00452 #define PACK_TYPE_SPACE_FIELDS 2
00453 #define PACK_TYPE_ZERO_FILL 4
00454 #define MI_FOUND_WRONG_KEY 32738
00455
00456 #define MI_MAX_KEY_BLOCK_SIZE (MI_MAX_KEY_BLOCK_LENGTH/MI_MIN_KEY_BLOCK_LENGTH)
00457 #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))
00458 #define MI_MAX_KEYPTR_SIZE 5
00459 #define MI_MIN_KEYBLOCK_LENGTH 50
00460
00461 #define MI_MIN_SIZE_BULK_INSERT_TREE 16384
00462 #define MI_MIN_ROWS_TO_USE_BULK_INSERT 100
00463 #define MI_MIN_ROWS_TO_DISABLE_INDEXES 100
00464 #define MI_MIN_ROWS_TO_USE_WRITE_CACHE 10
00465
00466
00467
00468 #define MI_UNIQUE_HASH_TYPE HA_KEYTYPE_ULONG_INT
00469 #define mi_unique_store(A,B) mi_int4store((A),(B))
00470
00471 extern boost::mutex THR_LOCK_myisam;
00472
00473
00474
00475 extern std::list<MI_INFO *> myisam_open_list;
00476 extern unsigned char myisam_file_magic[], myisam_pack_file_magic[];
00477 extern uint32_t myisam_read_vec[], myisam_readnext_vec[];
00478 extern uint32_t myisam_quick_table_bits;
00479 extern ulong myisam_pid;
00480
00481
00482
00483 typedef struct st_mi_s_param
00484 {
00485 uint ref_length,key_length,
00486 n_ref_length,
00487 n_length,
00488 totlength,
00489 part_of_prev_key,prev_length,pack_marker;
00490 unsigned char *key, *prev_key,*next_key_pos;
00491 bool store_not_null;
00492 } MI_KEY_PARAM;
00493
00494
00495
00496 extern int _mi_read_dynamic_record(MI_INFO *info,drizzled::internal::my_off_t filepos,unsigned char *buf);
00497 extern int _mi_write_dynamic_record(MI_INFO*, const unsigned char*);
00498 extern int _mi_update_dynamic_record(MI_INFO*, drizzled::internal::my_off_t, const unsigned char*);
00499 extern int _mi_delete_dynamic_record(MI_INFO *info);
00500 extern int _mi_cmp_dynamic_record(MI_INFO *info,const unsigned char *record);
00501 extern int _mi_read_rnd_dynamic_record(MI_INFO *, unsigned char *,drizzled::internal::my_off_t, bool);
00502 extern int _mi_write_blob_record(MI_INFO*, const unsigned char*);
00503 extern int _mi_update_blob_record(MI_INFO*, drizzled::internal::my_off_t, const unsigned char*);
00504 extern int _mi_read_static_record(MI_INFO *info, drizzled::internal::my_off_t filepos,unsigned char *buf);
00505 extern int _mi_write_static_record(MI_INFO*, const unsigned char*);
00506 extern int _mi_update_static_record(MI_INFO*, drizzled::internal::my_off_t, const unsigned char*);
00507 extern int _mi_delete_static_record(MI_INFO *info);
00508 extern int _mi_cmp_static_record(MI_INFO *info,const unsigned char *record);
00509 extern int _mi_read_rnd_static_record(MI_INFO*, unsigned char *,drizzled::internal::my_off_t, bool);
00510 extern int _mi_ck_write(MI_INFO *info,uint32_t keynr,unsigned char *key,uint32_t length);
00511 extern int _mi_ck_real_write_btree(MI_INFO *info, MI_KEYDEF *keyinfo,
00512 unsigned char *key, uint32_t key_length,
00513 drizzled::internal::my_off_t *root, uint32_t comp_flag);
00514 extern int _mi_enlarge_root(MI_INFO *info,MI_KEYDEF *keyinfo,unsigned char *key, drizzled::internal::my_off_t *root);
00515 extern int _mi_insert(MI_INFO *info,MI_KEYDEF *keyinfo,unsigned char *key,
00516 unsigned char *anc_buff,unsigned char *key_pos,unsigned char *key_buff,
00517 unsigned char *father_buff, unsigned char *father_keypos,
00518 drizzled::internal::my_off_t father_page, bool insert_last);
00519 extern int _mi_split_page(MI_INFO *info,MI_KEYDEF *keyinfo,unsigned char *key,
00520 unsigned char *buff,unsigned char *key_buff, bool insert_last);
00521 extern unsigned char *_mi_find_half_pos(uint32_t nod_flag,MI_KEYDEF *keyinfo,unsigned char *page,
00522 unsigned char *key,uint32_t *return_key_length,
00523 unsigned char **after_key);
00524 extern int _mi_calc_static_key_length(MI_KEYDEF *keyinfo,uint32_t nod_flag,
00525 unsigned char *key_pos, unsigned char *org_key,
00526 unsigned char *key_buff,
00527 unsigned char *key, MI_KEY_PARAM *s_temp);
00528 extern int _mi_calc_var_key_length(MI_KEYDEF *keyinfo,uint32_t nod_flag,
00529 unsigned char *key_pos, unsigned char *org_key,
00530 unsigned char *key_buff,
00531 unsigned char *key, MI_KEY_PARAM *s_temp);
00532 extern int _mi_calc_var_pack_key_length(MI_KEYDEF *keyinfo,uint32_t nod_flag,
00533 unsigned char *key_pos, unsigned char *org_key,
00534 unsigned char *prev_key,
00535 unsigned char *key, MI_KEY_PARAM *s_temp);
00536 extern int _mi_calc_bin_pack_key_length(MI_KEYDEF *keyinfo,uint32_t nod_flag,
00537 unsigned char *key_pos,unsigned char *org_key,
00538 unsigned char *prev_key,
00539 unsigned char *key, MI_KEY_PARAM *s_temp);
00540 void _mi_store_static_key(MI_KEYDEF *keyinfo, unsigned char *key_pos,
00541 MI_KEY_PARAM *s_temp);
00542 void _mi_store_var_pack_key(MI_KEYDEF *keyinfo, unsigned char *key_pos,
00543 MI_KEY_PARAM *s_temp);
00544 #ifdef NOT_USED
00545 void _mi_store_pack_key(MI_KEYDEF *keyinfo, unsigned char *key_pos,
00546 MI_KEY_PARAM *s_temp);
00547 #endif
00548 void _mi_store_bin_pack_key(MI_KEYDEF *keyinfo, unsigned char *key_pos,
00549 MI_KEY_PARAM *s_temp);
00550
00551 extern int _mi_ck_delete(MI_INFO *info,uint32_t keynr,unsigned char *key,uint32_t key_length);
00552 int _mi_readinfo(MI_INFO *info,int lock_flag,int check_keybuffer);
00553 extern int _mi_writeinfo(MI_INFO *info,uint32_t options);
00554 extern int _mi_test_if_changed(MI_INFO *info);
00555 extern int _mi_mark_file_changed(MI_INFO *info);
00556 extern int _mi_decrement_open_count(MI_INFO *info);
00557 extern int _mi_check_index(MI_INFO *info,int inx);
00558 extern int _mi_search(MI_INFO *info,MI_KEYDEF *keyinfo,unsigned char *key,uint32_t key_len,
00559 uint32_t nextflag,drizzled::internal::my_off_t pos);
00560 extern int _mi_bin_search(struct st_myisam_info *info,MI_KEYDEF *keyinfo,
00561 unsigned char *page,unsigned char *key,uint32_t key_len,uint32_t comp_flag,
00562 unsigned char * *ret_pos,unsigned char *buff, bool *was_last_key);
00563 extern int _mi_seq_search(MI_INFO *info,MI_KEYDEF *keyinfo,unsigned char *page,
00564 unsigned char *key,uint32_t key_len,uint32_t comp_flag,
00565 unsigned char **ret_pos,unsigned char *buff, bool *was_last_key);
00566 extern int _mi_prefix_search(MI_INFO *info,MI_KEYDEF *keyinfo,unsigned char *page,
00567 unsigned char *key,uint32_t key_len,uint32_t comp_flag,
00568 unsigned char **ret_pos,unsigned char *buff, bool *was_last_key);
00569 extern drizzled::internal::my_off_t _mi_kpos(uint32_t nod_flag,unsigned char *after_key);
00570 extern void _mi_kpointer(MI_INFO *info,unsigned char *buff,drizzled::internal::my_off_t pos);
00571 extern drizzled::internal::my_off_t _mi_dpos(MI_INFO *info, uint32_t nod_flag,unsigned char *after_key);
00572 extern drizzled::internal::my_off_t _mi_rec_pos(MYISAM_SHARE *info, unsigned char *ptr);
00573 void _mi_dpointer(MI_INFO *info, unsigned char *buff,drizzled::internal::my_off_t pos);
00574 extern uint32_t _mi_get_static_key(MI_KEYDEF *keyinfo,uint32_t nod_flag,unsigned char * *page,
00575 unsigned char *key);
00576 extern uint32_t _mi_get_pack_key(MI_KEYDEF *keyinfo,uint32_t nod_flag,unsigned char * *page,
00577 unsigned char *key);
00578 extern uint32_t _mi_get_binary_pack_key(MI_KEYDEF *keyinfo, uint32_t nod_flag,
00579 unsigned char **page_pos, unsigned char *key);
00580 extern unsigned char *_mi_get_last_key(MI_INFO *info,MI_KEYDEF *keyinfo,unsigned char *keypos,
00581 unsigned char *lastkey,unsigned char *endpos,
00582 uint32_t *return_key_length);
00583 extern unsigned char *_mi_get_key(MI_INFO *info, MI_KEYDEF *keyinfo, unsigned char *page,
00584 unsigned char *key, unsigned char *keypos, uint32_t *return_key_length);
00585 extern uint32_t _mi_keylength(MI_KEYDEF *keyinfo,unsigned char *key);
00586 extern uint32_t _mi_keylength_part(MI_KEYDEF *keyinfo, register unsigned char *key,
00587 HA_KEYSEG *end);
00588 extern unsigned char *_mi_move_key(MI_KEYDEF *keyinfo,unsigned char *to,unsigned char *from);
00589 extern int _mi_search_next(MI_INFO *info,MI_KEYDEF *keyinfo,unsigned char *key,
00590 uint32_t key_length,uint32_t nextflag,drizzled::internal::my_off_t pos);
00591 extern int _mi_search_first(MI_INFO *info,MI_KEYDEF *keyinfo,drizzled::internal::my_off_t pos);
00592 extern int _mi_search_last(MI_INFO *info,MI_KEYDEF *keyinfo,drizzled::internal::my_off_t pos);
00593 extern unsigned char *_mi_fetch_keypage(MI_INFO *info,MI_KEYDEF *keyinfo,drizzled::internal::my_off_t page,
00594 int level,unsigned char *buff,int return_buffer);
00595 extern int _mi_write_keypage(MI_INFO *info,MI_KEYDEF *keyinfo,drizzled::internal::my_off_t page,
00596 int level, unsigned char *buff);
00597 extern int _mi_dispose(MI_INFO *info,MI_KEYDEF *keyinfo,drizzled::internal::my_off_t pos,
00598 int level);
00599 extern drizzled::internal::my_off_t _mi_new(MI_INFO *info,MI_KEYDEF *keyinfo,int level);
00600 extern uint32_t _mi_make_key(MI_INFO *info,uint32_t keynr,unsigned char *key,
00601 const unsigned char *record,drizzled::internal::my_off_t filepos);
00602 extern uint32_t _mi_pack_key(register MI_INFO *info, uint32_t keynr, unsigned char *key,
00603 unsigned char *old, drizzled::key_part_map keypart_map,
00604 HA_KEYSEG **last_used_keyseg);
00605 extern int _mi_read_key_record(MI_INFO *info,drizzled::internal::my_off_t filepos,unsigned char *buf);
00606 extern int _mi_read_cache(drizzled::internal::io_cache_st *info,unsigned char *buff,drizzled::internal::my_off_t pos,
00607 uint32_t length,int re_read_if_possibly);
00608 extern uint64_t retrieve_auto_increment(MI_INFO *info,const unsigned char *record);
00609
00610 unsigned char *mi_alloc_rec_buff(MI_INFO *info, size_t length, unsigned char **buf);
00611 #define mi_get_rec_buff_ptr(info,buf) \
00612 ((((info)->s->options & HA_OPTION_PACK_RECORD) && (buf)) ? \
00613 (buf) - MI_REC_BUFF_OFFSET : (buf))
00614 #define mi_get_rec_buff_len(info,buf) \
00615 (*((uint32_t *)(mi_get_rec_buff_ptr(info,buf))))
00616
00617 extern ulong _mi_rec_unpack(MI_INFO *info,unsigned char *to,unsigned char *from,
00618 ulong reclength);
00619 extern bool _mi_rec_check(MI_INFO *info,const unsigned char *record, unsigned char *packpos,
00620 ulong packed_length, bool with_checkum);
00621 extern int _mi_write_part_record(MI_INFO *info,drizzled::internal::my_off_t filepos,ulong length,
00622 drizzled::internal::my_off_t next_filepos,unsigned char **record,
00623 ulong *reclength,int *flag);
00624 extern void _mi_print_key(FILE *stream,HA_KEYSEG *keyseg,const unsigned char *key,
00625 uint32_t length);
00626 extern bool _mi_read_pack_info(MI_INFO *info,bool fix_keys);
00627 extern int _mi_read_pack_record(MI_INFO *info,drizzled::internal::my_off_t filepos,unsigned char *buf);
00628 extern int _mi_read_rnd_pack_record(MI_INFO*, unsigned char *,drizzled::internal::my_off_t, bool);
00629 extern int _mi_pack_rec_unpack(MI_INFO *info, MI_BIT_BUFF *bit_buff,
00630 unsigned char *to, unsigned char *from, ulong reclength);
00631
00632 struct st_sort_info;
00633
00634
00635 typedef struct st_mi_block_info {
00636 unsigned char header[MI_BLOCK_INFO_HEADER_LENGTH];
00637 ulong rec_len;
00638 ulong data_len;
00639 ulong block_len;
00640 ulong blob_len;
00641 drizzled::internal::my_off_t filepos;
00642 drizzled::internal::my_off_t next_filepos;
00643 drizzled::internal::my_off_t prev_filepos;
00644 uint32_t second_read;
00645 uint32_t offset;
00646 } MI_BLOCK_INFO;
00647
00648
00649
00650 #define BLOCK_FIRST 1
00651 #define BLOCK_LAST 2
00652 #define BLOCK_DELETED 4
00653 #define BLOCK_ERROR 8
00654 #define BLOCK_SYNC_ERROR 16
00655 #define BLOCK_FATAL_ERROR 32
00656
00657 #define NEED_MEM ((uint) 10*4*(IO_SIZE+32)+32)
00658 #define MAXERR 20
00659 #define BUFFERS_WHEN_SORTING 16
00660 #define WRITE_COUNT 1000
00661 #define INDEX_TMP_EXT ".TMM"
00662 #define DATA_TMP_EXT ".TMD"
00663
00664 #define UPDATE_TIME 1
00665 #define UPDATE_STAT 2
00666 #define UPDATE_SORT 4
00667 #define UPDATE_AUTO_INC 8
00668 #define UPDATE_OPEN_COUNT 16
00669
00670 #define USE_BUFFER_INIT (((1024L*512L-MALLOC_OVERHEAD)/IO_SIZE)*IO_SIZE)
00671 #define READ_BUFFER_INIT (1024L*256L-MALLOC_OVERHEAD)
00672 #define SORT_BUFFER_INIT (2048L*1024L-MALLOC_OVERHEAD)
00673 #define MIN_SORT_BUFFER (4096-MALLOC_OVERHEAD)
00674
00675 #define fast_mi_writeinfo(INFO) if (!(INFO)->s->tot_locks) (void) _mi_writeinfo((INFO),0)
00676 #define fast_mi_readinfo(INFO) ((INFO)->lock_type == F_UNLCK) && _mi_readinfo((INFO),F_RDLCK,1)
00677
00678 extern uint32_t _mi_get_block_info(MI_BLOCK_INFO *,int, drizzled::internal::my_off_t);
00679 extern uint32_t _mi_rec_pack(MI_INFO *info,unsigned char *to,const unsigned char *from);
00680 extern uint32_t _mi_pack_get_block_info(MI_INFO *myisam, MI_BIT_BUFF *bit_buff,
00681 MI_BLOCK_INFO *info, unsigned char **rec_buff_p,
00682 int file, drizzled::internal::my_off_t filepos);
00683 extern void _my_store_blob_length(unsigned char *pos,uint32_t pack_length,uint32_t length);
00684 extern void mi_report_error(int errcode, const char *file_name);
00685 extern void mi_report_error(drizzled::error_t errcode, const char *file_name);
00686 extern size_t mi_mmap_pread(MI_INFO *info, unsigned char *Buffer,
00687 size_t Count, drizzled::internal::my_off_t offset, drizzled::myf MyFlags);
00688 extern size_t mi_mmap_pwrite(MI_INFO *info, const unsigned char *Buffer,
00689 size_t Count, drizzled::internal::my_off_t offset, drizzled::myf MyFlags);
00690 extern size_t mi_nommap_pread(MI_INFO *info, unsigned char *Buffer,
00691 size_t Count, drizzled::internal::my_off_t offset, drizzled::myf MyFlags);
00692 extern size_t mi_nommap_pwrite(MI_INFO *info, const unsigned char *Buffer,
00693 size_t Count, drizzled::internal::my_off_t offset, drizzled::myf MyFlags);
00694
00695 uint32_t mi_state_info_write(int file, MI_STATE_INFO *state, uint32_t pWrite);
00696 uint32_t mi_state_info_read_dsk(int file, MI_STATE_INFO *state, bool pRead);
00697 uint32_t mi_base_info_write(int file, MI_BASE_INFO *base);
00698 int mi_keyseg_write(int file, const HA_KEYSEG *keyseg);
00699 uint32_t mi_keydef_write(int file, MI_KEYDEF *keydef);
00700 uint32_t mi_uniquedef_write(int file, MI_UNIQUEDEF *keydef);
00701 uint32_t mi_recinfo_write(int file, drizzled::MI_COLUMNDEF *recinfo);
00702 extern int mi_disable_indexes(MI_INFO *info);
00703 extern int mi_enable_indexes(MI_INFO *info);
00704 extern int mi_indexes_are_disabled(MI_INFO *info);
00705 ulong _my_calc_total_blob_length(MI_INFO *info, const unsigned char *record);
00706 ha_checksum mi_checksum(MI_INFO *info, const unsigned char *buf);
00707 ha_checksum mi_static_checksum(MI_INFO *info, const unsigned char *buf);
00708 bool mi_check_unique(MI_INFO *info, MI_UNIQUEDEF *def, unsigned char *record,
00709 ha_checksum unique_hash, drizzled::internal::my_off_t pos);
00710 ha_checksum mi_unique_hash(MI_UNIQUEDEF *def, const unsigned char *buf);
00711 int _mi_cmp_static_unique(MI_INFO *info, MI_UNIQUEDEF *def,
00712 const unsigned char *record, drizzled::internal::my_off_t pos);
00713 int _mi_cmp_dynamic_unique(MI_INFO *info, MI_UNIQUEDEF *def,
00714 const unsigned char *record, drizzled::internal::my_off_t pos);
00715 int mi_unique_comp(MI_UNIQUEDEF *def, const unsigned char *a, const unsigned char *b,
00716 bool null_are_equal);
00717
00718 extern MI_INFO *test_if_reopen(char *filename);
00719 bool check_table_is_closed(const char *name, const char *where);
00720 int mi_open_datafile(MI_INFO *info, MYISAM_SHARE *share, int file_to_dup);
00721 int mi_open_keyfile(MYISAM_SHARE *share);
00722 void mi_setup_functions(register MYISAM_SHARE *share);
00723 bool mi_dynmap_file(MI_INFO *info, drizzled::internal::my_off_t size);
00724 void mi_remap_file(MI_INFO *info, drizzled::internal::my_off_t size);
00725
00726 int mi_check_index_cond(register MI_INFO *info, uint32_t keynr, unsigned char *record);
00727
00728
00729 volatile int *killed_ptr(MI_CHECK *param);
00730 void mi_check_print_error(MI_CHECK *param, const char *fmt,...);
00731 void mi_check_print_warning(MI_CHECK *param, const char *fmt,...);
00732 void mi_check_print_info(MI_CHECK *param, const char *fmt,...);
00733 int flush_pending_blocks(MI_SORT_PARAM *param);
00734 int thr_write_keys(MI_SORT_PARAM *sort_param);
00735
00736 int sort_write_record(MI_SORT_PARAM *sort_param);
00737 int _create_index_by_sort(MI_SORT_PARAM *info,bool no_messages, size_t);
00738
00739 extern void mi_set_index_cond_func(MI_INFO *info, index_cond_func_t func,
00740 void *func_arg);
00741
00742 extern size_t my_pwrite(int Filedes,const unsigned char *Buffer,size_t Count,
00743 drizzled::internal::my_off_t offset,drizzled::myf MyFlags);
00744 extern size_t my_pread(int Filedes,unsigned char *Buffer,size_t Count,drizzled::internal::my_off_t offset,
00745 drizzled::myf MyFlags);
00746
00747
00748 void mi_disable_non_unique_index(MI_INFO *info, drizzled::ha_rows rows);
00749 void _mi_report_crashed(MI_INFO *file, const char *message, const char *sfile,
00750 uint32_t sline);
00751
00752
00753 #define DFLT_INIT_HITS 3