home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / mysys / mf_cache.c < prev    next >
C/C++ Source or Header  |  2000-11-16  |  4KB  |  123 lines

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.  
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.  
  8.    This library 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 GNU
  11.    Library General Public License for more details.
  12.  
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17.  
  18. /* Open a temporary file and cache it with io_cache. Delete it on close */
  19.  
  20. #include "mysys_priv.h"
  21. #include <m_string.h>
  22. #include "my_static.h"
  23. #include "mysys_err.h"
  24.  
  25.     /*
  26.       Remove an open tempfile so that it doesn't survive
  27.       if we crash;    If the operating system doesn't support
  28.       this, just remember the file name for later removal
  29.     */
  30.  
  31. static my_bool cache_remove_open_tmp(IO_CACHE *cache, const char *name)
  32. {
  33. #if O_TEMPORARY == 0
  34. #if !defined(CANT_DELETE_OPEN_FILES)
  35.   /* The following should always succeed */
  36.   (void) my_delete(name,MYF(MY_WME | ME_NOINPUT));
  37. #else
  38.   int length;
  39.   if (!(cache->file_name=
  40.     (char*) my_malloc((length=strlen(name)+1),MYF(MY_WME)))
  41.   {
  42.     my_close(cache->file,MYF(0));
  43.     cache->file = -1;
  44.     errno=my_error=ENOMEM;
  45.     return 1;
  46.   }
  47.   memcpy(cache->file_name,name,length);
  48. #endif
  49. #endif /* O_TEMPORARY == 0 */
  50.   return 0;
  51. }
  52.  
  53.     /*
  54.     ** Open tempfile cached by IO_CACHE
  55.     ** Should be used when no seeks are done (only reinit_io_buff)
  56.     ** Return 0 if cache is inited ok
  57.     ** The actual file is created when the IO_CACHE buffer gets filled
  58.     ** If dir is not given, use TMPDIR.
  59.     */
  60.  
  61. my_bool open_cached_file(IO_CACHE *cache, const char* dir, const char *prefix,
  62.               uint cache_size, myf cache_myflags)
  63. {
  64.   DBUG_ENTER("open_cached_file");
  65.   cache->dir=     dir ? my_strdup(dir,MYF(cache_myflags & MY_WME)) : (char*) 0;
  66.   cache->prefix= (prefix ? my_strdup(prefix,MYF(cache_myflags & MY_WME)) :
  67.          (char*) 0);
  68.   cache->file_name=0;
  69.   cache->buffer=0;                /* Mark that not open */
  70.   if (!init_io_cache(cache,-1,cache_size,WRITE_CACHE,0L,0,
  71.              MYF(cache_myflags | MY_NABP)))
  72.   {
  73.     DBUG_RETURN(0);
  74.   }
  75.   my_free(cache->dir,    MYF(MY_ALLOW_ZERO_PTR));
  76.   my_free(cache->prefix,MYF(MY_ALLOW_ZERO_PTR));
  77.   DBUG_RETURN(1);
  78. }
  79.  
  80.     /* Create the temporary file */
  81.  
  82. my_bool real_open_cached_file(IO_CACHE *cache)
  83. {
  84.   char name_buff[FN_REFLEN];
  85.   int error=1;
  86.   DBUG_ENTER("real_open_cached_file");
  87.   if ((cache->file=create_temp_file(name_buff, cache->dir, cache->prefix,
  88.                     (O_RDWR | O_BINARY | O_TRUNC |
  89.                      O_TEMPORARY | O_SHORT_LIVED),
  90.                     MYF(MY_WME))) >= 0)
  91.   {
  92.     error=0;
  93.     cache_remove_open_tmp(cache, name_buff);
  94.   }
  95.   DBUG_RETURN(error);
  96. }
  97.  
  98.  
  99. void close_cached_file(IO_CACHE *cache)
  100. {
  101.   DBUG_ENTER("close_cached_file");
  102.   if (my_b_inited(cache))
  103.   {
  104.     File file=cache->file;
  105.     cache->file= -1;                /* Don't flush data */
  106.     (void) end_io_cache(cache);
  107.     if (file >= 0)
  108.     {
  109.       (void) my_close(file,MYF(0));
  110. #ifdef CANT_DELETE_OPEN_FILES
  111.       if (cache->file_name)
  112.       {
  113.     (void) my_delete(cache->file_name,MYF(MY_WME | ME_NOINPUT));
  114.     my_free(cache->file_name,MYF(0));
  115.       }
  116. #endif
  117.     }
  118.     my_free(cache->dir,MYF(MY_ALLOW_ZERO_PTR));
  119.     my_free(cache->prefix,MYF(MY_ALLOW_ZERO_PTR));
  120.   }
  121.   DBUG_VOID_RETURN;
  122. }
  123.