提交 c21502e7 编写于 作者: A Andrey Mironov

dbms: store checksums in binary format. [#MTRSADMIN-879]

上级 17b25aa8
......@@ -192,6 +192,8 @@ public:
/// Сериализует и десериализует в человекочитаемом виде.
bool readText(ReadBuffer & in); /// Возвращает false, если чексуммы в слишком старом формате.
bool readText_v2(ReadBuffer & in);
bool readText_v3(ReadBuffer & in);
void writeText(WriteBuffer & out) const;
bool empty() const
......
......@@ -1061,16 +1061,28 @@ void MergeTreeData::DataPart::Checksums::checkSizes(const String & path) const
bool MergeTreeData::DataPart::Checksums::readText(ReadBuffer & in)
{
files.clear();
size_t count;
DB::assertString("checksums format version: ", in);
int format_version;
DB::readText(format_version, in);
if (format_version < 1 || format_version > 2)
if (format_version < 1 || format_version > 3)
throw Exception("Bad checksums format version: " + DB::toString(format_version), ErrorCodes::UNKNOWN_FORMAT);
if (format_version == 1)
return false;
DB::assertString("\n", in);
if (format_version == 2)
return readText_v2(in);
if (format_version == 3)
return readText_v3(in);
return false;
}
bool MergeTreeData::DataPart::Checksums::readText_v2(ReadBuffer & in)
{
size_t count;
DB::readText(count, in);
DB::assertString(" files:\n", in);
......@@ -1105,35 +1117,53 @@ bool MergeTreeData::DataPart::Checksums::readText(ReadBuffer & in)
return true;
}
bool MergeTreeData::DataPart::Checksums::readText_v3(ReadBuffer & in)
{
size_t count;
DB::readVarUInt(count, in);
for (size_t i = 0; i < count; ++i)
{
String name;
Checksum sum;
DB::readBinary(name, in);
DB::readVarUInt(sum.file_size, in);
DB::readBinary(sum.file_hash, in);
DB::readBinary(sum.is_compressed, in);
if (sum.is_compressed)
{
DB::readVarUInt(sum.uncompressed_size, in);
DB::readBinary(sum.uncompressed_hash, in);
}
files.emplace(std::move(name), sum);
}
return true;
}
void MergeTreeData::DataPart::Checksums::writeText(WriteBuffer & out) const
{
DB::writeString("checksums format version: 2\n", out);
DB::writeText(files.size(), out);
DB::writeString(" files:\n", out);
DB::writeString("checksums format version: 3\n", out);
DB::writeVarUInt(files.size(), out);
for (const auto & it : files)
{
const String & name = it.first;
const Checksum & sum = it.second;
DB::writeString(name, out);
DB::writeString("\n\tsize: ", out);
DB::writeText(sum.file_size, out);
DB::writeString("\n\thash: ", out);
DB::writeText(sum.file_hash.first, out);
DB::writeString(" ", out);
DB::writeText(sum.file_hash.second, out);
DB::writeString("\n\tcompressed: ", out);
DB::writeText(sum.is_compressed, out);
DB::writeString("\n", out);
DB::writeBinary(name, out);
DB::writeVarUInt(sum.file_size, out);
DB::writeBinary(sum.file_hash, out);
DB::writeBinary(sum.is_compressed, out);
if (sum.is_compressed)
{
DB::writeString("\tuncompressed size: ", out);
DB::writeText(sum.uncompressed_size, out);
DB::writeString("\n\tuncompressed hash: ", out);
DB::writeText(sum.uncompressed_hash.first, out);
DB::writeString(" ", out);
DB::writeText(sum.uncompressed_hash.second, out);
DB::writeString("\n", out);
DB::writeVarUInt(sum.uncompressed_size, out);
DB::writeBinary(sum.uncompressed_hash, out);
}
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册