mi_preload.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /*
  14.   Preload indexes into key cache
  15. */
  16. #include "myisamdef.h"
  17. /*
  18.   Preload pages of the index file for a table into the key cache
  19.   SYNOPSIS
  20.     mi_preload()
  21.       info          open table
  22.       map           map of indexes to preload into key cache 
  23.       ignore_leaves only non-leaves pages are to be preloaded
  24.   RETURN VALUE
  25.     0 if a success. error code - otherwise.
  26.   NOTES.
  27.     At present pages for all indexes are preloaded.
  28.     In future only pages for indexes specified in the key_map parameter
  29.     of the table will be preloaded.
  30. */
  31. int mi_preload(MI_INFO *info, ulonglong key_map, my_bool ignore_leaves)
  32. {
  33.   uint i;
  34.   ulong length, block_length= 0;
  35.   uchar *buff= NULL;
  36.   MYISAM_SHARE* share= info->s;
  37.   uint keys= share->state.header.keys;
  38.   MI_KEYDEF *keyinfo= share->keyinfo;
  39.   my_off_t key_file_length= share->state.state.key_file_length;
  40.   my_off_t pos= share->base.keystart;
  41.   DBUG_ENTER("mi_preload");
  42.   if (!keys || !key_map || key_file_length == pos)
  43.     DBUG_RETURN(0);
  44.   block_length= keyinfo[0].block_length;
  45.   /* Check whether all indexes use the same block size */
  46.   for (i= 1 ; i < keys ; i++)
  47.   {
  48.     if (keyinfo[i].block_length != block_length)
  49.       DBUG_RETURN(my_errno= HA_ERR_NON_UNIQUE_BLOCK_SIZE);
  50.   }
  51.   length= info->preload_buff_size/block_length * block_length;
  52.   set_if_bigger(length, block_length);
  53.   if (!(buff= (uchar *) my_malloc(length, MYF(MY_WME))))
  54.     DBUG_RETURN(my_errno= HA_ERR_OUT_OF_MEM);
  55.   if (flush_key_blocks(share->key_cache,share->kfile, FLUSH_RELEASE))
  56.     goto err;
  57.   do
  58.   {
  59.     /* Read the next block of index file into the preload buffer */
  60.     if ((my_off_t) length > (key_file_length-pos))
  61.       length= (ulong) (key_file_length-pos);
  62.     if (my_pread(share->kfile, (byte*) buff, length, pos, MYF(MY_FAE|MY_FNABP)))
  63.       goto err;
  64.     if (ignore_leaves)
  65.     {
  66.       uchar *end= buff+length;
  67.       do
  68.       {
  69.         if (mi_test_if_nod(buff))
  70.         {
  71.           if (key_cache_insert(share->key_cache,
  72.                                share->kfile, pos, DFLT_INIT_HITS,
  73.                               (byte*) buff, block_length))
  74.     goto err;
  75. }
  76.         pos+= block_length;
  77.       }
  78.       while ((buff+= block_length) != end);
  79.       buff= end-length;
  80.     }
  81.     else
  82.     {
  83.       if (key_cache_insert(share->key_cache,
  84.                            share->kfile, pos, DFLT_INIT_HITS,
  85.                            (byte*) buff, length))
  86. goto err;
  87.       pos+= length;
  88.     }
  89.   }
  90.   while (pos != key_file_length);
  91.   my_free((char*) buff, MYF(0));
  92.   DBUG_RETURN(0);
  93. err:
  94.   my_free((char*) buff, MYF(MY_ALLOW_ZERO_PTR));
  95.   DBUG_RETURN(my_errno= errno);
  96. }