]> git.stg.codes - stg.git/commitdiff
Tables update implemented
authorMaxim Mamontov <faust.madf@gmail.com>
Mon, 8 Aug 2011 18:31:11 +0000 (21:31 +0300)
committerMaxim Mamontov <faust.madf@gmail.com>
Mon, 8 Aug 2011 18:31:11 +0000 (21:31 +0300)
projects/stargazer/plugins/other/smux/Makefile
projects/stargazer/plugins/other/smux/smux.cpp
projects/stargazer/plugins/other/smux/smux.h

index dc807a3d6d4028337e29ada68a2b197d804ad402..feaef9ee1d0772228810b62f6df685440faee2e6 100644 (file)
@@ -6,6 +6,7 @@ PROG = mod_smux.so
 
 SRCS =  smux.cpp \
        sensors.cpp \
+       tables.cpp \
        handlers.cpp \
        utils.cpp \
        types.cpp
index f6c1fade56bc7b9b622e94a7570f7672284415b0..79e9d208587b0398fa85ac86ee84f717b054b368 100644 (file)
@@ -9,6 +9,9 @@
 
 #include <vector>
 #include <algorithm>
+#include <iterator>
+#include <stdexcept>
+#include <utility>
 
 #include "stg/common.h"
 #include "stg/plugin_creator.h"
@@ -23,6 +26,12 @@ PLUGIN * GetPlugin()
 return smc.GetPlugin();
 }
 
+bool SPrefixLess(const Sensors::value_type & a,
+                 const Sensors::value_type & b)
+{
+return a.first.PrefixLess(b.first);
+}
+
 SMUX_SETTINGS::SMUX_SETTINGS()
     : ip(0),
       port(0)
@@ -98,9 +107,16 @@ pdusHandlers[PDUs_PR_set_request] = &SMUX::SetRequestHandler;
 
 SMUX::~SMUX()
 {
-Sensors::iterator it;
-for (it = sensors.begin(); it != sensors.end(); ++it)
-    delete it->second;
+    {
+    Sensors::iterator it;
+    for (it = sensors.begin(); it != sensors.end(); ++it)
+        delete it->second;
+    }
+    {
+    Tables::iterator it;
+    for (it = tables.begin(); it != tables.end(); ++it)
+        delete it->second;
+    }
 printfd(__FILE__, "SMUX::~SMUX()\n");
 pthread_mutex_destroy(&mutex);
 }
@@ -130,6 +146,22 @@ sensors[OID(".1.3.6.1.4.1.38313.1.1.12")] = new TariffChangeUsersSensor(*users);
 // Tariffs
 sensors[OID(".1.3.6.1.4.1.38313.1.2.1")] = new TotalTariffsSensor(*tariffs);
 
+// Table data
+tables[".1.3.6.1.4.1.38313.1.1.6"] = new TariffUsersTable(".1.3.6.1.4.1.38313.1.1.6", *users);
+
+UpdateTables();
+
+#ifdef DEBUG
+Sensors::const_iterator it(sensors.begin());
+while (it != sensors.end())
+    {
+    printfd(__FILE__, "%s = %s\n",
+            it->first.ToString().c_str(),
+            it->second->ToString().c_str());
+    ++it;
+    }
+#endif
+
 if (!running)
     {
     if (pthread_create(&thread, NULL, Runner, this))
@@ -264,3 +296,58 @@ else
     }
 return false;
 }
+
+bool SMUX::UpdateTables()
+{
+Sensors newSensors;
+bool done = true;
+Tables::iterator it(tables.begin());
+while (it != tables.end())
+    {
+    try
+        {
+        it->second->UpdateSensors(newSensors);
+        }
+    catch (const std::runtime_error & ex)
+        {
+        printfd(__FILE__,
+                "SMUX::UpdateTables - failed to update table '%s': '%s'\n",
+                it->first.c_str(), ex.what());
+        done = false;
+        break;
+        }
+    ++it;
+    }
+if (!done)
+    {
+    Sensors::iterator it(newSensors.begin());
+    while (it != newSensors.end())
+        {
+        delete it->second;
+        ++it;
+        }
+    return false;
+    }
+
+it = tables.begin();
+while (it != tables.end())
+    {
+    std::pair<Sensors::iterator, Sensors::iterator> res;
+    res = std::equal_range(sensors.begin(),
+                           sensors.end(),
+                           std::pair<OID, Sensor *>(OID(it->first), NULL),
+                           SPrefixLess);
+    Sensors::iterator sit(res.first);
+    while (sit != res.second)
+        {
+        delete sit->second;
+        ++sit;
+        }
+    sensors.erase(res.first, res.second);
+    ++it;
+    }
+
+sensors.insert(newSensors.begin(), newSensors.end());
+
+return true;
+}
index bbcada9da59e58a0d8ca6056699b9a946ed29d1e..08e23c38faf6617c385ef811729122a33a4d3c5b 100644 (file)
@@ -16,6 +16,7 @@
 #include "stg/tariffs.h"
 
 #include "sensors.h"
+#include "tables.h"
 #include "types.h"
 
 extern "C" PLUGIN * GetPlugin();
@@ -88,6 +89,8 @@ private:
     bool GetNextRequestHandler(const PDUs_t * pdus);
     bool SetRequestHandler(const PDUs_t * pdus);
 
+    bool UpdateTables();
+
     USERS * users;
     TARIFFS * tariffs;
 
@@ -105,6 +108,7 @@ private:
     SMUXHandlers smuxHandlers;
     PDUsHandlers pdusHandlers;
     Sensors sensors;
+    Tables tables;
 
 };
 //-----------------------------------------------------------------------------