#include "WithFileSize.h" #include #include #include #include #include namespace DB { namespace ErrorCodes { extern const int UNKNOWN_FILE_SIZE; } template static size_t getFileSize(T & in) { if (auto * with_file_size = dynamic_cast(&in)) { return with_file_size->getFileSize(); } throw Exception(ErrorCodes::UNKNOWN_FILE_SIZE, "Cannot find out file size"); } size_t getFileSizeFromReadBuffer(ReadBuffer & in) { if (auto * delegate = dynamic_cast(&in)) { return getFileSize(delegate->getWrappedReadBuffer()); } else if (auto * compressed = dynamic_cast(&in)) { return getFileSize(compressed->getWrappedReadBuffer()); } return getFileSize(in); } std::optional tryGetFileSizeFromReadBuffer(ReadBuffer & in) { try { return getFileSizeFromReadBuffer(in); } catch (...) { return std::nullopt; } } bool isBufferWithFileSize(const ReadBuffer & in) { if (const auto * delegate = dynamic_cast(&in)) { return delegate->isWithFileSize(); } else if (const auto * compressed = dynamic_cast(&in)) { return isBufferWithFileSize(compressed->getWrappedReadBuffer()); } return dynamic_cast(&in) != nullptr; } size_t getDataOffsetMaybeCompressed(const ReadBuffer & in) { if (const auto * delegate = dynamic_cast(&in)) { return getDataOffsetMaybeCompressed(delegate->getWrappedReadBuffer()); } else if (const auto * compressed = dynamic_cast(&in)) { return getDataOffsetMaybeCompressed(compressed->getWrappedReadBuffer()); } else if (const auto * peekable = dynamic_cast(&in)) { return getDataOffsetMaybeCompressed(peekable->getSubBuffer()); } return in.count(); } }