51
51
hash_get_key get_key,
52
52
void (*free_element)(void*),uint flags CALLER_INFO_PROTO)
54
DBUG_ENTER("hash_init");
55
DBUG_PRINT("enter",("hash: 0x%lx size: %u", (long) hash, (uint) size));
58
55
if (my_init_dynamic_array_ci(&hash->array, sizeof(HASH_LINK), size,
61
58
hash->free=0; /* Allow call to hash_free */
64
61
hash->key_offset=key_offset;
65
62
hash->key_length=key_length;
109
106
void hash_free(HASH *hash)
111
DBUG_ENTER("hash_free");
112
DBUG_PRINT("enter",("hash: 0x%lx", (long) hash));
114
108
hash_free_elements(hash);
116
110
delete_dynamic(&hash->array);
129
123
void my_hash_reset(HASH *hash)
131
DBUG_ENTER("my_hash_reset");
132
DBUG_PRINT("enter",("hash: 0x%lxd", (long) hash));
134
125
hash_free_elements(hash);
135
126
reset_dynamic(&hash->array);
136
127
/* Set row pointers so that the hash can be reused at once */
137
128
hash->blength= 1;
141
132
/* some helper functions */
216
206
pos= dynamic_element(&hash->array,idx,HASH_LINK*);
217
207
if (!hashcmp(hash,pos,key,length))
219
DBUG_PRINT("exit",("found key at %d",idx));
220
209
*current_record= idx;
221
DBUG_RETURN (pos->data);
449
438
uint blength,pos2,pos_hashnr,lastpos_hashnr,idx,empty_index;
450
439
HASH_LINK *data,*lastpos,*gpos,*pos,*pos3,*empty;
451
DBUG_ENTER("hash_delete");
452
440
if (!hash->records)
455
443
blength=hash->blength;
456
444
data=dynamic_element(&hash->array,0,HASH_LINK*);
537
525
uint new_index,new_pos_index,blength,records,empty;
539
527
HASH_LINK org_link,*data,*previous,*pos;
540
DBUG_ENTER("hash_update");
542
529
if (HASH_UNIQUE & hash->flags)
550
537
if (found != record)
551
DBUG_RETURN(1); /* Duplicate entry */
538
return(1); /* Duplicate entry */
553
540
while ((found= hash_next(hash, new_key, idx, &state)));
565
552
blength,records);
566
553
new_index=hash_mask(rec_hashnr(hash,record),blength,records);
567
554
if (idx == new_index)
568
DBUG_RETURN(0); /* Nothing to do (No record check) */
555
return(0); /* Nothing to do (No record check) */
649
636
if (*current_record != NO_RECORD) /* Safety */
650
637
dynamic_element(&hash->array, *current_record, HASH_LINK*)->data= new_row;
656
bool hash_check(HASH *hash)
659
uint i,rec_link,found,max_links,seek,links,idx;
660
uint records,blength;
661
HASH_LINK *data,*hash_info;
663
records=hash->records; blength=hash->blength;
664
data=dynamic_element(&hash->array,0,HASH_LINK*);
667
for (i=found=max_links=seek=0 ; i < records ; i++)
669
if (hash_rec_mask(hash,data+i,blength,records) == i)
671
found++; seek++; links=1;
672
for (idx=data[i].next ;
673
idx != NO_RECORD && found < records + 1;
679
("Found pointer outside array to %d from link starting at %d",
685
if ((rec_link=hash_rec_mask(hash,hash_info,blength,records)) != i)
688
("Record in wrong link at %d: Start %d Record: 0x%lx Record-link %d",
689
idx, i, (long) hash_info->data, rec_link));
695
if (links > max_links) max_links=links;
698
if (found != records)
700
DBUG_PRINT("error",("Found %u of %u records", found, records));
705
("records: %u seeks: %d max links: %d hitrate: %.2f",
706
records,seek,max_links,(float) seek / (float) records));