#include "CompressionCodecLZ4.h" #include #include #include #include #include #include #include #include #ifdef __clang__ #pragma clang diagnostic ignored "-Wold-style-cast" #endif namespace DB { namespace ErrorCodes { extern const int CANNOT_COMPRESS; extern const int ILLEGAL_SYNTAX_FOR_CODEC_TYPE; extern const int ILLEGAL_CODEC_PARAMETER; } UInt8 CompressionCodecLZ4::getMethodByte() const { return static_cast(CompressionMethodByte::LZ4); } String CompressionCodecLZ4::getCodecDesc() const { return "LZ4"; } UInt32 CompressionCodecLZ4::getMaxCompressedDataSize(UInt32 uncompressed_size) const { #pragma GCC diagnostic push #pragma GCC diagnostic warning "-Wold-style-cast" return LZ4_COMPRESSBOUND(uncompressed_size); #pragma GCC diagnostic pop } UInt32 CompressionCodecLZ4::doCompressData(const char * source, UInt32 source_size, char * dest) const { #pragma GCC diagnostic push #pragma GCC diagnostic warning "-Wold-style-cast" return LZ4_compress_default(source, dest, source_size, LZ4_COMPRESSBOUND(source_size)); #pragma GCC diagnostic pop } void CompressionCodecLZ4::doDecompressData(const char * source, UInt32 source_size, char * dest, UInt32 uncompressed_size) const { LZ4::decompress(source, dest, source_size, uncompressed_size, lz4_stat); } void registerCodecLZ4(CompressionCodecFactory & factory) { factory.registerSimpleCompressionCodec("LZ4", static_cast(CompressionMethodByte::LZ4), [&] () { return std::make_shared(); }); } String CompressionCodecLZ4HC::getCodecDesc() const { return "LZ4HC(" + toString(level) + ")"; } UInt32 CompressionCodecLZ4HC::doCompressData(const char * source, UInt32 source_size, char * dest) const { #pragma GCC diagnostic push #pragma GCC diagnostic warning "-Wold-style-cast" auto success = LZ4_compress_HC(source, dest, source_size, LZ4_COMPRESSBOUND(source_size), level); #pragma GCC diagnostic pop if (!success) throw Exception("Cannot LZ4_compress_HC", ErrorCodes::CANNOT_COMPRESS); return success; } void registerCodecLZ4HC(CompressionCodecFactory & factory) { factory.registerCompressionCodec("LZ4HC", {}, [&](const ASTPtr & arguments) -> CompressionCodecPtr { int level = 0; if (arguments && !arguments->children.empty()) { if (arguments->children.size() > 1) throw Exception("LZ4HC codec must have 1 parameter, given " + std::to_string(arguments->children.size()), ErrorCodes::ILLEGAL_SYNTAX_FOR_CODEC_TYPE); const auto children = arguments->children; const auto * literal = children[0]->as(); level = literal->value.safeGet(); } return std::make_shared(level); }); } CompressionCodecLZ4HC::CompressionCodecLZ4HC(int level_) : level(level_) { } }