mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
BTREE heap key structure is now the same as MyISAM
_mi_compare_text -> mi_compate_text Changes according Monty's suggestions
This commit is contained in:
111
heap/hp_open.c
111
heap/hp_open.c
@ -26,8 +26,8 @@
|
||||
static int keys_compare(heap_rb_param *param, uchar *key1, uchar *key2)
|
||||
{
|
||||
uint not_used;
|
||||
return hp_rb_key_cmp(param->keyseg, key1, key2, param->key_length,
|
||||
param->search_flag, ¬_used);
|
||||
return ha_key_cmp(param->keyseg, key1, key2, param->key_length,
|
||||
param->search_flag, ¬_used);
|
||||
}
|
||||
|
||||
static void init_block(HP_BLOCK *block,uint reclength,ulong min_records,
|
||||
@ -52,25 +52,28 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef,
|
||||
for (i=key_segs=max_length=0 ; i < keys ; i++)
|
||||
{
|
||||
key_segs+= keydef[i].keysegs;
|
||||
if (keydef[i].algorithm == HA_KEY_ALG_BTREE)
|
||||
key_segs++;
|
||||
bzero((char*) &keydef[i].block,sizeof(keydef[i].block));
|
||||
bzero((char*) &keydef[i].rb_tree ,sizeof(keydef[i].rb_tree));
|
||||
for (j=length=0 ; j < keydef[i].keysegs; j++)
|
||||
{
|
||||
length+=keydef[i].seg[j].length;
|
||||
if (keydef[i].seg[j].null_bit &&
|
||||
!(keydef[i].flag & HA_NULL_ARE_EQUAL))
|
||||
keydef[i].flag |= HA_NULL_PART_KEY;
|
||||
if (keydef[i].algorithm == HA_KEY_ALG_BTREE &&
|
||||
keydef[i].seg[j].null_bit)
|
||||
keydef[i].rb_tree.size_of_element++;
|
||||
if (keydef[i].seg[j].null_bit)
|
||||
{
|
||||
if (!(keydef[i].flag & HA_NULL_ARE_EQUAL))
|
||||
keydef[i].flag |= HA_NULL_PART_KEY;
|
||||
if (keydef[i].algorithm == HA_KEY_ALG_BTREE)
|
||||
keydef[i].rb_tree.size_of_element++;
|
||||
}
|
||||
}
|
||||
keydef[i].length= length;
|
||||
keydef[i].ref_offs= length + keydef[i].rb_tree.size_of_element -
|
||||
sizeof(byte*);
|
||||
if (length + keydef[i].rb_tree.size_of_element > max_length)
|
||||
max_length= length + keydef[i].rb_tree.size_of_element;
|
||||
keydef[i].length= length;
|
||||
length+= keydef[i].rb_tree.size_of_element +
|
||||
((keydef[i].algorithm == HA_KEY_ALG_BTREE) ? sizeof(byte*) : 0);
|
||||
if (length > max_length)
|
||||
max_length= length;
|
||||
}
|
||||
if (!(share = (HP_SHARE*) my_malloc((uint) sizeof(HP_SHARE)+
|
||||
if (!(share= (HP_SHARE*) my_malloc((uint) sizeof(HP_SHARE)+
|
||||
keys*sizeof(HP_KEYDEF)+
|
||||
key_segs*sizeof(HA_KEYSEG),
|
||||
MYF(MY_ZEROFILL))))
|
||||
@ -78,44 +81,46 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef,
|
||||
pthread_mutex_unlock(&THR_LOCK_heap);
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
share->keydef=(HP_KEYDEF*) (share+1);
|
||||
keyseg=(HA_KEYSEG*) (share->keydef+keys);
|
||||
init_block(&share->block,reclength+1,min_records,max_records);
|
||||
share->keydef= (HP_KEYDEF*) (share + 1);
|
||||
keyseg= (HA_KEYSEG*) (share->keydef + keys);
|
||||
init_block(&share->block, reclength + 1, min_records, max_records);
|
||||
/* Fix keys */
|
||||
memcpy(share->keydef,keydef,(size_t) (sizeof(keydef[0])*keys));
|
||||
for (i=0 ; i < keys ; i++)
|
||||
memcpy(share->keydef, keydef, (size_t) (sizeof(keydef[0]) * keys));
|
||||
for (i= 0; i < keys; i++)
|
||||
{
|
||||
HP_KEYDEF *keyinfo = share->keydef + i;
|
||||
keyinfo->seg = keyseg;
|
||||
memcpy(keyseg, keydef[i].seg,
|
||||
(size_t) (sizeof(keyseg[0]) * keydef[i].keysegs));
|
||||
keyseg += keydef[i].keysegs;
|
||||
HP_KEYDEF *keyinfo= share->keydef + i;
|
||||
uint nsegs= keydef[i].keysegs;
|
||||
|
||||
if (keydef[i].algorithm == HA_KEY_ALG_BTREE)
|
||||
{
|
||||
init_tree(&keyinfo->rb_tree, 0, 0, keydef[i].length +
|
||||
keydef[i].rb_tree.size_of_element,
|
||||
(qsort_cmp2)keys_compare, 1, NULL, NULL);
|
||||
keyinfo->delete_key = hp_rb_delete_key;
|
||||
keyinfo->write_key = hp_rb_write_key;
|
||||
init_tree(&keyinfo->rb_tree, 0, 0, 0, (qsort_cmp2)keys_compare, 1,
|
||||
NULL, NULL);
|
||||
keyinfo->delete_key= hp_rb_delete_key;
|
||||
keyinfo->write_key= hp_rb_write_key;
|
||||
nsegs++;
|
||||
}
|
||||
else
|
||||
{
|
||||
init_block(&keyinfo->block, sizeof(HASH_INFO), min_records,
|
||||
max_records);
|
||||
keyinfo->delete_key = hp_delete_key;
|
||||
keyinfo->write_key = hp_write_key;
|
||||
keyinfo->delete_key= hp_delete_key;
|
||||
keyinfo->write_key= hp_write_key;
|
||||
}
|
||||
keyinfo->seg= keyseg;
|
||||
memcpy(keyseg, keydef[i].seg,
|
||||
(size_t) (sizeof(keyseg[0]) * nsegs));
|
||||
keyseg+= nsegs;
|
||||
}
|
||||
|
||||
share->min_records=min_records;
|
||||
share->max_records=max_records;
|
||||
share->data_length=share->index_length=0;
|
||||
share->reclength=reclength;
|
||||
share->blength=1;
|
||||
share->keys=keys;
|
||||
share->max_key_length=max_length;
|
||||
share->changed=0;
|
||||
if (!(share->name=my_strdup(name,MYF(0))))
|
||||
share->min_records= min_records;
|
||||
share->max_records= max_records;
|
||||
share->data_length= share->index_length= 0;
|
||||
share->reclength= reclength;
|
||||
share->blength= 1;
|
||||
share->keys= keys;
|
||||
share->max_key_length= max_length;
|
||||
share->changed= 0;
|
||||
if (!(share->name= my_strdup(name,MYF(0))))
|
||||
{
|
||||
my_free((gptr) share,MYF(0));
|
||||
pthread_mutex_unlock(&THR_LOCK_heap);
|
||||
@ -125,8 +130,8 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef,
|
||||
thr_lock_init(&share->lock);
|
||||
VOID(pthread_mutex_init(&share->intern_lock,MY_MUTEX_INIT_FAST));
|
||||
#endif
|
||||
share->open_list.data=(void*) share;
|
||||
heap_share_list=list_add(heap_share_list,&share->open_list);
|
||||
share->open_list.data= (void*) share;
|
||||
heap_share_list= list_add(heap_share_list,&share->open_list);
|
||||
}
|
||||
if (!(info= (HP_INFO*) my_malloc((uint) sizeof(HP_INFO)+
|
||||
2 * share->max_key_length,
|
||||
@ -139,21 +144,21 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef,
|
||||
#ifdef THREAD
|
||||
thr_lock_data_init(&share->lock,&info->lock,NULL);
|
||||
#endif
|
||||
info->open_list.data=(void*) info;
|
||||
heap_open_list=list_add(heap_open_list,&info->open_list);
|
||||
info->open_list.data= (void*) info;
|
||||
heap_open_list= list_add(heap_open_list,&info->open_list);
|
||||
pthread_mutex_unlock(&THR_LOCK_heap);
|
||||
|
||||
info->s=share;
|
||||
info->lastkey=(byte*) (info+1);
|
||||
info->recbuf = (byte*) (info->lastkey + share->max_key_length);
|
||||
info->mode=mode;
|
||||
info->s= share;
|
||||
info->lastkey= (byte*) (info + 1);
|
||||
info->recbuf= (byte*) (info->lastkey + share->max_key_length);
|
||||
info->mode= mode;
|
||||
info->current_record= (ulong) ~0L; /* No current record */
|
||||
info->current_ptr=0;
|
||||
info->current_hash_ptr=0;
|
||||
info->lastinx= info->errkey= -1;
|
||||
info->update=0;
|
||||
info->current_ptr= 0;
|
||||
info->current_hash_ptr= 0;
|
||||
info->lastinx= info->errkey= -1;
|
||||
info->update= 0;
|
||||
#ifndef DBUG_OFF
|
||||
info->opt_flag=READ_CHECK_USED; /* Check when changing */
|
||||
info->opt_flag= READ_CHECK_USED; /* Check when changing */
|
||||
#endif
|
||||
DBUG_PRINT("exit",("heap: %lx reclength: %d records_in_block: %d",
|
||||
info,share->reclength,share->block.records_in_block));
|
||||
|
Reference in New Issue
Block a user