Merge kpdesk.mysql.com:/home/thek/dev/mysql-4.1-maint

into  kpdesk.mysql.com:/home/thek/dev/mysql-5.0-maint


mysys/my_chsize.c:
  Auto merged
mysys/my_seek.c:
  Auto merged
mysys/mf_iocache.c:
  Merged patch:
  - Moved comments
  - Moved check on return value of my_seek.
This commit is contained in:
unknown 2006-11-01 17:01:51 +01:00
commit 35f1820358
4 changed files with 153 additions and 20 deletions

View file

@ -445,11 +445,24 @@ int _my_b_read(register IO_CACHE *info, byte *Buffer, uint Count)
/* pos_in_file always point on where info->buffer was read */
pos_in_file=info->pos_in_file+(uint) (info->read_end - info->buffer);
/*
Whenever a function which operates on IO_CACHE flushes/writes
some part of the IO_CACHE to disk it will set the property
"seek_not_done" to indicate this to other functions operating
on the IO_CACHE.
*/
if (info->seek_not_done)
{ /* File touched, do seek */
VOID(my_seek(info->file,pos_in_file,MY_SEEK_SET,MYF(0)));
{
if (my_seek(info->file,pos_in_file,MY_SEEK_SET,MYF(0))
== MY_FILEPOS_ERROR)
{
info->error= -1;
DBUG_RETURN(1);
}
info->seek_not_done=0;
}
diff_length=(uint) (pos_in_file & (IO_SIZE-1));
if (Count >= (uint) (IO_SIZE+(IO_SIZE-diff_length)))
{ /* Fill first intern buffer */
@ -950,8 +963,22 @@ int _my_b_read_r(register IO_CACHE *cache, byte *Buffer, uint Count)
len= 0;
else
{
if (cache->seek_not_done) /* File touched, do seek */
VOID(my_seek(cache->file, pos_in_file, MY_SEEK_SET, MYF(0)));
/*
Whenever a function which operates on IO_CACHE flushes/writes
some part of the IO_CACHE to disk it will set the property
"seek_not_done" to indicate this to other functions operating
on the IO_CACHE.
*/
if (cache->seek_not_done)
{
if (my_seek(cache->file, pos_in_file, MY_SEEK_SET, MYF(0))
== MY_FILEPOS_ERROR)
{
cache->error= -1;
unlock_io_cache(cache);
DBUG_RETURN(1);
}
}
len= (int) my_read(cache->file, cache->buffer, length, cache->myflags);
}
DBUG_PRINT("io_cache_share", ("read %d bytes", len));
@ -1053,11 +1080,16 @@ static void copy_to_read_buffer(IO_CACHE *write_cache,
/*
Do sequential read from the SEQ_READ_APPEND cache
we do this in three stages:
Do sequential read from the SEQ_READ_APPEND cache.
We do this in three stages:
- first read from info->buffer
- then if there are still data to read, try the file descriptor
- afterwards, if there are still data to read, try append buffer
RETURNS
0 Success
1 Failed to read
*/
int _my_b_seq_read(register IO_CACHE *info, byte *Buffer, uint Count)
@ -1085,7 +1117,13 @@ int _my_b_seq_read(register IO_CACHE *info, byte *Buffer, uint Count)
With read-append cache we must always do a seek before we read,
because the write could have moved the file pointer astray
*/
VOID(my_seek(info->file,pos_in_file,MY_SEEK_SET,MYF(0)));
if (my_seek(info->file,pos_in_file,MY_SEEK_SET,MYF(0))
== MY_FILEPOS_ERROR)
{
info->error= -1;
unlock_append_buffer(info);
return (1);
}
info->seek_not_done=0;
diff_length=(uint) (pos_in_file & (IO_SIZE-1));
@ -1201,6 +1239,21 @@ read_append_buffer:
#ifdef HAVE_AIOWAIT
/*
Read from the IO_CACHE into a buffer and feed asynchronously
from disk when needed.
SYNOPSIS
_my_b_async_read()
info IO_CACHE pointer
Buffer Buffer to retrieve count bytes from file
Count Number of bytes to read into Buffer
RETURN VALUE
-1 An error has occurred; my_errno is set.
0 Success
1 An error has occurred; IO_CACHE to error state.
*/
int _my_b_async_read(register IO_CACHE *info, byte *Buffer, uint Count)
{
uint length,read_length,diff_length,left_length,use_length,org_Count;
@ -1291,13 +1344,20 @@ int _my_b_async_read(register IO_CACHE *info, byte *Buffer, uint Count)
info->error=(int) (read_length+left_length);
return 1;
}
VOID(my_seek(info->file,next_pos_in_file,MY_SEEK_SET,MYF(0)));
if (my_seek(info->file,next_pos_in_file,MY_SEEK_SET,MYF(0))
== MY_FILEPOS_ERROR)
{
info->error= -1;
return (1);
}
read_length=IO_SIZE*2- (uint) (next_pos_in_file & (IO_SIZE-1));
if (Count < read_length)
{ /* Small block, read to cache */
if ((read_length=my_read(info->file,info->request_pos,
read_length, info->myflags)) == (uint) -1)
return info->error= -1;
return info->error= -1;
use_length=min(Count,read_length);
memcpy(Buffer,info->request_pos,(size_t) use_length);
info->read_pos=info->request_pos+Count;
@ -1384,7 +1444,15 @@ int _my_b_get(IO_CACHE *info)
return (int) (uchar) buff;
}
/* Returns != 0 if error on write */
/*
Write a byte buffer to IO_CACHE and flush to disk
if IO_CACHE is full.
RETURN VALUE
1 On error on write
0 On success
-1 On error; my_errno contains error code.
*/
int _my_b_write(register IO_CACHE *info, const byte *Buffer, uint Count)
{
@ -1408,8 +1476,18 @@ int _my_b_write(register IO_CACHE *info, const byte *Buffer, uint Count)
{ /* Fill first intern buffer */
length=Count & (uint) ~(IO_SIZE-1);
if (info->seek_not_done)
{ /* File touched, do seek */
VOID(my_seek(info->file,info->pos_in_file,MY_SEEK_SET,MYF(0)));
{
/*
Whenever a function which operates on IO_CACHE flushes/writes
some part of the IO_CACHE to disk it will set the property
"seek_not_done" to indicate this to other functions operating
on the IO_CACHE.
*/
if (my_seek(info->file,info->pos_in_file,MY_SEEK_SET,MYF(0)))
{
info->error= -1;
return (1);
}
info->seek_not_done=0;
}
if (my_write(info->file,Buffer,(uint) length,info->myflags | MY_NABP))