my_chsize.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. #include "mysys_priv.h"
  14. #include "mysys_err.h"
  15. #include "m_string.h"
  16. /*
  17.   Change size of file.
  18.   SYNOPSIS
  19.     my_chsize()
  20.       fd File descriptor
  21.       new_length New file size
  22.       filler If we don't have truncate, fill up all bytes after
  23. new_length with this character
  24.       MyFlags Flags
  25.   DESCRIPTION
  26.     my_chsize() truncates file if shorter else fill with the filler character
  27.   RETURN VALUE
  28.     0 Ok
  29.     1 Error 
  30. */
  31. int my_chsize(File fd, my_off_t newlength, int filler, myf MyFlags)
  32. {
  33.   my_off_t oldsize;
  34.   char buff[IO_SIZE];
  35.   DBUG_ENTER("my_chsize");
  36.   DBUG_PRINT("my",("fd: %d  length: %lu  MyFlags: %d",fd,(ulong) newlength,
  37.    MyFlags));
  38.   oldsize = my_seek(fd, 0L, MY_SEEK_END, MYF(MY_WME+MY_FAE));
  39.   DBUG_PRINT("info",("old_size: %ld", (ulong) oldsize));
  40.   if (oldsize > newlength)
  41. #if defined(HAVE_SETFILEPOINTER)
  42.   /* This is for the moment only true on windows */
  43.   {
  44.     long is_success;
  45.     HANDLE win_file= (HANDLE) _get_osfhandle(fd);
  46.     long length_low, length_high;
  47.     length_low= (long) (ulong) newlength;
  48.     length_high= (long) ((ulonglong) newlength >> 32);
  49.     is_success= SetFilePointer(win_file, length_low, &length_high, FILE_BEGIN);
  50.     if (is_success == -1 && (my_errno= GetLastError()) != NO_ERROR)
  51.       goto err;
  52.     if (SetEndOfFile(win_file))
  53.       DBUG_RETURN(0);
  54.     my_errno= GetLastError();
  55.     goto err;
  56.   }
  57. #elif defined(HAVE_FTRUNCATE)
  58.   {
  59.     if (ftruncate(fd, (off_t) newlength))
  60.     {
  61.       my_errno= errno;
  62.       goto err;
  63.     }
  64.     DBUG_RETURN(0);
  65.   }
  66. #elif defined(HAVE_CHSIZE)
  67.   {
  68.     if (chsize(fd, (off_t) newlength))
  69.     {
  70.       my_errno=errno;
  71.       goto err;
  72.     }
  73.     DBUG_RETURN(0);
  74.   }
  75. #else
  76.   {
  77.     /*
  78.       Fill space between requested length and true length with 'filler'
  79.       We should never come here on any modern machine
  80.     */
  81.     VOID(my_seek(fd, newlength, MY_SEEK_SET, MYF(MY_WME+MY_FAE)));
  82.     swap_variables(my_off_t, newlength, oldsize);
  83.   }
  84. #endif
  85.   /* Full file with 'filler' until it's as big as requested */
  86.   bfill(buff, IO_SIZE, filler);
  87.   while (newlength-oldsize > IO_SIZE)
  88.   {
  89.     if (my_write(fd,(byte*) buff,IO_SIZE,MYF(MY_NABP)))
  90.       goto err;
  91.     oldsize+= IO_SIZE;
  92.   }
  93.   if (my_write(fd,(byte*) buff,(uint) (newlength-oldsize),MYF(MY_NABP)))
  94.     goto err;
  95.   DBUG_RETURN(0);
  96. err:
  97.   DBUG_PRINT("error", ("errno: %d", errno));
  98.   if (MyFlags & MY_WME)
  99.     my_error(EE_CANT_CHSIZE, MYF(ME_BELL+ME_WAITTANG), my_errno);
  100.   DBUG_RETURN(1);
  101. } /* my_chsize */