1 | #pragma once |
2 | |
3 | #include <Common/PODArray.h> |
4 | #include <Compression/LZ4_decompress_faster.h> |
5 | #include <Compression/ICompressionCodec.h> |
6 | |
7 | |
8 | namespace DB |
9 | { |
10 | |
11 | class ReadBuffer; |
12 | |
13 | /** Basic functionality for implementation of |
14 | * CompressedReadBuffer, CompressedReadBufferFromFile and CachedCompressedReadBuffer. |
15 | */ |
16 | class CompressedReadBufferBase |
17 | { |
18 | protected: |
19 | ReadBuffer * compressed_in; |
20 | |
21 | /// If 'compressed_in' buffer has whole compressed block - then use it. Otherwise copy parts of data to 'own_compressed_buffer'. |
22 | PODArray<char> own_compressed_buffer; |
23 | /// Points to memory, holding compressed block. |
24 | char * compressed_buffer = nullptr; |
25 | |
26 | /// Don't checksum on decompressing. |
27 | bool disable_checksum = false; |
28 | |
29 | /// Read compressed data into compressed_buffer. Get size of decompressed data from block header. Checksum if need. |
30 | /// Returns number of compressed bytes read. |
31 | size_t readCompressedData(size_t & size_decompressed, size_t & size_compressed_without_checksum); |
32 | |
33 | void decompress(char * to, size_t size_decompressed, size_t size_compressed_without_checksum); |
34 | |
35 | public: |
36 | /// 'compressed_in' could be initialized lazily, but before first call of 'readCompressedData'. |
37 | CompressedReadBufferBase(ReadBuffer * in = nullptr); |
38 | ~CompressedReadBufferBase(); |
39 | |
40 | /** Disable checksums. |
41 | * For example, may be used when |
42 | * compressed data is generated by client, that cannot calculate checksums, and fill checksums with zeros instead. |
43 | */ |
44 | void disableChecksumming() |
45 | { |
46 | disable_checksum = true; |
47 | } |
48 | |
49 | public: |
50 | CompressionCodecPtr codec; |
51 | }; |
52 | |
53 | } |
54 | |