YoushouldhavereceivedacopyoftheGNUGeneralPublicLicense alongwiththisprogram;ifnot,writetotheFreeSoftware
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
/* Test av isam-databas: stor test */
#ifndef USE_MY_FUNC /* We want to be able to dbug this !! */ #define USE_MY_FUNC #endif #include"myisamdef.h" #include <m_ctype.h> #include <my_bit.h>
if (mi_write(file,record))
{ if (my_errno != HA_ERR_FOUND_DUPP_KEY || key3[n3] == 0)
{
printf("Error: %d in write at record: %d\n",my_errno,i); goto err;
} if (verbose) printf(" Double key: %d\n",n3);
} else
{ if (key3[n3] == 1 && first_key <3 && first_key+keys >= 3)
{
printf("Error: Didn't get error when writing second key: '%8d'\n",n3); goto err;
}
write_count++; key1[n1]++; key3[n3]=1;
}
/* Check if we can find key without flushing database */ if (i == recant/2)
{ for (j=rnd(1000)+1 ; j>0 && key1[j] == 0 ; j--) ; if (!j) for (j=999 ; j>0 && key1[j] == 0 ; j--) ;
snprintf((char*) key, sizeof(key), "%6d",j); if (mi_rkey(file,read_record,0,key,HA_WHOLE_KEY,HA_READ_KEY_EXACT))
{
printf("Test in loop: Can't find key: \"%s\"\n",key); goto err;
}
}
} if (testflag==1) goto end;
if (write_cacheing)
{ if (mi_extra(file,HA_EXTRA_NO_CACHE,0))
{
puts("got error from mi_extra(HA_EXTRA_NO_CACHE)"); goto end;
}
} if (key_cacheing)
resize_key_cache(dflt_key_cache,key_cache_block_size,key_cache_size*2, 0, 0, 0);
if (!silent)
printf("- Delete\n"); for (i=0 ; i<recant/10 ; i++)
{ for (j=rnd(1000)+1 ; j>0 && key1[j] == 0 ; j--) ; if (j != 0)
{
snprintf((char*) key, sizeof(key), "%6d",j); if (mi_rkey(file,read_record,0,key,HA_WHOLE_KEY,HA_READ_KEY_EXACT))
{
printf("can't find key1: \"%s\"\n",key); goto err;
} if (opt_delete == (uint) remove_count) /* While testing */ goto end; if (mi_delete(file,read_record))
{
printf("error: %d; can't delete record: \"%s\"\n", my_errno,read_record); goto err;
}
opt_delete++;
key1[atoi((char*) read_record+keyinfo[0].seg[0].start)]--;
key3[atoi((char*) read_record+keyinfo[2].seg[0].start)]=0;
} else
puts("Warning: Skipping delete test because no dupplicate keys");
} if (testflag==2) goto end;
for (j=rnd(1000)+1 ; j>0 && key1[j] == 0 ; j--) ; if (j != 0)
{
snprintf((char*) key, sizeof(key), "%6d",j); if (mi_rkey(file,read_record,0,key,HA_WHOLE_KEY,HA_READ_KEY_EXACT))
{
printf("can't find key1: \"%s\"\n",(char*) key); goto err;
} if (use_blob)
{ if (i & 1)
put_blob_in_record(record2+blob_pos,&blob_buffer); else
bmove(record2+blob_pos,read_record+blob_pos,8);
} if (mi_update(file,read_record,record2))
{ if (my_errno != HA_ERR_FOUND_DUPP_KEY || key3[n3] == 0)
{
printf("error: %d; can't update:\nFrom: \"%s\"\nTo: \"%s\"\n",
my_errno,read_record,record2); goto err;
} if (verbose)
printf("Double key when tried to update:\nFrom: \"%s\"\nTo: \"%s\"\n",record,record2);
} else
{
key1[atoi((char*) read_record+keyinfo[0].seg[0].start)]--;
key3[atoi((char*) read_record+keyinfo[2].seg[0].start)]=0;
key1[n1]++; key3[n3]=1;
update++;
}
}
} if (testflag == 3) goto end;
for (i=999, dupp_keys=j=0 ; i>0 ; i--)
{ if (key1[i] > dupp_keys)
{
dupp_keys=key1[i]; j=i;
}
}
snprintf((char*) key, sizeof(key), "%6d",j);
start=keyinfo[0].seg[0].start;
length=keyinfo[0].seg[0].length; if (dupp_keys)
{ if (!silent)
printf("- Same key: first - next -> last - prev -> first\n");
DBUG_PRINT("progpos",("first - next -> last - prev -> first")); if (verbose) printf(" Using key: \"%s\" Keys: %d\n",key,dupp_keys);
if (mi_rkey(file,read_record,0,key,HA_WHOLE_KEY,HA_READ_KEY_EXACT)) goto err; if (mi_rsame(file,read_record2,-1)) goto err; if (memcmp(read_record,read_record2,reclength) != 0)
{
printf("mi_rsame didn't find same record\n"); goto end;
}
info.recpos=mi_position(file); if (mi_rfirst(file,read_record2,0) ||
mi_rsame_with_pos(file,read_record2,0,info.recpos) ||
memcmp(read_record,read_record2,reclength) != 0)
{
printf("mi_rsame_with_pos didn't find same record\n"); goto end;
}
{ int skr=mi_rnext(file,read_record2,0); if ((skr && my_errno != HA_ERR_END_OF_FILE) ||
mi_rprev(file,read_record2,-1) ||
memcmp(read_record,read_record2,reclength) != 0)
{
printf("mi_rsame_with_pos lost position\n"); goto end;
}
}
ant=1; while (mi_rnext(file,read_record2,0) == 0 &&
memcmp(read_record2+start,key,length) == 0) ant++; if (ant != dupp_keys)
{
printf("next: Found: %d keys of %d\n",ant,dupp_keys); goto end;
}
ant=0; while (mi_rprev(file,read_record3,0) == 0 &&
memcmp(read_record3+start,key,length) == 0) ant++; if (ant != dupp_keys)
{
printf("prev: Found: %d records of %d\n",ant,dupp_keys); goto end;
}
/* Check of mi_rnext_same */ if (mi_rkey(file,read_record,0,key,HA_WHOLE_KEY,HA_READ_KEY_EXACT)) goto err;
ant=1; while (!mi_rnext_same(file,read_record3) && ant < dupp_keys+10)
ant++; if (ant != dupp_keys || my_errno != HA_ERR_END_OF_FILE)
{
printf("mi_rnext_same: Found: %d records of %d\n",ant,dupp_keys); goto end;
}
}
if (!silent)
printf("- All keys: first - next -> last - prev -> first\n");
DBUG_PRINT("progpos",("All keys: first - next -> last - prev -> first"));
ant=1; if (mi_rfirst(file,read_record,0))
{
printf("Can't find first record\n"); goto end;
} while ((error=mi_rnext(file,read_record3,0)) == 0 && ant < write_count+10)
ant++; if (ant != write_count - opt_delete || error != HA_ERR_END_OF_FILE)
{
printf("next: I found: %d records of %d (error: %d)\n",
ant, write_count - opt_delete, error); goto end;
} if (mi_rlast(file,read_record2,0) ||
memcmp(read_record2,read_record3,reclength))
{
printf("Can't find last record\n");
DBUG_DUMP("record2",(uchar*) read_record2,reclength);
DBUG_DUMP("record3",(uchar*) read_record3,reclength); goto end;
}
ant=1; while (mi_rprev(file,read_record3,0) == 0 && ant < write_count+10)
ant++; if (ant != write_count - opt_delete)
{
printf("prev: I found: %d records of %d\n",ant,write_count); goto end;
} if (memcmp(read_record,read_record3,reclength))
{
printf("Can't find first record\n"); goto end;
}
if (!silent)
printf("- Test if: Read first - next - prev - prev - next == first\n");
DBUG_PRINT("progpos",("- Read first - next - prev - prev - next == first")); if (mi_rfirst(file,read_record,0) ||
mi_rnext(file,read_record3,0) ||
mi_rprev(file,read_record3,0) ||
mi_rprev(file,read_record3,0) == 0 ||
mi_rnext(file,read_record3,0)) goto err; if (memcmp(read_record,read_record3,reclength) != 0)
printf("Can't find first record\n");
if (!silent)
printf("- Test if: Read last - prev - next - next - prev == last\n");
DBUG_PRINT("progpos",("Read last - prev - next - next - prev == last")); if (mi_rlast(file,read_record2,0) ||
mi_rprev(file,read_record3,0) ||
mi_rnext(file,read_record3,0) ||
mi_rnext(file,read_record3,0) == 0 ||
mi_rprev(file,read_record3,0)) goto err; if (memcmp(read_record2,read_record3,reclength))
printf("Can't find last record\n"); #ifdef NOT_ANYMORE if (!silent)
puts("- Test read key-part");
strmov(key2,key); for(i=strlen(key2) ; i-- > 1 ;)
{
key2[i]=0;
/* The following row is just to catch some bugs in the key code */
bzero((char*) file->lastkey,file->s->base.max_key_length*2); if (mi_rkey(file,read_record,0,key2,(uint) i,HA_READ_PREFIX)) goto err; if (memcmp(read_record+start,key,(uint) i))
{
puts("Didn't find right record"); goto end;
}
} #endif if (dupp_keys > 2)
{ if (!silent)
printf("- Read key (first) - next - delete - next -> last\n");
DBUG_PRINT("progpos",("first - next - delete - next -> last")); if (mi_rkey(file,read_record,0,key,HA_WHOLE_KEY,HA_READ_KEY_EXACT)) goto err; if (mi_rnext(file,read_record3,0)) goto err; if (mi_delete(file,read_record3)) goto err;
opt_delete++;
ant=1; while (mi_rnext(file,read_record3,0) == 0 &&
memcmp(read_record3+start,key,length) == 0) ant++; if (ant != dupp_keys-1)
{
printf("next: I can only find: %d keys of %d\n",ant,dupp_keys-1); goto end;
}
} if (dupp_keys>4)
{ if (!silent)
printf("- Read last of key - prev - delete - prev -> first\n");
DBUG_PRINT("progpos",("last - prev - delete - prev -> first")); if (mi_rprev(file,read_record3,0)) goto err; if (mi_rprev(file,read_record3,0)) goto err; if (mi_delete(file,read_record3)) goto err;
opt_delete++;
ant=1; while (mi_rprev(file,read_record3,0) == 0 &&
memcmp(read_record3+start,key,length) == 0) ant++; if (ant != dupp_keys-2)
{
printf("next: I can only find: %d keys of %d\n",ant,dupp_keys-2); goto end;
}
} if (dupp_keys > 6)
{ if (!silent)
printf("- Read first - delete - next -> last\n");
DBUG_PRINT("progpos",("first - delete - next -> last")); if (mi_rkey(file,read_record3,0,key,HA_WHOLE_KEY,HA_READ_KEY_EXACT)) goto err; if (mi_delete(file,read_record3)) goto err;
opt_delete++;
ant=1; if (mi_rnext(file,read_record,0)) goto err; /* Skall finnas poster */ while (mi_rnext(file,read_record3,0) == 0 &&
memcmp(read_record3+start,key,length) == 0) ant++; if (ant != dupp_keys-3)
{
printf("next: I can only find: %d keys of %d\n",ant,dupp_keys-3); goto end;
}
if (!silent)
printf("- Read last - delete - prev -> first\n");
DBUG_PRINT("progpos",("last - delete - prev -> first")); if (mi_rprev(file,read_record3,0)) goto err; if (mi_delete(file,read_record3)) goto err;
opt_delete++;
ant=0; while (mi_rprev(file,read_record3,0) == 0 &&
memcmp(read_record3+start,key,length) == 0) ant++; if (ant != dupp_keys-4)
{
printf("next: I can only find: %d keys of %d\n",ant,dupp_keys-4); goto end;
}
}
if (!silent)
puts("- Test if: Read rrnd - same");
DBUG_PRINT("progpos",("Read rrnd - same")); for (i=0 ; i < write_count ; i++)
{ if (mi_rrnd(file,read_record,i == 0 ? 0L : HA_OFFSET_ERROR) == 0) break;
} if (i == write_count) goto err;
bmove(read_record2,read_record,reclength); for (i=MY_MIN(2,keys) ; i-- > 0 ;)
{ if (mi_rsame(file,read_record2,(int) i)) goto err; if (memcmp(read_record,read_record2,reclength) != 0)
{
printf("mi_rsame didn't find same record\n"); goto end;
}
} if (!silent)
puts("- Test mi_records_in_range");
mi_status(file,&info,HA_STATUS_VARIABLE); for (i=0 ; i < info.keys ; i++)
{
key_range min_key, max_key; if (mi_rfirst(file,read_record,(int) i) ||
mi_rlast(file,read_record2,(int) i)) goto err;
copy_key(file,(uint) i,(uchar*) read_record,(uchar*) key);
copy_key(file,(uint) i,(uchar*) read_record2,(uchar*) key2);
min_key.key= key;
min_key.keypart_map= HA_WHOLE_KEY;
min_key.flag= HA_READ_KEY_EXACT;
max_key.key= key2;
max_key.keypart_map= HA_WHOLE_KEY;
max_key.flag= HA_READ_AFTER_KEY;
range_records= mi_records_in_range(file,(int) i, &min_key, &max_key,
&pages); if (range_records < info.records*8/10 ||
range_records > info.records*12/10)
{
printf("mi_records_range returned %ld; Should be about %ld\n",
(long) range_records,(long) info.records); goto end;
} if (verbose)
{
printf("mi_records_range returned %ld; Exact is %ld (diff: %4.2g %%)\n",
(long) range_records, (long) info.records,
labs((long) range_records - (long) info.records)*100.0/
info.records);
}
} for (i=0 ; i < 5 ; i++)
{ for (j=rnd(1000)+1 ; j>0 && key1[j] == 0 ; j--) ; for (k=rnd(1000)+1 ; k>0 && key1[k] == 0 ; k--) ; if (j != 0 && k != 0)
{
key_range min_key, max_key;
page_range pages; if (j > k)
swap_variables(int, j, k);
snprintf((char*) key, sizeof(key), "%6d",j);
snprintf((char*) key2, sizeof(key2), "%6d",k);
min_key.key= key;
min_key.keypart_map= HA_WHOLE_KEY;
min_key.flag= HA_READ_AFTER_KEY;
max_key.key= key2;
max_key.keypart_map= HA_WHOLE_KEY;
max_key.flag= HA_READ_BEFORE_KEY;
range_records= mi_records_in_range(file, 0, &min_key, &max_key, &pages);
records=0; for (j++ ; j < k ; j++)
records+=key1[j]; if ((long) range_records < (long) records*7/10-2 ||
(long) range_records > (long) records*14/10+2)
{
printf("mi_records_range for key: %d returned %lu; Should be about %lu\n",
i, (ulong) range_records, (ulong) records); goto end;
} if (verbose && records)
{
printf("mi_records_range returned %lu; Exact is %lu (diff: %4.2g %%)\n",
(ulong) range_records, (ulong) records,
labs((long) range_records-(long) records)*100.0/records);
}
}
}
if (!silent)
printf("- mi_info\n");
mi_status(file,&info,HA_STATUS_VARIABLE | HA_STATUS_CONST); if (info.records != write_count-opt_delete || info.deleted > opt_delete + update
|| info.keys != keys)
{
puts("Wrong info from mi_info");
printf("Got: records: %lu delete: %lu i_keys: %d\n",
(ulong) info.records, (ulong) info.deleted, info.keys);
} if (verbose)
{ char buff[80];
get_date(buff,sizeof(buff),3,info.create_time);
printf("info: Created %s\n",buff);
get_date(buff,sizeof(buff),3,info.check_time);
printf("info: checked %s\n",buff);
get_date(buff,sizeof(buff),3,info.update_time);
printf("info: Modified %s\n",buff);
}
mi_panic(HA_PANIC_WRITE);
mi_panic(HA_PANIC_READ); if (mi_is_changed(file))
puts("Warning: mi_is_changed reported that datafile was changed");
if (!silent)
printf("- mi_extra(CACHE) + mi_rrnd.... + mi_extra(NO_CACHE)\n"); if (mi_reset(file) || mi_extra(file,HA_EXTRA_CACHE,0))
{ if (do_locking || (!use_blob && !pack_fields))
{
puts("got error from mi_extra(HA_EXTRA_CACHE)"); goto end;
}
}
ant=0; while ((error=mi_rrnd(file,record,HA_OFFSET_ERROR)) != HA_ERR_END_OF_FILE &&
ant < write_count + 10)
ant+= error ? 0 : 1; if (ant != write_count-opt_delete)
{
printf("rrnd with cache: I can only find: %d records of %d\n",
ant,write_count-opt_delete); goto end;
} if (mi_extra(file,HA_EXTRA_NO_CACHE,0))
{
puts("got error from mi_extra(HA_EXTRA_NO_CACHE)"); goto end;
}
ant=0;
mi_scan_init(file); while ((error=mi_scan(file,record)) != HA_ERR_END_OF_FILE &&
ant < write_count + 10)
ant+= error ? 0 : 1; if (ant != write_count-opt_delete)
{
printf("scan with cache: I can only find: %d records of %d\n",
ant,write_count-opt_delete); goto end;
}
if (testflag == 4) goto end;
if (!silent)
printf("- Removing keys\n");
DBUG_PRINT("progpos",("Removing keys"));
lastpos = HA_OFFSET_ERROR; /* DBUG_POP(); */
mi_reset(file);
found_parts=0; while ((error=mi_rrnd(file,read_record,HA_OFFSET_ERROR)) !=
HA_ERR_END_OF_FILE)
{
info.recpos=mi_position(file); if (lastpos >= info.recpos && lastpos != HA_OFFSET_ERROR)
{
printf("mi_rrnd didn't advance filepointer; old: %ld, new: %ld\n",
(long) lastpos, (long) info.recpos); goto err;
}
lastpos=info.recpos; if (error == 0)
{ if (opt_delete == (uint) remove_count) /* While testing */ goto end; if (mi_rsame(file,read_record,-1))
{
printf("can't find record %lx\n",(long) info.recpos); goto err;
} if (use_blob)
{
ulong blob_length,pos;
uchar *ptr;
memcpy(&ptr, read_record+blob_pos+4, sizeof(ptr));
blob_length= uint4korr(read_record+blob_pos); for (pos=0 ; pos < blob_length ; pos++)
{ if (ptr[pos] != (uchar) (blob_length+pos))
{
printf("found blob with wrong info at %ld\n",(long) lastpos);
use_blob=0; break;
}
}
} if (mi_delete(file,read_record))
{
printf("can't delete record: %6.6s, delete_count: %d\n",
read_record, opt_delete); goto err;
}
opt_delete++;
} else
found_parts++;
} if (my_errno != HA_ERR_END_OF_FILE && my_errno != HA_ERR_RECORD_DELETED)
printf("error: %d from mi_rrnd\n",my_errno); if (write_count != opt_delete)
{
printf("Deleted only %d of %d records (%d parts)\n",opt_delete,write_count,
found_parts); goto err;
}
end: if (mi_close(file)) goto err;
mi_panic(HA_PANIC_CLOSE); /* Should close log */ if (!silent)
{
KEY_CACHE_STATISTICS stats;
printf("\nFollowing test have been made:\n");
printf("Write records: %d\nUpdate records: %d\nSame-key-read: %d\nDelete records: %d\n", write_count,update,dupp_keys,opt_delete); if (rec_pointer_size)
printf("Record pointer size: %d\n",rec_pointer_size);
printf("myisam_block_size: %lu\n", myisam_block_size); if (key_cacheing)
{
puts("Key cache used");
printf("key_cache_block_size: %u\n", key_cache_block_size); if (write_cacheing)
puts("Key cache resized");
} if (write_cacheing)
puts("Write cacheing used"); if (write_cacheing)
puts("quick mode"); if (async_io && do_locking)
puts("Asyncron io with locking used"); elseif (do_locking)
puts("Locking used"); if (use_blob)
puts("blobs used");
bzero(&stats, sizeof(stats));
get_key_cache_statistics(dflt_key_cache, 0, &stats);
printf("key cache status: \n\
blocks used:%10lu\n\ not flushed:%10lu\n\
w_requests: %10lu\n\
writes: %10lu\n\
r_requests: %10lu\n\
reads: %10lu\n",
(ulong) stats.blocks_used,
(ulong) stats.blocks_changed,
(ulong) stats.write_requests,
(ulong) stats.writes,
(ulong) stats.read_requests,
(ulong) stats.reads);
}
end_key_cache(dflt_key_cache,1); if (blob_buffer)
my_free(blob_buffer);
my_end(silent ? MY_CHECK_ERROR : MY_CHECK_ERROR | MY_GIVE_INFO); return(0);
err:
printf("got error: %d when using MyISAM-database\n",my_errno); if (file)
(void) mi_close(file); return(1);
} /* main */
/* l{ser optioner */ /* OBS! intierar endast DEBUG - ingen debuggning h{r ! */
[Original von:0.20Diese Quellcodebibliothek enthält Beispiele in vielen Programmiersprachen.
Man kann per Verzeichnistruktur darin navigieren.
Der Code wird farblich markiert angezeigt.Datei übertragen2026-10-08]