From 4a1763e4287724421720e174f938d7303ad07c04 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 2 Feb 2008 00:01:31 +0100 Subject: Fix for Windows-specific bugs: - one which led REDO_INSERT_ROW_BLOBS to fail to apply - one excess close ("-1 file left open") Don't need maria-path option / environment variable. Fixes for ma_test_all-t to run under Windows. Port of ma_test_recovery to Perl, written by Jani. storage/maria/unittest/ma_test_recovery.expected: Rename: storage/maria/ma_test_recovery.expected -> storage/maria/unittest/ma_test_recovery.expected mysys/my_pread.c: Fix for Windows-specific bug (maria_read_log -a failed during ma_test_all-t): Windows does not have pread() so the branch setting HA_ERR_FILE_TOO_SHORT was not compiled in, broke applying of REDO_INSERT_ROW_BLOBS. After fixing that, it appeared that in my Windows machine, errno is not changed in case of EOF; as we read it we have to reset it at start. The changed to readbytes!=-1 is to detect EOF mysys/my_read.c: The change to readbytes!=-1 is to detect EOF storage/maria/ma_loghandler.c: Fix for Windows-specific bug: as we don't open the directory we should not close it. storage/maria/ma_page.c: This is C, cannot declare variable after instruction. storage/maria/ma_test_recovery: ma_test_recovery.expected moved storage/maria/unittest/ma_test_all-t: Can now safely guess maria_path so don't need the command-line option or environment variable. Port to Windows (.exe, different locations of executables); can guess suffix, don't need --suffix. storage/maria/unittest/ma_test_recovery.pl: Perl version of ma_test_recovery, written by Jani. Will deprecate the shell version. --- mysys/my_pread.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'mysys/my_pread.c') diff --git a/mysys/my_pread.c b/mysys/my_pread.c index 7ad7a8faaf8..6b6957a24e5 100644 --- a/mysys/my_pread.c +++ b/mysys/my_pread.c @@ -47,7 +47,7 @@ size_t my_pread(File Filedes, uchar *Buffer, size_t Count, my_off_t offset, myf MyFlags) { size_t readbytes; - int error= 0; + int error= 0, save_errno; #ifndef DBUG_OFF char llbuf[22]; DBUG_ENTER("my_pread"); @@ -57,26 +57,25 @@ size_t my_pread(File Filedes, uchar *Buffer, size_t Count, my_off_t offset, #endif for (;;) { -#ifndef __WIN__ - errno=0; /* Linux doesn't reset this */ -#endif + errno=0; /* Linux, Windows don't reset this on EOF/success */ #ifndef HAVE_PREAD pthread_mutex_lock(&my_file_info[Filedes].mutex); readbytes= (uint) -1; error= (lseek(Filedes, offset, MY_SEEK_SET) == (my_off_t) -1 || (readbytes= read(Filedes, Buffer, Count)) != Count); + save_errno= errno; pthread_mutex_unlock(&my_file_info[Filedes].mutex); + if (error) + { + errno= save_errno; #else if ((error= ((readbytes= pread(Filedes, Buffer, Count, offset)) != Count))) { +#endif my_errno= errno; - if (errno == 0 || (readbytes == (size_t) -1 && + if (errno == 0 || (readbytes != (size_t) -1 && (MyFlags & (MY_NABP | MY_FNABP)))) my_errno= HA_ERR_FILE_TOO_SHORT; - } -#endif - if (error) - { DBUG_PRINT("warning",("Read only %d bytes off %u from %d, errno: %d", (int) readbytes, (uint) Count,Filedes,my_errno)); #ifdef THREAD -- cgit v1.2.1