18 #include "heap_priv.h"
23 #include <drizzled/error_t.h>
30 using namespace drizzled;
35 int heap_write(
HP_INFO *info,
const unsigned char *record)
41 if ((share->records >= share->max_records && share->max_records) ||
42 (share->recordspace.total_data_length + share->index_length >= share->max_table_size))
44 return(errno=HA_ERR_RECORD_FILE_FULL);
47 if (!(pos=hp_allocate_chunkset(&share->recordspace, 1)))
51 for (keydef = share->keydef, end = keydef + share->keys; keydef < end;
54 if (hp_write_key(info, keydef, record, pos))
58 hp_copy_record_data_to_chunkset(share, record, pos);
60 if (++share->records == share->blength)
61 share->blength+= share->blength;
63 info->current_ptr=pos;
64 info->current_hash_ptr=0;
65 info->update|=HA_STATE_AKTIV;
67 heap_update_auto_increment(info, record);
71 info->errkey= keydef - share->keydef;
72 while (keydef >= share->keydef)
74 if (hp_delete_key(info, keydef, record, pos, 0))
79 hp_free_chunks(&share->recordspace, pos);
110 const unsigned char *record,
unsigned char *recpos)
114 uint32_t halfbuff,hashnr,first_index;
115 unsigned char *ptr_to_rec= NULL,*ptr_to_rec2= NULL;
116 HASH_INFO *empty, *gpos= NULL, *gpos2= NULL, *pos;
119 if (!(empty= hp_find_free_hash(share,&keyinfo->block,share->records)))
121 halfbuff= (long) share->blength >> 1;
122 pos= hp_find_hash(&keyinfo->block,(first_index=share->records-halfbuff));
144 hashnr = hp_rec_hashnr(keyinfo, pos->ptr_to_rec);
151 if (hp_mask(hashnr, share->blength, share->records) != first_index)
165 if (!(hashnr & halfbuff))
168 if (!(flag & LOWFIND))
173 flag=LOWFIND | HIGHFIND;
176 ptr_to_rec=pos->ptr_to_rec;
185 flag=LOWFIND | LOWUSED;
187 ptr_to_rec=pos->ptr_to_rec;
193 if (!(flag & LOWUSED))
196 gpos->ptr_to_rec=ptr_to_rec;
198 flag= (flag & HIGHFIND) | (LOWFIND | LOWUSED);
201 ptr_to_rec=pos->ptr_to_rec;
207 if (!(flag & HIGHFIND))
209 flag= (flag & LOWFIND) | HIGHFIND;
213 ptr_to_rec2=pos->ptr_to_rec;
217 if (!(flag & HIGHUSED))
220 gpos2->ptr_to_rec=ptr_to_rec2;
222 flag= (flag & LOWFIND) | (HIGHFIND | HIGHUSED);
225 ptr_to_rec2=pos->ptr_to_rec;
229 while ((pos=pos->next_key));
231 if ((flag & (LOWFIND | HIGHFIND)) == (LOWFIND | HIGHFIND))
237 keyinfo->hash_buckets++;
240 if ((flag & (LOWFIND | LOWUSED)) == LOWFIND)
242 gpos->ptr_to_rec=ptr_to_rec;
245 if ((flag & (HIGHFIND | HIGHUSED)) == HIGHFIND)
247 gpos2->ptr_to_rec=ptr_to_rec2;
253 pos=hp_find_hash(&keyinfo->block, hp_mask(hp_rec_hashnr(keyinfo, record),
254 share->blength, share->records + 1));
257 pos->ptr_to_rec=recpos;
259 keyinfo->hash_buckets++;
265 gpos=hp_find_hash(&keyinfo->block,
266 hp_mask(hp_rec_hashnr(keyinfo, pos->ptr_to_rec),
267 share->blength, share->records + 1));
270 pos->ptr_to_rec=recpos;
275 keyinfo->hash_buckets++;
276 pos->ptr_to_rec=recpos;
278 hp_movelink(pos, gpos, empty);
282 if ((keyinfo->flag & HA_NOSAME) && pos == gpos &&
283 (!(keyinfo->flag & HA_NULL_PART_KEY) ||
284 !hp_if_null_in_key(keyinfo, record)))
289 if (! hp_rec_key_cmp(keyinfo, record, pos->ptr_to_rec, 1))
291 return(errno=HA_ERR_FOUND_DUPP_KEY);
293 }
while ((pos=pos->next_key));
307 if (records < block->last_allocated)
308 return hp_find_hash(block,records);
309 if (!(block_pos=(records % block->records_in_block)))
311 if (hp_get_new_block(block,&length))
313 info->index_length+=length;
315 block->last_allocated=records+1;
316 return((
HASH_INFO*) ((
unsigned char*) block->level_info[0].last_blocks+
317 block_pos*block->recbuffer));