]> granicus.if.org Git - icinga2/commitdiff
TimePeriod update function should return an array of time segments
authorGunnar Beutner <gunnar.beutner@netways.de>
Fri, 15 Mar 2013 08:54:06 +0000 (09:54 +0100)
committerGunnar Beutner <gunnar.beutner@netways.de>
Fri, 15 Mar 2013 08:54:06 +0000 (09:54 +0100)
Fixes #3857

lib/icinga/timeperiod.cpp
lib/icinga/timeperiod.h

index a48917be63e334df83f2115c07738c46be3f60d8..8352b19bb13dd52c0e6ad91ac93ef4f3578513e0 100644 (file)
@@ -104,6 +104,11 @@ void TimePeriod::AddSegment(double begin, double end)
        Touch("segments");
 }
 
+void TimePeriod::AddSegment(const Dictionary::Ptr& segment)
+{
+       AddSegment(segment->Get("begin"), segment->Get("end"));
+}
+
 void TimePeriod::RemoveSegment(double begin, double end)
 {
        ASSERT(OwnsLock());
@@ -199,7 +204,16 @@ void TimePeriod::UpdateRegion(double begin, double end)
        }
 
        task->Start();
-       task->GetResult();
+       Array::Ptr segments = task->GetResult();
+
+       {
+               ObjectLock olock(this);
+               RemoveSegment(begin, end);
+
+               BOOST_FOREACH(const Dictionary::Ptr& segment, segments) {
+                       AddSegment(segment);
+               }
+       }
 }
 
 bool TimePeriod::IsInside(double ts) const
@@ -274,10 +288,8 @@ void TimePeriod::EmptyTimePeriodUpdate(const ScriptTask::Ptr& task, const vector
        double begin = arguments[1];
        double end = arguments[2];
 
-       ObjectLock olock(tp);
-       tp->RemoveSegment(begin, end);
-
-       task->FinishResult(Empty);
+       Array::Ptr segments = boost::make_shared<Array>();
+       task->FinishResult(segments);
 }
 
 void TimePeriod::EvenMinutesTimePeriodUpdate(const ScriptTask::Ptr& task, const vector<Value>& arguments)
@@ -289,16 +301,17 @@ void TimePeriod::EvenMinutesTimePeriodUpdate(const ScriptTask::Ptr& task, const
        double begin = arguments[1];
        double end = arguments[2];
 
-       {
-               ObjectLock olock(tp);
+       Array::Ptr segments = boost::make_shared<Array>();
 
-               tp->RemoveSegment(begin, end);
+       for (long t = begin; t < end; t += 60) {
+               if ((t / 60) % 2 == 0) {
+                       Dictionary::Ptr segment = boost::make_shared<Dictionary>();
+                       segment->Set("begin", t);
+                       segment->Set("end", t + 60);
 
-               for (long t = begin; t < end; t += 60) {
-                       if ((t / 60) % 2 == 0)
-                               tp->AddSegment(t, t + 60);
+                       segments->Add(segment);
                }
        }
 
-       task->FinishResult(Empty);
+       task->FinishResult(segments);
 }
index d27ee42980f767c0f7f6f9715195303a07e33123..5beb1a0240b395497a70feb6a98ddc01e35261af 100644 (file)
@@ -40,10 +40,6 @@ public:
 
        virtual void Start(void);
 
-       void AddSegment(double s, double end);
-       void RemoveSegment(double begin, double end);
-       void PurgeSegments(double end);
-
        void UpdateRegion(double begin, double end);
 
        bool IsInside(double ts) const;
@@ -57,6 +53,11 @@ private:
        Attribute<double> m_ValidEnd;
        Attribute<Array::Ptr> m_Segments;
 
+       void AddSegment(double s, double end);
+       void AddSegment(const Dictionary::Ptr& segment);
+       void RemoveSegment(double begin, double end);
+       void PurgeSegments(double end);
+
        static Timer::Ptr m_UpdateTimer;
        static void UpdateTimerHandler(void);
 };