diff options
-rw-r--r-- | BitKeeper/etc/logging_ok | 1 | ||||
-rw-r--r-- | include/config-win.h | 1 | ||||
-rw-r--r-- | mysys/my_chsize.c | 55 |
3 files changed, 41 insertions, 16 deletions
diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index edb3f4141da..5cfac9730ab 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -112,6 +112,7 @@ vva@eagle.mysql.r18.ru vva@genie.(none) walrus@kishkin.ru walrus@mysql.com +wax@mysql.com worm@altair.is.lan zak@balfor.local zak@linux.local diff --git a/include/config-win.h b/include/config-win.h index 69020636893..cde77a6e0aa 100644 --- a/include/config-win.h +++ b/include/config-win.h @@ -276,6 +276,7 @@ inline double ulonglong2double(ulonglong value) #define HAVE_ISAM /* We want to have support for ISAM in 4.0 */ #define HAVE_QUERY_CACHE #define SPRINTF_RETURNS_INT +#define HAVE_SETFILEPOINTER /* SetFilePointer function for huge files */ #ifdef NOT_USED #define HAVE_SNPRINTF /* Gave link error */ diff --git a/mysys/my_chsize.c b/mysys/my_chsize.c index 06e8f159f4a..0840a7a69e4 100644 --- a/mysys/my_chsize.c +++ b/mysys/my_chsize.c @@ -36,24 +36,11 @@ 0 Ok 1 Error */ - int my_chsize(File fd, my_off_t newlength, int filler, myf MyFlags) { DBUG_ENTER("my_chsize"); DBUG_PRINT("my",("fd: %d length: %lu MyFlags: %d",fd,(ulong) newlength, MyFlags)); - -#ifdef HAVE_CHSIZE - if (chsize(fd,(off_t) newlength)) - { - DBUG_PRINT("error",("errno: %d",errno)); - my_errno=errno; - if (MyFlags & MY_WME) - my_error(EE_CANT_CHSIZE,MYF(ME_BELL+ME_WAITTANG),errno); - DBUG_RETURN(1); - } - DBUG_RETURN(0); -#else /* if file is shorter, expand with null, else fill unused part with null */ { my_off_t oldsize; @@ -62,7 +49,42 @@ int my_chsize(File fd, my_off_t newlength, int filler, myf MyFlags) oldsize = my_seek(fd, 0L, MY_SEEK_END, MYF(MY_WME+MY_FAE)); DBUG_PRINT("info",("old_size: %ld", (ulong) oldsize)); -#ifdef HAVE_FTRUNCATE +#ifdef HAVE_CHSIZE + if (oldsize > newlength || filler == 0) + { + if (chsize(fd,(off_t) newlength)) + { + DBUG_PRINT("error",("errno: %d",errno)); + my_errno=errno; + if (MyFlags & MY_WME) + my_error(EE_CANT_CHSIZE,MYF(ME_BELL+ME_WAITTANG),errno); + DBUG_RETURN(1); + } + else + { + if (filler == 0) + DBUG_RETURN(0); + } + } +#elif defined(HAVE_SETFILEPOINTER) + if (oldsize > newlength) + { + LARGE_INTEGER new_length; + HANDLE win_file; + win_file= (HANDLE)_get_osfhandle(fd); + new_length.QuadPart = newlength; + if (SetFilePointerEx(win_file,new_length,NULL,FILE_BEGIN)) + { + if (SetEndOfFile(win_file)) + DBUG_RETURN(0); + } + DBUG_PRINT("error",("errno: %d",errno)); + my_errno=errno; + if (MyFlags & MY_WME) + my_error(EE_CANT_CHSIZE,MYF(ME_BELL+ME_WAITTANG),errno); + DBUG_RETURN(1); + } +#elif defined(HAVE_FTRUNCATE) if (oldsize > newlength) { if (ftruncate(fd, (off_t) newlength)) @@ -99,5 +121,6 @@ int my_chsize(File fd, my_off_t newlength, int filler, myf MyFlags) DBUG_PRINT("error",("errno: %d",my_errno)); DBUG_RETURN(1); } -#endif -} /* my_chsize */ +} /* my_chsize */ + + |