12
12
You should have received a copy of the GNU General Public License
13
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
16
16
/* This file is included by all internal myisam files */
18
#ifndef PLUGIN_MYISAM_MYISAM_PRIV_H
19
#define PLUGIN_MYISAM_MYISAM_PRIV_H
18
#if !defined(MYISAMDEF_H)
22
21
#include "myisam.h" /* Structs & some defines */
23
22
#include "myisampack.h" /* packing of keys */
24
#include "drizzled/tree.h"
25
#include "drizzled/internal/my_pthread.h"
26
#include <drizzled/thr_lock.h>
27
#include <drizzled/common.h>
34
#include <boost/thread/mutex.hpp>
24
#include <my_pthread.h>
27
#if defined(my_write) && !defined(MAP_TO_USE_RAID)
37
28
#undef my_write /* undef map from my_nosys; We need test-if-disk full */
40
/* Typical key cash */
41
static const uint32_t KEY_CACHE_SIZE= 8*1024*1024;
43
/* Default size of a key cache block */
44
static const uint32_t KEY_CACHE_BLOCK_SIZE= 1024;
46
31
typedef struct st_mi_status_info
48
drizzled::ha_rows records; /* Rows in table */
49
drizzled::ha_rows del; /* Removed rows */
50
drizzled::internal::my_off_t empty; /* lost space in datafile */
51
drizzled::internal::my_off_t key_empty; /* lost space in indexfile */
52
drizzled::internal::my_off_t key_file_length;
53
drizzled::internal::my_off_t data_file_length;
54
drizzled::internal::ha_checksum checksum;
33
ha_rows records; /* Rows in table */
34
ha_rows del; /* Removed rows */
35
my_off_t empty; /* lost space in datafile */
36
my_off_t key_empty; /* lost space in indexfile */
37
my_off_t key_file_length;
38
my_off_t data_file_length;
57
42
typedef struct st_mi_state_info
59
44
struct { /* Fileheader */
60
unsigned char file_version[4];
61
unsigned char options[2];
62
unsigned char header_length[2];
63
unsigned char state_info_length[2];
64
unsigned char base_info_length[2];
65
unsigned char base_pos[2];
66
unsigned char key_parts[2]; /* Key parts */
67
unsigned char unique_key_parts[2]; /* Key parts + unique parts */
68
unsigned char keys; /* number of keys in file */
69
unsigned char uniques; /* number of UNIQUE definitions */
70
unsigned char language; /* Language for indexes */
71
unsigned char max_block_size_index; /* max keyblock size */
72
unsigned char fulltext_keys;
73
unsigned char not_used; /* To align to 8 */
45
uchar file_version[4];
47
uchar header_length[2];
48
uchar state_info_length[2];
49
uchar base_info_length[2];
51
uchar key_parts[2]; /* Key parts */
52
uchar unique_key_parts[2]; /* Key parts + unique parts */
53
uchar keys; /* number of keys in file */
54
uchar uniques; /* number of UNIQUE definitions */
55
uchar language; /* Language for indexes */
56
uchar max_block_size_index; /* max keyblock size */
58
uchar not_used; /* To align to 8 */
76
61
MI_STATUS_INFO state;
77
drizzled::ha_rows split; /* number of split blocks */
78
drizzled::internal::my_off_t dellink; /* Link to next removed block */
62
ha_rows split; /* number of split blocks */
63
my_off_t dellink; /* Link to next removed block */
79
64
uint64_t auto_increment;
80
65
ulong process; /* process that updated table last */
81
66
ulong unique; /* Unique number for this process */
82
67
ulong update_count; /* Updated for each write lock */
84
69
ulong *rec_per_key_part;
85
drizzled::internal::my_off_t *key_root; /* Start of key trees */
86
drizzled::internal::my_off_t *key_del; /* delete links for trees */
87
drizzled::internal::my_off_t rec_per_key_rows; /* Rows when calculating rec_per_key */
70
my_off_t *key_root; /* Start of key trees */
71
my_off_t *key_del; /* delete links for trees */
72
my_off_t rec_per_key_rows; /* Rows when calculating rec_per_key */
89
74
ulong sec_index_changed; /* Updated when new sec_index */
90
75
ulong sec_index_used; /* which extra index are in use */
91
76
uint64_t key_map; /* Which keys are in use */
92
drizzled::internal::ha_checksum checksum; /* Table checksum */
77
ha_checksum checksum; /* Table checksum */
93
78
ulong version; /* timestamp of create */
94
79
time_t create_time; /* Time when created database */
95
80
time_t recover_time; /* Time for last recover */
96
81
time_t check_time; /* Time for last check */
97
82
uint sortkey; /* sorted by this key (not used) */
99
84
uint8_t changed; /* Changed since myisamchk */
101
86
/* the following isn't saved on disk */
102
uint32_t state_diff_length; /* Should be 0 */
87
uint state_diff_length; /* Should be 0 */
103
88
uint state_length; /* Length of state header in file */
177
160
MI_KEYDEF *keyinfo; /* Key definitions */
178
161
MI_UNIQUEDEF *uniqueinfo; /* unique definitions */
179
162
HA_KEYSEG *keyparts; /* key part info */
180
drizzled::MI_COLUMNDEF *rec; /* Pointer to field information */
163
MI_COLUMNDEF *rec; /* Pointer to field information */
181
164
MI_PACK pack; /* Data about packed records */
182
165
MI_BLOB *blobs; /* Pointer to blobs */
183
std::list<drizzled::Session *> *in_use; /* List of threads using this table */
166
LIST *in_use; /* List of threads using this table */
184
167
char *unique_file_name; /* realpath() of index file */
185
168
char *data_file_name, /* Resolved path names from symlinks */
186
169
*index_file_name;
187
unsigned char *file_map; /* mem-map of file if possible */
189
drizzled::KEY_CACHE key_cache; /* ref to the current key cache */
191
drizzled::KEY_CACHE *getKeyCache()
170
uchar *file_map; /* mem-map of file if possible */
171
KEY_CACHE *key_cache; /* ref to the current key cache */
198
172
MI_DECODE_TREE *decode_trees;
199
173
uint16_t *decode_tables;
200
int (*read_record)(struct st_myisam_info*, drizzled::internal::my_off_t, unsigned char*);
201
int (*write_record)(struct st_myisam_info*, const unsigned char*);
202
int (*update_record)(struct st_myisam_info*, drizzled::internal::my_off_t, const unsigned char*);
174
int (*read_record)(struct st_myisam_info*, my_off_t, uchar*);
175
int (*write_record)(struct st_myisam_info*, const uchar*);
176
int (*update_record)(struct st_myisam_info*, my_off_t, const uchar*);
203
177
int (*delete_record)(struct st_myisam_info*);
204
int (*read_rnd)(struct st_myisam_info*, unsigned char*, drizzled::internal::my_off_t, bool);
205
int (*compare_record)(struct st_myisam_info*, const unsigned char *);
178
int (*read_rnd)(struct st_myisam_info*, uchar*, my_off_t, my_bool);
179
int (*compare_record)(struct st_myisam_info*, const uchar *);
206
180
/* Function to use for a row checksum. */
207
drizzled::internal::ha_checksum (*calc_checksum)(struct st_myisam_info*, const unsigned char *);
181
ha_checksum (*calc_checksum)(struct st_myisam_info*, const uchar *);
208
182
int (*compare_unique)(struct st_myisam_info*, MI_UNIQUEDEF *,
209
const unsigned char *record, drizzled::internal::my_off_t pos);
210
size_t (*file_read)(MI_INFO *, unsigned char *, size_t, drizzled::internal::my_off_t, drizzled::myf);
211
size_t (*file_write)(MI_INFO *, const unsigned char *, size_t, drizzled::internal::my_off_t, drizzled::myf);
183
const uchar *record, my_off_t pos);
184
size_t (*file_read)(MI_INFO *, uchar *, size_t, my_off_t, myf);
185
size_t (*file_write)(MI_INFO *, const uchar *, size_t, my_off_t, myf);
186
invalidator_by_filename invalidator; /* query cache invalidator */
212
187
ulong this_process; /* processid */
213
188
ulong last_process; /* For table-change-check */
214
189
ulong last_version; /* Version on start */
215
uint64_t options; /* Options used */
190
ulong options; /* Options used */
216
191
ulong min_pack_length; /* Theese are used by packed data */
217
192
ulong max_pack_length;
218
193
ulong state_diff_length;
219
194
uint rec_reflength; /* rec_reflength in use now */
220
uint32_t unique_name_length;
221
int kfile; /* Shared keyfile */
222
int data_file; /* Shared data file */
195
uint unique_name_length;
196
File kfile; /* Shared keyfile */
197
File data_file; /* Shared data file */
223
198
int mode; /* mode of file on open */
224
199
uint reopen; /* How many times reopened */
225
200
uint w_locks,r_locks,tot_locks; /* Number of read/write locks */
226
201
uint blocksize; /* blocksize of keyfile */
227
drizzled::myf write_flag;
228
enum drizzled::data_file_type data_file_type;
203
enum data_file_type data_file_type;
229
204
/* Below flag is needed to make log tables work with concurrent insert */
205
my_bool is_log_table;
232
bool changed, /* If changed since lock */
207
my_bool changed, /* If changed since lock */
233
208
global_changed, /* If changed since open */
235
210
temporary,delay_key_write,
236
211
concurrent_insert;
237
drizzled::internal::my_off_t mmaped_length;
238
uint32_t nonmmaped_inserts; /* counter of writing in non-mmaped
213
pthread_mutex_t intern_lock; /* Locking for use with _locking */
214
rw_lock_t *key_root_lock;
215
my_off_t mmaped_length;
216
uint nonmmaped_inserts; /* counter of writing in non-mmaped
243
typedef uint32_t mi_bit_type;
222
typedef uint mi_bit_type;
245
224
typedef struct st_mi_bit_buff { /* Used for packing of record */
246
225
mi_bit_type current_byte;
248
unsigned char *pos,*end,*blob_pos,*blob_end;
227
uchar *pos,*end,*blob_pos,*blob_end;
253
typedef bool (*index_cond_func_t)(void *param);
232
typedef my_bool (*index_cond_func_t)(void *param);
255
234
struct st_myisam_info {
256
235
MYISAM_SHARE *s; /* Shared between open:s */
493
476
part_of_prev_key,prev_length,pack_marker;
494
unsigned char *key, *prev_key,*next_key_pos;
477
uchar *key, *prev_key,*next_key_pos;
478
my_bool store_not_null;
498
481
/* Prototypes for intern functions */
500
extern int _mi_read_dynamic_record(MI_INFO *info,drizzled::internal::my_off_t filepos,unsigned char *buf);
501
extern int _mi_write_dynamic_record(MI_INFO*, const unsigned char*);
502
extern int _mi_update_dynamic_record(MI_INFO*, drizzled::internal::my_off_t, const unsigned char*);
483
extern int _mi_read_dynamic_record(MI_INFO *info,my_off_t filepos,uchar *buf);
484
extern int _mi_write_dynamic_record(MI_INFO*, const uchar*);
485
extern int _mi_update_dynamic_record(MI_INFO*, my_off_t, const uchar*);
503
486
extern int _mi_delete_dynamic_record(MI_INFO *info);
504
extern int _mi_cmp_dynamic_record(MI_INFO *info,const unsigned char *record);
505
extern int _mi_read_rnd_dynamic_record(MI_INFO *, unsigned char *,drizzled::internal::my_off_t, bool);
506
extern int _mi_write_blob_record(MI_INFO*, const unsigned char*);
507
extern int _mi_update_blob_record(MI_INFO*, drizzled::internal::my_off_t, const unsigned char*);
508
extern int _mi_read_static_record(MI_INFO *info, drizzled::internal::my_off_t filepos,unsigned char *buf);
509
extern int _mi_write_static_record(MI_INFO*, const unsigned char*);
510
extern int _mi_update_static_record(MI_INFO*, drizzled::internal::my_off_t, const unsigned char*);
487
extern int _mi_cmp_dynamic_record(MI_INFO *info,const uchar *record);
488
extern int _mi_read_rnd_dynamic_record(MI_INFO *, uchar *,my_off_t, my_bool);
489
extern int _mi_write_blob_record(MI_INFO*, const uchar*);
490
extern int _mi_update_blob_record(MI_INFO*, my_off_t, const uchar*);
491
extern int _mi_read_static_record(MI_INFO *info, my_off_t filepos,uchar *buf);
492
extern int _mi_write_static_record(MI_INFO*, const uchar*);
493
extern int _mi_update_static_record(MI_INFO*, my_off_t, const uchar*);
511
494
extern int _mi_delete_static_record(MI_INFO *info);
512
extern int _mi_cmp_static_record(MI_INFO *info,const unsigned char *record);
513
extern int _mi_read_rnd_static_record(MI_INFO*, unsigned char *,drizzled::internal::my_off_t, bool);
514
extern int _mi_ck_write(MI_INFO *info,uint32_t keynr,unsigned char *key,uint32_t length);
495
extern int _mi_cmp_static_record(MI_INFO *info,const uchar *record);
496
extern int _mi_read_rnd_static_record(MI_INFO*, uchar *,my_off_t, my_bool);
497
extern int _mi_ck_write(MI_INFO *info,uint keynr,uchar *key,uint length);
515
498
extern int _mi_ck_real_write_btree(MI_INFO *info, MI_KEYDEF *keyinfo,
516
unsigned char *key, uint32_t key_length,
517
drizzled::internal::my_off_t *root, uint32_t comp_flag);
518
extern int _mi_enlarge_root(MI_INFO *info,MI_KEYDEF *keyinfo,unsigned char *key, drizzled::internal::my_off_t *root);
519
extern int _mi_insert(MI_INFO *info,MI_KEYDEF *keyinfo,unsigned char *key,
520
unsigned char *anc_buff,unsigned char *key_pos,unsigned char *key_buff,
521
unsigned char *father_buff, unsigned char *father_keypos,
522
drizzled::internal::my_off_t father_page, bool insert_last);
523
extern int _mi_split_page(MI_INFO *info,MI_KEYDEF *keyinfo,unsigned char *key,
524
unsigned char *buff,unsigned char *key_buff, bool insert_last);
525
extern unsigned char *_mi_find_half_pos(uint32_t nod_flag,MI_KEYDEF *keyinfo,unsigned char *page,
526
unsigned char *key,uint32_t *return_key_length,
527
unsigned char **after_key);
528
extern int _mi_calc_static_key_length(MI_KEYDEF *keyinfo,uint32_t nod_flag,
529
unsigned char *key_pos, unsigned char *org_key,
530
unsigned char *key_buff,
531
unsigned char *key, MI_KEY_PARAM *s_temp);
532
extern int _mi_calc_var_key_length(MI_KEYDEF *keyinfo,uint32_t nod_flag,
533
unsigned char *key_pos, unsigned char *org_key,
534
unsigned char *key_buff,
535
unsigned char *key, MI_KEY_PARAM *s_temp);
536
extern int _mi_calc_var_pack_key_length(MI_KEYDEF *keyinfo,uint32_t nod_flag,
537
unsigned char *key_pos, unsigned char *org_key,
538
unsigned char *prev_key,
539
unsigned char *key, MI_KEY_PARAM *s_temp);
540
extern int _mi_calc_bin_pack_key_length(MI_KEYDEF *keyinfo,uint32_t nod_flag,
541
unsigned char *key_pos,unsigned char *org_key,
542
unsigned char *prev_key,
543
unsigned char *key, MI_KEY_PARAM *s_temp);
544
void _mi_store_static_key(MI_KEYDEF *keyinfo, unsigned char *key_pos,
499
uchar *key, uint key_length,
500
my_off_t *root, uint comp_flag);
501
extern int _mi_enlarge_root(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *key, my_off_t *root);
502
extern int _mi_insert(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *key,
503
uchar *anc_buff,uchar *key_pos,uchar *key_buff,
504
uchar *father_buff, uchar *father_keypos,
505
my_off_t father_page, my_bool insert_last);
506
extern int _mi_split_page(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *key,
507
uchar *buff,uchar *key_buff, my_bool insert_last);
508
extern uchar *_mi_find_half_pos(uint nod_flag,MI_KEYDEF *keyinfo,uchar *page,
509
uchar *key,uint *return_key_length,
511
extern int _mi_calc_static_key_length(MI_KEYDEF *keyinfo,uint nod_flag,
512
uchar *key_pos, uchar *org_key,
514
uchar *key, MI_KEY_PARAM *s_temp);
515
extern int _mi_calc_var_key_length(MI_KEYDEF *keyinfo,uint nod_flag,
516
uchar *key_pos, uchar *org_key,
518
uchar *key, MI_KEY_PARAM *s_temp);
519
extern int _mi_calc_var_pack_key_length(MI_KEYDEF *keyinfo,uint nod_flag,
520
uchar *key_pos, uchar *org_key,
522
uchar *key, MI_KEY_PARAM *s_temp);
523
extern int _mi_calc_bin_pack_key_length(MI_KEYDEF *keyinfo,uint nod_flag,
524
uchar *key_pos,uchar *org_key,
526
uchar *key, MI_KEY_PARAM *s_temp);
527
void _mi_store_static_key(MI_KEYDEF *keyinfo, uchar *key_pos,
545
528
MI_KEY_PARAM *s_temp);
546
void _mi_store_var_pack_key(MI_KEYDEF *keyinfo, unsigned char *key_pos,
529
void _mi_store_var_pack_key(MI_KEYDEF *keyinfo, uchar *key_pos,
547
530
MI_KEY_PARAM *s_temp);
549
void _mi_store_pack_key(MI_KEYDEF *keyinfo, unsigned char *key_pos,
532
void _mi_store_pack_key(MI_KEYDEF *keyinfo, uchar *key_pos,
550
533
MI_KEY_PARAM *s_temp);
552
void _mi_store_bin_pack_key(MI_KEYDEF *keyinfo, unsigned char *key_pos,
535
void _mi_store_bin_pack_key(MI_KEYDEF *keyinfo, uchar *key_pos,
553
536
MI_KEY_PARAM *s_temp);
555
extern int _mi_ck_delete(MI_INFO *info,uint32_t keynr,unsigned char *key,uint32_t key_length);
556
int _mi_readinfo(MI_INFO *info,int lock_flag,int check_keybuffer);
557
extern int _mi_writeinfo(MI_INFO *info,uint32_t options);
538
extern int _mi_ck_delete(MI_INFO *info,uint keynr,uchar *key,uint key_length);
539
extern int _mi_readinfo(MI_INFO *info,int lock_flag,int check_keybuffer);
540
extern int _mi_writeinfo(MI_INFO *info,uint options);
558
541
extern int _mi_test_if_changed(MI_INFO *info);
559
542
extern int _mi_mark_file_changed(MI_INFO *info);
560
543
extern int _mi_decrement_open_count(MI_INFO *info);
561
544
extern int _mi_check_index(MI_INFO *info,int inx);
562
extern int _mi_search(MI_INFO *info,MI_KEYDEF *keyinfo,unsigned char *key,uint32_t key_len,
563
uint32_t nextflag,drizzled::internal::my_off_t pos);
545
extern int _mi_search(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *key,uint key_len,
546
uint nextflag,my_off_t pos);
564
547
extern int _mi_bin_search(struct st_myisam_info *info,MI_KEYDEF *keyinfo,
565
unsigned char *page,unsigned char *key,uint32_t key_len,uint32_t comp_flag,
566
unsigned char * *ret_pos,unsigned char *buff, bool *was_last_key);
567
extern int _mi_seq_search(MI_INFO *info,MI_KEYDEF *keyinfo,unsigned char *page,
568
unsigned char *key,uint32_t key_len,uint32_t comp_flag,
569
unsigned char **ret_pos,unsigned char *buff, bool *was_last_key);
570
extern int _mi_prefix_search(MI_INFO *info,MI_KEYDEF *keyinfo,unsigned char *page,
571
unsigned char *key,uint32_t key_len,uint32_t comp_flag,
572
unsigned char **ret_pos,unsigned char *buff, bool *was_last_key);
573
extern drizzled::internal::my_off_t _mi_kpos(uint32_t nod_flag,unsigned char *after_key);
574
extern void _mi_kpointer(MI_INFO *info,unsigned char *buff,drizzled::internal::my_off_t pos);
575
extern drizzled::internal::my_off_t _mi_dpos(MI_INFO *info, uint32_t nod_flag,unsigned char *after_key);
576
extern drizzled::internal::my_off_t _mi_rec_pos(MYISAM_SHARE *info, unsigned char *ptr);
577
void _mi_dpointer(MI_INFO *info, unsigned char *buff,drizzled::internal::my_off_t pos);
578
extern uint32_t _mi_get_static_key(MI_KEYDEF *keyinfo,uint32_t nod_flag,unsigned char * *page,
580
extern uint32_t _mi_get_pack_key(MI_KEYDEF *keyinfo,uint32_t nod_flag,unsigned char * *page,
582
extern uint32_t _mi_get_binary_pack_key(MI_KEYDEF *keyinfo, uint32_t nod_flag,
583
unsigned char **page_pos, unsigned char *key);
584
extern unsigned char *_mi_get_last_key(MI_INFO *info,MI_KEYDEF *keyinfo,unsigned char *keypos,
585
unsigned char *lastkey,unsigned char *endpos,
586
uint32_t *return_key_length);
587
extern unsigned char *_mi_get_key(MI_INFO *info, MI_KEYDEF *keyinfo, unsigned char *page,
588
unsigned char *key, unsigned char *keypos, uint32_t *return_key_length);
589
extern uint32_t _mi_keylength(MI_KEYDEF *keyinfo,unsigned char *key);
590
extern uint32_t _mi_keylength_part(MI_KEYDEF *keyinfo, register unsigned char *key,
548
uchar *page,uchar *key,uint key_len,uint comp_flag,
549
uchar * *ret_pos,uchar *buff, my_bool *was_last_key);
550
extern int _mi_seq_search(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *page,
551
uchar *key,uint key_len,uint comp_flag,
552
uchar **ret_pos,uchar *buff, my_bool *was_last_key);
553
extern int _mi_prefix_search(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *page,
554
uchar *key,uint key_len,uint comp_flag,
555
uchar **ret_pos,uchar *buff, my_bool *was_last_key);
556
extern my_off_t _mi_kpos(uint nod_flag,uchar *after_key);
557
extern void _mi_kpointer(MI_INFO *info,uchar *buff,my_off_t pos);
558
extern my_off_t _mi_dpos(MI_INFO *info, uint nod_flag,uchar *after_key);
559
extern my_off_t _mi_rec_pos(MYISAM_SHARE *info, uchar *ptr);
560
extern void _mi_dpointer(MI_INFO *info, uchar *buff,my_off_t pos);
561
extern uint _mi_get_static_key(MI_KEYDEF *keyinfo,uint nod_flag,uchar * *page,
563
extern uint _mi_get_pack_key(MI_KEYDEF *keyinfo,uint nod_flag,uchar * *page,
565
extern uint _mi_get_binary_pack_key(MI_KEYDEF *keyinfo, uint nod_flag,
566
uchar **page_pos, uchar *key);
567
extern uchar *_mi_get_last_key(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *keypos,
568
uchar *lastkey,uchar *endpos,
569
uint *return_key_length);
570
extern uchar *_mi_get_key(MI_INFO *info, MI_KEYDEF *keyinfo, uchar *page,
571
uchar *key, uchar *keypos, uint *return_key_length);
572
extern uint _mi_keylength(MI_KEYDEF *keyinfo,uchar *key);
573
extern uint _mi_keylength_part(MI_KEYDEF *keyinfo, register uchar *key,
592
extern unsigned char *_mi_move_key(MI_KEYDEF *keyinfo,unsigned char *to,unsigned char *from);
593
extern int _mi_search_next(MI_INFO *info,MI_KEYDEF *keyinfo,unsigned char *key,
594
uint32_t key_length,uint32_t nextflag,drizzled::internal::my_off_t pos);
595
extern int _mi_search_first(MI_INFO *info,MI_KEYDEF *keyinfo,drizzled::internal::my_off_t pos);
596
extern int _mi_search_last(MI_INFO *info,MI_KEYDEF *keyinfo,drizzled::internal::my_off_t pos);
597
extern unsigned char *_mi_fetch_keypage(MI_INFO *info,MI_KEYDEF *keyinfo,drizzled::internal::my_off_t page,
598
int level,unsigned char *buff,int return_buffer);
599
extern int _mi_write_keypage(MI_INFO *info,MI_KEYDEF *keyinfo,drizzled::internal::my_off_t page,
600
int level, unsigned char *buff);
601
extern int _mi_dispose(MI_INFO *info,MI_KEYDEF *keyinfo,drizzled::internal::my_off_t pos,
575
extern uchar *_mi_move_key(MI_KEYDEF *keyinfo,uchar *to,uchar *from);
576
extern int _mi_search_next(MI_INFO *info,MI_KEYDEF *keyinfo,uchar *key,
577
uint key_length,uint nextflag,my_off_t pos);
578
extern int _mi_search_first(MI_INFO *info,MI_KEYDEF *keyinfo,my_off_t pos);
579
extern int _mi_search_last(MI_INFO *info,MI_KEYDEF *keyinfo,my_off_t pos);
580
extern uchar *_mi_fetch_keypage(MI_INFO *info,MI_KEYDEF *keyinfo,my_off_t page,
581
int level,uchar *buff,int return_buffer);
582
extern int _mi_write_keypage(MI_INFO *info,MI_KEYDEF *keyinfo,my_off_t page,
583
int level, uchar *buff);
584
extern int _mi_dispose(MI_INFO *info,MI_KEYDEF *keyinfo,my_off_t pos,
603
extern drizzled::internal::my_off_t _mi_new(MI_INFO *info,MI_KEYDEF *keyinfo,int level);
604
extern uint32_t _mi_make_key(MI_INFO *info,uint32_t keynr,unsigned char *key,
605
const unsigned char *record,drizzled::internal::my_off_t filepos);
606
extern uint32_t _mi_pack_key(register MI_INFO *info, uint32_t keynr, unsigned char *key,
607
unsigned char *old, drizzled::key_part_map keypart_map,
586
extern my_off_t _mi_new(MI_INFO *info,MI_KEYDEF *keyinfo,int level);
587
extern uint _mi_make_key(MI_INFO *info,uint keynr,uchar *key,
588
const uchar *record,my_off_t filepos);
589
extern uint _mi_pack_key(register MI_INFO *info, uint keynr, uchar *key,
590
uchar *old, key_part_map keypart_map,
608
591
HA_KEYSEG **last_used_keyseg);
609
extern int _mi_read_key_record(MI_INFO *info,drizzled::internal::my_off_t filepos,unsigned char *buf);
610
extern int _mi_read_cache(drizzled::internal::IO_CACHE *info,unsigned char *buff,drizzled::internal::my_off_t pos,
611
uint32_t length,int re_read_if_possibly);
612
extern uint64_t retrieve_auto_increment(MI_INFO *info,const unsigned char *record);
592
extern int _mi_read_key_record(MI_INFO *info,my_off_t filepos,uchar *buf);
593
extern int _mi_read_cache(IO_CACHE *info,uchar *buff,my_off_t pos,
594
uint length,int re_read_if_possibly);
595
extern uint64_t retrieve_auto_increment(MI_INFO *info,const uchar *record);
614
unsigned char *mi_alloc_rec_buff(MI_INFO *info, size_t length, unsigned char **buf);
597
extern uchar *mi_alloc_rec_buff(MI_INFO *,ulong, uchar**);
615
598
#define mi_get_rec_buff_ptr(info,buf) \
616
599
((((info)->s->options & HA_OPTION_PACK_RECORD) && (buf)) ? \
617
600
(buf) - MI_REC_BUFF_OFFSET : (buf))
618
601
#define mi_get_rec_buff_len(info,buf) \
619
602
(*((uint32_t *)(mi_get_rec_buff_ptr(info,buf))))
621
extern ulong _mi_rec_unpack(MI_INFO *info,unsigned char *to,unsigned char *from,
604
extern ulong _mi_rec_unpack(MI_INFO *info,uchar *to,uchar *from,
622
605
ulong reclength);
623
extern bool _mi_rec_check(MI_INFO *info,const unsigned char *record, unsigned char *packpos,
624
ulong packed_length, bool with_checkum);
625
extern int _mi_write_part_record(MI_INFO *info,drizzled::internal::my_off_t filepos,ulong length,
626
drizzled::internal::my_off_t next_filepos,unsigned char **record,
606
extern my_bool _mi_rec_check(MI_INFO *info,const uchar *record, uchar *packpos,
607
ulong packed_length, my_bool with_checkum);
608
extern int _mi_write_part_record(MI_INFO *info,my_off_t filepos,ulong length,
609
my_off_t next_filepos,uchar **record,
627
610
ulong *reclength,int *flag);
628
extern void _mi_print_key(FILE *stream,HA_KEYSEG *keyseg,const unsigned char *key,
630
extern bool _mi_read_pack_info(MI_INFO *info,bool fix_keys);
631
extern int _mi_read_pack_record(MI_INFO *info,drizzled::internal::my_off_t filepos,unsigned char *buf);
632
extern int _mi_read_rnd_pack_record(MI_INFO*, unsigned char *,drizzled::internal::my_off_t, bool);
611
extern void _mi_print_key(FILE *stream,HA_KEYSEG *keyseg,const uchar *key,
613
extern my_bool _mi_read_pack_info(MI_INFO *info,bool fix_keys);
614
extern int _mi_read_pack_record(MI_INFO *info,my_off_t filepos,uchar *buf);
615
extern int _mi_read_rnd_pack_record(MI_INFO*, uchar *,my_off_t, my_bool);
633
616
extern int _mi_pack_rec_unpack(MI_INFO *info, MI_BIT_BUFF *bit_buff,
634
unsigned char *to, unsigned char *from, ulong reclength);
617
uchar *to, uchar *from, ulong reclength);
618
extern uint64_t mi_safe_mul(uint64_t a,uint64_t b);
636
620
struct st_sort_info;
639
623
typedef struct st_mi_block_info { /* Parameter to _mi_get_block_info */
640
unsigned char header[MI_BLOCK_INFO_HEADER_LENGTH];
624
uchar header[MI_BLOCK_INFO_HEADER_LENGTH];
645
drizzled::internal::my_off_t filepos;
646
drizzled::internal::my_off_t next_filepos;
647
drizzled::internal::my_off_t prev_filepos;
648
uint32_t second_read;
630
my_off_t next_filepos;
631
my_off_t prev_filepos;
652
636
/* bits in return from _mi_get_block_info */
676
660
#define SORT_BUFFER_INIT (2048L*1024L-MALLOC_OVERHEAD)
677
661
#define MIN_SORT_BUFFER (4096-MALLOC_OVERHEAD)
663
enum myisam_log_commands {
664
MI_LOG_OPEN,MI_LOG_WRITE,MI_LOG_UPDATE,MI_LOG_DELETE,MI_LOG_CLOSE,MI_LOG_EXTRA,MI_LOG_LOCK,MI_LOG_DELETE_ALL
667
#define myisam_log(a,b,c,d) if (myisam_log_file >= 0) _myisam_log(a,b,c,d)
668
#define myisam_log_command(a,b,c,d,e) if (myisam_log_file >= 0) _myisam_log_command(a,b,c,d,e)
669
#define myisam_log_record(a,b,c,d,e) if (myisam_log_file >= 0) _myisam_log_record(a,b,c,d,e)
679
671
#define fast_mi_writeinfo(INFO) if (!(INFO)->s->tot_locks) (void) _mi_writeinfo((INFO),0)
680
672
#define fast_mi_readinfo(INFO) ((INFO)->lock_type == F_UNLCK) && _mi_readinfo((INFO),F_RDLCK,1)
682
extern uint32_t _mi_get_block_info(MI_BLOCK_INFO *,int, drizzled::internal::my_off_t);
683
extern uint32_t _mi_rec_pack(MI_INFO *info,unsigned char *to,const unsigned char *from);
684
extern uint32_t _mi_pack_get_block_info(MI_INFO *myisam, MI_BIT_BUFF *bit_buff,
685
MI_BLOCK_INFO *info, unsigned char **rec_buff_p,
686
int file, drizzled::internal::my_off_t filepos);
687
extern void _my_store_blob_length(unsigned char *pos,uint32_t pack_length,uint32_t length);
678
extern uint _mi_get_block_info(MI_BLOCK_INFO *,File, my_off_t);
679
extern uint _mi_rec_pack(MI_INFO *info,uchar *to,const uchar *from);
680
extern uint _mi_pack_get_block_info(MI_INFO *myisam, MI_BIT_BUFF *bit_buff,
681
MI_BLOCK_INFO *info, uchar **rec_buff_p,
682
File file, my_off_t filepos);
683
extern void _my_store_blob_length(uchar *pos,uint pack_length,uint length);
684
extern void _myisam_log(enum myisam_log_commands command,MI_INFO *info,
685
const uchar *buffert,uint length);
686
extern void _myisam_log_command(enum myisam_log_commands command,
687
MI_INFO *info, const uchar *buffert,
688
uint length, int result);
689
extern void _myisam_log_record(enum myisam_log_commands command,MI_INFO *info,
690
const uchar *record,my_off_t filepos,
688
692
extern void mi_report_error(int errcode, const char *file_name);
689
extern size_t mi_mmap_pread(MI_INFO *info, unsigned char *Buffer,
690
size_t Count, drizzled::internal::my_off_t offset, drizzled::myf MyFlags);
691
extern size_t mi_mmap_pwrite(MI_INFO *info, const unsigned char *Buffer,
692
size_t Count, drizzled::internal::my_off_t offset, drizzled::myf MyFlags);
693
extern size_t mi_nommap_pread(MI_INFO *info, unsigned char *Buffer,
694
size_t Count, drizzled::internal::my_off_t offset, drizzled::myf MyFlags);
695
extern size_t mi_nommap_pwrite(MI_INFO *info, const unsigned char *Buffer,
696
size_t Count, drizzled::internal::my_off_t offset, drizzled::myf MyFlags);
693
extern my_bool _mi_memmap_file(MI_INFO *info);
694
extern void _mi_unmap_file(MI_INFO *info);
695
extern uint save_pack_length(uint version, uchar *block_buff, ulong length);
696
extern uint read_pack_length(uint version, const uchar *buf, ulong *length);
697
extern uint calc_pack_length(uint version, ulong length);
698
extern size_t mi_mmap_pread(MI_INFO *info, uchar *Buffer,
699
size_t Count, my_off_t offset, myf MyFlags);
700
extern size_t mi_mmap_pwrite(MI_INFO *info, const uchar *Buffer,
701
size_t Count, my_off_t offset, myf MyFlags);
702
extern size_t mi_nommap_pread(MI_INFO *info, uchar *Buffer,
703
size_t Count, my_off_t offset, myf MyFlags);
704
extern size_t mi_nommap_pwrite(MI_INFO *info, const uchar *Buffer,
705
size_t Count, my_off_t offset, myf MyFlags);
698
uint32_t mi_state_info_write(int file, MI_STATE_INFO *state, uint32_t pWrite);
699
uint32_t mi_state_info_read_dsk(int file, MI_STATE_INFO *state, bool pRead);
700
uint32_t mi_base_info_write(int file, MI_BASE_INFO *base);
701
int mi_keyseg_write(int file, const HA_KEYSEG *keyseg);
702
uint32_t mi_keydef_write(int file, MI_KEYDEF *keydef);
703
uint32_t mi_uniquedef_write(int file, MI_UNIQUEDEF *keydef);
704
uint32_t mi_recinfo_write(int file, drizzled::MI_COLUMNDEF *recinfo);
707
uint mi_state_info_write(File file, MI_STATE_INFO *state, uint pWrite);
708
uchar *mi_state_info_read(uchar *ptr, MI_STATE_INFO *state);
709
uint mi_state_info_read_dsk(File file, MI_STATE_INFO *state, my_bool pRead);
710
uint mi_base_info_write(File file, MI_BASE_INFO *base);
711
uchar *my_n_base_info_read(uchar *ptr, MI_BASE_INFO *base);
712
int mi_keyseg_write(File file, const HA_KEYSEG *keyseg);
713
uchar *mi_keyseg_read(uchar *ptr, HA_KEYSEG *keyseg);
714
uint mi_keydef_write(File file, MI_KEYDEF *keydef);
715
uchar *mi_keydef_read(uchar *ptr, MI_KEYDEF *keydef);
716
uint mi_uniquedef_write(File file, MI_UNIQUEDEF *keydef);
717
uchar *mi_uniquedef_read(uchar *ptr, MI_UNIQUEDEF *keydef);
718
uint mi_recinfo_write(File file, MI_COLUMNDEF *recinfo);
719
uchar *mi_recinfo_read(uchar *ptr, MI_COLUMNDEF *recinfo);
705
720
extern int mi_disable_indexes(MI_INFO *info);
706
721
extern int mi_enable_indexes(MI_INFO *info);
707
722
extern int mi_indexes_are_disabled(MI_INFO *info);
708
ulong _my_calc_total_blob_length(MI_INFO *info, const unsigned char *record);
709
drizzled::internal::ha_checksum mi_checksum(MI_INFO *info, const unsigned char *buf);
710
drizzled::internal::ha_checksum mi_static_checksum(MI_INFO *info, const unsigned char *buf);
711
bool mi_check_unique(MI_INFO *info, MI_UNIQUEDEF *def, unsigned char *record,
712
drizzled::internal::ha_checksum unique_hash, drizzled::internal::my_off_t pos);
713
drizzled::internal::ha_checksum mi_unique_hash(MI_UNIQUEDEF *def, const unsigned char *buf);
723
ulong _my_calc_total_blob_length(MI_INFO *info, const uchar *record);
724
ha_checksum mi_checksum(MI_INFO *info, const uchar *buf);
725
ha_checksum mi_static_checksum(MI_INFO *info, const uchar *buf);
726
my_bool mi_check_unique(MI_INFO *info, MI_UNIQUEDEF *def, uchar *record,
727
ha_checksum unique_hash, my_off_t pos);
728
ha_checksum mi_unique_hash(MI_UNIQUEDEF *def, const uchar *buf);
714
729
int _mi_cmp_static_unique(MI_INFO *info, MI_UNIQUEDEF *def,
715
const unsigned char *record, drizzled::internal::my_off_t pos);
730
const uchar *record, my_off_t pos);
716
731
int _mi_cmp_dynamic_unique(MI_INFO *info, MI_UNIQUEDEF *def,
717
const unsigned char *record, drizzled::internal::my_off_t pos);
718
int mi_unique_comp(MI_UNIQUEDEF *def, const unsigned char *a, const unsigned char *b,
719
bool null_are_equal);
732
const uchar *record, my_off_t pos);
733
int mi_unique_comp(MI_UNIQUEDEF *def, const uchar *a, const uchar *b,
734
my_bool null_are_equal);
735
void mi_get_status(void* param, int concurrent_insert);
736
void mi_update_status(void* param);
737
void mi_restore_status(void* param);
738
void mi_copy_status(void* to,void *from);
739
bool mi_check_status(void* param);
721
741
extern MI_INFO *test_if_reopen(char *filename);
722
bool check_table_is_closed(const char *name, const char *where);
723
int mi_open_datafile(MI_INFO *info, MYISAM_SHARE *share, int file_to_dup);
742
my_bool check_table_is_closed(const char *name, const char *where);
743
int mi_open_datafile(MI_INFO *info, MYISAM_SHARE *share, File file_to_dup);
724
744
int mi_open_keyfile(MYISAM_SHARE *share);
725
745
void mi_setup_functions(register MYISAM_SHARE *share);
726
bool mi_dynmap_file(MI_INFO *info, drizzled::internal::my_off_t size);
727
void mi_remap_file(MI_INFO *info, drizzled::internal::my_off_t size);
746
my_bool mi_dynmap_file(MI_INFO *info, my_off_t size);
747
void mi_remap_file(MI_INFO *info, my_off_t size);
729
int mi_check_index_cond(register MI_INFO *info, uint32_t keynr, unsigned char *record);
749
int mi_check_index_cond(register MI_INFO *info, uint keynr, uchar *record);
731
751
/* Functions needed by mi_check */
732
752
volatile int *killed_ptr(MI_CHECK *param);
733
void mi_check_print_error(MI_CHECK *param, const char *fmt,...);
734
void mi_check_print_warning(MI_CHECK *param, const char *fmt,...);
735
void mi_check_print_info(MI_CHECK *param, const char *fmt,...);
753
void mi_check_print_error _VARARGS((MI_CHECK *param, const char *fmt,...));
754
void mi_check_print_warning _VARARGS((MI_CHECK *param, const char *fmt,...));
755
void mi_check_print_info _VARARGS((MI_CHECK *param, const char *fmt,...));
736
756
int flush_pending_blocks(MI_SORT_PARAM *param);
737
757
int thr_write_keys(MI_SORT_PARAM *sort_param);
738
int flush_blocks(MI_CHECK *param, drizzled::KEY_CACHE *key_cache, int file);
758
pthread_handler_t thr_find_all_keys(void *arg);
759
int flush_blocks(MI_CHECK *param, KEY_CACHE *key_cache, File file);
740
761
int sort_write_record(MI_SORT_PARAM *sort_param);
741
int _create_index_by_sort(MI_SORT_PARAM *info,bool no_messages, size_t);
762
int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages, ulong);
743
764
extern void mi_set_index_cond_func(MI_INFO *info, index_cond_func_t func,
745
766
/* Just for myisam legacy */
746
extern size_t my_pwrite(int Filedes,const unsigned char *Buffer,size_t Count,
747
drizzled::internal::my_off_t offset,drizzled::myf MyFlags);
748
extern size_t my_pread(int Filedes,unsigned char *Buffer,size_t Count,drizzled::internal::my_off_t offset,
749
drizzled::myf MyFlags);
767
extern size_t my_pwrite(File Filedes,const uchar *Buffer,size_t Count,
768
my_off_t offset,myf MyFlags);
769
extern size_t my_pread(File Filedes,uchar *Buffer,size_t Count,my_off_t offset,
751
772
/* Needed for handler */
752
void mi_disable_non_unique_index(MI_INFO *info, drizzled::ha_rows rows);
753
void _mi_report_crashed(MI_INFO *file, const char *message, const char *sfile,
756
#endif /* PLUGIN_MYISAM_MYISAM_PRIV_H */
773
void mi_disable_non_unique_index(MI_INFO *info, ha_rows rows);
774
void _mi_report_crashed(MI_INFO *file __attribute__((unused)),
775
const char *message __attribute__((unused)),
776
const char *sfile __attribute__((unused)),
777
uint sline __attribute__((unused)));