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
/* Read and write key blocks */
18
#include "myisam_priv.h"
20
using namespace drizzled;
18
#include "myisamdef.h"
22
20
/* Fetch a key-page in memory */
24
22
unsigned char *_mi_fetch_keypage(register MI_INFO *info, MI_KEYDEF *keyinfo,
25
internal::my_off_t page, int level,
23
my_off_t page, int level,
26
24
unsigned char *buff, int return_buffer)
28
26
unsigned char *tmp;
29
27
uint32_t page_size;
31
tmp=(unsigned char*) key_cache_read(info->s->getKeyCache(),
29
tmp=(unsigned char*) key_cache_read(info->s->key_cache,
32
30
info->s->kfile, page, level, (unsigned char*) buff,
33
31
(uint) keyinfo->block_length,
34
32
(uint) keyinfo->block_length,
58
56
/* Write a key-page on disk */
60
58
int _mi_write_keypage(register MI_INFO *info, register MI_KEYDEF *keyinfo,
61
internal::my_off_t page, int level, unsigned char *buff)
59
my_off_t page, int level, unsigned char *buff)
63
61
register uint32_t length;
75
73
if ((length=keyinfo->block_length) > IO_SIZE*2 &&
76
74
info->state->key_file_length != page+length)
77
75
length= ((mi_getint(buff)+IO_SIZE-1) & (uint) ~(IO_SIZE-1));
80
78
length=mi_getint(buff);
81
79
memset(buff+length, 0, keyinfo->block_length-length);
82
80
length=keyinfo->block_length;
85
return((key_cache_write(info->s->getKeyCache(),
83
return((key_cache_write(info->s->key_cache,
86
84
info->s->kfile,page, level, (unsigned char*) buff,length,
87
85
(uint) keyinfo->block_length,
88
86
(int) ((info->lock_type != F_UNLCK) ||
93
91
/* Remove page from disk */
95
int _mi_dispose(register MI_INFO *info, MI_KEYDEF *keyinfo, internal::my_off_t pos,
93
int _mi_dispose(register MI_INFO *info, MI_KEYDEF *keyinfo, my_off_t pos,
98
internal::my_off_t old_link;
99
97
unsigned char buff[8];
101
99
old_link= info->s->state.key_del[keyinfo->block_size_index];
102
100
info->s->state.key_del[keyinfo->block_size_index]= pos;
103
101
mi_sizestore(buff,old_link);
104
102
info->s->state.changed|= STATE_NOT_SORTED_PAGES;
105
return(key_cache_write(info->s->getKeyCache(),
103
return(key_cache_write(info->s->key_cache,
106
104
info->s->kfile, pos , level, buff,
108
106
(uint) keyinfo->block_length,
113
111
/* Make new page on disk */
115
internal::my_off_t _mi_new(register MI_INFO *info, MI_KEYDEF *keyinfo, int level)
113
my_off_t _mi_new(register MI_INFO *info, MI_KEYDEF *keyinfo, int level)
117
internal::my_off_t pos;
118
116
unsigned char buff[8];
120
118
if ((pos= info->s->state.key_del[keyinfo->block_size_index]) ==
123
121
if (info->state->key_file_length >=
124
122
info->s->base.max_key_file_length - keyinfo->block_length)
126
errno=HA_ERR_INDEX_FILE_FULL;
124
my_errno=HA_ERR_INDEX_FILE_FULL;
127
125
return(HA_OFFSET_ERROR);
129
127
pos=info->state->key_file_length;
134
if (!key_cache_read(info->s->getKeyCache(),
132
if (!key_cache_read(info->s->key_cache,
135
133
info->s->kfile, pos, level,
137
135
(uint) sizeof(buff),