aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/yson/node/node_io.cpp
diff options
context:
space:
mode:
authorAlexander Smirnov <alex@ydb.tech>2024-04-16 09:11:59 +0000
committerAlexander Smirnov <alex@ydb.tech>2024-04-16 09:11:59 +0000
commit25de1d521ca218e2b040739fea77a39e9fc543e9 (patch)
tree21521d8866cf1462dbd52c071cf369974c29650e /library/cpp/yson/node/node_io.cpp
parentbf444b8ed4d0f6bf17fd753e2cf88f9440012e87 (diff)
parent0a63d9ddc516f206f2b8745ce5e5dfa60190d755 (diff)
downloadydb-25de1d521ca218e2b040739fea77a39e9fc543e9.tar.gz
Merge branch 'rightlib' into mergelibs-240416-0910
Diffstat (limited to 'library/cpp/yson/node/node_io.cpp')
-rw-r--r--library/cpp/yson/node/node_io.cpp33
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)