18 #include "myisam_priv.h"
20 using namespace drizzled;
22 int _mi_write_static_record(
MI_INFO *info,
const unsigned char *record)
24 unsigned char temp[8];
25 if (info->s->state.dellink != HA_OFFSET_ERROR &&
26 !info->append_insert_at_end)
28 internal::my_off_t filepos=info->s->state.dellink;
29 info->rec_cache.seek_not_done=1;
30 if (info->s->file_read(info, &temp[0],info->s->base.rec_reflength,
31 info->s->state.dellink+1,
34 info->s->state.dellink= _mi_rec_pos(info->s,temp);
36 info->state->empty-=info->s->base.pack_reclength;
37 if (info->s->file_write(info, record, info->s->base.reclength,
44 if (info->state->data_file_length > info->s->base.max_data_file_length-
45 info->s->base.pack_reclength)
47 errno=HA_ERR_RECORD_FILE_FULL;
50 if (info->opt_flag & WRITE_CACHE_USED)
52 if (info->rec_cache.write(record, info->s->base.reclength))
54 if (info->s->base.pack_reclength != info->s->base.reclength)
56 uint32_t length=info->s->base.pack_reclength - info->s->base.reclength;
57 memset(temp, 0, length);
58 if (info->rec_cache.write(temp,length))
64 info->rec_cache.seek_not_done=1;
65 if (info->s->file_write(info, record, info->s->base.reclength,
66 info->state->data_file_length,
69 if (info->s->base.pack_reclength != info->s->base.reclength)
71 uint32_t length=info->s->base.pack_reclength - info->s->base.reclength;
72 memset(temp, 0, length);
73 if (info->s->file_write(info, temp,length,
74 info->state->data_file_length+
75 info->s->base.reclength,
80 info->state->data_file_length+=info->s->base.pack_reclength;
81 info->s->state.split++;
88 int _mi_update_static_record(
MI_INFO *info, internal::my_off_t pos,
const unsigned char *record)
90 info->rec_cache.seek_not_done=1;
91 return (info->s->file_write(info,
92 record, info->s->base.reclength,
98 int _mi_delete_static_record(
MI_INFO *info)
100 unsigned char temp[9];
103 info->state->empty+=info->s->base.pack_reclength;
105 _mi_dpointer(info,temp+1,info->s->state.dellink);
106 info->s->state.dellink = info->lastpos;
107 info->rec_cache.seek_not_done=1;
108 return (info->s->file_write(info,(
unsigned char*) temp, 1+info->s->rec_reflength,
109 info->lastpos, MYF(MY_NABP)) != 0);
113 int _mi_cmp_static_record(
register MI_INFO *info,
register const unsigned char *old)
115 if (info->opt_flag & WRITE_CACHE_USED)
117 if (info->rec_cache.flush())
121 info->rec_cache.seek_not_done=1;
124 if ((info->opt_flag & READ_CHECK_USED))
126 info->rec_cache.seek_not_done=1;
127 if (info->s->file_read(info, info->rec_buff, info->s->base.reclength,
131 if (memcmp(info->rec_buff, old,
132 (uint) info->s->base.reclength))
134 errno=HA_ERR_RECORD_CHANGED;
143 const unsigned char *record, internal::my_off_t pos)
145 info->rec_cache.seek_not_done=1;
146 if (info->s->file_read(info, info->rec_buff, info->s->base.reclength,
149 return(mi_unique_comp(def, record, info->rec_buff,
150 def->null_are_equal));
159 int _mi_read_static_record(
register MI_INFO *info,
register internal::my_off_t pos,
160 register unsigned char *record)
162 if (pos != HA_OFFSET_ERROR)
164 if (info->opt_flag & WRITE_CACHE_USED &&
165 info->rec_cache.pos_in_file <= pos &&
166 info->rec_cache.flush())
168 info->rec_cache.seek_not_done=1;
170 int error= info->s->file_read(info, record, info->s->base.reclength, pos,MYF(MY_NABP)) != 0;
171 fast_mi_writeinfo(info);
176 errno=HA_ERR_RECORD_DELETED;
179 info->update|= HA_STATE_AKTIV;
184 fast_mi_writeinfo(info);
190 int _mi_read_rnd_static_record(
MI_INFO *info,
unsigned char *buf,
191 register internal::my_off_t filepos,
192 bool skip_deleted_blocks)
194 int locked,error,cache_read;
198 if (info->opt_flag & WRITE_CACHE_USED &&
199 (info->rec_cache.pos_in_file <= filepos || skip_deleted_blocks) &&
200 info->rec_cache.flush())
202 if (info->opt_flag & READ_CACHE_USED)
204 if (filepos == info->rec_cache.tell() &&
205 (skip_deleted_blocks || !filepos))
210 info->rec_cache.seek_not_done=1;
213 if (info->lock_type == F_UNLCK)
215 if (filepos >= info->state->data_file_length)
217 if (_mi_readinfo(info,F_RDLCK,0))
223 #ifndef UNSAFE_LOCKING
226 info->tmp_lock_type=F_RDLCK;
230 if (filepos >= info->state->data_file_length)
232 fast_mi_writeinfo(info);
233 return(errno=HA_ERR_END_OF_FILE);
235 info->lastpos= filepos;
236 info->nextpos= filepos+share->base.pack_reclength;
240 if ((error=_mi_read_static_record(info,filepos,buf)))
243 error=errno=HA_ERR_RECORD_DELETED;
251 error= info->rec_cache.read(buf, share->base.reclength);
252 if (info->s->base.pack_reclength != info->s->base.reclength && !error)
255 error= info->rec_cache.read(tmp, info->s->base.pack_reclength - info->s->base.reclength);
258 _mi_writeinfo(info,0);
263 return(errno=HA_ERR_RECORD_DELETED);
266 info->update|= HA_STATE_AKTIV | HA_STATE_KEY_CHANGED;
270 if (info->rec_cache.error != -1 || errno == 0)
271 errno=HA_ERR_WRONG_IN_RECORD;