diff options
| author | Alexander Smirnov <[email protected]> | 2025-01-10 00:22:26 +0000 |
|---|---|---|
| committer | Alexander Smirnov <[email protected]> | 2025-01-10 00:22:26 +0000 |
| commit | cba921b5ec4600bec70a6ec9a076708aaef9b611 (patch) | |
| tree | 27fe2aebe9148f81ba1c9a89bd1669f3d5297902 /library/cpp/protobuf/yql/descriptor.cpp | |
| parent | 046fc2f028484e755d2e45ce1f9637cd5ac83e35 (diff) | |
| parent | fab0037c69a3d2c1d81904e6174dcb4317ba02a2 (diff) | |
Merge branch 'rightlib' into merge-libs-250110-0021
Diffstat (limited to 'library/cpp/protobuf/yql/descriptor.cpp')
| -rw-r--r-- | library/cpp/protobuf/yql/descriptor.cpp | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/library/cpp/protobuf/yql/descriptor.cpp b/library/cpp/protobuf/yql/descriptor.cpp index 2d5a154fc17..e5e1c8e28bd 100644 --- a/library/cpp/protobuf/yql/descriptor.cpp +++ b/library/cpp/protobuf/yql/descriptor.cpp @@ -19,6 +19,7 @@ #include <google/protobuf/text_format.h> #include <google/protobuf/io/zero_copy_stream_impl_lite.h> +#include <google/protobuf/io/coded_stream.h> using namespace NProtoBuf; @@ -73,6 +74,7 @@ TDynamicInfoRef TDynamicInfo::Create(const TStringBuf& typeConfig) { info->SkipBytes_ = data.SkipBytes; info->OptionalLists_ = data.OptionalLists; info->SyntaxAware_ = data.SyntaxAware; + info->Deterministic_ = data.Deterministic; return info; } @@ -146,7 +148,16 @@ TString TDynamicInfo::Serialize(const Message& proto) { switch (ProtoFormat_) { case PF_PROTOBIN: { result.ReserveAndResize(proto.ByteSize()); - if (!proto.SerializeToArray(result.begin(), result.size())) { + bool success = false; + if (Deterministic_) { + io::ArrayOutputStream arrOut(result.begin(), result.size()); + io::CodedOutputStream codedOut(&arrOut); + codedOut.SetSerializationDeterministic(true); + success = proto.SerializeToCodedStream(&codedOut); + } else { + success = proto.SerializeToArray(result.begin(), result.size()); + } + if (!success) { ythrow yexception() << "can't serialize protobin message"; } break; @@ -159,7 +170,9 @@ TString TDynamicInfo::Serialize(const Message& proto) { } case PF_JSON: { NJson::TJsonValue value; - NProtobufJson::Proto2Json(proto, value); + NProtobufJson::TProto2JsonConfig config; + config.SetSortMapKeys(Deterministic_); + NProtobufJson::Proto2Json(proto, value, config); result = NJson::WriteJson(value); break; } @@ -225,6 +238,10 @@ TString GenerateProtobufTypeConfig( ret["view"]["yt_mode"] = true; } + if (options.Deterministic) { + ret["view"]["deterministic"] = true; + } + return NJson::WriteJson(ret, false); } @@ -268,6 +285,7 @@ TProtoTypeConfig ParseTypeConfig(const TStringBuf& config) { result.OptionalLists = value["lists"]["optional"].GetBooleanSafe(true); result.SyntaxAware = value["syntax"]["aware"].GetBooleanSafe(false); result.YtMode = value["view"]["yt_mode"].GetBooleanSafe(false); + result.Deterministic = value["view"]["deterministic"].GetBooleanSafe(false); if (protoFormat == "protobin") { result.ProtoFormat = PF_PROTOBIN; |
