summaryrefslogtreecommitdiffstats
path: root/library/cpp/eventlog/iterator.cpp
diff options
context:
space:
mode:
authorrobot-piglet <[email protected]>2023-12-02 01:45:21 +0300
committerrobot-piglet <[email protected]>2023-12-02 02:42:50 +0300
commit9c43d58f75cf086b744cf4fe2ae180e8f37e4a0c (patch)
tree9f88a486917d371d099cd712efd91b4c122d209d /library/cpp/eventlog/iterator.cpp
parent32fb6dda1feb24f9ab69ece5df0cb9ec238ca5e6 (diff)
Intermediate changes
Diffstat (limited to 'library/cpp/eventlog/iterator.cpp')
-rw-r--r--library/cpp/eventlog/iterator.cpp88
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());
+}