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

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. /* USE_MY_STREAM isn't set because we can't thrust my_fclose! */
  18. #include "mysys_priv.h"
  19. #include "mysys_err.h"
  20. #include <errno.h>
  21. #include <stdio.h>
  22. #ifdef HAVE_FSEEKO
  23. #undef ftell
  24. #undef fseek
  25. #define ftell(A) ftello(A)
  26. #define fseek(A,B,C) fseeko((A),(B),(C))
  27. #endif
  28. /* Read a chunk of bytes from a file  */
  29. /* Returns (uint) -1 if error as my_read() */
  30. uint my_fread(FILE *stream, byte *Buffer, uint Count, myf MyFlags)
  31. /* File descriptor */
  32. /* Buffer must be at least count bytes */
  33. /* Max number of bytes returnd */
  34. /* Flags on what to do on error */
  35. {
  36.   uint readbytes;
  37.   DBUG_ENTER("my_fread");
  38.   DBUG_PRINT("my",("stream: %lx  Buffer: %lx  Count: %u  MyFlags: %d",
  39.    stream, Buffer, Count, MyFlags));
  40.   if ((readbytes = (uint) fread(Buffer,sizeof(char),(size_t) Count,stream))
  41.       != Count)
  42.   {
  43.     DBUG_PRINT("error",("Read only %d bytes",readbytes));
  44.     if (MyFlags & (MY_WME | MY_FAE | MY_FNABP))
  45.     {
  46.       if (ferror(stream))
  47. my_error(EE_READ, MYF(ME_BELL+ME_WAITTANG),
  48.  my_filename(fileno(stream)),errno);
  49.       else
  50.       if (MyFlags & (MY_NABP | MY_FNABP))
  51. my_error(EE_EOFERR, MYF(ME_BELL+ME_WAITTANG),
  52.  my_filename(fileno(stream)),errno);
  53.     }
  54.     my_errno=errno ? errno : -1;
  55.     if (ferror(stream) || MyFlags & (MY_NABP | MY_FNABP))
  56.       DBUG_RETURN((uint) -1); /* Return with error */
  57.   }
  58.   if (MyFlags & (MY_NABP | MY_FNABP))
  59.     DBUG_RETURN(0); /* Read ok */
  60.   DBUG_RETURN(readbytes);
  61. } /* my_fread */
  62. /*
  63. ** Write a chunk of bytes to a stream
  64. ** Returns (uint) -1 if error as my_write()
  65. ** Does retries if interrupted
  66. */
  67. uint my_fwrite(FILE *stream, const byte *Buffer, uint Count, myf MyFlags)
  68. {
  69.   uint writenbytes=0;
  70.   off_t seekptr;
  71. #if !defined(NO_BACKGROUND) && defined(USE_MY_STREAM)
  72.   uint errors;
  73. #endif
  74.   DBUG_ENTER("my_fwrite");
  75.   DBUG_PRINT("my",("stream: %lx  Buffer: %lx  Count: %u  MyFlags: %d",
  76.    stream, Buffer, Count, MyFlags));
  77. #if !defined(NO_BACKGROUND) && defined(USE_MY_STREAM)
  78.   errors=0;
  79. #endif
  80.   seekptr=ftell(stream);
  81.   for (;;)
  82.   {
  83.     uint writen;
  84.     if ((writen = (uint) fwrite((char*) Buffer,sizeof(char),
  85. (size_t) Count, stream)) != Count)
  86.     {
  87.       DBUG_PRINT("error",("Write only %d bytes",writenbytes));
  88.       my_errno=errno;
  89.       if (writen != (uint) -1)
  90.       {
  91. seekptr+=writen;
  92. Buffer+=writen;
  93. writenbytes+=writen;
  94. Count-=writen;
  95.       }
  96. #ifdef EINTR
  97.       if (errno == EINTR)
  98.       {
  99. VOID(my_fseek(stream,seekptr,MY_SEEK_SET,MYF(0)));
  100. continue;
  101.       }
  102. #endif
  103. #if !defined(NO_BACKGROUND) && defined(USE_MY_STREAM)
  104. #ifdef THREAD
  105.       if (my_thread_var->abort)
  106. MyFlags&= ~ MY_WAIT_IF_FULL; /* End if aborted by user */
  107. #endif
  108.       if (errno == ENOSPC && (MyFlags & MY_WAIT_IF_FULL))
  109.       {
  110. if (!(errors++ % MY_WAIT_GIVE_USER_A_MESSAGE))
  111.   my_error(EE_DISK_FULL,MYF(ME_BELL | ME_NOREFRESH));
  112. sleep(MY_WAIT_FOR_USER_TO_FIX_PANIC);
  113. VOID(my_fseek(stream,seekptr,MY_SEEK_SET,MYF(0)));
  114. continue;
  115.       }
  116. #endif
  117.       if (ferror(stream) || (MyFlags & (MY_NABP | MY_FNABP)))
  118.       {
  119. if (MyFlags & (MY_WME | MY_FAE | MY_FNABP))
  120. {
  121.   my_error(EE_WRITE, MYF(ME_BELL+ME_WAITTANG),
  122.    my_filename(fileno(stream)),errno);
  123. }
  124. writenbytes=(uint) -1; /* Return that we got error */
  125. break;
  126.       }
  127.     }
  128.     if (MyFlags & (MY_NABP | MY_FNABP))
  129.       writenbytes=0; /* Everything OK */
  130.     else
  131.       writenbytes+=writen;
  132.     break;
  133.   }
  134.   DBUG_RETURN(writenbytes);
  135. } /* my_fwrite */
  136. /* Seek to position in file */
  137. /* ARGSUSED */
  138. my_off_t my_fseek(FILE *stream, my_off_t pos, int whence, myf MyFlags)
  139. {
  140.   DBUG_ENTER("my_fseek");
  141.   DBUG_PRINT("my",("stream: %lx  pos: %lu  whence: %d  MyFlags: %d",
  142.    stream, pos, whence, MyFlags));
  143.   DBUG_RETURN(fseek(stream, (off_t) pos, whence) ?
  144.       MY_FILEPOS_ERROR : (my_off_t) ftell(stream));
  145. } /* my_seek */
  146. /* Tell current position of file */
  147. /* ARGSUSED */
  148. my_off_t my_ftell(FILE *stream, myf MyFlags)
  149. {
  150.   off_t pos;
  151.   DBUG_ENTER("my_ftell");
  152.   DBUG_PRINT("my",("stream: %lx  MyFlags: %d",stream, MyFlags));
  153.   pos=ftell(stream);
  154.   DBUG_PRINT("exit",("ftell: %lu",(ulong) pos));
  155.   DBUG_RETURN((my_off_t) pos);
  156. } /* my_ftell */