18 #include "myisam_priv.h"
20 using namespace drizzled;
25 internal::my_off_t page,
int,
unsigned char *buff,
int)
27 if (not pread(info->s->kfile, buff, keyinfo->block_length, page))
29 info->last_keypage=HA_OFFSET_ERROR;
30 mi_print_error(info->s, HA_ERR_CRASHED);
34 unsigned char* tmp= buff;
35 if (tmp == info->buff)
37 info->last_keypage=page;
38 uint32_t page_size=mi_getint(tmp);
39 if (page_size < 4 || page_size > keyinfo->block_length)
41 info->last_keypage = HA_OFFSET_ERROR;
42 mi_print_error(info->s, HA_ERR_CRASHED);
43 errno = HA_ERR_CRASHED;
53 internal::my_off_t page,
int,
unsigned char *buff)
58 if (page < info->s->base.keystart ||
59 page+keyinfo->block_length > info->state->key_file_length ||
60 (page & (MI_MIN_KEY_BLOCK_LENGTH-1)))
67 if ((length=keyinfo->block_length) > IO_SIZE*2 &&
68 info->state->key_file_length != page+length)
69 length= ((mi_getint(buff)+IO_SIZE-1) & (uint) ~(IO_SIZE-1));
72 length=mi_getint(buff);
73 memset(buff+length, 0, keyinfo->block_length-length);
74 length=keyinfo->block_length;
77 return not pwrite(info->s->kfile, buff, length, page);
83 int _mi_dispose(
MI_INFO *info,
MI_KEYDEF *keyinfo, internal::my_off_t pos,
int)
85 internal::my_off_t old_link;
86 unsigned char buff[8];
88 old_link= info->s->state.key_del[keyinfo->block_size_index];
89 info->s->state.key_del[keyinfo->block_size_index]= pos;
90 mi_sizestore(buff,old_link);
91 info->s->state.changed|= STATE_NOT_SORTED_PAGES;
92 return not pwrite(info->s->kfile, buff,
sizeof(buff), pos);
100 internal::my_off_t pos;
101 unsigned char buff[8];
103 if ((pos= info->s->state.key_del[keyinfo->block_size_index]) ==
106 if (info->state->key_file_length >=
107 info->s->base.max_key_file_length - keyinfo->block_length)
109 errno=HA_ERR_INDEX_FILE_FULL;
110 return(HA_OFFSET_ERROR);
112 pos=info->state->key_file_length;
113 info->state->key_file_length+= keyinfo->block_length;
115 else if (pread(info->s->kfile, buff,
sizeof(buff), pos))
116 info->s->state.key_del[keyinfo->block_size_index]= mi_sizekorr(buff);
118 pos= HA_OFFSET_ERROR;
119 info->s->state.changed|= STATE_NOT_SORTED_PAGES;