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

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.   Functions for read record cacheing with myisam
  15.   Used for reading dynamic/compressed records from datafile.
  16.   Can fetch data directly from file (outside cache),
  17.   if reading a small chunk straight before the cached part (with possible
  18.   overlap).
  19.   Can be explicitly asked not to use cache (by not setting READING_NEXT in
  20.   flag) - useful for occasional out-of-cache reads, when the next read is
  21.   expected to hit the cache again.
  22.   Allows "partial read" errors in the record header (when READING_HEADER flag
  23.   is set) - unread part is bzero'ed
  24.   Note: out-of-cache reads are enabled for shared IO_CACHE's too,
  25.   as these reads will be cached by OS cache (and my_pread is always atomic)
  26. */
  27. #include "myisamdef.h"
  28. int _mi_read_cache(IO_CACHE *info, byte *buff, my_off_t pos, uint length,
  29.    int flag)
  30. {
  31.   uint read_length,in_buff_length;
  32.   my_off_t offset;
  33.   char *in_buff_pos;
  34.   DBUG_ENTER("_mi_read_cache");
  35.   if (pos < info->pos_in_file)
  36.   {
  37.     read_length=length;
  38.     if ((my_off_t) read_length > (my_off_t) (info->pos_in_file-pos))
  39.       read_length=(uint) (info->pos_in_file-pos);
  40.     info->seek_not_done=1;
  41.     if (my_pread(info->file,buff,read_length,pos,MYF(MY_NABP)))
  42.       DBUG_RETURN(1);
  43.     if (!(length-=read_length))
  44.       DBUG_RETURN(0);
  45.     pos+=read_length;
  46.     buff+=read_length;
  47.   }
  48.   if (pos >= info->pos_in_file &&
  49.       (offset= (my_off_t) (pos - info->pos_in_file)) <
  50.       (my_off_t) (info->read_end - info->request_pos))
  51.   {
  52.     in_buff_pos=info->request_pos+(uint) offset;
  53.     in_buff_length= min(length,(uint) (info->read_end-in_buff_pos));
  54.     memcpy(buff,info->request_pos+(uint) offset,(size_t) in_buff_length);
  55.     if (!(length-=in_buff_length))
  56.       DBUG_RETURN(0);
  57.     pos+=in_buff_length;
  58.     buff+=in_buff_length;
  59.   }
  60.   else
  61.     in_buff_length=0;
  62.   if (flag & READING_NEXT)
  63.   {
  64.     if (pos != (info->pos_in_file +
  65. (uint) (info->read_end - info->request_pos)))
  66.     {
  67.       info->pos_in_file=pos; /* Force start here */
  68.       info->read_pos=info->read_end=info->request_pos; /* Everything used */
  69.       info->seek_not_done=1;
  70.     }
  71.     else
  72.       info->read_pos=info->read_end; /* All block used */
  73.     if (!(*info->read_function)(info,buff,length))
  74.       DBUG_RETURN(0);
  75.     read_length=info->error;
  76.   }
  77.   else
  78.   {
  79.     info->seek_not_done=1;
  80.     if ((read_length=my_pread(info->file,buff,length,pos,MYF(0))) == length)
  81.       DBUG_RETURN(0);
  82.   }
  83.   if (!(flag & READING_HEADER) || (int) read_length == -1 ||
  84.       read_length+in_buff_length < 3)
  85.   {
  86.     DBUG_PRINT("error",
  87.                ("Error %d reading next-multi-part block (Got %d bytes)",
  88.                 my_errno, (int) read_length));
  89.     if (!my_errno || my_errno == -1)
  90.       my_errno=HA_ERR_WRONG_IN_RECORD;
  91.     DBUG_RETURN(1);
  92.   }
  93.   bzero(buff+read_length,MI_BLOCK_INFO_HEADER_LENGTH - in_buff_length -
  94.         read_length);
  95.   DBUG_RETURN(0);
  96. } /* _mi_read_cache */