_cache.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. /* Functions for read record cacheing with nisam */
  14. /* Used instead of my_b_read() to allow for no-cacheed seeks */
  15. #include "isamdef.h"
  16. #define READING_NEXT 1
  17. #define READING_HEADER 2
  18. /* Copy block from cache if it`s in it. If re_read_if_possibly is */
  19. /* set read to cache (if after current file-position) else read to */
  20. /* buff   */
  21. int _nisam_read_cache(IO_CACHE *info, byte *buff, ulong pos, uint length,
  22.       int flag)
  23. {
  24.   uint read_length,in_buff_length;
  25.   ulong offset;
  26.   char *in_buff_pos;
  27.   if (pos < info->pos_in_file)
  28.   {
  29.     read_length= (uint) min((ulong) length,(ulong) (info->pos_in_file-pos));
  30.     info->seek_not_done=1;
  31.     VOID(my_seek(info->file,pos,MY_SEEK_SET,MYF(0)));
  32.     if (my_read(info->file,buff,read_length,MYF(MY_NABP)))
  33.       return 1;
  34.     if (!(length-=read_length))
  35.       return 0;
  36.     pos+=read_length;
  37.     buff+=read_length;
  38.   }
  39.   if ((offset=pos - (ulong) info->pos_in_file) <
  40.       (ulong) (info->read_end - info->request_pos))
  41.   {
  42.     in_buff_pos=info->request_pos+(uint) offset;
  43.     in_buff_length= min(length,(uint) (info->read_end-in_buff_pos));
  44.     memcpy(buff,info->request_pos+(uint) offset,(size_t) in_buff_length);
  45.     if (!(length-=in_buff_length))
  46.       return 0;
  47.     pos+=in_buff_length;
  48.     buff+=in_buff_length;
  49.   }
  50.   else
  51.     in_buff_length=0;
  52.   if (flag & READING_NEXT)
  53.   {
  54.     if (pos != ((info)->pos_in_file +
  55. (uint) ((info)->read_end - (info)->request_pos)))
  56.     {
  57.       info->pos_in_file=pos; /* Force start here */
  58.       info->read_pos=info->read_end=info->request_pos; /* Everything used */
  59.       info->seek_not_done=1;
  60.     }
  61.     else
  62.       info->read_pos=info->read_end; /* All block used */
  63.     if (!(*info->read_function)(info,buff,length))
  64.       return 0;
  65.     if (!(flag & READING_HEADER) || info->error == -1 ||
  66. (uint) info->error+in_buff_length < 3)
  67.       return 1;
  68.     if (BLOCK_INFO_HEADER_LENGTH < in_buff_length + (uint) info->error)
  69.       bzero(buff+info->error,BLOCK_INFO_HEADER_LENGTH - in_buff_length -
  70.     (uint) info->error);
  71.     return 0;
  72.   }
  73.   info->seek_not_done=1;
  74.   VOID(my_seek(info->file,pos,MY_SEEK_SET,MYF(0)));
  75.   if ((read_length=my_read(info->file,buff,length,MYF(0))) == length)
  76.     return 0;
  77.   if (!(flag & READING_HEADER) || (int) read_length == -1 ||
  78.       read_length+in_buff_length < 3)
  79.     return 1;
  80.   bzero(buff+read_length,BLOCK_INFO_HEADER_LENGTH - in_buff_length -
  81. read_length);
  82.   return 0;
  83. } /* _nisam_read_cache */