Commit 99df703b authored by wax@mysql.com's avatar wax@mysql.com

BUG

Add functions SetFilePointerEx and SetEndOfFile for huge 
tables instead of chsize
Move chsize to right place
parent 99d22442
...@@ -109,6 +109,7 @@ vva@eagle.mysql.r18.ru ...@@ -109,6 +109,7 @@ vva@eagle.mysql.r18.ru
vva@genie.(none) vva@genie.(none)
walrus@kishkin.ru walrus@kishkin.ru
walrus@mysql.com walrus@mysql.com
wax@mysql.com
worm@altair.is.lan worm@altair.is.lan
zak@balfor.local zak@balfor.local
zak@linux.local zak@linux.local
......
...@@ -276,6 +276,7 @@ inline double ulonglong2double(ulonglong value) ...@@ -276,6 +276,7 @@ inline double ulonglong2double(ulonglong value)
#define HAVE_ISAM /* We want to have support for ISAM in 4.0 */ #define HAVE_ISAM /* We want to have support for ISAM in 4.0 */
#define HAVE_QUERY_CACHE #define HAVE_QUERY_CACHE
#define SPRINTF_RETURNS_INT #define SPRINTF_RETURNS_INT
#define HAVE_SETFILEPOINTER /* SetFilePointer function for huge files */
#ifdef NOT_USED #ifdef NOT_USED
#define HAVE_SNPRINTF /* Gave link error */ #define HAVE_SNPRINTF /* Gave link error */
......
...@@ -36,14 +36,22 @@ ...@@ -36,14 +36,22 @@
0 Ok 0 Ok
1 Error 1 Error
*/ */
int my_chsize(File fd, my_off_t newlength, int filler, myf MyFlags) int my_chsize(File fd, my_off_t newlength, int filler, myf MyFlags)
{ {
DBUG_ENTER("my_chsize"); DBUG_ENTER("my_chsize");
DBUG_PRINT("my",("fd: %d length: %lu MyFlags: %d",fd,(ulong) newlength, DBUG_PRINT("my",("fd: %d length: %lu MyFlags: %d",fd,(ulong) newlength,
MyFlags)); MyFlags));
/* if file is shorter, expand with null, else fill unused part with null */
{
my_off_t oldsize;
char buff[IO_SIZE];
oldsize = my_seek(fd, 0L, MY_SEEK_END, MYF(MY_WME+MY_FAE));
DBUG_PRINT("info",("old_size: %ld", (ulong) oldsize));
#ifdef HAVE_CHSIZE #ifdef HAVE_CHSIZE
if (oldsize > newlength || filler == 0)
{
if (chsize(fd,(off_t) newlength)) if (chsize(fd,(off_t) newlength))
{ {
DBUG_PRINT("error",("errno: %d",errno)); DBUG_PRINT("error",("errno: %d",errno));
...@@ -52,17 +60,31 @@ int my_chsize(File fd, my_off_t newlength, int filler, myf MyFlags) ...@@ -52,17 +60,31 @@ int my_chsize(File fd, my_off_t newlength, int filler, myf MyFlags)
my_error(EE_CANT_CHSIZE,MYF(ME_BELL+ME_WAITTANG),errno); my_error(EE_CANT_CHSIZE,MYF(ME_BELL+ME_WAITTANG),errno);
DBUG_RETURN(1); DBUG_RETURN(1);
} }
else
{
if (filler == 0)
DBUG_RETURN(0); DBUG_RETURN(0);
#else }
/* if file is shorter, expand with null, else fill unused part with null */ }
#elif defined(HAVE_SETFILEPOINTER)
if (oldsize > newlength)
{ {
my_off_t oldsize; LARGE_INTEGER new_length;
char buff[IO_SIZE]; HANDLE win_file;
win_file= (HANDLE)_get_osfhandle(fd);
oldsize = my_seek(fd, 0L, MY_SEEK_END, MYF(MY_WME+MY_FAE)); new_length.QuadPart = newlength;
DBUG_PRINT("info",("old_size: %ld", (ulong) oldsize)); if (SetFilePointerEx(win_file,new_length,NULL,FILE_BEGIN))
{
#ifdef HAVE_FTRUNCATE 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 (oldsize > newlength)
{ {
if (ftruncate(fd, (off_t) newlength)) if (ftruncate(fd, (off_t) newlength))
...@@ -99,5 +121,6 @@ int my_chsize(File fd, my_off_t newlength, int filler, myf MyFlags) ...@@ -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_PRINT("error",("errno: %d",my_errno));
DBUG_RETURN(1); DBUG_RETURN(1);
} }
#endif
} /* my_chsize */ } /* my_chsize */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment