2020-01-04 07:31:00 +00:00
|
|
|
#include <IO/CompressionMethod.h>
|
|
|
|
|
|
|
|
#include <IO/ReadBuffer.h>
|
|
|
|
#include <IO/WriteBuffer.h>
|
|
|
|
#include <IO/ZlibInflatingReadBuffer.h>
|
|
|
|
#include <IO/ZlibDeflatingWriteBuffer.h>
|
|
|
|
#include <IO/BrotliReadBuffer.h>
|
|
|
|
#include <IO/BrotliWriteBuffer.h>
|
|
|
|
|
2020-04-16 12:31:57 +00:00
|
|
|
#if !defined(ARCADIA_BUILD)
|
|
|
|
# include <Common/config.h>
|
|
|
|
#endif
|
2020-01-04 07:31:00 +00:00
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
|
|
|
namespace ErrorCodes
|
|
|
|
{
|
|
|
|
extern const int NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::string toContentEncodingName(CompressionMethod method)
|
|
|
|
{
|
|
|
|
switch (method)
|
|
|
|
{
|
|
|
|
case CompressionMethod::Gzip: return "gzip";
|
|
|
|
case CompressionMethod::Zlib: return "deflate";
|
|
|
|
case CompressionMethod::Brotli: return "br";
|
|
|
|
case CompressionMethod::None: return "";
|
|
|
|
}
|
|
|
|
__builtin_unreachable();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CompressionMethod chooseCompressionMethod(const std::string & path, const std::string & hint)
|
|
|
|
{
|
|
|
|
std::string file_extension;
|
|
|
|
if (hint.empty() || hint == "auto")
|
|
|
|
{
|
|
|
|
auto pos = path.find_last_of('.');
|
|
|
|
if (pos != std::string::npos)
|
|
|
|
file_extension = path.substr(pos + 1, std::string::npos);
|
|
|
|
}
|
|
|
|
|
|
|
|
const std::string * method_str = file_extension.empty() ? &hint : &file_extension;
|
|
|
|
|
|
|
|
if (*method_str == "gzip" || *method_str == "gz")
|
|
|
|
return CompressionMethod::Gzip;
|
|
|
|
if (*method_str == "deflate")
|
|
|
|
return CompressionMethod::Zlib;
|
|
|
|
if (*method_str == "brotli" || *method_str == "br")
|
|
|
|
return CompressionMethod::Brotli;
|
2020-01-04 18:50:19 +00:00
|
|
|
if (hint.empty() || hint == "auto" || hint == "none")
|
2020-01-04 07:31:00 +00:00
|
|
|
return CompressionMethod::None;
|
|
|
|
|
|
|
|
throw Exception("Unknown compression method " + hint + ". Only 'auto', 'none', 'gzip', 'br' are supported as compression methods",
|
|
|
|
ErrorCodes::NOT_IMPLEMENTED);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-01-04 22:59:08 +00:00
|
|
|
std::unique_ptr<ReadBuffer> wrapReadBufferWithCompressionMethod(
|
|
|
|
std::unique_ptr<ReadBuffer> nested,
|
|
|
|
CompressionMethod method,
|
|
|
|
size_t buf_size,
|
|
|
|
char * existing_memory,
|
|
|
|
size_t alignment)
|
2020-01-04 07:31:00 +00:00
|
|
|
{
|
|
|
|
if (method == CompressionMethod::Gzip || method == CompressionMethod::Zlib)
|
2020-01-04 22:59:08 +00:00
|
|
|
return std::make_unique<ZlibInflatingReadBuffer>(std::move(nested), method, buf_size, existing_memory, alignment);
|
2020-01-04 07:31:00 +00:00
|
|
|
#if USE_BROTLI
|
|
|
|
if (method == CompressionMethod::Brotli)
|
2020-01-04 22:59:08 +00:00
|
|
|
return std::make_unique<BrotliReadBuffer>(std::move(nested), buf_size, existing_memory, alignment);
|
2020-01-04 07:31:00 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
if (method == CompressionMethod::None)
|
|
|
|
return nested;
|
|
|
|
|
|
|
|
throw Exception("Unsupported compression method", ErrorCodes::NOT_IMPLEMENTED);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-01-04 22:59:08 +00:00
|
|
|
std::unique_ptr<WriteBuffer> wrapWriteBufferWithCompressionMethod(
|
|
|
|
std::unique_ptr<WriteBuffer> nested,
|
|
|
|
CompressionMethod method,
|
|
|
|
int level,
|
|
|
|
size_t buf_size,
|
|
|
|
char * existing_memory,
|
|
|
|
size_t alignment)
|
2020-01-04 07:31:00 +00:00
|
|
|
{
|
|
|
|
if (method == DB::CompressionMethod::Gzip || method == CompressionMethod::Zlib)
|
2020-01-04 22:59:08 +00:00
|
|
|
return std::make_unique<ZlibDeflatingWriteBuffer>(std::move(nested), method, level, buf_size, existing_memory, alignment);
|
2020-01-04 07:31:00 +00:00
|
|
|
|
|
|
|
#if USE_BROTLI
|
|
|
|
if (method == DB::CompressionMethod::Brotli)
|
2020-01-04 22:59:08 +00:00
|
|
|
return std::make_unique<BrotliWriteBuffer>(std::move(nested), level, buf_size, existing_memory, alignment);
|
2020-01-04 07:31:00 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
if (method == CompressionMethod::None)
|
|
|
|
return nested;
|
|
|
|
|
|
|
|
throw Exception("Unsupported compression method", ErrorCodes::NOT_IMPLEMENTED);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|