| 1 | /* -*- mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- */ |
| 2 | // vim: ft=cpp:expandtab:ts=8:sw=4:softtabstop=4: |
| 3 | #ident "$Id$" |
| 4 | /*====== |
| 5 | This file is part of PerconaFT. |
| 6 | |
| 7 | |
| 8 | Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. |
| 9 | |
| 10 | PerconaFT is free software: you can redistribute it and/or modify |
| 11 | it under the terms of the GNU General Public License, version 2, |
| 12 | as published by the Free Software Foundation. |
| 13 | |
| 14 | PerconaFT is distributed in the hope that it will be useful, |
| 15 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 17 | GNU General Public License for more details. |
| 18 | |
| 19 | You should have received a copy of the GNU General Public License |
| 20 | along with PerconaFT. If not, see <http://www.gnu.org/licenses/>. |
| 21 | |
| 22 | ---------------------------------------- |
| 23 | |
| 24 | PerconaFT is free software: you can redistribute it and/or modify |
| 25 | it under the terms of the GNU Affero General Public License, version 3, |
| 26 | as published by the Free Software Foundation. |
| 27 | |
| 28 | PerconaFT is distributed in the hope that it will be useful, |
| 29 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 30 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 31 | GNU Affero General Public License for more details. |
| 32 | |
| 33 | You should have received a copy of the GNU Affero General Public License |
| 34 | along with PerconaFT. If not, see <http://www.gnu.org/licenses/>. |
| 35 | ======= */ |
| 36 | |
| 37 | #ident "Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved." |
| 38 | |
| 39 | #pragma once |
| 40 | |
| 41 | #include <zlib.h> |
| 42 | #include <db.h> |
| 43 | |
| 44 | // The following provides an abstraction of quicklz and zlib. |
| 45 | // We offer three compression methods: ZLIB, QUICKLZ, and LZMA, as well as a "no compression" option. These options are declared in make_tdb.c. |
| 46 | // The resulting byte string includes enough information for us to decompress it. That is, we can tell whether it's z-compressed or qz-compressed or xz-compressed. |
| 47 | |
| 48 | size_t toku_compress_bound (enum toku_compression_method a, size_t size); |
| 49 | // Effect: Return the number of bytes needed to compress a buffer of size SIZE using compression method A. |
| 50 | // Typically, the result is a little bit larger than SIZE, since some data cannot be compressed. |
| 51 | // Usage note: It may help to know roughly how much space is involved. |
| 52 | // zlib's bound is something like (size + (size>>12) + (size>>14) + (size>>25) + 13. |
| 53 | // quicklz's bound is something like size+400. |
| 54 | |
| 55 | void toku_compress (enum toku_compression_method a, |
| 56 | // the following types and naming conventions come from zlib.h |
| 57 | Bytef *dest, uLongf *destLen, |
| 58 | const Bytef *source, uLong sourceLen); |
| 59 | // Effect: Using compression method A, compress SOURCE into DEST. The number of bytes to compress is passed in SOURCELEN. |
| 60 | // On input: *destLen is the size of the buffer. |
| 61 | // On output: *destLen is the size of the actual compressed data. |
| 62 | // Usage note: sourceLen may be be zero (unlike for quicklz, which requires sourceLen>0). |
| 63 | // Requires: The buffer must be big enough to hold the compressed data. (That is *destLen >= compressBound(a, sourceLen)) |
| 64 | // Requires: sourceLen < 2^32. |
| 65 | // Usage note: Although we *try* to assert if the DESTLEN isn't big enough, it's possible that it's too late by then (in the case of quicklz which offers |
| 66 | // no way to avoid a buffer overrun.) So we require that that DESTLEN is big enough. |
| 67 | // Rationale: zlib's argument order is DEST then SOURCE with the size of the buffer passed in *destLen, and the size of the result returned in *destLen. |
| 68 | // quicklz's argument order is SOURCE then DEST with the size returned (and it has no way to verify that an overright didn't happen). |
| 69 | // We use zlib's calling conventions partly because it is safer, and partly because it is more established. |
| 70 | // We also use zlib's ugly camel case convention for destLen and sourceLen. |
| 71 | // Unlike zlib, we return no error codes. Instead, we require that the data be OK and the size of the buffers is OK, and assert if there's a problem. |
| 72 | |
| 73 | void toku_decompress (Bytef *dest, uLongf destLen, |
| 74 | const Bytef *source, uLongf sourceLen); |
| 75 | // Effect: Decompress source (length sourceLen) into dest (length destLen) |
| 76 | // This function can decompress data compressed with either zlib or quicklz compression methods (calling toku_compress(), which puts an appropriate header on so we know which it is.) |
| 77 | // Requires: destLen is equal to the actual decompressed size of the data. |
| 78 | // Requires: The source must have been properly compressed. |
| 79 | |