_check.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This program is free software; you can redistribute it and/or modify
  4.    it under the terms of the GNU General Public License as published by
  5.    the Free Software Foundation; either version 2 of the License, or
  6.    (at your option) any later version.
  7.    
  8.    This program is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.    GNU General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU General Public License
  14.    along with this program; if not, write to the Free Software
  15.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  16. /* Check that heap-structure is ok */
  17. #include "heapdef.h"
  18. static int check_one_key(HP_KEYDEF *keydef, uint keynr, ulong records,
  19.  ulong blength, my_bool print_status);
  20. /* Returns 0 if the HEAP is ok */
  21. int heap_check_heap(HP_INFO *info,my_bool print_status)
  22. {
  23.   int error;
  24.   uint key;
  25.   HP_SHARE *share=info->s;
  26.   DBUG_ENTER("heap_check_keys");
  27.   for (error=key=0 ; key < share->keys ; key++)
  28.     error|=check_one_key(share->keydef+key,key, share->records,share->blength,
  29.  print_status);
  30.   DBUG_RETURN(error);
  31. }
  32. static int check_one_key(HP_KEYDEF *keydef, uint keynr, ulong records,
  33.  ulong blength, my_bool print_status)
  34. {
  35.   int error;
  36.   uint i,found,max_links,seek,links;
  37.   uint rec_link; /* Only used with debugging */
  38.   HASH_INFO *hash_info;
  39.   error=0;
  40.   for (i=found=max_links=seek=0 ; i < records ; i++)
  41.   {
  42.     hash_info=hp_find_hash(&keydef->block,i);
  43.     if (_hp_mask(_hp_rec_hashnr(keydef,hash_info->ptr_to_rec),
  44.  blength,records) == i)
  45.     {
  46.       found++;
  47.       seek++;
  48.       links=1;
  49.       while ((hash_info=hash_info->next_key) && found < records + 1)
  50.       {
  51. seek+= ++links;
  52. if ((rec_link=_hp_mask(_hp_rec_hashnr(keydef,hash_info->ptr_to_rec),
  53.        blength,records))
  54.     != i)
  55. {
  56.   DBUG_PRINT("error",("Record in wrong link: Link %d  Record: %lx  Record-link %d", i,hash_info->ptr_to_rec,rec_link));
  57.   error=1;
  58. }
  59. else
  60.   found++;
  61.       }
  62.       if (links > max_links) max_links=links;
  63.     }
  64.   }
  65.   if (found != records)
  66.   {
  67.     DBUG_PRINT("error",("Found %ld of %ld records"));
  68.     error=1;
  69.   }
  70.   DBUG_PRINT("info",
  71.      ("records: %ld   seeks: %d   max links: %d   hitrate: %.2f",
  72.       records,seek,max_links,(float) seek / (float) (records ? records : 1)));
  73.   if (print_status)
  74.     printf("Key: %d  records: %ld   seeks: %d   max links: %d   hitrate: %.2fn",
  75.    keynr, records, seek, max_links, (float) seek / (float) records);
  76.   return error;
  77. }