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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL 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. /* Open a temporary file and cache it with io_cache. Delete it on close */
  14. #include "mysys_priv.h"
  15. #include <m_string.h>
  16. #include "my_static.h"
  17. #include "mysys_err.h"
  18. /*
  19.   Remove an open tempfile so that it doesn't survive
  20.   if we crash; If the operating system doesn't support
  21.   this, just remember the file name for later removal
  22. */
  23. static my_bool cache_remove_open_tmp(IO_CACHE *cache __attribute__((unused)),
  24.      const char *name)
  25. {
  26. #if O_TEMPORARY == 0
  27. #if !defined(CANT_DELETE_OPEN_FILES)
  28.   /* The following should always succeed */
  29.   (void) my_delete(name,MYF(MY_WME | ME_NOINPUT));
  30. #else
  31.   int length;
  32.   if (!(cache->file_name=
  33. (char*) my_malloc((length=strlen(name)+1),MYF(MY_WME))))
  34.   {
  35.     my_close(cache->file,MYF(0));
  36.     cache->file = -1;
  37.     errno=my_errno=ENOMEM;
  38.     return 1;
  39.   }
  40.   memcpy(cache->file_name,name,length);
  41. #endif
  42. #endif /* O_TEMPORARY == 0 */
  43.   return 0;
  44. }
  45. /*
  46. ** Open tempfile cached by IO_CACHE
  47. ** Should be used when no seeks are done (only reinit_io_buff)
  48. ** Return 0 if cache is inited ok
  49. ** The actual file is created when the IO_CACHE buffer gets filled
  50. ** If dir is not given, use TMPDIR.
  51. */
  52. my_bool open_cached_file(IO_CACHE *cache, const char* dir, const char *prefix,
  53.   uint cache_size, myf cache_myflags)
  54. {
  55.   DBUG_ENTER("open_cached_file");
  56.   cache->dir=  dir ? my_strdup(dir,MYF(cache_myflags & MY_WME)) : (char*) 0;
  57.   cache->prefix= (prefix ? my_strdup(prefix,MYF(cache_myflags & MY_WME)) :
  58.  (char*) 0);
  59.   cache->file_name=0;
  60.   cache->buffer=0; /* Mark that not open */
  61.   if (!init_io_cache(cache,-1,cache_size,WRITE_CACHE,0L,0,
  62.      MYF(cache_myflags | MY_NABP)))
  63.   {
  64.     DBUG_RETURN(0);
  65.   }
  66.   my_free(cache->dir, MYF(MY_ALLOW_ZERO_PTR));
  67.   my_free(cache->prefix,MYF(MY_ALLOW_ZERO_PTR));
  68.   DBUG_RETURN(1);
  69. }
  70. /* Create the temporary file */
  71. my_bool real_open_cached_file(IO_CACHE *cache)
  72. {
  73.   char name_buff[FN_REFLEN];
  74.   int error=1;
  75.   DBUG_ENTER("real_open_cached_file");
  76.   if ((cache->file=create_temp_file(name_buff, cache->dir, cache->prefix,
  77.     (O_RDWR | O_BINARY | O_TRUNC |
  78.      O_TEMPORARY | O_SHORT_LIVED),
  79.     MYF(MY_WME))) >= 0)
  80.   {
  81.     error=0;
  82.     cache_remove_open_tmp(cache, name_buff);
  83.   }
  84.   DBUG_RETURN(error);
  85. }
  86. void close_cached_file(IO_CACHE *cache)
  87. {
  88.   DBUG_ENTER("close_cached_file");
  89.   if (my_b_inited(cache))
  90.   {
  91.     File file=cache->file;
  92.     cache->file= -1; /* Don't flush data */
  93.     (void) end_io_cache(cache);
  94.     if (file >= 0)
  95.     {
  96.       (void) my_close(file,MYF(0));
  97. #ifdef CANT_DELETE_OPEN_FILES
  98.       if (cache->file_name)
  99.       {
  100. (void) my_delete(cache->file_name,MYF(MY_WME | ME_NOINPUT));
  101. my_free(cache->file_name,MYF(0));
  102.       }
  103. #endif
  104.     }
  105.     my_free(cache->dir,MYF(MY_ALLOW_ZERO_PTR));
  106.     my_free(cache->prefix,MYF(MY_ALLOW_ZERO_PTR));
  107.   }
  108.   DBUG_VOID_RETURN;
  109. }