From c34540676efaaa4e06f4bb3f916218de5c980dbf Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Fri, 9 Aug 2013 11:07:55 +0200 Subject: [PATCH] ido: Use relative timestamps for the timeranges. --- lib/icinga/legacytimeperiod.cpp | 26 ++++++++++++++------------ lib/icinga/legacytimeperiod.h | 1 + lib/ido/timeperioddbobject.cpp | 11 +++-------- 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/lib/icinga/legacytimeperiod.cpp b/lib/icinga/legacytimeperiod.cpp index 67d4d0156..f88acc3ae 100644 --- a/lib/icinga/legacytimeperiod.cpp +++ b/lib/icinga/legacytimeperiod.cpp @@ -329,7 +329,7 @@ bool LegacyTimePeriod::IsInDayDefinition(const String& daydef, tm *reference) return IsInTimeRange(&begin, &end, stride, reference); } -Dictionary::Ptr LegacyTimePeriod::ProcessTimeRange(const String& timerange, tm *reference) +void LegacyTimePeriod::ProcessTimeRangeRaw(const String& timerange, tm *reference, tm *begin, tm *end) { std::vector times; @@ -349,22 +349,24 @@ Dictionary::Ptr LegacyTimePeriod::ProcessTimeRange(const String& timerange, tm * if (hd2.size() != 2) BOOST_THROW_EXCEPTION(std::invalid_argument("Invalid time specification: " + times[1])); - tm begin, end; - - begin = *reference; - begin.tm_sec = 0; - begin.tm_min = Convert::ToLong(hd1[1]); - begin.tm_hour = Convert::ToLong(hd1[0]); + *begin = *reference; + begin->tm_sec = 0; + begin->tm_min = Convert::ToLong(hd1[1]); + begin->tm_hour = Convert::ToLong(hd1[0]); - end = *reference; - end.tm_sec = 0; - end.tm_min = Convert::ToLong(hd2[1]); - end.tm_hour = Convert::ToLong(hd2[0]); + *end = *reference; + end->tm_sec = 0; + end->tm_min = Convert::ToLong(hd2[1]); + end->tm_hour = Convert::ToLong(hd2[0]); +} +Dictionary::Ptr LegacyTimePeriod::ProcessTimeRange(const String& timestamp, tm *reference) +{ + tm begin, end; + ProcessTimeRangeRaw(timestamp, reference, &begin, &end); Dictionary::Ptr segment = boost::make_shared(); segment->Set("begin", (long)mktime(&begin)); segment->Set("end", (long)mktime(&end)); - return segment; } diff --git a/lib/icinga/legacytimeperiod.h b/lib/icinga/legacytimeperiod.h index 131961fa3..5ccd84c00 100644 --- a/lib/icinga/legacytimeperiod.h +++ b/lib/icinga/legacytimeperiod.h @@ -44,6 +44,7 @@ public: static void ParseTimeSpec(const String& timespec, tm *begin, tm *end, tm *reference); static void ParseTimeRange(const String& timerange, tm *begin, tm *end, int *stride, tm *reference); static bool IsInDayDefinition(const String& daydef, tm *reference); + static void ProcessTimeRangeRaw(const String& timerange, tm *reference, tm *begin, tm *end); static Dictionary::Ptr ProcessTimeRange(const String& timerange, tm *reference); static void ProcessTimeRanges(const String& timeranges, tm *reference, const Array::Ptr& result); diff --git a/lib/ido/timeperioddbobject.cpp b/lib/ido/timeperioddbobject.cpp index 83c5e8a9f..47f86798a 100644 --- a/lib/ido/timeperioddbobject.cpp +++ b/lib/ido/timeperioddbobject.cpp @@ -97,12 +97,7 @@ void TimePeriodDbObject::OnConfigUpdate(void) #endif /* _MSC_VER */ tm begin, end; - int stride; - - LegacyTimePeriod::ParseTimeRange(key, &begin, &end, &stride, &reference); - - if (stride != 1) - continue; + LegacyTimePeriod::ProcessTimeRangeRaw(value, &reference, &begin, &end); DbQuery query; query.Table = GetType()->GetTable() + "_timeranges"; @@ -111,8 +106,8 @@ void TimePeriodDbObject::OnConfigUpdate(void) query.Fields->Set("instance_id", 0); /* DbConnection class fills in real ID */ query.Fields->Set("timeperiod_id", DbValue::FromObjectInsertID(tp)); query.Fields->Set("day", wday); - query.Fields->Set("start_sec", mktime(&begin)); - query.Fields->Set("end_sec", mktime(&end)); + query.Fields->Set("start_sec", begin.tm_hour * 3600 + begin.tm_min * 60 + begin.tm_sec); + query.Fields->Set("end_sec", end.tm_hour * 3600 + end.tm_min * 60 + end.tm_sec); OnQuery(query); } } -- 2.40.0