aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/eventlog/dumper/common.cpp
diff options
context:
space:
mode:
authorqrort <qrort@yandex-team.com>2022-11-30 23:47:12 +0300
committerqrort <qrort@yandex-team.com>2022-11-30 23:47:12 +0300
commit22f8ae0e3f5d68b92aecccdf96c1d841a0334311 (patch)
treebffa27765faf54126ad44bcafa89fadecb7a73d7 /library/cpp/eventlog/dumper/common.cpp
parent332b99e2173f0425444abb759eebcb2fafaa9209 (diff)
downloadydb-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.cpp81
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;
+}