2005-12-23 04:50:10 +01:00
|
|
|
/*
|
|
|
|
azio is a modified version of gzio. It makes use of mysys and removes mallocs.
|
2006-12-04 07:09:32 +01:00
|
|
|
-Brian Aker
|
2005-12-23 04:50:10 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
/* gzio.c -- IO on .gz files
|
|
|
|
* Copyright (C) 1995-2005 Jean-loup Gailly.
|
|
|
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* @(#) $Id$ */
|
|
|
|
|
2006-03-26 13:59:37 +02:00
|
|
|
#include "azlib.h"
|
|
|
|
|
2005-12-23 04:50:10 +01:00
|
|
|
#include <stdio.h>
|
2005-12-28 05:33:48 +01:00
|
|
|
#include <string.h>
|
2005-12-23 04:50:10 +01:00
|
|
|
|
|
|
|
static int const gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */
|
2007-01-21 20:41:00 +01:00
|
|
|
static int const az_magic[3] = {0xfe, 0x03, 0x01}; /* az magic header */
|
2005-12-23 04:50:10 +01:00
|
|
|
|
WL#3817: Simplify string / memory area types and make things more consistent (first part)
The following type conversions was done:
- Changed byte to uchar
- Changed gptr to uchar*
- Change my_string to char *
- Change my_size_t to size_t
- Change size_s to size_t
Removed declaration of byte, gptr, my_string, my_size_t and size_s.
Following function parameter changes was done:
- All string functions in mysys/strings was changed to use size_t
instead of uint for string lengths.
- All read()/write() functions changed to use size_t (including vio).
- All protocoll functions changed to use size_t instead of uint
- Functions that used a pointer to a string length was changed to use size_t*
- Changed malloc(), free() and related functions from using gptr to use void *
as this requires fewer casts in the code and is more in line with how the
standard functions work.
- Added extra length argument to dirname_part() to return the length of the
created string.
- Changed (at least) following functions to take uchar* as argument:
- db_dump()
- my_net_write()
- net_write_command()
- net_store_data()
- DBUG_DUMP()
- decimal2bin() & bin2decimal()
- Changed my_compress() and my_uncompress() to use size_t. Changed one
argument to my_uncompress() from a pointer to a value as we only return
one value (makes function easier to use).
- Changed type of 'pack_data' argument to packfrm() to avoid casts.
- Changed in readfrm() and writefrom(), ha_discover and handler::discover()
the type for argument 'frmdata' to uchar** to avoid casts.
- Changed most Field functions to use uchar* instead of char* (reduced a lot of
casts).
- Changed field->val_xxx(xxx, new_ptr) to take const pointers.
Other changes:
- Removed a lot of not needed casts
- Added a few new cast required by other changes
- Added some cast to my_multi_malloc() arguments for safety (as string lengths
needs to be uint, not size_t).
- Fixed all calls to hash-get-key functions to use size_t*. (Needed to be done
explicitely as this conflict was often hided by casting the function to
hash_get_key).
- Changed some buffers to memory regions to uchar* to avoid casts.
- Changed some string lengths from uint to size_t.
- Changed field->ptr to be uchar* instead of char*. This allowed us to
get rid of a lot of casts.
- Some changes from true -> TRUE, false -> FALSE, unsigned char -> uchar
- Include zlib.h in some files as we needed declaration of crc32()
- Changed MY_FILE_ERROR to be (size_t) -1.
- Changed many variables to hold the result of my_read() / my_write() to be
size_t. This was needed to properly detect errors (which are
returned as (size_t) -1).
- Removed some very old VMS code
- Changed packfrm()/unpackfrm() to not be depending on uint size
(portability fix)
- Removed windows specific code to restore cursor position as this
causes slowdown on windows and we should not mix read() and pread()
calls anyway as this is not thread safe. Updated function comment to
reflect this. Changed function that depended on original behavior of
my_pwrite() to itself restore the cursor position (one such case).
- Added some missing checking of return value of malloc().
- Changed definition of MOD_PAD_CHAR_TO_FULL_LENGTH to avoid 'long' overflow.
- Changed type of table_def::m_size from my_size_t to ulong to reflect that
m_size is the number of elements in the array, not a string/memory
length.
- Moved THD::max_row_length() to table.cc (as it's not depending on THD).
Inlined max_row_length_blob() into this function.
- More function comments
- Fixed some compiler warnings when compiled without partitions.
- Removed setting of LEX_STRING() arguments in declaration (portability fix).
- Some trivial indentation/variable name changes.
- Some trivial code simplifications:
- Replaced some calls to alloc_root + memcpy to use
strmake_root()/strdup_root().
- Changed some calls from memdup() to strmake() (Safety fix)
- Simpler loops in client-simple.c
2007-05-10 11:59:39 +02:00
|
|
|
/* gzip flag uchar */
|
2005-12-23 04:50:10 +01:00
|
|
|
#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */
|
|
|
|
#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */
|
|
|
|
#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */
|
|
|
|
#define ORIG_NAME 0x08 /* bit 3 set: original file name present */
|
|
|
|
#define COMMENT 0x10 /* bit 4 set: file comment present */
|
|
|
|
#define RESERVED 0xE0 /* bits 5..7: reserved */
|
|
|
|
|
2005-12-24 02:51:14 +01:00
|
|
|
int az_open(azio_stream *s, const char *path, int Flags, File fd);
|
|
|
|
int do_flush(azio_stream *file, int flush);
|
|
|
|
int get_byte(azio_stream *s);
|
|
|
|
void check_header(azio_stream *s);
|
2007-01-11 08:53:08 +01:00
|
|
|
void write_header(azio_stream *s);
|
2005-12-24 02:51:14 +01:00
|
|
|
int destroy(azio_stream *s);
|
|
|
|
void putLong(File file, uLong x);
|
|
|
|
uLong getLong(azio_stream *s);
|
2007-01-11 08:53:08 +01:00
|
|
|
void read_header(azio_stream *s, unsigned char *buffer);
|
2005-12-23 04:50:10 +01:00
|
|
|
|
|
|
|
/* ===========================================================================
|
|
|
|
Opens a gzip (.gz) file for reading or writing. The mode parameter
|
|
|
|
is as in fopen ("rb" or "wb"). The file is given either by file descriptor
|
|
|
|
or path name (if fd == -1).
|
|
|
|
az_open returns NULL if the file could not be opened or if there was
|
|
|
|
insufficient memory to allocate the (de)compression state; errno
|
|
|
|
can be checked to distinguish the two cases (if errno is zero, the
|
|
|
|
zlib error is Z_MEM_ERROR).
|
|
|
|
*/
|
2005-12-24 02:51:14 +01:00
|
|
|
int az_open (azio_stream *s, const char *path, int Flags, File fd)
|
2005-12-23 04:50:10 +01:00
|
|
|
{
|
|
|
|
int err;
|
2007-01-13 05:05:55 +01:00
|
|
|
int level = Z_DEFAULT_COMPRESSION; /* compression level */
|
2005-12-23 04:50:10 +01:00
|
|
|
int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */
|
|
|
|
|
|
|
|
s->stream.zalloc = (alloc_func)0;
|
|
|
|
s->stream.zfree = (free_func)0;
|
|
|
|
s->stream.opaque = (voidpf)0;
|
2007-03-21 06:13:55 +01:00
|
|
|
memset(s->inbuf, 0, AZ_BUFSIZE_READ);
|
|
|
|
memset(s->outbuf, 0, AZ_BUFSIZE_WRITE);
|
2005-12-23 04:50:10 +01:00
|
|
|
s->stream.next_in = s->inbuf;
|
|
|
|
s->stream.next_out = s->outbuf;
|
|
|
|
s->stream.avail_in = s->stream.avail_out = 0;
|
|
|
|
s->z_err = Z_OK;
|
|
|
|
s->z_eof = 0;
|
|
|
|
s->in = 0;
|
|
|
|
s->out = 0;
|
|
|
|
s->back = EOF;
|
|
|
|
s->crc = crc32(0L, Z_NULL, 0);
|
|
|
|
s->transparent = 0;
|
|
|
|
s->mode = 'r';
|
2006-12-05 07:01:48 +01:00
|
|
|
s->version = (unsigned char)az_magic[1]; /* this needs to be a define to version */
|
2007-01-21 20:41:00 +01:00
|
|
|
s->version = (unsigned char)az_magic[2]; /* minor version */
|
2005-12-23 04:50:10 +01:00
|
|
|
|
2007-01-11 08:53:08 +01:00
|
|
|
/*
|
|
|
|
We do our own version of append by nature.
|
|
|
|
We must always have write access to take card of the header.
|
|
|
|
*/
|
|
|
|
DBUG_ASSERT(Flags | O_APPEND);
|
|
|
|
DBUG_ASSERT(Flags | O_WRONLY);
|
|
|
|
|
|
|
|
if (Flags & O_RDWR)
|
2005-12-23 04:50:10 +01:00
|
|
|
s->mode = 'w';
|
|
|
|
|
2007-01-11 08:53:08 +01:00
|
|
|
if (s->mode == 'w')
|
|
|
|
{
|
2005-12-23 04:50:10 +01:00
|
|
|
err = deflateInit2(&(s->stream), level,
|
2005-12-28 05:33:48 +01:00
|
|
|
Z_DEFLATED, -MAX_WBITS, 8, strategy);
|
2005-12-23 04:50:10 +01:00
|
|
|
/* windowBits is passed < 0 to suppress zlib header */
|
|
|
|
|
|
|
|
s->stream.next_out = s->outbuf;
|
|
|
|
if (err != Z_OK)
|
|
|
|
{
|
|
|
|
destroy(s);
|
|
|
|
return Z_NULL;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
s->stream.next_in = s->inbuf;
|
|
|
|
|
|
|
|
err = inflateInit2(&(s->stream), -MAX_WBITS);
|
|
|
|
/* windowBits is passed < 0 to tell that there is no zlib header.
|
|
|
|
* Note that in this case inflate *requires* an extra "dummy" byte
|
|
|
|
* after the compressed stream in order to complete decompression and
|
|
|
|
* return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are
|
|
|
|
* present after the compressed stream.
|
|
|
|
*/
|
|
|
|
if (err != Z_OK)
|
|
|
|
{
|
|
|
|
destroy(s);
|
|
|
|
return Z_NULL;
|
|
|
|
}
|
|
|
|
}
|
2007-03-21 06:13:55 +01:00
|
|
|
s->stream.avail_out = AZ_BUFSIZE_WRITE;
|
2005-12-23 04:50:10 +01:00
|
|
|
|
|
|
|
errno = 0;
|
|
|
|
s->file = fd < 0 ? my_open(path, Flags, MYF(0)) : fd;
|
|
|
|
|
|
|
|
if (s->file < 0 )
|
|
|
|
{
|
|
|
|
destroy(s);
|
|
|
|
return Z_NULL;
|
|
|
|
}
|
2007-01-11 08:53:08 +01:00
|
|
|
|
|
|
|
if (Flags & O_CREAT || Flags & O_TRUNC)
|
|
|
|
{
|
|
|
|
s->rows= 0;
|
|
|
|
s->forced_flushes= 0;
|
2007-01-21 02:19:54 +01:00
|
|
|
s->shortest_row= 0;
|
|
|
|
s->longest_row= 0;
|
2007-01-11 08:53:08 +01:00
|
|
|
s->auto_increment= 0;
|
|
|
|
s->check_point= 0;
|
2007-01-24 19:30:06 +01:00
|
|
|
s->comment_start_pos= 0;
|
|
|
|
s->comment_length= 0;
|
|
|
|
s->frm_start_pos= 0;
|
|
|
|
s->frm_length= 0;
|
2007-01-11 08:53:08 +01:00
|
|
|
s->dirty= 1; /* We create the file dirty */
|
2007-01-24 19:30:06 +01:00
|
|
|
s->start = AZHEADER_SIZE + AZMETA_BUFFER_SIZE;
|
2007-01-11 08:53:08 +01:00
|
|
|
write_header(s);
|
|
|
|
my_seek(s->file, 0, MY_SEEK_END, MYF(0));
|
|
|
|
}
|
|
|
|
else if (s->mode == 'w')
|
|
|
|
{
|
WL#3817: Simplify string / memory area types and make things more consistent (first part)
The following type conversions was done:
- Changed byte to uchar
- Changed gptr to uchar*
- Change my_string to char *
- Change my_size_t to size_t
- Change size_s to size_t
Removed declaration of byte, gptr, my_string, my_size_t and size_s.
Following function parameter changes was done:
- All string functions in mysys/strings was changed to use size_t
instead of uint for string lengths.
- All read()/write() functions changed to use size_t (including vio).
- All protocoll functions changed to use size_t instead of uint
- Functions that used a pointer to a string length was changed to use size_t*
- Changed malloc(), free() and related functions from using gptr to use void *
as this requires fewer casts in the code and is more in line with how the
standard functions work.
- Added extra length argument to dirname_part() to return the length of the
created string.
- Changed (at least) following functions to take uchar* as argument:
- db_dump()
- my_net_write()
- net_write_command()
- net_store_data()
- DBUG_DUMP()
- decimal2bin() & bin2decimal()
- Changed my_compress() and my_uncompress() to use size_t. Changed one
argument to my_uncompress() from a pointer to a value as we only return
one value (makes function easier to use).
- Changed type of 'pack_data' argument to packfrm() to avoid casts.
- Changed in readfrm() and writefrom(), ha_discover and handler::discover()
the type for argument 'frmdata' to uchar** to avoid casts.
- Changed most Field functions to use uchar* instead of char* (reduced a lot of
casts).
- Changed field->val_xxx(xxx, new_ptr) to take const pointers.
Other changes:
- Removed a lot of not needed casts
- Added a few new cast required by other changes
- Added some cast to my_multi_malloc() arguments for safety (as string lengths
needs to be uint, not size_t).
- Fixed all calls to hash-get-key functions to use size_t*. (Needed to be done
explicitely as this conflict was often hided by casting the function to
hash_get_key).
- Changed some buffers to memory regions to uchar* to avoid casts.
- Changed some string lengths from uint to size_t.
- Changed field->ptr to be uchar* instead of char*. This allowed us to
get rid of a lot of casts.
- Some changes from true -> TRUE, false -> FALSE, unsigned char -> uchar
- Include zlib.h in some files as we needed declaration of crc32()
- Changed MY_FILE_ERROR to be (size_t) -1.
- Changed many variables to hold the result of my_read() / my_write() to be
size_t. This was needed to properly detect errors (which are
returned as (size_t) -1).
- Removed some very old VMS code
- Changed packfrm()/unpackfrm() to not be depending on uint size
(portability fix)
- Removed windows specific code to restore cursor position as this
causes slowdown on windows and we should not mix read() and pread()
calls anyway as this is not thread safe. Updated function comment to
reflect this. Changed function that depended on original behavior of
my_pwrite() to itself restore the cursor position (one such case).
- Added some missing checking of return value of malloc().
- Changed definition of MOD_PAD_CHAR_TO_FULL_LENGTH to avoid 'long' overflow.
- Changed type of table_def::m_size from my_size_t to ulong to reflect that
m_size is the number of elements in the array, not a string/memory
length.
- Moved THD::max_row_length() to table.cc (as it's not depending on THD).
Inlined max_row_length_blob() into this function.
- More function comments
- Fixed some compiler warnings when compiled without partitions.
- Removed setting of LEX_STRING() arguments in declaration (portability fix).
- Some trivial indentation/variable name changes.
- Some trivial code simplifications:
- Replaced some calls to alloc_root + memcpy to use
strmake_root()/strdup_root().
- Changed some calls from memdup() to strmake() (Safety fix)
- Simpler loops in client-simple.c
2007-05-10 11:59:39 +02:00
|
|
|
uchar buffer[AZHEADER_SIZE + AZMETA_BUFFER_SIZE];
|
|
|
|
my_pread(s->file, buffer, AZHEADER_SIZE + AZMETA_BUFFER_SIZE, 0,
|
2007-02-23 12:13:55 +01:00
|
|
|
MYF(0));
|
2007-01-11 08:53:08 +01:00
|
|
|
read_header(s, buffer); /* skip the .az header */
|
|
|
|
my_seek(s->file, 0, MY_SEEK_END, MYF(0));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
check_header(s); /* skip the .az header */
|
2005-12-23 04:50:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2007-01-11 08:53:08 +01:00
|
|
|
|
|
|
|
void write_header(azio_stream *s)
|
|
|
|
{
|
|
|
|
char buffer[AZHEADER_SIZE + AZMETA_BUFFER_SIZE];
|
|
|
|
char *ptr= buffer;
|
|
|
|
|
2007-03-21 06:13:55 +01:00
|
|
|
s->block_size= AZ_BUFSIZE_WRITE;
|
2007-01-11 08:53:08 +01:00
|
|
|
s->version = (unsigned char)az_magic[1];
|
2007-01-21 20:41:00 +01:00
|
|
|
s->minor_version = (unsigned char)az_magic[2];
|
2007-01-11 08:53:08 +01:00
|
|
|
|
|
|
|
|
|
|
|
/* Write a very simple .az header: */
|
2007-01-21 02:19:54 +01:00
|
|
|
memset(buffer, 0, AZHEADER_SIZE + AZMETA_BUFFER_SIZE);
|
2007-01-11 08:53:08 +01:00
|
|
|
*(ptr + AZ_MAGIC_POS)= az_magic[0];
|
|
|
|
*(ptr + AZ_VERSION_POS)= (unsigned char)s->version;
|
2007-01-21 20:41:00 +01:00
|
|
|
*(ptr + AZ_MINOR_VERSION_POS)= (unsigned char)s->minor_version;
|
2007-01-11 08:53:08 +01:00
|
|
|
*(ptr + AZ_BLOCK_POS)= (unsigned char)(s->block_size/1024); /* Reserved for block size */
|
|
|
|
*(ptr + AZ_STRATEGY_POS)= (unsigned char)Z_DEFAULT_STRATEGY; /* Compression Type */
|
|
|
|
|
2007-01-24 19:30:06 +01:00
|
|
|
int4store(ptr + AZ_FRM_POS, s->frm_start_pos); /* FRM Block */
|
|
|
|
int4store(ptr + AZ_FRM_LENGTH_POS, s->frm_length); /* FRM Block */
|
|
|
|
int4store(ptr + AZ_COMMENT_POS, s->comment_start_pos); /* COMMENT Block */
|
|
|
|
int4store(ptr + AZ_COMMENT_LENGTH_POS, s->comment_length); /* COMMENT Block */
|
2007-01-11 08:53:08 +01:00
|
|
|
int4store(ptr + AZ_META_POS, 0); /* Meta Block */
|
2007-01-24 19:30:06 +01:00
|
|
|
int4store(ptr + AZ_META_LENGTH_POS, 0); /* Meta Block */
|
2007-01-11 08:53:08 +01:00
|
|
|
int8store(ptr + AZ_START_POS, (unsigned long long)s->start); /* Start of Data Block Index Block */
|
|
|
|
int8store(ptr + AZ_ROW_POS, (unsigned long long)s->rows); /* Start of Data Block Index Block */
|
|
|
|
int8store(ptr + AZ_FLUSH_POS, (unsigned long long)s->forced_flushes); /* Start of Data Block Index Block */
|
|
|
|
int8store(ptr + AZ_CHECK_POS, (unsigned long long)s->check_point); /* Start of Data Block Index Block */
|
|
|
|
int8store(ptr + AZ_AUTOINCREMENT_POS, (unsigned long long)s->auto_increment); /* Start of Data Block Index Block */
|
2007-01-21 02:19:54 +01:00
|
|
|
int4store(ptr+ AZ_LONGEST_POS , s->longest_row); /* Longest row */
|
|
|
|
int4store(ptr+ AZ_SHORTEST_POS, s->shortest_row); /* Shorest row */
|
2007-01-24 19:30:06 +01:00
|
|
|
int4store(ptr+ AZ_FRM_POS,
|
|
|
|
AZHEADER_SIZE + AZMETA_BUFFER_SIZE); /* FRM position */
|
2007-01-11 08:53:08 +01:00
|
|
|
*(ptr + AZ_DIRTY_POS)= (unsigned char)s->dirty; /* Start of Data Block Index Block */
|
|
|
|
|
|
|
|
/* Always begin at the begining, and end there as well */
|
2007-08-13 15:11:25 +02:00
|
|
|
my_pwrite(s->file, (uchar*) buffer, AZHEADER_SIZE + AZMETA_BUFFER_SIZE, 0,
|
|
|
|
MYF(0));
|
2007-01-11 08:53:08 +01:00
|
|
|
}
|
|
|
|
|
2005-12-23 04:50:10 +01:00
|
|
|
/* ===========================================================================
|
|
|
|
Opens a gzip (.gz) file for reading or writing.
|
|
|
|
*/
|
|
|
|
int azopen(azio_stream *s, const char *path, int Flags)
|
|
|
|
{
|
|
|
|
return az_open(s, path, Flags, -1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ===========================================================================
|
|
|
|
Associate a gzFile with the file descriptor fd. fd is not dup'ed here
|
|
|
|
to mimic the behavio(u)r of fdopen.
|
|
|
|
*/
|
|
|
|
int azdopen(azio_stream *s, File fd, int Flags)
|
|
|
|
{
|
|
|
|
if (fd < 0) return 0;
|
|
|
|
|
|
|
|
return az_open (s, NULL, Flags, fd);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ===========================================================================
|
|
|
|
Read a byte from a azio_stream; update next_in and avail_in. Return EOF
|
|
|
|
for end of file.
|
|
|
|
IN assertion: the stream s has been sucessfully opened for reading.
|
|
|
|
*/
|
2005-12-24 02:51:14 +01:00
|
|
|
int get_byte(s)
|
2005-12-23 04:50:10 +01:00
|
|
|
azio_stream *s;
|
|
|
|
{
|
|
|
|
if (s->z_eof) return EOF;
|
|
|
|
if (s->stream.avail_in == 0)
|
|
|
|
{
|
|
|
|
errno = 0;
|
WL#3817: Simplify string / memory area types and make things more consistent (first part)
The following type conversions was done:
- Changed byte to uchar
- Changed gptr to uchar*
- Change my_string to char *
- Change my_size_t to size_t
- Change size_s to size_t
Removed declaration of byte, gptr, my_string, my_size_t and size_s.
Following function parameter changes was done:
- All string functions in mysys/strings was changed to use size_t
instead of uint for string lengths.
- All read()/write() functions changed to use size_t (including vio).
- All protocoll functions changed to use size_t instead of uint
- Functions that used a pointer to a string length was changed to use size_t*
- Changed malloc(), free() and related functions from using gptr to use void *
as this requires fewer casts in the code and is more in line with how the
standard functions work.
- Added extra length argument to dirname_part() to return the length of the
created string.
- Changed (at least) following functions to take uchar* as argument:
- db_dump()
- my_net_write()
- net_write_command()
- net_store_data()
- DBUG_DUMP()
- decimal2bin() & bin2decimal()
- Changed my_compress() and my_uncompress() to use size_t. Changed one
argument to my_uncompress() from a pointer to a value as we only return
one value (makes function easier to use).
- Changed type of 'pack_data' argument to packfrm() to avoid casts.
- Changed in readfrm() and writefrom(), ha_discover and handler::discover()
the type for argument 'frmdata' to uchar** to avoid casts.
- Changed most Field functions to use uchar* instead of char* (reduced a lot of
casts).
- Changed field->val_xxx(xxx, new_ptr) to take const pointers.
Other changes:
- Removed a lot of not needed casts
- Added a few new cast required by other changes
- Added some cast to my_multi_malloc() arguments for safety (as string lengths
needs to be uint, not size_t).
- Fixed all calls to hash-get-key functions to use size_t*. (Needed to be done
explicitely as this conflict was often hided by casting the function to
hash_get_key).
- Changed some buffers to memory regions to uchar* to avoid casts.
- Changed some string lengths from uint to size_t.
- Changed field->ptr to be uchar* instead of char*. This allowed us to
get rid of a lot of casts.
- Some changes from true -> TRUE, false -> FALSE, unsigned char -> uchar
- Include zlib.h in some files as we needed declaration of crc32()
- Changed MY_FILE_ERROR to be (size_t) -1.
- Changed many variables to hold the result of my_read() / my_write() to be
size_t. This was needed to properly detect errors (which are
returned as (size_t) -1).
- Removed some very old VMS code
- Changed packfrm()/unpackfrm() to not be depending on uint size
(portability fix)
- Removed windows specific code to restore cursor position as this
causes slowdown on windows and we should not mix read() and pread()
calls anyway as this is not thread safe. Updated function comment to
reflect this. Changed function that depended on original behavior of
my_pwrite() to itself restore the cursor position (one such case).
- Added some missing checking of return value of malloc().
- Changed definition of MOD_PAD_CHAR_TO_FULL_LENGTH to avoid 'long' overflow.
- Changed type of table_def::m_size from my_size_t to ulong to reflect that
m_size is the number of elements in the array, not a string/memory
length.
- Moved THD::max_row_length() to table.cc (as it's not depending on THD).
Inlined max_row_length_blob() into this function.
- More function comments
- Fixed some compiler warnings when compiled without partitions.
- Removed setting of LEX_STRING() arguments in declaration (portability fix).
- Some trivial indentation/variable name changes.
- Some trivial code simplifications:
- Replaced some calls to alloc_root + memcpy to use
strmake_root()/strdup_root().
- Changed some calls from memdup() to strmake() (Safety fix)
- Simpler loops in client-simple.c
2007-05-10 11:59:39 +02:00
|
|
|
s->stream.avail_in = my_read(s->file, (uchar *)s->inbuf, AZ_BUFSIZE_READ, MYF(0));
|
2005-12-23 04:50:10 +01:00
|
|
|
if (s->stream.avail_in == 0)
|
|
|
|
{
|
|
|
|
s->z_eof = 1;
|
2006-01-02 09:58:58 +01:00
|
|
|
/* if (ferror(s->file)) s->z_err = Z_ERRNO; */
|
2005-12-23 04:50:10 +01:00
|
|
|
return EOF;
|
|
|
|
}
|
|
|
|
s->stream.next_in = s->inbuf;
|
|
|
|
}
|
|
|
|
s->stream.avail_in--;
|
|
|
|
return *(s->stream.next_in)++;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ===========================================================================
|
|
|
|
Check the gzip header of a azio_stream opened for reading. Set the stream
|
|
|
|
mode to transparent if the gzip magic header is not present; set s->err
|
|
|
|
to Z_DATA_ERROR if the magic header is present but the rest of the header
|
|
|
|
is incorrect.
|
|
|
|
IN assertion: the stream s has already been created sucessfully;
|
|
|
|
s->stream.avail_in is zero for the first time, but may be non-zero
|
|
|
|
for concatenated .gz files.
|
|
|
|
*/
|
2005-12-24 02:51:14 +01:00
|
|
|
void check_header(azio_stream *s)
|
2005-12-23 04:50:10 +01:00
|
|
|
{
|
WL#3817: Simplify string / memory area types and make things more consistent (first part)
The following type conversions was done:
- Changed byte to uchar
- Changed gptr to uchar*
- Change my_string to char *
- Change my_size_t to size_t
- Change size_s to size_t
Removed declaration of byte, gptr, my_string, my_size_t and size_s.
Following function parameter changes was done:
- All string functions in mysys/strings was changed to use size_t
instead of uint for string lengths.
- All read()/write() functions changed to use size_t (including vio).
- All protocoll functions changed to use size_t instead of uint
- Functions that used a pointer to a string length was changed to use size_t*
- Changed malloc(), free() and related functions from using gptr to use void *
as this requires fewer casts in the code and is more in line with how the
standard functions work.
- Added extra length argument to dirname_part() to return the length of the
created string.
- Changed (at least) following functions to take uchar* as argument:
- db_dump()
- my_net_write()
- net_write_command()
- net_store_data()
- DBUG_DUMP()
- decimal2bin() & bin2decimal()
- Changed my_compress() and my_uncompress() to use size_t. Changed one
argument to my_uncompress() from a pointer to a value as we only return
one value (makes function easier to use).
- Changed type of 'pack_data' argument to packfrm() to avoid casts.
- Changed in readfrm() and writefrom(), ha_discover and handler::discover()
the type for argument 'frmdata' to uchar** to avoid casts.
- Changed most Field functions to use uchar* instead of char* (reduced a lot of
casts).
- Changed field->val_xxx(xxx, new_ptr) to take const pointers.
Other changes:
- Removed a lot of not needed casts
- Added a few new cast required by other changes
- Added some cast to my_multi_malloc() arguments for safety (as string lengths
needs to be uint, not size_t).
- Fixed all calls to hash-get-key functions to use size_t*. (Needed to be done
explicitely as this conflict was often hided by casting the function to
hash_get_key).
- Changed some buffers to memory regions to uchar* to avoid casts.
- Changed some string lengths from uint to size_t.
- Changed field->ptr to be uchar* instead of char*. This allowed us to
get rid of a lot of casts.
- Some changes from true -> TRUE, false -> FALSE, unsigned char -> uchar
- Include zlib.h in some files as we needed declaration of crc32()
- Changed MY_FILE_ERROR to be (size_t) -1.
- Changed many variables to hold the result of my_read() / my_write() to be
size_t. This was needed to properly detect errors (which are
returned as (size_t) -1).
- Removed some very old VMS code
- Changed packfrm()/unpackfrm() to not be depending on uint size
(portability fix)
- Removed windows specific code to restore cursor position as this
causes slowdown on windows and we should not mix read() and pread()
calls anyway as this is not thread safe. Updated function comment to
reflect this. Changed function that depended on original behavior of
my_pwrite() to itself restore the cursor position (one such case).
- Added some missing checking of return value of malloc().
- Changed definition of MOD_PAD_CHAR_TO_FULL_LENGTH to avoid 'long' overflow.
- Changed type of table_def::m_size from my_size_t to ulong to reflect that
m_size is the number of elements in the array, not a string/memory
length.
- Moved THD::max_row_length() to table.cc (as it's not depending on THD).
Inlined max_row_length_blob() into this function.
- More function comments
- Fixed some compiler warnings when compiled without partitions.
- Removed setting of LEX_STRING() arguments in declaration (portability fix).
- Some trivial indentation/variable name changes.
- Some trivial code simplifications:
- Replaced some calls to alloc_root + memcpy to use
strmake_root()/strdup_root().
- Changed some calls from memdup() to strmake() (Safety fix)
- Simpler loops in client-simple.c
2007-05-10 11:59:39 +02:00
|
|
|
int method; /* method uchar */
|
|
|
|
int flags; /* flags uchar */
|
2005-12-23 04:50:10 +01:00
|
|
|
uInt len;
|
|
|
|
int c;
|
|
|
|
|
|
|
|
/* Assure two bytes in the buffer so we can peek ahead -- handle case
|
|
|
|
where first byte of header is at the end of the buffer after the last
|
|
|
|
gzip segment */
|
|
|
|
len = s->stream.avail_in;
|
|
|
|
if (len < 2) {
|
|
|
|
if (len) s->inbuf[0] = s->stream.next_in[0];
|
|
|
|
errno = 0;
|
WL#3817: Simplify string / memory area types and make things more consistent (first part)
The following type conversions was done:
- Changed byte to uchar
- Changed gptr to uchar*
- Change my_string to char *
- Change my_size_t to size_t
- Change size_s to size_t
Removed declaration of byte, gptr, my_string, my_size_t and size_s.
Following function parameter changes was done:
- All string functions in mysys/strings was changed to use size_t
instead of uint for string lengths.
- All read()/write() functions changed to use size_t (including vio).
- All protocoll functions changed to use size_t instead of uint
- Functions that used a pointer to a string length was changed to use size_t*
- Changed malloc(), free() and related functions from using gptr to use void *
as this requires fewer casts in the code and is more in line with how the
standard functions work.
- Added extra length argument to dirname_part() to return the length of the
created string.
- Changed (at least) following functions to take uchar* as argument:
- db_dump()
- my_net_write()
- net_write_command()
- net_store_data()
- DBUG_DUMP()
- decimal2bin() & bin2decimal()
- Changed my_compress() and my_uncompress() to use size_t. Changed one
argument to my_uncompress() from a pointer to a value as we only return
one value (makes function easier to use).
- Changed type of 'pack_data' argument to packfrm() to avoid casts.
- Changed in readfrm() and writefrom(), ha_discover and handler::discover()
the type for argument 'frmdata' to uchar** to avoid casts.
- Changed most Field functions to use uchar* instead of char* (reduced a lot of
casts).
- Changed field->val_xxx(xxx, new_ptr) to take const pointers.
Other changes:
- Removed a lot of not needed casts
- Added a few new cast required by other changes
- Added some cast to my_multi_malloc() arguments for safety (as string lengths
needs to be uint, not size_t).
- Fixed all calls to hash-get-key functions to use size_t*. (Needed to be done
explicitely as this conflict was often hided by casting the function to
hash_get_key).
- Changed some buffers to memory regions to uchar* to avoid casts.
- Changed some string lengths from uint to size_t.
- Changed field->ptr to be uchar* instead of char*. This allowed us to
get rid of a lot of casts.
- Some changes from true -> TRUE, false -> FALSE, unsigned char -> uchar
- Include zlib.h in some files as we needed declaration of crc32()
- Changed MY_FILE_ERROR to be (size_t) -1.
- Changed many variables to hold the result of my_read() / my_write() to be
size_t. This was needed to properly detect errors (which are
returned as (size_t) -1).
- Removed some very old VMS code
- Changed packfrm()/unpackfrm() to not be depending on uint size
(portability fix)
- Removed windows specific code to restore cursor position as this
causes slowdown on windows and we should not mix read() and pread()
calls anyway as this is not thread safe. Updated function comment to
reflect this. Changed function that depended on original behavior of
my_pwrite() to itself restore the cursor position (one such case).
- Added some missing checking of return value of malloc().
- Changed definition of MOD_PAD_CHAR_TO_FULL_LENGTH to avoid 'long' overflow.
- Changed type of table_def::m_size from my_size_t to ulong to reflect that
m_size is the number of elements in the array, not a string/memory
length.
- Moved THD::max_row_length() to table.cc (as it's not depending on THD).
Inlined max_row_length_blob() into this function.
- More function comments
- Fixed some compiler warnings when compiled without partitions.
- Removed setting of LEX_STRING() arguments in declaration (portability fix).
- Some trivial indentation/variable name changes.
- Some trivial code simplifications:
- Replaced some calls to alloc_root + memcpy to use
strmake_root()/strdup_root().
- Changed some calls from memdup() to strmake() (Safety fix)
- Simpler loops in client-simple.c
2007-05-10 11:59:39 +02:00
|
|
|
len = (uInt)my_read(s->file, (uchar *)s->inbuf + len, AZ_BUFSIZE_READ >> len, MYF(0));
|
2007-11-23 14:51:12 +01:00
|
|
|
if (len == (uInt)-1) s->z_err = Z_ERRNO;
|
2005-12-23 04:50:10 +01:00
|
|
|
s->stream.avail_in += len;
|
|
|
|
s->stream.next_in = s->inbuf;
|
|
|
|
if (s->stream.avail_in < 2) {
|
|
|
|
s->transparent = s->stream.avail_in;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Peek ahead to check the gzip magic header */
|
2006-12-05 07:01:48 +01:00
|
|
|
if ( s->stream.next_in[0] == gz_magic[0] && s->stream.next_in[1] == gz_magic[1])
|
|
|
|
{
|
|
|
|
s->stream.avail_in -= 2;
|
|
|
|
s->stream.next_in += 2;
|
|
|
|
s->version= (unsigned char)2;
|
|
|
|
|
|
|
|
/* Check the rest of the gzip header */
|
|
|
|
method = get_byte(s);
|
|
|
|
flags = get_byte(s);
|
|
|
|
if (method != Z_DEFLATED || (flags & RESERVED) != 0) {
|
|
|
|
s->z_err = Z_DATA_ERROR;
|
|
|
|
return;
|
|
|
|
}
|
2005-12-23 04:50:10 +01:00
|
|
|
|
2006-12-05 07:01:48 +01:00
|
|
|
/* Discard time, xflags and OS code: */
|
|
|
|
for (len = 0; len < 6; len++) (void)get_byte(s);
|
2005-12-23 04:50:10 +01:00
|
|
|
|
2006-12-05 07:01:48 +01:00
|
|
|
if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */
|
|
|
|
len = (uInt)get_byte(s);
|
|
|
|
len += ((uInt)get_byte(s))<<8;
|
|
|
|
/* len is garbage if EOF but the loop below will quit anyway */
|
|
|
|
while (len-- != 0 && get_byte(s) != EOF) ;
|
|
|
|
}
|
|
|
|
if ((flags & ORIG_NAME) != 0) { /* skip the original file name */
|
|
|
|
while ((c = get_byte(s)) != 0 && c != EOF) ;
|
|
|
|
}
|
|
|
|
if ((flags & COMMENT) != 0) { /* skip the .gz file comment */
|
|
|
|
while ((c = get_byte(s)) != 0 && c != EOF) ;
|
|
|
|
}
|
|
|
|
if ((flags & HEAD_CRC) != 0) { /* skip the header crc */
|
|
|
|
for (len = 0; len < 2; len++) (void)get_byte(s);
|
|
|
|
}
|
|
|
|
s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK;
|
2007-01-11 08:53:08 +01:00
|
|
|
s->start = my_tell(s->file, MYF(0)) - s->stream.avail_in;
|
2005-12-23 04:50:10 +01:00
|
|
|
}
|
2006-12-05 07:01:48 +01:00
|
|
|
else if ( s->stream.next_in[0] == az_magic[0] && s->stream.next_in[1] == az_magic[1])
|
|
|
|
{
|
2007-01-11 08:53:08 +01:00
|
|
|
unsigned char buffer[AZHEADER_SIZE + AZMETA_BUFFER_SIZE];
|
2005-12-23 04:50:10 +01:00
|
|
|
|
2007-01-11 08:53:08 +01:00
|
|
|
for (len = 0; len < (AZHEADER_SIZE + AZMETA_BUFFER_SIZE); len++)
|
|
|
|
buffer[len]= get_byte(s);
|
2006-12-05 07:01:48 +01:00
|
|
|
s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK;
|
2007-01-11 08:53:08 +01:00
|
|
|
read_header(s, buffer);
|
2007-01-24 19:30:06 +01:00
|
|
|
for (; len < s->start; len++)
|
|
|
|
get_byte(s);
|
2005-12-23 04:50:10 +01:00
|
|
|
}
|
2007-01-11 08:53:08 +01:00
|
|
|
else
|
|
|
|
{
|
|
|
|
s->z_err = Z_OK;
|
|
|
|
|
|
|
|
return;
|
2005-12-23 04:50:10 +01:00
|
|
|
}
|
2007-01-11 08:53:08 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void read_header(azio_stream *s, unsigned char *buffer)
|
|
|
|
{
|
|
|
|
if (buffer[0] == az_magic[0] && buffer[1] == az_magic[1])
|
|
|
|
{
|
|
|
|
s->version= (unsigned int)buffer[AZ_VERSION_POS];
|
2007-01-21 20:41:00 +01:00
|
|
|
s->minor_version= (unsigned int)buffer[AZ_MINOR_VERSION_POS];
|
2007-01-11 08:53:08 +01:00
|
|
|
s->block_size= 1024 * buffer[AZ_BLOCK_POS];
|
|
|
|
s->start= (unsigned long long)uint8korr(buffer + AZ_START_POS);
|
|
|
|
s->rows= (unsigned long long)uint8korr(buffer + AZ_ROW_POS);
|
|
|
|
s->check_point= (unsigned long long)uint8korr(buffer + AZ_CHECK_POS);
|
|
|
|
s->forced_flushes= (unsigned long long)uint8korr(buffer + AZ_FLUSH_POS);
|
|
|
|
s->auto_increment= (unsigned long long)uint8korr(buffer + AZ_AUTOINCREMENT_POS);
|
2007-01-21 02:19:54 +01:00
|
|
|
s->longest_row= (unsigned int)uint4korr(buffer + AZ_LONGEST_POS);
|
|
|
|
s->shortest_row= (unsigned int)uint4korr(buffer + AZ_SHORTEST_POS);
|
2007-01-24 19:30:06 +01:00
|
|
|
s->frm_start_pos= (unsigned int)uint4korr(buffer + AZ_FRM_POS);
|
|
|
|
s->frm_length= (unsigned int)uint4korr(buffer + AZ_FRM_LENGTH_POS);
|
|
|
|
s->comment_start_pos= (unsigned int)uint4korr(buffer + AZ_COMMENT_POS);
|
|
|
|
s->comment_length= (unsigned int)uint4korr(buffer + AZ_COMMENT_LENGTH_POS);
|
2007-01-11 08:53:08 +01:00
|
|
|
s->dirty= (unsigned int)buffer[AZ_DIRTY_POS];
|
2005-12-23 04:50:10 +01:00
|
|
|
}
|
2006-12-05 07:01:48 +01:00
|
|
|
else
|
|
|
|
{
|
2007-01-11 08:53:08 +01:00
|
|
|
DBUG_ASSERT(buffer[0] == az_magic[0] && buffer[1] == az_magic[1]);
|
2006-12-05 07:01:48 +01:00
|
|
|
return;
|
2005-12-23 04:50:10 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ===========================================================================
|
|
|
|
* Cleanup then free the given azio_stream. Return a zlib error code.
|
|
|
|
Try freeing in the reverse order of allocations.
|
|
|
|
*/
|
2005-12-24 02:51:14 +01:00
|
|
|
int destroy (s)
|
2005-12-23 04:50:10 +01:00
|
|
|
azio_stream *s;
|
|
|
|
{
|
|
|
|
int err = Z_OK;
|
|
|
|
|
2007-01-21 02:19:54 +01:00
|
|
|
if (s->stream.state != NULL)
|
|
|
|
{
|
|
|
|
if (s->mode == 'w')
|
2005-12-23 04:50:10 +01:00
|
|
|
err = deflateEnd(&(s->stream));
|
|
|
|
else if (s->mode == 'r')
|
|
|
|
err = inflateEnd(&(s->stream));
|
|
|
|
}
|
2007-01-21 02:19:54 +01:00
|
|
|
|
2005-12-25 12:29:49 +01:00
|
|
|
if (s->file > 0 && my_close(s->file, MYF(0)))
|
2005-12-23 04:50:10 +01:00
|
|
|
err = Z_ERRNO;
|
2007-01-21 02:19:54 +01:00
|
|
|
|
|
|
|
s->file= -1;
|
|
|
|
|
2005-12-23 04:50:10 +01:00
|
|
|
if (s->z_err < 0) err = s->z_err;
|
|
|
|
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ===========================================================================
|
|
|
|
Reads the given number of uncompressed bytes from the compressed file.
|
|
|
|
azread returns the number of bytes actually read (0 for end of file).
|
|
|
|
*/
|
2007-01-11 08:53:08 +01:00
|
|
|
unsigned int ZEXPORT azread ( azio_stream *s, voidp buf, unsigned int len, int *error)
|
2005-12-23 04:50:10 +01:00
|
|
|
{
|
|
|
|
Bytef *start = (Bytef*)buf; /* starting point for crc computation */
|
|
|
|
Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */
|
2006-12-04 07:09:32 +01:00
|
|
|
*error= 0;
|
2005-12-23 04:50:10 +01:00
|
|
|
|
2006-12-04 07:09:32 +01:00
|
|
|
if (s->mode != 'r')
|
|
|
|
{
|
|
|
|
*error= Z_STREAM_ERROR;
|
|
|
|
return 0;
|
|
|
|
}
|
2005-12-23 04:50:10 +01:00
|
|
|
|
2006-12-04 07:09:32 +01:00
|
|
|
if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO)
|
|
|
|
{
|
|
|
|
*error= s->z_err;
|
|
|
|
return 0;
|
|
|
|
}
|
2005-12-23 04:50:10 +01:00
|
|
|
|
2006-12-04 07:09:32 +01:00
|
|
|
if (s->z_err == Z_STREAM_END) /* EOF */
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
2005-12-23 04:50:10 +01:00
|
|
|
|
|
|
|
next_out = (Byte*)buf;
|
|
|
|
s->stream.next_out = (Bytef*)buf;
|
|
|
|
s->stream.avail_out = len;
|
|
|
|
|
|
|
|
if (s->stream.avail_out && s->back != EOF) {
|
|
|
|
*next_out++ = s->back;
|
|
|
|
s->stream.next_out++;
|
|
|
|
s->stream.avail_out--;
|
|
|
|
s->back = EOF;
|
|
|
|
s->out++;
|
|
|
|
start++;
|
|
|
|
if (s->last) {
|
|
|
|
s->z_err = Z_STREAM_END;
|
2006-12-04 07:09:32 +01:00
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
2005-12-23 04:50:10 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
while (s->stream.avail_out != 0) {
|
|
|
|
|
|
|
|
if (s->transparent) {
|
|
|
|
/* Copy first the lookahead bytes: */
|
|
|
|
uInt n = s->stream.avail_in;
|
|
|
|
if (n > s->stream.avail_out) n = s->stream.avail_out;
|
|
|
|
if (n > 0) {
|
2005-12-28 05:33:48 +01:00
|
|
|
memcpy(s->stream.next_out, s->stream.next_in, n);
|
2005-12-23 04:50:10 +01:00
|
|
|
next_out += n;
|
|
|
|
s->stream.next_out = (Bytef *)next_out;
|
|
|
|
s->stream.next_in += n;
|
|
|
|
s->stream.avail_out -= n;
|
|
|
|
s->stream.avail_in -= n;
|
|
|
|
}
|
|
|
|
if (s->stream.avail_out > 0)
|
|
|
|
{
|
|
|
|
s->stream.avail_out -=
|
WL#3817: Simplify string / memory area types and make things more consistent (first part)
The following type conversions was done:
- Changed byte to uchar
- Changed gptr to uchar*
- Change my_string to char *
- Change my_size_t to size_t
- Change size_s to size_t
Removed declaration of byte, gptr, my_string, my_size_t and size_s.
Following function parameter changes was done:
- All string functions in mysys/strings was changed to use size_t
instead of uint for string lengths.
- All read()/write() functions changed to use size_t (including vio).
- All protocoll functions changed to use size_t instead of uint
- Functions that used a pointer to a string length was changed to use size_t*
- Changed malloc(), free() and related functions from using gptr to use void *
as this requires fewer casts in the code and is more in line with how the
standard functions work.
- Added extra length argument to dirname_part() to return the length of the
created string.
- Changed (at least) following functions to take uchar* as argument:
- db_dump()
- my_net_write()
- net_write_command()
- net_store_data()
- DBUG_DUMP()
- decimal2bin() & bin2decimal()
- Changed my_compress() and my_uncompress() to use size_t. Changed one
argument to my_uncompress() from a pointer to a value as we only return
one value (makes function easier to use).
- Changed type of 'pack_data' argument to packfrm() to avoid casts.
- Changed in readfrm() and writefrom(), ha_discover and handler::discover()
the type for argument 'frmdata' to uchar** to avoid casts.
- Changed most Field functions to use uchar* instead of char* (reduced a lot of
casts).
- Changed field->val_xxx(xxx, new_ptr) to take const pointers.
Other changes:
- Removed a lot of not needed casts
- Added a few new cast required by other changes
- Added some cast to my_multi_malloc() arguments for safety (as string lengths
needs to be uint, not size_t).
- Fixed all calls to hash-get-key functions to use size_t*. (Needed to be done
explicitely as this conflict was often hided by casting the function to
hash_get_key).
- Changed some buffers to memory regions to uchar* to avoid casts.
- Changed some string lengths from uint to size_t.
- Changed field->ptr to be uchar* instead of char*. This allowed us to
get rid of a lot of casts.
- Some changes from true -> TRUE, false -> FALSE, unsigned char -> uchar
- Include zlib.h in some files as we needed declaration of crc32()
- Changed MY_FILE_ERROR to be (size_t) -1.
- Changed many variables to hold the result of my_read() / my_write() to be
size_t. This was needed to properly detect errors (which are
returned as (size_t) -1).
- Removed some very old VMS code
- Changed packfrm()/unpackfrm() to not be depending on uint size
(portability fix)
- Removed windows specific code to restore cursor position as this
causes slowdown on windows and we should not mix read() and pread()
calls anyway as this is not thread safe. Updated function comment to
reflect this. Changed function that depended on original behavior of
my_pwrite() to itself restore the cursor position (one such case).
- Added some missing checking of return value of malloc().
- Changed definition of MOD_PAD_CHAR_TO_FULL_LENGTH to avoid 'long' overflow.
- Changed type of table_def::m_size from my_size_t to ulong to reflect that
m_size is the number of elements in the array, not a string/memory
length.
- Moved THD::max_row_length() to table.cc (as it's not depending on THD).
Inlined max_row_length_blob() into this function.
- More function comments
- Fixed some compiler warnings when compiled without partitions.
- Removed setting of LEX_STRING() arguments in declaration (portability fix).
- Some trivial indentation/variable name changes.
- Some trivial code simplifications:
- Replaced some calls to alloc_root + memcpy to use
strmake_root()/strdup_root().
- Changed some calls from memdup() to strmake() (Safety fix)
- Simpler loops in client-simple.c
2007-05-10 11:59:39 +02:00
|
|
|
(uInt)my_read(s->file, (uchar *)next_out, s->stream.avail_out, MYF(0));
|
2005-12-23 04:50:10 +01:00
|
|
|
}
|
|
|
|
len -= s->stream.avail_out;
|
|
|
|
s->in += len;
|
|
|
|
s->out += len;
|
|
|
|
if (len == 0) s->z_eof = 1;
|
2006-12-04 07:09:32 +01:00
|
|
|
{
|
|
|
|
return len;
|
|
|
|
}
|
2005-12-23 04:50:10 +01:00
|
|
|
}
|
|
|
|
if (s->stream.avail_in == 0 && !s->z_eof) {
|
|
|
|
|
|
|
|
errno = 0;
|
WL#3817: Simplify string / memory area types and make things more consistent (first part)
The following type conversions was done:
- Changed byte to uchar
- Changed gptr to uchar*
- Change my_string to char *
- Change my_size_t to size_t
- Change size_s to size_t
Removed declaration of byte, gptr, my_string, my_size_t and size_s.
Following function parameter changes was done:
- All string functions in mysys/strings was changed to use size_t
instead of uint for string lengths.
- All read()/write() functions changed to use size_t (including vio).
- All protocoll functions changed to use size_t instead of uint
- Functions that used a pointer to a string length was changed to use size_t*
- Changed malloc(), free() and related functions from using gptr to use void *
as this requires fewer casts in the code and is more in line with how the
standard functions work.
- Added extra length argument to dirname_part() to return the length of the
created string.
- Changed (at least) following functions to take uchar* as argument:
- db_dump()
- my_net_write()
- net_write_command()
- net_store_data()
- DBUG_DUMP()
- decimal2bin() & bin2decimal()
- Changed my_compress() and my_uncompress() to use size_t. Changed one
argument to my_uncompress() from a pointer to a value as we only return
one value (makes function easier to use).
- Changed type of 'pack_data' argument to packfrm() to avoid casts.
- Changed in readfrm() and writefrom(), ha_discover and handler::discover()
the type for argument 'frmdata' to uchar** to avoid casts.
- Changed most Field functions to use uchar* instead of char* (reduced a lot of
casts).
- Changed field->val_xxx(xxx, new_ptr) to take const pointers.
Other changes:
- Removed a lot of not needed casts
- Added a few new cast required by other changes
- Added some cast to my_multi_malloc() arguments for safety (as string lengths
needs to be uint, not size_t).
- Fixed all calls to hash-get-key functions to use size_t*. (Needed to be done
explicitely as this conflict was often hided by casting the function to
hash_get_key).
- Changed some buffers to memory regions to uchar* to avoid casts.
- Changed some string lengths from uint to size_t.
- Changed field->ptr to be uchar* instead of char*. This allowed us to
get rid of a lot of casts.
- Some changes from true -> TRUE, false -> FALSE, unsigned char -> uchar
- Include zlib.h in some files as we needed declaration of crc32()
- Changed MY_FILE_ERROR to be (size_t) -1.
- Changed many variables to hold the result of my_read() / my_write() to be
size_t. This was needed to properly detect errors (which are
returned as (size_t) -1).
- Removed some very old VMS code
- Changed packfrm()/unpackfrm() to not be depending on uint size
(portability fix)
- Removed windows specific code to restore cursor position as this
causes slowdown on windows and we should not mix read() and pread()
calls anyway as this is not thread safe. Updated function comment to
reflect this. Changed function that depended on original behavior of
my_pwrite() to itself restore the cursor position (one such case).
- Added some missing checking of return value of malloc().
- Changed definition of MOD_PAD_CHAR_TO_FULL_LENGTH to avoid 'long' overflow.
- Changed type of table_def::m_size from my_size_t to ulong to reflect that
m_size is the number of elements in the array, not a string/memory
length.
- Moved THD::max_row_length() to table.cc (as it's not depending on THD).
Inlined max_row_length_blob() into this function.
- More function comments
- Fixed some compiler warnings when compiled without partitions.
- Removed setting of LEX_STRING() arguments in declaration (portability fix).
- Some trivial indentation/variable name changes.
- Some trivial code simplifications:
- Replaced some calls to alloc_root + memcpy to use
strmake_root()/strdup_root().
- Changed some calls from memdup() to strmake() (Safety fix)
- Simpler loops in client-simple.c
2007-05-10 11:59:39 +02:00
|
|
|
s->stream.avail_in = (uInt)my_read(s->file, (uchar *)s->inbuf, AZ_BUFSIZE_READ, MYF(0));
|
2005-12-23 04:50:10 +01:00
|
|
|
if (s->stream.avail_in == 0)
|
|
|
|
{
|
|
|
|
s->z_eof = 1;
|
|
|
|
}
|
|
|
|
s->stream.next_in = (Bytef *)s->inbuf;
|
|
|
|
}
|
|
|
|
s->in += s->stream.avail_in;
|
|
|
|
s->out += s->stream.avail_out;
|
|
|
|
s->z_err = inflate(&(s->stream), Z_NO_FLUSH);
|
|
|
|
s->in -= s->stream.avail_in;
|
|
|
|
s->out -= s->stream.avail_out;
|
|
|
|
|
|
|
|
if (s->z_err == Z_STREAM_END) {
|
|
|
|
/* Check CRC and original size */
|
|
|
|
s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start));
|
|
|
|
start = s->stream.next_out;
|
|
|
|
|
|
|
|
if (getLong(s) != s->crc) {
|
|
|
|
s->z_err = Z_DATA_ERROR;
|
|
|
|
} else {
|
|
|
|
(void)getLong(s);
|
|
|
|
/* The uncompressed length returned by above getlong() may be
|
|
|
|
* different from s->out in case of concatenated .gz files.
|
|
|
|
* Check for such files:
|
|
|
|
*/
|
|
|
|
check_header(s);
|
2007-01-11 08:53:08 +01:00
|
|
|
if (s->z_err == Z_OK)
|
|
|
|
{
|
2005-12-23 04:50:10 +01:00
|
|
|
inflateReset(&(s->stream));
|
|
|
|
s->crc = crc32(0L, Z_NULL, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (s->z_err != Z_OK || s->z_eof) break;
|
|
|
|
}
|
|
|
|
s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start));
|
|
|
|
|
|
|
|
if (len == s->stream.avail_out &&
|
|
|
|
(s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO))
|
2006-12-04 07:09:32 +01:00
|
|
|
{
|
|
|
|
*error= s->z_err;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return (len - s->stream.avail_out);
|
2005-12-23 04:50:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* ===========================================================================
|
|
|
|
Writes the given number of uncompressed bytes into the compressed file.
|
|
|
|
azwrite returns the number of bytes actually written (0 in case of error).
|
|
|
|
*/
|
2007-09-07 13:27:52 +02:00
|
|
|
unsigned int azwrite (azio_stream *s, const voidp buf, unsigned int len)
|
2005-12-23 04:50:10 +01:00
|
|
|
{
|
|
|
|
s->stream.next_in = (Bytef*)buf;
|
|
|
|
s->stream.avail_in = len;
|
|
|
|
|
2007-01-11 08:53:08 +01:00
|
|
|
s->rows++;
|
|
|
|
|
2005-12-23 04:50:10 +01:00
|
|
|
while (s->stream.avail_in != 0)
|
|
|
|
{
|
|
|
|
if (s->stream.avail_out == 0)
|
|
|
|
{
|
|
|
|
|
|
|
|
s->stream.next_out = s->outbuf;
|
WL#3817: Simplify string / memory area types and make things more consistent (first part)
The following type conversions was done:
- Changed byte to uchar
- Changed gptr to uchar*
- Change my_string to char *
- Change my_size_t to size_t
- Change size_s to size_t
Removed declaration of byte, gptr, my_string, my_size_t and size_s.
Following function parameter changes was done:
- All string functions in mysys/strings was changed to use size_t
instead of uint for string lengths.
- All read()/write() functions changed to use size_t (including vio).
- All protocoll functions changed to use size_t instead of uint
- Functions that used a pointer to a string length was changed to use size_t*
- Changed malloc(), free() and related functions from using gptr to use void *
as this requires fewer casts in the code and is more in line with how the
standard functions work.
- Added extra length argument to dirname_part() to return the length of the
created string.
- Changed (at least) following functions to take uchar* as argument:
- db_dump()
- my_net_write()
- net_write_command()
- net_store_data()
- DBUG_DUMP()
- decimal2bin() & bin2decimal()
- Changed my_compress() and my_uncompress() to use size_t. Changed one
argument to my_uncompress() from a pointer to a value as we only return
one value (makes function easier to use).
- Changed type of 'pack_data' argument to packfrm() to avoid casts.
- Changed in readfrm() and writefrom(), ha_discover and handler::discover()
the type for argument 'frmdata' to uchar** to avoid casts.
- Changed most Field functions to use uchar* instead of char* (reduced a lot of
casts).
- Changed field->val_xxx(xxx, new_ptr) to take const pointers.
Other changes:
- Removed a lot of not needed casts
- Added a few new cast required by other changes
- Added some cast to my_multi_malloc() arguments for safety (as string lengths
needs to be uint, not size_t).
- Fixed all calls to hash-get-key functions to use size_t*. (Needed to be done
explicitely as this conflict was often hided by casting the function to
hash_get_key).
- Changed some buffers to memory regions to uchar* to avoid casts.
- Changed some string lengths from uint to size_t.
- Changed field->ptr to be uchar* instead of char*. This allowed us to
get rid of a lot of casts.
- Some changes from true -> TRUE, false -> FALSE, unsigned char -> uchar
- Include zlib.h in some files as we needed declaration of crc32()
- Changed MY_FILE_ERROR to be (size_t) -1.
- Changed many variables to hold the result of my_read() / my_write() to be
size_t. This was needed to properly detect errors (which are
returned as (size_t) -1).
- Removed some very old VMS code
- Changed packfrm()/unpackfrm() to not be depending on uint size
(portability fix)
- Removed windows specific code to restore cursor position as this
causes slowdown on windows and we should not mix read() and pread()
calls anyway as this is not thread safe. Updated function comment to
reflect this. Changed function that depended on original behavior of
my_pwrite() to itself restore the cursor position (one such case).
- Added some missing checking of return value of malloc().
- Changed definition of MOD_PAD_CHAR_TO_FULL_LENGTH to avoid 'long' overflow.
- Changed type of table_def::m_size from my_size_t to ulong to reflect that
m_size is the number of elements in the array, not a string/memory
length.
- Moved THD::max_row_length() to table.cc (as it's not depending on THD).
Inlined max_row_length_blob() into this function.
- More function comments
- Fixed some compiler warnings when compiled without partitions.
- Removed setting of LEX_STRING() arguments in declaration (portability fix).
- Some trivial indentation/variable name changes.
- Some trivial code simplifications:
- Replaced some calls to alloc_root + memcpy to use
strmake_root()/strdup_root().
- Changed some calls from memdup() to strmake() (Safety fix)
- Simpler loops in client-simple.c
2007-05-10 11:59:39 +02:00
|
|
|
if (my_write(s->file, (uchar *)s->outbuf, AZ_BUFSIZE_WRITE,
|
2007-03-21 06:13:55 +01:00
|
|
|
MYF(0)) != AZ_BUFSIZE_WRITE)
|
2005-12-23 04:50:10 +01:00
|
|
|
{
|
|
|
|
s->z_err = Z_ERRNO;
|
|
|
|
break;
|
|
|
|
}
|
2007-03-21 06:13:55 +01:00
|
|
|
s->stream.avail_out = AZ_BUFSIZE_WRITE;
|
2005-12-23 04:50:10 +01:00
|
|
|
}
|
|
|
|
s->in += s->stream.avail_in;
|
|
|
|
s->out += s->stream.avail_out;
|
|
|
|
s->z_err = deflate(&(s->stream), Z_NO_FLUSH);
|
|
|
|
s->in -= s->stream.avail_in;
|
|
|
|
s->out -= s->stream.avail_out;
|
|
|
|
if (s->z_err != Z_OK) break;
|
|
|
|
}
|
|
|
|
s->crc = crc32(s->crc, (const Bytef *)buf, len);
|
|
|
|
|
2007-01-21 02:19:54 +01:00
|
|
|
if (len > s->longest_row)
|
|
|
|
s->longest_row= len;
|
|
|
|
|
|
|
|
if (len < s->shortest_row || !(s->shortest_row))
|
|
|
|
s->shortest_row= len;
|
|
|
|
|
2007-01-11 08:53:08 +01:00
|
|
|
return (unsigned int)(len - s->stream.avail_in);
|
2005-12-23 04:50:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* ===========================================================================
|
|
|
|
Flushes all pending output into the compressed file. The parameter
|
|
|
|
flush is as in the deflate() function.
|
|
|
|
*/
|
2007-01-11 08:53:08 +01:00
|
|
|
int do_flush (azio_stream *s, int flush)
|
2005-12-23 04:50:10 +01:00
|
|
|
{
|
|
|
|
uInt len;
|
|
|
|
int done = 0;
|
2007-05-31 16:45:22 +02:00
|
|
|
my_off_t afterwrite_pos;
|
2005-12-23 04:50:10 +01:00
|
|
|
|
|
|
|
if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR;
|
|
|
|
|
|
|
|
s->stream.avail_in = 0; /* should be zero already anyway */
|
|
|
|
|
2007-01-11 08:53:08 +01:00
|
|
|
for (;;)
|
|
|
|
{
|
2007-03-21 06:13:55 +01:00
|
|
|
len = AZ_BUFSIZE_WRITE - s->stream.avail_out;
|
2005-12-23 04:50:10 +01:00
|
|
|
|
2007-01-21 02:19:54 +01:00
|
|
|
if (len != 0)
|
|
|
|
{
|
|
|
|
s->check_point= my_tell(s->file, MYF(0));
|
WL#3817: Simplify string / memory area types and make things more consistent (first part)
The following type conversions was done:
- Changed byte to uchar
- Changed gptr to uchar*
- Change my_string to char *
- Change my_size_t to size_t
- Change size_s to size_t
Removed declaration of byte, gptr, my_string, my_size_t and size_s.
Following function parameter changes was done:
- All string functions in mysys/strings was changed to use size_t
instead of uint for string lengths.
- All read()/write() functions changed to use size_t (including vio).
- All protocoll functions changed to use size_t instead of uint
- Functions that used a pointer to a string length was changed to use size_t*
- Changed malloc(), free() and related functions from using gptr to use void *
as this requires fewer casts in the code and is more in line with how the
standard functions work.
- Added extra length argument to dirname_part() to return the length of the
created string.
- Changed (at least) following functions to take uchar* as argument:
- db_dump()
- my_net_write()
- net_write_command()
- net_store_data()
- DBUG_DUMP()
- decimal2bin() & bin2decimal()
- Changed my_compress() and my_uncompress() to use size_t. Changed one
argument to my_uncompress() from a pointer to a value as we only return
one value (makes function easier to use).
- Changed type of 'pack_data' argument to packfrm() to avoid casts.
- Changed in readfrm() and writefrom(), ha_discover and handler::discover()
the type for argument 'frmdata' to uchar** to avoid casts.
- Changed most Field functions to use uchar* instead of char* (reduced a lot of
casts).
- Changed field->val_xxx(xxx, new_ptr) to take const pointers.
Other changes:
- Removed a lot of not needed casts
- Added a few new cast required by other changes
- Added some cast to my_multi_malloc() arguments for safety (as string lengths
needs to be uint, not size_t).
- Fixed all calls to hash-get-key functions to use size_t*. (Needed to be done
explicitely as this conflict was often hided by casting the function to
hash_get_key).
- Changed some buffers to memory regions to uchar* to avoid casts.
- Changed some string lengths from uint to size_t.
- Changed field->ptr to be uchar* instead of char*. This allowed us to
get rid of a lot of casts.
- Some changes from true -> TRUE, false -> FALSE, unsigned char -> uchar
- Include zlib.h in some files as we needed declaration of crc32()
- Changed MY_FILE_ERROR to be (size_t) -1.
- Changed many variables to hold the result of my_read() / my_write() to be
size_t. This was needed to properly detect errors (which are
returned as (size_t) -1).
- Removed some very old VMS code
- Changed packfrm()/unpackfrm() to not be depending on uint size
(portability fix)
- Removed windows specific code to restore cursor position as this
causes slowdown on windows and we should not mix read() and pread()
calls anyway as this is not thread safe. Updated function comment to
reflect this. Changed function that depended on original behavior of
my_pwrite() to itself restore the cursor position (one such case).
- Added some missing checking of return value of malloc().
- Changed definition of MOD_PAD_CHAR_TO_FULL_LENGTH to avoid 'long' overflow.
- Changed type of table_def::m_size from my_size_t to ulong to reflect that
m_size is the number of elements in the array, not a string/memory
length.
- Moved THD::max_row_length() to table.cc (as it's not depending on THD).
Inlined max_row_length_blob() into this function.
- More function comments
- Fixed some compiler warnings when compiled without partitions.
- Removed setting of LEX_STRING() arguments in declaration (portability fix).
- Some trivial indentation/variable name changes.
- Some trivial code simplifications:
- Replaced some calls to alloc_root + memcpy to use
strmake_root()/strdup_root().
- Changed some calls from memdup() to strmake() (Safety fix)
- Simpler loops in client-simple.c
2007-05-10 11:59:39 +02:00
|
|
|
if ((uInt)my_write(s->file, (uchar *)s->outbuf, len, MYF(0)) != len)
|
2005-12-23 04:50:10 +01:00
|
|
|
{
|
|
|
|
s->z_err = Z_ERRNO;
|
|
|
|
return Z_ERRNO;
|
|
|
|
}
|
|
|
|
s->stream.next_out = s->outbuf;
|
2007-03-21 06:13:55 +01:00
|
|
|
s->stream.avail_out = AZ_BUFSIZE_WRITE;
|
2005-12-23 04:50:10 +01:00
|
|
|
}
|
|
|
|
if (done) break;
|
|
|
|
s->out += s->stream.avail_out;
|
|
|
|
s->z_err = deflate(&(s->stream), flush);
|
|
|
|
s->out -= s->stream.avail_out;
|
|
|
|
|
|
|
|
/* Ignore the second of two consecutive flushes: */
|
|
|
|
if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK;
|
|
|
|
|
|
|
|
/* deflate has finished flushing only when it hasn't used up
|
|
|
|
* all the available space in the output buffer:
|
|
|
|
*/
|
|
|
|
done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END);
|
|
|
|
|
|
|
|
if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break;
|
|
|
|
}
|
2007-01-11 08:53:08 +01:00
|
|
|
|
|
|
|
if (flush == Z_FINISH)
|
2007-01-21 02:19:54 +01:00
|
|
|
s->dirty= AZ_STATE_CLEAN; /* Mark it clean, we should be good now */
|
|
|
|
else
|
|
|
|
s->dirty= AZ_STATE_SAVED; /* Mark it clean, we should be good now */
|
2007-05-31 16:45:22 +02:00
|
|
|
|
|
|
|
afterwrite_pos= my_tell(s->file, MYF(0));
|
2007-01-11 08:53:08 +01:00
|
|
|
write_header(s);
|
2007-05-31 16:45:22 +02:00
|
|
|
my_seek(s->file, afterwrite_pos, SEEK_SET, MYF(0));
|
2007-01-11 08:53:08 +01:00
|
|
|
|
2005-12-23 04:50:10 +01:00
|
|
|
return s->z_err == Z_STREAM_END ? Z_OK : s->z_err;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ZEXPORT azflush (s, flush)
|
|
|
|
azio_stream *s;
|
|
|
|
int flush;
|
|
|
|
{
|
2007-01-11 08:53:08 +01:00
|
|
|
int err;
|
2005-12-23 04:50:10 +01:00
|
|
|
|
2007-01-11 08:53:08 +01:00
|
|
|
if (s->mode == 'r')
|
|
|
|
{
|
|
|
|
unsigned char buffer[AZHEADER_SIZE + AZMETA_BUFFER_SIZE];
|
WL#3817: Simplify string / memory area types and make things more consistent (first part)
The following type conversions was done:
- Changed byte to uchar
- Changed gptr to uchar*
- Change my_string to char *
- Change my_size_t to size_t
- Change size_s to size_t
Removed declaration of byte, gptr, my_string, my_size_t and size_s.
Following function parameter changes was done:
- All string functions in mysys/strings was changed to use size_t
instead of uint for string lengths.
- All read()/write() functions changed to use size_t (including vio).
- All protocoll functions changed to use size_t instead of uint
- Functions that used a pointer to a string length was changed to use size_t*
- Changed malloc(), free() and related functions from using gptr to use void *
as this requires fewer casts in the code and is more in line with how the
standard functions work.
- Added extra length argument to dirname_part() to return the length of the
created string.
- Changed (at least) following functions to take uchar* as argument:
- db_dump()
- my_net_write()
- net_write_command()
- net_store_data()
- DBUG_DUMP()
- decimal2bin() & bin2decimal()
- Changed my_compress() and my_uncompress() to use size_t. Changed one
argument to my_uncompress() from a pointer to a value as we only return
one value (makes function easier to use).
- Changed type of 'pack_data' argument to packfrm() to avoid casts.
- Changed in readfrm() and writefrom(), ha_discover and handler::discover()
the type for argument 'frmdata' to uchar** to avoid casts.
- Changed most Field functions to use uchar* instead of char* (reduced a lot of
casts).
- Changed field->val_xxx(xxx, new_ptr) to take const pointers.
Other changes:
- Removed a lot of not needed casts
- Added a few new cast required by other changes
- Added some cast to my_multi_malloc() arguments for safety (as string lengths
needs to be uint, not size_t).
- Fixed all calls to hash-get-key functions to use size_t*. (Needed to be done
explicitely as this conflict was often hided by casting the function to
hash_get_key).
- Changed some buffers to memory regions to uchar* to avoid casts.
- Changed some string lengths from uint to size_t.
- Changed field->ptr to be uchar* instead of char*. This allowed us to
get rid of a lot of casts.
- Some changes from true -> TRUE, false -> FALSE, unsigned char -> uchar
- Include zlib.h in some files as we needed declaration of crc32()
- Changed MY_FILE_ERROR to be (size_t) -1.
- Changed many variables to hold the result of my_read() / my_write() to be
size_t. This was needed to properly detect errors (which are
returned as (size_t) -1).
- Removed some very old VMS code
- Changed packfrm()/unpackfrm() to not be depending on uint size
(portability fix)
- Removed windows specific code to restore cursor position as this
causes slowdown on windows and we should not mix read() and pread()
calls anyway as this is not thread safe. Updated function comment to
reflect this. Changed function that depended on original behavior of
my_pwrite() to itself restore the cursor position (one such case).
- Added some missing checking of return value of malloc().
- Changed definition of MOD_PAD_CHAR_TO_FULL_LENGTH to avoid 'long' overflow.
- Changed type of table_def::m_size from my_size_t to ulong to reflect that
m_size is the number of elements in the array, not a string/memory
length.
- Moved THD::max_row_length() to table.cc (as it's not depending on THD).
Inlined max_row_length_blob() into this function.
- More function comments
- Fixed some compiler warnings when compiled without partitions.
- Removed setting of LEX_STRING() arguments in declaration (portability fix).
- Some trivial indentation/variable name changes.
- Some trivial code simplifications:
- Replaced some calls to alloc_root + memcpy to use
strmake_root()/strdup_root().
- Changed some calls from memdup() to strmake() (Safety fix)
- Simpler loops in client-simple.c
2007-05-10 11:59:39 +02:00
|
|
|
my_pread(s->file, (uchar*) buffer, AZHEADER_SIZE + AZMETA_BUFFER_SIZE, 0,
|
2007-02-23 12:13:55 +01:00
|
|
|
MYF(0));
|
2007-01-11 08:53:08 +01:00
|
|
|
read_header(s, buffer); /* skip the .az header */
|
|
|
|
|
|
|
|
return Z_OK;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
s->forced_flushes++;
|
|
|
|
err= do_flush(s, flush);
|
|
|
|
|
|
|
|
if (err) return err;
|
|
|
|
my_sync(s->file, MYF(0));
|
|
|
|
return s->z_err == Z_STREAM_END ? Z_OK : s->z_err;
|
|
|
|
}
|
2005-12-23 04:50:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* ===========================================================================
|
|
|
|
Rewinds input file.
|
|
|
|
*/
|
|
|
|
int azrewind (s)
|
|
|
|
azio_stream *s;
|
|
|
|
{
|
|
|
|
if (s == NULL || s->mode != 'r') return -1;
|
|
|
|
|
|
|
|
s->z_err = Z_OK;
|
|
|
|
s->z_eof = 0;
|
|
|
|
s->back = EOF;
|
|
|
|
s->stream.avail_in = 0;
|
|
|
|
s->stream.next_in = (Bytef *)s->inbuf;
|
|
|
|
s->crc = crc32(0L, Z_NULL, 0);
|
|
|
|
if (!s->transparent) (void)inflateReset(&s->stream);
|
|
|
|
s->in = 0;
|
|
|
|
s->out = 0;
|
2006-11-30 02:40:42 +01:00
|
|
|
return my_seek(s->file, (int)s->start, MY_SEEK_SET, MYF(0)) == MY_FILEPOS_ERROR;
|
2005-12-23 04:50:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* ===========================================================================
|
|
|
|
Sets the starting position for the next azread or azwrite on the given
|
|
|
|
compressed file. The offset represents a number of bytes in the
|
|
|
|
azseek returns the resulting offset location as measured in bytes from
|
|
|
|
the beginning of the uncompressed stream, or -1 in case of error.
|
|
|
|
SEEK_END is not implemented, returns error.
|
|
|
|
In this version of the library, azseek can be extremely slow.
|
|
|
|
*/
|
2005-12-23 21:22:31 +01:00
|
|
|
my_off_t azseek (s, offset, whence)
|
2005-12-23 04:50:10 +01:00
|
|
|
azio_stream *s;
|
2005-12-23 21:22:31 +01:00
|
|
|
my_off_t offset;
|
2005-12-23 04:50:10 +01:00
|
|
|
int whence;
|
|
|
|
{
|
|
|
|
|
|
|
|
if (s == NULL || whence == SEEK_END ||
|
|
|
|
s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) {
|
|
|
|
return -1L;
|
|
|
|
}
|
|
|
|
|
2007-01-11 08:53:08 +01:00
|
|
|
if (s->mode == 'w')
|
|
|
|
{
|
|
|
|
if (whence == SEEK_SET)
|
2005-12-23 04:50:10 +01:00
|
|
|
offset -= s->in;
|
|
|
|
|
|
|
|
/* At this point, offset is the number of zero bytes to write. */
|
|
|
|
/* There was a zmemzero here if inbuf was null -Brian */
|
2007-01-11 08:53:08 +01:00
|
|
|
while (offset > 0)
|
|
|
|
{
|
2007-10-26 18:26:06 +02:00
|
|
|
uInt size = AZ_BUFSIZE_READ;
|
|
|
|
if (offset < AZ_BUFSIZE_READ) size = (uInt)offset;
|
2005-12-23 04:50:10 +01:00
|
|
|
|
|
|
|
size = azwrite(s, s->inbuf, size);
|
|
|
|
if (size == 0) return -1L;
|
|
|
|
|
|
|
|
offset -= size;
|
|
|
|
}
|
|
|
|
return s->in;
|
|
|
|
}
|
|
|
|
/* Rest of function is for reading only */
|
|
|
|
|
|
|
|
/* compute absolute position */
|
|
|
|
if (whence == SEEK_CUR) {
|
|
|
|
offset += s->out;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (s->transparent) {
|
|
|
|
/* map to my_seek */
|
|
|
|
s->back = EOF;
|
|
|
|
s->stream.avail_in = 0;
|
|
|
|
s->stream.next_in = (Bytef *)s->inbuf;
|
|
|
|
if (my_seek(s->file, offset, MY_SEEK_SET, MYF(0)) == MY_FILEPOS_ERROR) return -1L;
|
|
|
|
|
|
|
|
s->in = s->out = offset;
|
|
|
|
return offset;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* For a negative seek, rewind and use positive seek */
|
|
|
|
if (offset >= s->out) {
|
|
|
|
offset -= s->out;
|
2006-11-30 02:40:42 +01:00
|
|
|
} else if (azrewind(s)) {
|
2005-12-23 04:50:10 +01:00
|
|
|
return -1L;
|
|
|
|
}
|
|
|
|
/* offset is now the number of bytes to skip. */
|
|
|
|
|
|
|
|
if (offset && s->back != EOF) {
|
|
|
|
s->back = EOF;
|
|
|
|
s->out++;
|
|
|
|
offset--;
|
|
|
|
if (s->last) s->z_err = Z_STREAM_END;
|
|
|
|
}
|
|
|
|
while (offset > 0) {
|
2006-12-04 07:09:32 +01:00
|
|
|
int error;
|
2007-10-26 18:26:06 +02:00
|
|
|
unsigned int size = AZ_BUFSIZE_WRITE;
|
|
|
|
if (offset < AZ_BUFSIZE_WRITE) size = (int)offset;
|
2005-12-23 04:50:10 +01:00
|
|
|
|
2006-12-04 07:09:32 +01:00
|
|
|
size = azread(s, s->outbuf, size, &error);
|
2007-10-26 18:26:06 +02:00
|
|
|
if (error < 0) return -1L;
|
2005-12-23 04:50:10 +01:00
|
|
|
offset -= size;
|
|
|
|
}
|
|
|
|
return s->out;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ===========================================================================
|
|
|
|
Returns the starting position for the next azread or azwrite on the
|
|
|
|
given compressed file. This position represents a number of bytes in the
|
|
|
|
uncompressed data stream.
|
|
|
|
*/
|
2005-12-23 21:22:31 +01:00
|
|
|
my_off_t ZEXPORT aztell (file)
|
2005-12-23 04:50:10 +01:00
|
|
|
azio_stream *file;
|
|
|
|
{
|
|
|
|
return azseek(file, 0L, SEEK_CUR);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* ===========================================================================
|
|
|
|
Outputs a long in LSB order to the given file
|
|
|
|
*/
|
2005-12-24 02:51:14 +01:00
|
|
|
void putLong (File file, uLong x)
|
2005-12-23 04:50:10 +01:00
|
|
|
{
|
|
|
|
int n;
|
WL#3817: Simplify string / memory area types and make things more consistent (first part)
The following type conversions was done:
- Changed byte to uchar
- Changed gptr to uchar*
- Change my_string to char *
- Change my_size_t to size_t
- Change size_s to size_t
Removed declaration of byte, gptr, my_string, my_size_t and size_s.
Following function parameter changes was done:
- All string functions in mysys/strings was changed to use size_t
instead of uint for string lengths.
- All read()/write() functions changed to use size_t (including vio).
- All protocoll functions changed to use size_t instead of uint
- Functions that used a pointer to a string length was changed to use size_t*
- Changed malloc(), free() and related functions from using gptr to use void *
as this requires fewer casts in the code and is more in line with how the
standard functions work.
- Added extra length argument to dirname_part() to return the length of the
created string.
- Changed (at least) following functions to take uchar* as argument:
- db_dump()
- my_net_write()
- net_write_command()
- net_store_data()
- DBUG_DUMP()
- decimal2bin() & bin2decimal()
- Changed my_compress() and my_uncompress() to use size_t. Changed one
argument to my_uncompress() from a pointer to a value as we only return
one value (makes function easier to use).
- Changed type of 'pack_data' argument to packfrm() to avoid casts.
- Changed in readfrm() and writefrom(), ha_discover and handler::discover()
the type for argument 'frmdata' to uchar** to avoid casts.
- Changed most Field functions to use uchar* instead of char* (reduced a lot of
casts).
- Changed field->val_xxx(xxx, new_ptr) to take const pointers.
Other changes:
- Removed a lot of not needed casts
- Added a few new cast required by other changes
- Added some cast to my_multi_malloc() arguments for safety (as string lengths
needs to be uint, not size_t).
- Fixed all calls to hash-get-key functions to use size_t*. (Needed to be done
explicitely as this conflict was often hided by casting the function to
hash_get_key).
- Changed some buffers to memory regions to uchar* to avoid casts.
- Changed some string lengths from uint to size_t.
- Changed field->ptr to be uchar* instead of char*. This allowed us to
get rid of a lot of casts.
- Some changes from true -> TRUE, false -> FALSE, unsigned char -> uchar
- Include zlib.h in some files as we needed declaration of crc32()
- Changed MY_FILE_ERROR to be (size_t) -1.
- Changed many variables to hold the result of my_read() / my_write() to be
size_t. This was needed to properly detect errors (which are
returned as (size_t) -1).
- Removed some very old VMS code
- Changed packfrm()/unpackfrm() to not be depending on uint size
(portability fix)
- Removed windows specific code to restore cursor position as this
causes slowdown on windows and we should not mix read() and pread()
calls anyway as this is not thread safe. Updated function comment to
reflect this. Changed function that depended on original behavior of
my_pwrite() to itself restore the cursor position (one such case).
- Added some missing checking of return value of malloc().
- Changed definition of MOD_PAD_CHAR_TO_FULL_LENGTH to avoid 'long' overflow.
- Changed type of table_def::m_size from my_size_t to ulong to reflect that
m_size is the number of elements in the array, not a string/memory
length.
- Moved THD::max_row_length() to table.cc (as it's not depending on THD).
Inlined max_row_length_blob() into this function.
- More function comments
- Fixed some compiler warnings when compiled without partitions.
- Removed setting of LEX_STRING() arguments in declaration (portability fix).
- Some trivial indentation/variable name changes.
- Some trivial code simplifications:
- Replaced some calls to alloc_root + memcpy to use
strmake_root()/strdup_root().
- Changed some calls from memdup() to strmake() (Safety fix)
- Simpler loops in client-simple.c
2007-05-10 11:59:39 +02:00
|
|
|
uchar buffer[1];
|
2005-12-23 04:50:10 +01:00
|
|
|
|
|
|
|
for (n = 0; n < 4; n++)
|
|
|
|
{
|
|
|
|
buffer[0]= (int)(x & 0xff);
|
|
|
|
my_write(file, buffer, 1, MYF(0));
|
|
|
|
x >>= 8;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ===========================================================================
|
|
|
|
Reads a long in LSB order from the given azio_stream. Sets z_err in case
|
|
|
|
of error.
|
|
|
|
*/
|
2005-12-24 02:51:14 +01:00
|
|
|
uLong getLong (azio_stream *s)
|
2005-12-23 04:50:10 +01:00
|
|
|
{
|
|
|
|
uLong x = (uLong)get_byte(s);
|
|
|
|
int c;
|
|
|
|
|
|
|
|
x += ((uLong)get_byte(s))<<8;
|
|
|
|
x += ((uLong)get_byte(s))<<16;
|
|
|
|
c = get_byte(s);
|
|
|
|
if (c == EOF) s->z_err = Z_DATA_ERROR;
|
|
|
|
x += ((uLong)c)<<24;
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ===========================================================================
|
|
|
|
Flushes all pending output if necessary, closes the compressed file
|
|
|
|
and deallocates all the (de)compression state.
|
|
|
|
*/
|
|
|
|
int azclose (azio_stream *s)
|
|
|
|
{
|
|
|
|
|
|
|
|
if (s == NULL) return Z_STREAM_ERROR;
|
2007-01-21 02:19:54 +01:00
|
|
|
|
|
|
|
if (s->file < 1) return Z_OK;
|
2006-12-05 07:01:48 +01:00
|
|
|
|
2007-01-11 08:53:08 +01:00
|
|
|
if (s->mode == 'w')
|
|
|
|
{
|
2007-01-21 02:19:54 +01:00
|
|
|
if (do_flush(s, Z_FINISH) != Z_OK)
|
2005-12-23 04:50:10 +01:00
|
|
|
return destroy(s);
|
|
|
|
|
|
|
|
putLong(s->file, s->crc);
|
|
|
|
putLong(s->file, (uLong)(s->in & 0xffffffff));
|
2007-01-21 02:19:54 +01:00
|
|
|
s->dirty= AZ_STATE_CLEAN;
|
|
|
|
s->check_point= my_tell(s->file, MYF(0));
|
|
|
|
write_header(s);
|
2005-12-23 04:50:10 +01:00
|
|
|
}
|
2007-01-21 02:19:54 +01:00
|
|
|
|
2005-12-23 04:50:10 +01:00
|
|
|
return destroy(s);
|
|
|
|
}
|
2007-01-24 19:30:06 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
Though this was added to support MySQL's FRM file, anything can be
|
|
|
|
stored in this location.
|
|
|
|
*/
|
|
|
|
int azwrite_frm(azio_stream *s, char *blob, unsigned int length)
|
|
|
|
{
|
|
|
|
if (s->mode == 'r')
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
if (s->rows > 0)
|
|
|
|
return 1;
|
|
|
|
|
2007-02-23 12:13:55 +01:00
|
|
|
s->frm_start_pos= (uint) s->start;
|
2007-01-24 19:30:06 +01:00
|
|
|
s->frm_length= length;
|
|
|
|
s->start+= length;
|
|
|
|
|
2007-08-13 15:11:25 +02:00
|
|
|
my_pwrite(s->file, (uchar*) blob, s->frm_length, s->frm_start_pos, MYF(0));
|
2007-01-24 19:30:06 +01:00
|
|
|
|
|
|
|
write_header(s);
|
|
|
|
my_seek(s->file, 0, MY_SEEK_END, MYF(0));
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int azread_frm(azio_stream *s, char *blob)
|
|
|
|
{
|
2007-08-13 15:11:25 +02:00
|
|
|
my_pread(s->file, (uchar*) blob, s->frm_length, s->frm_start_pos, MYF(0));
|
2007-01-24 19:30:06 +01:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
Simple comment field
|
|
|
|
*/
|
|
|
|
int azwrite_comment(azio_stream *s, char *blob, unsigned int length)
|
|
|
|
{
|
|
|
|
if (s->mode == 'r')
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
if (s->rows > 0)
|
|
|
|
return 1;
|
|
|
|
|
2007-02-23 12:13:55 +01:00
|
|
|
s->comment_start_pos= (uint) s->start;
|
2007-01-24 19:30:06 +01:00
|
|
|
s->comment_length= length;
|
|
|
|
s->start+= length;
|
|
|
|
|
2007-08-13 15:11:25 +02:00
|
|
|
my_pwrite(s->file, (uchar*) blob, s->comment_length, s->comment_start_pos,
|
|
|
|
MYF(0));
|
2007-01-24 19:30:06 +01:00
|
|
|
|
|
|
|
write_header(s);
|
|
|
|
my_seek(s->file, 0, MY_SEEK_END, MYF(0));
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int azread_comment(azio_stream *s, char *blob)
|
|
|
|
{
|
2007-08-13 15:11:25 +02:00
|
|
|
my_pread(s->file, (uchar*) blob, s->comment_length, s->comment_start_pos,
|
|
|
|
MYF(0));
|
2007-01-24 19:30:06 +01:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|