diff options
author | qrort <qrort@yandex-team.com> | 2022-11-30 23:47:12 +0300 |
---|---|---|
committer | qrort <qrort@yandex-team.com> | 2022-11-30 23:47:12 +0300 |
commit | 22f8ae0e3f5d68b92aecccdf96c1d841a0334311 (patch) | |
tree | bffa27765faf54126ad44bcafa89fadecb7a73d7 /library/cpp/eventlog/iterator.cpp | |
parent | 332b99e2173f0425444abb759eebcb2fafaa9209 (diff) | |
download | ydb-22f8ae0e3f5d68b92aecccdf96c1d841a0334311.tar.gz |
validate canons without yatest_common
Diffstat (limited to 'library/cpp/eventlog/iterator.cpp')
-rw-r--r-- | library/cpp/eventlog/iterator.cpp | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/library/cpp/eventlog/iterator.cpp b/library/cpp/eventlog/iterator.cpp new file mode 100644 index 00000000000..71f955bca82 --- /dev/null +++ b/library/cpp/eventlog/iterator.cpp @@ -0,0 +1,88 @@ +#include "iterator.h" + +#include <library/cpp/streams/growing_file_input/growing_file_input.h> + +#include <util/string/cast.h> +#include <util/string/split.h> +#include <util/string/type.h> +#include <util/stream/file.h> + +using namespace NEventLog; + +namespace { + inline TIntrusivePtr<TEventFilter> ConstructEventFilter(bool enableEvents, const TString& evList, IEventFactory* fac) { + if (evList.empty()) { + return nullptr; + } + + TVector<TString> events; + + StringSplitter(evList).Split(',').SkipEmpty().Collect(&events); + if (events.empty()) { + return nullptr; + } + + TIntrusivePtr<TEventFilter> filter(new TEventFilter(enableEvents)); + + for (const auto& event : events) { + if (IsNumber(event)) + filter->AddEventClass(FromString<size_t>(event)); + else + filter->AddEventClass(fac->ClassByName(event)); + } + + return filter; + } + + struct TIterator: public IIterator { + inline TIterator(const TOptions& o, IEventFactory* fac) + : First(true) + { + if (o.FileName.size()) { + if (o.ForceStreamMode || o.TailFMode) { + FileInput.Reset(o.TailFMode ? (IInputStream*)new TGrowingFileInput(o.FileName) : (IInputStream*)new TUnbufferedFileInput(o.FileName)); + FrameStream.Reset(new TFrameStreamer(*FileInput, fac, o.FrameFilter)); + } else { + FrameStream.Reset(new TFrameStreamer(o.FileName, o.StartTime, o.EndTime, o.MaxRequestDuration, fac, o.FrameFilter)); + } + } else { + FrameStream.Reset(new TFrameStreamer(*o.Input, fac, o.FrameFilter)); + } + + EvFilter = ConstructEventFilter(o.EnableEvents, o.EvList, fac); + EventStream.Reset(new TEventStreamer(*FrameStream, o.StartTime, o.EndTime, o.ForceStrongOrdering, EvFilter, o.ForceLosslessStrongOrdering)); + } + + TConstEventPtr Next() override { + if (First) { + First = false; + + if (!EventStream->Avail()) { + return nullptr; + } + } else { + if (!EventStream->Next()) { + return nullptr; + } + } + + return **EventStream; + } + + THolder<IInputStream> FileInput; + THolder<TFrameStreamer> FrameStream; + TIntrusivePtr<TEventFilter> EvFilter; + THolder<TEventStreamer> EventStream; + bool First; + }; +} + +IIterator::~IIterator() = default; + +THolder<IIterator> NEventLog::CreateIterator(const TOptions& o, IEventFactory* fac) { + return MakeHolder<TIterator>(o, fac); +} + +THolder<IIterator> NEventLog::CreateIterator(const TOptions& o) { + return MakeHolder<TIterator>(o, NEvClass::Factory()); +} |