Beispiel #1
0
size_t my_pwrite(File Filedes, const uchar *Buffer, size_t Count,
                 my_off_t offset, myf MyFlags)
{
    size_t writtenbytes, written;
    uint errors;

    DBUG_ENTER("my_pwrite");
    DBUG_PRINT("my",("fd: %d  Seek: %llu  Buffer: %p  Count: %lu  MyFlags: %d",
                     Filedes, offset, Buffer, (ulong)Count, MyFlags));
    errors= 0;
    written= 0;

    for (;;)
    {
#if !defined (HAVE_PREAD) && !defined (_WIN32)
        int error;
        writtenbytes= (size_t) -1;
        mysql_mutex_lock(&my_file_info[Filedes].mutex);
        error= (lseek(Filedes, offset, MY_SEEK_SET) != (my_off_t) -1 &&
                (writtenbytes= write(Filedes, Buffer, Count)) == Count);
        mysql_mutex_unlock(&my_file_info[Filedes].mutex);
        if (error)
            break;
#elif defined (_WIN32)
        writtenbytes= my_win_pwrite(Filedes, Buffer, Count, offset);
#else
        writtenbytes= pwrite(Filedes, Buffer, Count, offset);
#endif
        if(writtenbytes == Count)
            break;
        my_errno= errno;
        if (writtenbytes != (size_t) -1)
        {
            written+= writtenbytes;
            Buffer+= writtenbytes;
            Count-= writtenbytes;
            offset+= writtenbytes;
        }
        DBUG_PRINT("error",("Write only %u bytes", (uint) writtenbytes));
#ifndef NO_BACKGROUND

        if (my_thread_var->abort)
            MyFlags&= ~ MY_WAIT_IF_FULL;		/* End if aborted by user */

        if ((my_errno == ENOSPC || my_errno == EDQUOT) &&
                (MyFlags & MY_WAIT_IF_FULL))
        {
            wait_for_free_space(my_filename(Filedes), errors);
            errors++;
            continue;
        }
        if ((writtenbytes && writtenbytes != (size_t) -1) || my_errno == EINTR)
            continue;					/* Retry */
#endif
        if (MyFlags & (MY_NABP | MY_FNABP))
        {
            if (MyFlags & (MY_WME | MY_FAE | MY_FNABP))
            {
                my_error(EE_WRITE, MYF(ME_BELL | ME_WAITTANG),
                         my_filename(Filedes),my_errno);
            }
            DBUG_RETURN(MY_FILE_ERROR);		/* Error on read */
        }
        else
            break;					/* Return bytes written */
    }
    DBUG_EXECUTE_IF("check", my_seek(Filedes, -1, SEEK_SET, MYF(0)););
Beispiel #2
0
size_t my_pwrite(File Filedes, const uchar *Buffer, size_t Count,
                 my_off_t offset, myf MyFlags)
{
    size_t writtenbytes;
    size_t sum_written= 0;
    uint errors= 0;
    const size_t initial_count= Count;

    DBUG_ENTER("my_pwrite");
    DBUG_PRINT("my",("fd: %d  Seek: %llu  Buffer: %p  Count: %lu  MyFlags: %d",
                     Filedes, offset, Buffer, (ulong)Count, MyFlags));

    for (;;)
    {
        errno= 0;
#if defined (_WIN32)
        writtenbytes= my_win_pwrite(Filedes, Buffer, Count, offset);
#else
        writtenbytes= pwrite(Filedes, Buffer, Count, offset);
#endif
        if(writtenbytes == Count)
        {
            sum_written+= writtenbytes;
            break;
        }
        my_errno= errno;
        if (writtenbytes != (size_t) -1)
        {
            sum_written+= writtenbytes;
            Buffer+= writtenbytes;
            Count-= writtenbytes;
            offset+= writtenbytes;
        }
        DBUG_PRINT("error",("Write only %u bytes", (uint) writtenbytes));

        if (my_thread_var->abort)
            MyFlags&= ~ MY_WAIT_IF_FULL;		/* End if aborted by user */

        if ((my_errno == ENOSPC || my_errno == EDQUOT) &&
                (MyFlags & MY_WAIT_IF_FULL))
        {
            wait_for_free_space(my_filename(Filedes), errors);
            errors++;
            continue;
        }
        if (writtenbytes != 0 && writtenbytes != (size_t) -1)
            continue;
        else if (my_errno == EINTR)
        {
            continue;                                 /* Retry */
        }
        else if (writtenbytes == 0 && !errors++)    /* Retry once */
        {
            /* We may come here if the file quota is exeeded */
            continue;
        }
        break;                                  /* Return bytes written */
    }
    if (MyFlags & (MY_NABP | MY_FNABP))
    {
        if (sum_written == initial_count)
            DBUG_RETURN(0);        /* Want only errors, not bytes written */
        if (MyFlags & (MY_WME | MY_FAE | MY_FNABP))
        {
            char errbuf[MYSYS_STRERROR_SIZE];
            my_error(EE_WRITE, MYF(ME_BELL | ME_WAITTANG), my_filename(Filedes),
                     my_errno, my_strerror(errbuf, sizeof(errbuf), my_errno));
        }
        DBUG_RETURN(MY_FILE_ERROR);
    }
    DBUG_EXECUTE_IF("check", my_seek(Filedes, -1, SEEK_SET, MYF(0)););