summaryrefslogtreecommitdiff
path: root/heap/hp_open.c
diff options
context:
space:
mode:
authorunknown <ram@gw.udmsearch.izhnet.ru>2002-06-07 16:47:36 +0500
committerunknown <ram@gw.udmsearch.izhnet.ru>2002-06-07 16:47:36 +0500
commit6192996d17bb37e87a62a5e92f9e89330ccc6f28 (patch)
tree563098f1aa3cf848c7c56670c3c82ebf4dd4a9d6 /heap/hp_open.c
parentfa86b948379ca3929ebd8a7b941d6c2fbb26f8ec (diff)
downloadmariadb-git-6192996d17bb37e87a62a5e92f9e89330ccc6f28.tar.gz
heap_create() <-> heap_open()
Diffstat (limited to 'heap/hp_open.c')
-rw-r--r--heap/hp_open.c155
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, &not_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);
-}