diff options
author | unknown <ram@gw.udmsearch.izhnet.ru> | 2002-06-07 16:47:36 +0500 |
---|---|---|
committer | unknown <ram@gw.udmsearch.izhnet.ru> | 2002-06-07 16:47:36 +0500 |
commit | 6192996d17bb37e87a62a5e92f9e89330ccc6f28 (patch) | |
tree | 563098f1aa3cf848c7c56670c3c82ebf4dd4a9d6 /heap/hp_open.c | |
parent | fa86b948379ca3929ebd8a7b941d6c2fbb26f8ec (diff) | |
download | mariadb-git-6192996d17bb37e87a62a5e92f9e89330ccc6f28.tar.gz |
heap_create() <-> heap_open()
Diffstat (limited to 'heap/hp_open.c')
-rw-r--r-- | heap/hp_open.c | 155 |
1 files changed, 13 insertions, 142 deletions
diff --git a/heap/hp_open.c b/heap/hp_open.c index d48423c506a..1fa832208fb 100644 --- a/heap/hp_open.c +++ b/heap/hp_open.c @@ -23,130 +23,27 @@ #include "my_sys.h" -static int keys_compare(heap_rb_param *param, uchar *key1, uchar *key2) +HP_INFO *heap_open(const char *name, int mode) { - uint not_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, - ulong max_records); - - /* open a heap database. */ - -HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef, - uint reclength, ulong max_records, ulong min_records) -{ - uint i,j,key_segs,max_length,length; HP_INFO *info; HP_SHARE *share; - HA_KEYSEG *keyseg; DBUG_ENTER("heap_open"); - pthread_mutex_lock(&THR_LOCK_heap); - if (!(share = hp_find_named_heap(name))) + if (!(share= hp_find_named_heap(name))) { - HP_KEYDEF *keyinfo; - DBUG_PRINT("info",("Initializing new table")); - for (i=key_segs=max_length=0, keyinfo= keydef; i < keys; i++, keyinfo++) - { - bzero((char*) &keyinfo->block,sizeof(keyinfo->block)); - bzero((char*) &keyinfo->rb_tree ,sizeof(keyinfo->rb_tree)); - for (j=length=0 ; j < keyinfo->keysegs; j++) - { - length+=keyinfo->seg[j].length; - if (keyinfo->seg[j].null_bit) - { - if (!(keyinfo->flag & HA_NULL_ARE_EQUAL)) - keyinfo->flag |= HA_NULL_PART_KEY; - if (keyinfo->algorithm == HA_KEY_ALG_BTREE) - keyinfo->rb_tree.size_of_element++; - } - } - keyinfo->length= length; - length+= keyinfo->rb_tree.size_of_element + - ((keyinfo->algorithm == HA_KEY_ALG_BTREE) ? sizeof(byte*) : 0); - if (length > max_length) - max_length= length; - key_segs+= keyinfo->keysegs; - if (keyinfo->algorithm == HA_KEY_ALG_BTREE) - { - key_segs++; /* additional HA_KEYTYPE_END segment */ - if (keyinfo->flag & HA_NULL_PART_KEY) - keyinfo->get_key_length = hp_rb_null_key_length; - else - keyinfo->get_key_length = hp_rb_key_length; - } - } - if (!(share= (HP_SHARE*) my_malloc((uint) sizeof(HP_SHARE)+ - keys*sizeof(HP_KEYDEF)+ - key_segs*sizeof(HA_KEYSEG), - MYF(MY_ZEROFILL)))) - { - 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); - /* Fix keys */ - memcpy(share->keydef, keydef, (size_t) (sizeof(keydef[0]) * keys)); - for (i= 0, keyinfo= share->keydef; i < keys; i++, keyinfo++) - { - uint nsegs= keydef[i].keysegs; - - if (keydef[i].algorithm == HA_KEY_ALG_BTREE) - { - init_tree(&keyinfo->rb_tree, 0, 0, sizeof(byte*), - (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->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)))) - { - my_free((gptr) share,MYF(0)); - pthread_mutex_unlock(&THR_LOCK_heap); - DBUG_RETURN(0); - } -#ifdef THREAD - 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); + my_errno= ENOENT; + pthread_mutex_unlock(&THR_LOCK_heap); + DBUG_RETURN(0); } - if (!(info= (HP_INFO*) my_malloc((uint) sizeof(HP_INFO)+ + if (!(info= (HP_INFO*) my_malloc((uint) sizeof(HP_INFO) + 2 * share->max_key_length, MYF(MY_ZEROFILL)))) { pthread_mutex_unlock(&THR_LOCK_heap); DBUG_RETURN(0); } - share->open_count++; + share->open_count++; #ifdef THREAD thr_lock_data_init(&share->lock,&info->lock,NULL); #endif @@ -169,8 +66,7 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef, DBUG_PRINT("exit",("heap: %lx reclength: %d records_in_block: %d", info,share->reclength,share->block.records_in_block)); DBUG_RETURN(info); -} /* heap_open */ - +} /* map name to a heap-nr. If name isn't found return 0 */ @@ -181,41 +77,16 @@ HP_SHARE *hp_find_named_heap(const char *name) DBUG_ENTER("heap_find"); DBUG_PRINT("enter",("name: %s",name)); - for (pos=heap_share_list ; pos ; pos=pos->next) + for (pos= heap_share_list; pos; pos= pos->next) { - info=(HP_SHARE*) pos->data; - if (!strcmp(name,info->name)) + info= (HP_SHARE*) pos->data; + if (!strcmp(name, info->name)) { - DBUG_PRINT("exit",("Old heap_database: %lx",info)); + DBUG_PRINT("exit", ("Old heap_database: %lx",info)); DBUG_RETURN(info); } } - DBUG_RETURN((HP_SHARE *)0); + DBUG_RETURN((HP_SHARE *) 0); } -static void init_block(HP_BLOCK *block, uint reclength, ulong min_records, - ulong max_records) -{ - uint i,recbuffer,records_in_block; - - max_records=max(min_records,max_records); - if (!max_records) - max_records=1000; /* As good as quess as anything */ - recbuffer=(uint) (reclength+sizeof(byte**)-1) & ~(sizeof(byte**)-1); - records_in_block=max_records/10; - if (records_in_block < 10 && max_records) - records_in_block=10; - if (!records_in_block || records_in_block*recbuffer > - (my_default_record_cache_size-sizeof(HP_PTRS)*HP_MAX_LEVELS)) - records_in_block=(my_default_record_cache_size-sizeof(HP_PTRS)* - HP_MAX_LEVELS)/recbuffer+1; - block->records_in_block=records_in_block; - block->recbuffer=recbuffer; - block->last_allocated= 0L; - - for (i=0 ; i <= HP_MAX_LEVELS ; i++) - block->level_info[i].records_under_level= - (!i ? 1 : i == 1 ? records_in_block : - HP_PTRS_IN_NOD * block->level_info[i-1].records_under_level); -} |