diff options
author | ionagamed <ionagamed@yandex-team.com> | 2024-04-15 10:18:45 +0300 |
---|---|---|
committer | ionagamed <ionagamed@yandex-team.com> | 2024-04-15 10:28:06 +0300 |
commit | c015541a60f8d93070c53511daaff81db730d194 (patch) | |
tree | 248d7d962c718e75801036109fdef147bc1880ed /library/cpp/yson/node/node_io.cpp | |
parent | 7930380b354abe9969174901a4e8a730ab1d0906 (diff) | |
download | ydb-c015541a60f8d93070c53511daaff81db730d194.tar.gz |
YT: Add NodeFromYsonStreamNonGreedy; use it in TNode::Load
В рамках
3547980204d51d6eba4c3b56989a916379526673
Diffstat (limited to 'library/cpp/yson/node/node_io.cpp')
-rw-r--r-- | library/cpp/yson/node/node_io.cpp | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/library/cpp/yson/node/node_io.cpp b/library/cpp/yson/node/node_io.cpp index 2e191d8d48..d8a05ec995 100644 --- a/library/cpp/yson/node/node_io.cpp +++ b/library/cpp/yson/node/node_io.cpp @@ -11,6 +11,7 @@ #include <library/cpp/json/json_reader.h> #include <library/cpp/json/json_value.h> +#include <util/generic/size_literals.h> #include <util/stream/input.h> #include <util/stream/output.h> #include <util/stream/str.h> @@ -82,6 +83,28 @@ static TNode CreateEmptyNodeByType(::NYson::EYsonType type) return result; } +static TNode NodeFromYsonStream(IInputStream* input, ::NYson::EYsonType type, bool consumeUntilEof) +{ + TNode result = CreateEmptyNodeByType(type); + + ui64 bufferSizeLimit = 64_KB; + if (!consumeUntilEof) { + // Other values might be in the stream, so reading one symbol at a time. + bufferSizeLimit = 1; + } + + TNodeBuilder builder(&result); + ::NYson::TYsonParser parser( + &builder, + input, + type, + /*enableLinePositionInfo*/ false, + bufferSizeLimit, + consumeUntilEof); + parser.Parse(); + return result; +} + TNode NodeFromYsonString(const TStringBuf input, ::NYson::EYsonType type) { TMemoryInput stream(input); @@ -104,12 +127,12 @@ TString NodeToCanonicalYsonString(const TNode& node, NYson::EYsonFormat format) TNode NodeFromYsonStream(IInputStream* input, ::NYson::EYsonType type) { - TNode result = CreateEmptyNodeByType(type); + return NodeFromYsonStream(input, type, /*consumeUntilEof*/ true); +} - TNodeBuilder builder(&result); - ::NYson::TYsonParser parser(&builder, input, type); - parser.Parse(); - return result; +TNode NodeFromYsonStreamNonGreedy(IInputStream* input, ::NYson::EYsonType type) +{ + return NodeFromYsonStream(input, type, /*consumeUntilEof*/ false); } void NodeToYsonStream(const TNode& node, IOutputStream* output, NYson::EYsonFormat format) |