my_chsize.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  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. #include "mysys_priv.h"
  18. #include "mysys_err.h"
  19. #include "m_string.h"
  20. /* Change size of file.  Truncate file if shorter, */
  21. /* else expand with zero. */
  22. int my_chsize(File fd, my_off_t newlength, myf MyFlags)
  23. {
  24.   DBUG_ENTER("my_chsize");
  25.   DBUG_PRINT("my",("fd: %d  length: %lu  MyFlags: %d",fd,(ulong) newlength,
  26.    MyFlags));
  27. #ifdef HAVE_CHSIZE
  28.   if (chsize(fd,(off_t) newlength))
  29.   {
  30.     DBUG_PRINT("error",("errno: %d",errno));
  31.     my_errno=errno;
  32.     if (MyFlags & MY_WME)
  33.       my_error(EE_CANT_CHSIZE,MYF(ME_BELL+ME_WAITTANG),errno);
  34.     DBUG_RETURN(1);
  35.   }
  36.   DBUG_RETURN(0);
  37. #else
  38.   /* if file is shorter, expand with null, else fill unused part with null */
  39.   {
  40.     my_off_t oldsize;
  41.     char buff[IO_SIZE];
  42.     oldsize = my_seek(fd, 0L, MY_SEEK_END, MYF(MY_WME+MY_FAE));
  43.     DBUG_PRINT("info",("old_size: %ld", (ulong) oldsize));
  44. #ifdef HAVE_FTRUNCATE
  45.     if (oldsize > newlength)
  46.     {
  47.       if (ftruncate(fd, (off_t) newlength))
  48.       {
  49. my_errno=errno;
  50. DBUG_PRINT("error",("errno: %d",errno));
  51. if (MyFlags & MY_WME)
  52.   my_error(EE_CANT_CHSIZE, MYF(ME_BELL+ME_WAITTANG), errno);
  53. DBUG_RETURN(1);
  54.       }
  55.       DBUG_RETURN(0);
  56.     }
  57. #else
  58.     if (oldsize > newlength)
  59.     { /* Fill diff with null */
  60.       VOID(my_seek(fd, newlength, MY_SEEK_SET, MYF(MY_WME+MY_FAE)));
  61.       swap(my_off_t, newlength, oldsize);
  62.     }
  63. #endif
  64.     /* Full file with 0 until it's as big as requested */
  65.     bzero(buff,IO_SIZE);
  66.     while (newlength-oldsize > IO_SIZE)
  67.     {
  68.       if (my_write(fd,(byte*) buff,IO_SIZE,MYF(MY_NABP)))
  69. goto err;
  70.       oldsize+= IO_SIZE;
  71.     }
  72.     if (my_write(fd,(byte*) buff,(uint) (newlength-oldsize),MYF(MY_NABP)))
  73.       goto err;
  74.     DBUG_RETURN(0);
  75.   err:
  76.     if (MyFlags & MY_WME)
  77.       my_error(EE_CANT_CHSIZE,MYF(ME_BELL+ME_WAITTANG),my_errno);
  78.     DBUG_PRINT("error",("errno: %d",my_errno));
  79.     DBUG_RETURN(1);
  80.   }
  81. #endif
  82. } /* my_chsize */