void hp_clear_keys(HP_SHARE *info) { uint key; DBUG_ENTER("hp_clear_keys"); for (key=0 ; key < info->keys ; key++) { HP_KEYDEF *keyinfo = info->keydef + key; if (keyinfo->algorithm == HA_KEY_ALG_BTREE) { delete_tree(&keyinfo->rb_tree); } else { HP_BLOCK *block= &keyinfo->block; if (block->levels) VOID(hp_free_level(block,block->levels,block->root,(byte*) 0)); block->levels=0; block->last_allocated=0; keyinfo->hash_buckets= 0; } } info->index_length=0; DBUG_VOID_RETURN; }
uchar *hp_free_level(HP_BLOCK *block, uint level, HP_PTRS *pos, uchar *last_pos) { int i,max_pos; uchar *next_ptr; if (level == 1) next_ptr=(uchar*) pos+block->recbuffer; else { max_pos= (block->level_info[level-1].last_blocks == pos) ? HP_PTRS_IN_NOD - block->level_info[level-1].free_ptrs_in_block : HP_PTRS_IN_NOD; next_ptr=(uchar*) (pos+1); for (i=0 ; i < max_pos ; i++) next_ptr=hp_free_level(block,level-1, (HP_PTRS*) pos->blocks[i],next_ptr); } if ((uchar*) pos != last_pos) { my_free(pos); return last_pos; } return next_ptr; /* next memory position */ }
void hp_clear(HP_SHARE *info) { DBUG_ENTER("hp_clear"); if (info->block.levels) VOID(hp_free_level(&info->block,info->block.levels,info->block.root, (byte*) 0)); info->block.levels=0; hp_clear_keys(info); info->records= info->deleted= 0; info->data_length= 0; info->blength=1; info->changed=0; info->del_link=0; DBUG_VOID_RETURN; }