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

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