summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BitKeeper/etc/logging_ok1
-rw-r--r--include/config-win.h1
-rw-r--r--mysys/my_chsize.c55
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 */
+
+