diff options
Diffstat (limited to 'heap/_check.c')
-rw-r--r-- | heap/_check.c | 69 |
1 files changed, 61 insertions, 8 deletions
diff --git a/heap/_check.c b/heap/_check.c index e22eb5e7e4a..6cc19aba137 100644 --- a/heap/_check.c +++ b/heap/_check.c @@ -1,15 +1,15 @@ /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ @@ -21,19 +21,70 @@ static int check_one_key(HP_KEYDEF *keydef, uint keynr, ulong records, ulong blength, my_bool print_status); -/* Returns 0 if the HEAP is ok */ +/* + Check if keys and rows are ok in a heap table + + SYNOPSIS + heap_check_heap() + info Table handler + print_status Prints some extra status + + NOTES + Doesn't change the state of the table handler + + RETURN VALUES + 0 ok + 1 error +*/ int heap_check_heap(HP_INFO *info,my_bool print_status) { int error; uint key; + ulong records=0, deleted=0, pos, next_block; HP_SHARE *share=info->s; - DBUG_ENTER("heap_check_keys"); + HP_INFO save_info= *info; /* Needed because scan_init */ + DBUG_ENTER("heap_check_heap"); - for (error=key=0 ; key < share->keys ; key++) + for (error=key= 0 ; key < share->keys ; key++) error|=check_one_key(share->keydef+key,key, share->records,share->blength, print_status); + /* + This is basicly the same code as in hp_scan, but we repeat it here to + get shorter DBUG log file. + */ + for (pos=next_block= 0 ; ; pos++) + { + if (pos < next_block) + { + info->current_ptr+= share->block.recbuffer; + } + else + { + next_block+= share->block.records_in_block; + if (next_block >= share->records+share->deleted) + { + next_block= share->records+share->deleted; + if (pos >= next_block) + break; /* End of file */ + } + } + _hp_find_record(info,pos); + + if (!info->current_ptr[share->reclength]) + deleted++; + else + records++; + } + + if (records != share->records || deleted != share->deleted) + { + DBUG_PRINT("error",("Found rows: %lu (%lu) deleted %lu (%lu)", + records, share->records, deleted, share->deleted)); + error= 1; + } + *info= save_info; DBUG_RETURN(error); } @@ -79,9 +130,11 @@ static int check_one_key(HP_KEYDEF *keydef, uint keynr, ulong records, } DBUG_PRINT("info", ("records: %ld seeks: %d max links: %d hitrate: %.2f", - records,seek,max_links,(float) seek / (float) (records ? records : 1))); + records,seek,max_links, + (float) seek / (float) (records ? records : 1))); if (print_status) printf("Key: %d records: %ld seeks: %d max links: %d hitrate: %.2f\n", - keynr, records, seek, max_links, (float) seek / (float) records); + keynr, records, seek, max_links, + (float) seek / (float) (records ? records : 1)); return error; } |