YoushouldhavereceivedacopyoftheGNUGeneralPublicLicense alongwiththisprogram;ifnot,writetotheFreeSoftware
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
for (i=0 ; i < recant ; i++)
{
n1=rnd(1000); n2=rnd(100); n3=rnd(MY_MIN(recant*5,MAX_RECORDS));
record= (char*) my_malloc(reclength,MYF(MY_FAE));
snprintf(record, reclength, "%6d:%4d:%8d:Pos: %4d ",n1,n2,n3,write_count); if (my_hash_insert(&hash,record))
{
printf("Error: %d in write at record: %d\n",my_errno,i); goto err;
}
key1[n1]++;
key_check+=n1;
write_count++;
} if (hash_check(&hash))
{
puts("Heap keys crashed"); goto err;
}
printf("- Delete\n"); for (i=0 ; i < write_count/10 ; i++)
{ for (j=rnd(1000) ; j>0 && key1[j] == 0 ; j--) ; if (j != 0)
{
snprintf(key, sizeof(key), "%6d",j); if (!(recpos=hash_search(&hash,key,0)))
{
printf("can't find key1: \"%s\"\n",key); goto err;
}
key1[atoi(recpos)]--;
key_check-=atoi(recpos);
memcpy(oldrecord,recpos,reclength); if (hash_delete(&hash,recpos))
{
printf("error: %d; can't delete record: \"%s\"\n", my_errno,oldrecord); goto err;
} delete++; if (testflag == 2 && hash_check(&hash))
{
puts("Heap keys crashed"); goto err;
}
}
} if (hash_check(&hash))
{
puts("Hash keys crashed"); goto err;
}
printf("- Update\n"); for (i=0 ; i < write_count/10 ; i++)
{
n1=rnd(1000); n2=rnd(100); n3=rnd(MY_MIN(recant*2,MAX_RECORDS)); for (j=rnd(1000) ; j>0 && key1[j] == 0 ; j--) ; if (j)
{
snprintf(key, sizeof(key), "%6d",j); if (!(recpos=hash_search(&hash,key,0)))
{
printf("can't find key1: \"%s\"\n",key); goto err;
}
key1[atoi(recpos)]--;
key_check=key_check-atoi(recpos)+n1;
key1[n1]++;
snprintf(recpos, reclength, "%6d:%4d:%8d:XXX: %4d ",n1,n2,n3,update);
update++; if (hash_update(&hash,recpos,key,0))
{
printf("can't update key1: \"%s\"\n",key); goto err;
} if (testflag == 3 && hash_check(&hash))
{
printf("Heap keys crashed for %d update\n",update); goto err;
}
}
} if (hash_check(&hash))
{
puts("Heap keys crashed"); goto err;
}
for (j=0 ; j < 1000 ; j++) if (key1[j] > 1) break; // j will be 1000 only if we have no keys in the hash. This only happens // when the parameter recant is set to 0 via command line argument. if (j < 1000 && key1[j] > 1)
{
HASH_SEARCH_STATE state;
printf("- Testing identical read\n");
snprintf(key, sizeof(key), "%6d",j);
pos=1; if (!(recpos= hash_first(&hash, key, 0, &state)))
{
printf("can't find key1: \"%s\"\n",key); goto err;
} while (hash_next(&hash, key, 0, &state) && pos < (ulong) (key1[j]+10))
pos++; if (pos != (ulong) key1[j])
{
printf("Found %ld copies of key: %s. Should be %d",pos,key,key1[j]); goto err;
}
}
printf("- Creating output heap-file 2\n"); if (hash_init(&hash2, default_charset_info, hash.records, 0, 0, hash2_key, free_record,0)) goto err;
printf("- Copying and removing records\n");
pos=0; while ((recpos=hash_element(&hash,0)))
{
record=(uchar*) my_malloc(reclength,MYF(MY_FAE));
memcpy(record,recpos,reclength);
record[reclength-1]=rnd(5)+1; if (my_hash_insert(&hash2,record))
{
printf("Got error when inserting record: %*s",reclength,record); goto err;
}
key_check-=atoi(record);
write_count++; if (hash_delete(&hash,recpos))
{
printf("Got error when deleting record: %*s",reclength,recpos); goto err;
} if (testflag==4)
{ if (hash_check(&hash) || hash_check(&hash2))
{
puts("Hash keys crashed"); goto err;
}
}
pos++;
} if (hash_check(&hash) || hash_check(&hash2))
{
puts("Hash keys crashed"); goto err;
} if (key_check != 0)
{
printf("Key check didn't get to 0 (%ld)\n",key_check);
}
printf("\nFollowing test have been made:\n");
printf("Write records: %d\nUpdate records: %d\nDelete records: %d\n", write_count,
update,delete);
hash_free(&hash); hash_free(&hash2);
my_end(MY_GIVE_INFO);
DBUG_RETURN(0);
err:
printf("Got error: %d when using hashing\n",my_errno);
DBUG_RETURN(-1);
} /* main */
/* read options */ /* NOTE! DBUG not initialised - no debugging here! */