~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
/*
2
  This libary has been modified for use by the MySQL Archive Engine.
3
     -Brian Aker
4
*/
5
6
/* zlib.h -- interface of the 'zlib' general purpose compression library
7
  version 1.2.3, July 18th, 2005
8
9
  Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler
10
11
  This software is provided 'as-is', without any express or implied
12
  warranty.  In no event will the authors be held liable for any damages
13
  arising from the use of this software.
14
15
  Permission is granted to anyone to use this software for any purpose,
16
  including commercial applications, and to alter it and redistribute it
17
  freely, subject to the following restrictions:
18
19
  1. The origin of this software must not be misrepresented; you must not
20
     claim that you wrote the original software. If you use this software
21
     in a product, an acknowledgment in the product documentation would be
22
     appreciated but is not required.
23
  2. Altered source versions must be plainly marked as such, and must not be
24
     misrepresented as being the original software.
25
  3. This notice may not be removed or altered from any source distribution.
26
27
  Jean-loup Gailly        Mark Adler
28
  jloup@gzip.org          madler@alumni.caltech.edu
29
30
31
  The data format used by the zlib library is described by RFCs (Request for
32
  Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt
33
  (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
34
*/
35
36
#ifndef __AZIO_H__
37
#define __AZIO_H__
38
39
/* We currently allow this on all platforms */
40
#define AZIO_AIO
41
212.5.39 by Monty Taylor
Phew. Moved my_base and my_global.
42
#include <drizzled/global.h>
543 by Monty Taylor
Renamed drizzle_common again. Removed sql_common. (empty)
43
#include <drizzled/common.h>
212.5.13 by Monty Taylor
Moved my_sys/my_pthread/my_nosys and mysys_err to mysys.
44
#include <mysys/my_sys.h>
1 by brian
clean slate
45
77.1.81 by Monty Taylor
Moved zlib include to not bork pread/pwrite defines on ubuntu.
46
#include <zlib.h>
1 by brian
clean slate
47
48
#ifdef  __cplusplus
49
extern "C" {
50
#endif
53.2.33 by Monty Taylor
More warnings fixes.
51
1 by brian
clean slate
52
/* Start of MySQL Specific Information */
53
54
/* Some personal debugging functions */
55
#define WATCHPOINT fprintf(stderr, "\nWATCHPOINT %s:%d (%s)\n", __FILE__, __LINE__,__func__);fflush(stderr);
56
#define WATCHPOINT_STRING(A) fprintf(stderr, "\nWATCHPOINT %s:%d (%s) %s\n", __FILE__, __LINE__,__func__,A);fflush(stderr);
57
#define WATCHPOINT_NUMBER(A) fprintf(stderr, "\nWATCHPOINT %s:%d (%s) %d\n", __FILE__, __LINE__,__func__,(int)(A));fflush(stderr);
58
#define WATCHPOINT_ERRNO(A) fprintf(stderr, "\nWATCHPOINT %s:%d (%s) %s\n", __FILE__, __LINE__,__func__, strerror(A));A= 0;fflush(stderr);
59
60
/*
481 by Brian Aker
Remove all of uchar.
61
  uint64_t + uint64_t + uint64_t + uint64_t + unsigned char
1 by brian
clean slate
62
*/
53.2.2 by Monty Taylor
Updated everything that needs updating to compile with -std=gnu99 -pedantic
63
#define AZMETA_BUFFER_SIZE sizeof(uint64_t) \
64
  + sizeof(uint64_t) + sizeof(uint64_t) + sizeof(uint64_t) \
1 by brian
clean slate
65
  + sizeof(unsigned int) + sizeof(unsigned int) \
66
  + sizeof(unsigned int) + sizeof(unsigned int) \
67
  + sizeof(unsigned char)
68
69
#define AZHEADER_SIZE 29
70
71
#define AZ_MAGIC_POS 0
72
#define AZ_VERSION_POS 1
73
#define AZ_MINOR_VERSION_POS 2
74
#define AZ_BLOCK_POS 3
75
#define AZ_STRATEGY_POS 4
76
#define AZ_FRM_POS 5
77
#define AZ_FRM_LENGTH_POS 9
78
#define AZ_META_POS 13
79
#define AZ_META_LENGTH_POS 17
80
#define AZ_START_POS 21
81
#define AZ_ROW_POS 29
82
#define AZ_FLUSH_POS 37
83
#define AZ_CHECK_POS 45
84
#define AZ_AUTOINCREMENT_POS 53
85
#define AZ_LONGEST_POS 61
86
#define AZ_SHORTEST_POS 65
87
#define AZ_COMMENT_POS 69
88
#define AZ_COMMENT_LENGTH_POS 73
89
#define AZ_DIRTY_POS 77
90
91
92
/*
93
  Flags for state
94
*/
95
#define AZ_STATE_CLEAN 0
96
#define AZ_STATE_DIRTY 1
97
#define AZ_STATE_SAVED 2
98
#define AZ_STATE_CRASHED 3
99
100
/*
101
     The 'zlib' compression library provides in-memory compression and
102
  decompression functions, including integrity checks of the uncompressed
103
  data.  This version of the library supports only one compression method
104
  (deflation) but other algorithms will be added later and will have the same
105
  stream interface.
106
107
     Compression can be done in a single step if the buffers are large
108
  enough (for example if an input file is mmap'ed), or can be done by
109
  repeated calls of the compression function.  In the latter case, the
110
  application must provide more input and/or consume the output
111
  (providing more output space) before each call.
112
113
     The compressed data format used by default by the in-memory functions is
114
  the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped
115
  around a deflate stream, which is itself documented in RFC 1951.
116
117
     The library also supports reading and writing files in gzip (.gz) format
118
  with an interface similar to that of stdio using the functions that start
119
  with "gz".  The gzip format is different from the zlib format.  gzip is a
120
  gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.
121
122
     This library can optionally read and write gzip streams in memory as well.
123
124
     The zlib format was designed to be compact and fast for use in memory
125
  and on communications channels.  The gzip format was designed for single-
126
  file compression on file systems, has a larger header than zlib to maintain
127
  directory information, and uses a different, slower check method than zlib.
128
129
     The library does not install any signal handler. The decoder checks
130
  the consistency of the compressed data, so the library should never
131
  crash even in case of corrupted input.
132
*/
133
134
135
/*
136
   The application must update next_in and avail_in when avail_in has
137
   dropped to zero. It must update next_out and avail_out when avail_out
138
   has dropped to zero. The application must initialize zalloc, zfree and
139
   opaque before calling the init function. All other fields are set by the
140
   compression library and must not be updated by the application.
141
142
   The opaque value provided by the application will be passed as the first
143
   parameter for calls of zalloc and zfree. This can be useful for custom
144
   memory management. The compression library attaches no meaning to the
145
   opaque value.
146
147
   zalloc must return Z_NULL if there is not enough memory for the object.
148
   If zlib is used in a multi-threaded application, zalloc and zfree must be
149
   thread safe.
150
151
   On 16-bit systems, the functions zalloc and zfree must be able to allocate
152
   exactly 65536 bytes, but will not be required to allocate more than this
153
   if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
154
   pointers returned by zalloc for objects of exactly 65536 bytes *must*
155
   have their offset normalized to zero. The default allocation function
156
   provided by this library ensures this (see zutil.c). To reduce memory
157
   requirements and avoid any allocation of 64K objects, at the expense of
158
   compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
159
160
   The fields total_in and total_out can be used for statistics or
161
   progress reports. After compression, total_in holds the total size of
162
   the uncompressed data and may be saved for use in the decompressor
163
   (particularly if the decompressor wants to decompress everything in
164
   a single step).
165
*/
166
167
                        /* constants */
168
169
#define Z_NO_FLUSH      0
170
#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
171
#define Z_SYNC_FLUSH    2
172
#define Z_FULL_FLUSH    3
173
#define Z_FINISH        4
174
#define Z_BLOCK         5
175
/* Allowed flush values; see deflate() and inflate() below for details */
176
177
#define Z_OK            0
178
#define Z_STREAM_END    1
179
#define Z_NEED_DICT     2
180
#define Z_ERRNO        (-1)
181
#define Z_STREAM_ERROR (-2)
182
#define Z_DATA_ERROR   (-3)
183
#define Z_MEM_ERROR    (-4)
184
#define Z_BUF_ERROR    (-5)
185
#define Z_VERSION_ERROR (-6)
186
/* Return codes for the compression/decompression functions. Negative
187
 * values are errors, positive values are used for special but normal events.
188
 */
189
190
#define Z_NO_COMPRESSION         0
191
#define Z_BEST_SPEED             1
192
#define Z_BEST_COMPRESSION       9
193
#define Z_DEFAULT_COMPRESSION  (-1)
194
/* compression levels */
195
196
#define Z_FILTERED            1
197
#define Z_HUFFMAN_ONLY        2
198
#define Z_RLE                 3
199
#define Z_FIXED               4
200
#define Z_DEFAULT_STRATEGY    0
201
/* compression strategy; see deflateInit2() below for details */
202
203
#define Z_BINARY   0
204
#define Z_TEXT     1
205
#define Z_ASCII    Z_TEXT   /* for compatibility with 1.2.2 and earlier */
206
#define Z_UNKNOWN  2
207
/* Possible values of the data_type field (though see inflate()) */
208
209
#define Z_DEFLATED   8
210
/* The deflate compression method (the only one supported in this version) */
211
212
#define Z_NULL  0  /* for initializing zalloc, zfree, opaque */
213
#define AZ_BUFSIZE_READ 32768
214
#define AZ_BUFSIZE_WRITE 16384
215
216
typedef enum {
217
  AZ_THREAD_FINISHED,
218
  AZ_THREAD_ACTIVE,
219
  AZ_THREAD_DEAD
220
} az_thread_type;
221
222
typedef enum {
223
  AZ_METHOD_BLOCK,
224
  AZ_METHOD_AIO,
53.2.2 by Monty Taylor
Updated everything that needs updating to compile with -std=gnu99 -pedantic
225
  AZ_METHOD_MAX
1 by brian
clean slate
226
} az_method;
227
228
typedef struct azio_container_st azio_container_st;
229
230
struct azio_container_st {
231
  int fd;
232
  az_thread_type ready;
233
  size_t offset;
234
  size_t read_size;
235
  void *buffer;
236
  pthread_mutex_t thresh_mutex;
237
  pthread_cond_t threshhold;
238
  pthread_t mainthread;            /* Thread descriptor */
239
};
240
241
242
typedef struct azio_stream {
243
  z_stream stream;
244
  int      z_err;   /* error code for last stream operation */
245
  int      z_eof;   /* set if end of input file */
246
  File     file;   /* .gz file */
247
  Byte     *inbuf;  /* input buffer */
248
  Byte     buffer1[AZ_BUFSIZE_READ];  /* input buffer */
249
  Byte     buffer2[AZ_BUFSIZE_READ];  /* input buffer */
250
  Byte     outbuf[AZ_BUFSIZE_WRITE]; /* output buffer */
251
  int      aio_inited; /* Are we good to go */
252
  uLong    crc;     /* crc32 of uncompressed data */
253
  char     *msg;    /* error message */
254
  char     mode;    /* 'w' or 'r' */
255
  size_t  start;   /* start of compressed data in file (header skipped) */
256
  size_t  in;      /* bytes into deflate or inflate */
257
  size_t  out;     /* bytes out of deflate or inflate */
258
  size_t  pos;     /* bytes out of deflate or inflate */
259
  int      back;    /* one character push-back */
260
  int      last;    /* true if push-back is last character */
261
  unsigned char version;   /* Version */
262
  unsigned char minor_version;   /* Version */
263
  unsigned int block_size;   /* Block Size */
53.2.2 by Monty Taylor
Updated everything that needs updating to compile with -std=gnu99 -pedantic
264
  uint64_t check_point;   /* Last position we checked */
265
  uint64_t forced_flushes;   /* Forced Flushes */
266
  uint64_t rows;   /* rows */
267
  uint64_t auto_increment;   /* auto increment field */
1 by brian
clean slate
268
  unsigned int longest_row;   /* Longest row */
269
  unsigned int shortest_row;   /* Shortest row */
270
  unsigned char dirty;   /* State of file */
271
  unsigned int frm_start_pos;   /* Position for start of FRM */
272
  unsigned int frm_length;   /* Position for start of FRM */
273
  unsigned int comment_start_pos;   /* Position for start of comment */
274
  unsigned int comment_length;   /* Position for start of comment */
275
#ifdef AZIO_AIO
276
  azio_container_st container;
277
#endif
278
  az_method method;
279
  char *row_ptr;
280
} azio_stream;
281
282
                        /* basic functions */
283
284
int azopen(azio_stream *s, const char *path, int Flags, az_method method);
285
/*
286
     Opens a gzip (.gz) file for reading or writing. The mode parameter
287
   is as in fopen ("rb" or "wb") but can also include a compression level
288
   ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for
289
   Huffman only compression as in "wb1h", or 'R' for run-length encoding
290
   as in "wb1R". (See the description of deflateInit2 for more information
291
   about the strategy parameter.)
292
293
     azopen can be used to read a file which is not in gzip format; in this
294
   case gzread will directly read from the file without decompression.
295
296
     azopen returns NULL if the file could not be opened or if there was
297
   insufficient memory to allocate the (de)compression state; errno
298
   can be checked to distinguish the two cases (if errno is zero, the
299
   zlib error is Z_MEM_ERROR).  */
300
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
301
int azdopen(azio_stream *s,File fd, int Flags);
1 by brian
clean slate
302
/*
303
     azdopen() associates a azio_stream with the file descriptor fd.  File
304
   descriptors are obtained from calls like open, dup, creat, pipe or
305
   fileno (in the file has been previously opened with fopen).
306
   The mode parameter is as in azopen.
307
     The next call of gzclose on the returned azio_stream will also close the
308
   file descriptor fd, just like fclose(fdopen(fd), mode) closes the file
309
   descriptor fd. If you want to keep fd open, use azdopen(dup(fd), mode).
310
     azdopen returns NULL if there was insufficient memory to allocate
311
   the (de)compression state.
312
*/
313
314
315
unsigned int azread_internal( azio_stream *s, voidp buf, unsigned int len, int *error);
316
/*
317
   This function is legacy, do not use.
318
319
     Reads the given number of uncompressed bytes from the compressed file.
320
   If the input file was not in gzip format, gzread copies the given number
321
   of bytes into the buffer.
322
     gzread returns the number of uncompressed bytes actually read (0 for
323
   end of file, -1 for error). */
324
325
extern int azflush(azio_stream *file, int flush);
326
/*
327
     Flushes all pending output into the compressed file. The parameter
328
   flush is as in the deflate() function. The return value is the zlib
329
   error number (see function gzerror below). gzflush returns Z_OK if
330
   the flush parameter is Z_FINISH and all output could be flushed.
331
     gzflush should be called only when strictly necessary because it can
332
   degrade compression.
333
*/
334
335
extern size_t azseek (azio_stream *file,
336
                                      size_t offset, int whence);
337
/*
338
      Sets the starting position for the next gzread or gzwrite on the
339
   given compressed file. The offset represents a number of bytes in the
340
   uncompressed data stream. The whence parameter is defined as in lseek(2);
341
   the value SEEK_END is not supported.
342
     If the file is opened for reading, this function is emulated but can be
343
   extremely slow. If the file is opened for writing, only forward seeks are
344
   supported; gzseek then compresses a sequence of zeroes up to the new
345
   starting position.
346
347
      gzseek returns the resulting offset location as measured in bytes from
348
   the beginning of the uncompressed stream, or -1 in case of error, in
349
   particular if the file is opened for writing and the new starting position
350
   would be before the current position.
351
*/
352
353
extern size_t aztell(azio_stream *file);
354
/*
355
     Returns the starting position for the next gzread or gzwrite on the
356
   given compressed file. This position represents a number of bytes in the
357
   uncompressed data stream.
358
359
   gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
360
*/
361
362
extern int azclose(azio_stream *file);
363
/*
364
     Flushes all pending output if necessary, closes the compressed file
365
   and deallocates all the (de)compression state. The return value is the zlib
366
   error number (see function gzerror below).
367
*/
368
369
int azread_init(azio_stream *s);
370
size_t azwrite_row(azio_stream *s, void *buf, unsigned int len);
371
size_t azread_row(azio_stream *s, int *error);
372
373
extern int azwrite_frm (azio_stream *s, char *blob, unsigned int length);
374
extern int azread_frm (azio_stream *s, char *blob);
375
extern int azwrite_comment (azio_stream *s, char *blob, unsigned int length);
376
extern int azread_comment (azio_stream *s, char *blob);
377
378
#ifdef	__cplusplus
379
}
380
#endif
381
382
#endif /* AZIO_H */