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/dumper/common.cpp | |
parent | 332b99e2173f0425444abb759eebcb2fafaa9209 (diff) | |
download | ydb-22f8ae0e3f5d68b92aecccdf96c1d841a0334311.tar.gz |
validate canons without yatest_common
Diffstat (limited to 'library/cpp/eventlog/dumper/common.cpp')
-rw-r--r-- | library/cpp/eventlog/dumper/common.cpp | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/library/cpp/eventlog/dumper/common.cpp b/library/cpp/eventlog/dumper/common.cpp new file mode 100644 index 00000000000..eebe3b6ee33 --- /dev/null +++ b/library/cpp/eventlog/dumper/common.cpp @@ -0,0 +1,81 @@ +#include "common.h" + +#include <contrib/libs/re2/re2/re2.h> + +#include <util/datetime/base.h> +#include <util/datetime/parser.h> +#include <util/string/cast.h> + +static time_t RecentTime(int h, int m, int s) { + time_t now = time(nullptr); + tm tmTmp; + localtime_r(&now, &tmTmp); + tmTmp.tm_hour = h; + tmTmp.tm_min = m; + tmTmp.tm_sec = s; + time_t today = mktime(&tmTmp); + tmTmp.tm_mday -= 1; + time_t yesterday = mktime(&tmTmp); + return today <= now ? today : yesterday; +} + +static bool ParseRecentTime(const TString& str, time_t& result) { + RE2 RecentTimePattern("(\\d{1,2}):(\\d{2})(?::(\\d{2}))?"); + re2::StringPiece hStr, mStr, sStr; + if (!RE2::FullMatch({str.data(), str.size()}, RecentTimePattern, &hStr, &mStr, &sStr)) { + return false; + } + int h = FromString<int>(hStr.data(), hStr.length()); + int m = FromString<int>(mStr.data(), mStr.length()); + int s = FromString<int>(sStr.data(), sStr.length(), 0); + if (h > 23 || m > 59 || s > 59) { + return false; + } + result = RecentTime(h, m, s); + return true; +} + +namespace { + class TDefaultOffset8601Parser: public TIso8601DateTimeParser { + public: + TDefaultOffset8601Parser(int offsetHours) { + DateTimeFields.ZoneOffsetMinutes = offsetHours * 60; + } + }; +} // namespace + +static bool ParseISO8601DateTimeWithDefaultOffset(TStringBuf str, int offsetHours, time_t& result) { + TDefaultOffset8601Parser parser{offsetHours}; + + if (!parser.ParsePart(str.data(), str.size())) { + return false; + } + + const TInstant instant = parser.GetResult(TInstant::Max()); + if (instant == TInstant::Max()) { + return false; + } + + result = instant.TimeT(); + return true; +} + +ui64 ParseTime(const TString& str, ui64 defValue, int offset) { + if (!str) { + return defValue; + } + + time_t utcTime; + + if (ParseISO8601DateTimeWithDefaultOffset(str, offset, utcTime)) { + return (ui64)utcTime * 1000000; + } + + if (ParseRecentTime(str, utcTime)) { + return (ui64)utcTime * 1000000; + } + + // if conversion fails, TryFromString leaves defValue unchanged + TryFromString<ui64>(str, defValue); + return defValue; +} |