]> git.stg.codes - stg.git/commitdiff
Allow to have multi-leveled module settings.
authorMaxim Mamontov <faust.madf@gmail.com>
Sat, 5 Sep 2015 12:23:37 +0000 (15:23 +0300)
committerMaxim Mamontov <faust.madf@gmail.com>
Sat, 5 Sep 2015 12:23:37 +0000 (15:23 +0300)
include/stg/module_settings.h
projects/stargazer/settings_impl.cpp
projects/stargazer/settings_impl.h

index a1baf33c80f1aba03e8d698c3e7422cfdccb2714..5af5eefcd23149796711ce76d81bc7d5d45d21e3 100644 (file)
 //-----------------------------------------------------------------------------
 struct PARAM_VALUE
 {
-    PARAM_VALUE()
-        : param(),
-          value()
+    PARAM_VALUE() {}
+    PARAM_VALUE(const std::string& p, const std::vector<std::string>& vs)
+        : param(p),
+          value(vs)
+    {}
+    PARAM_VALUE(const std::string& p, const std::vector<std::string>& vs, const std::vector<PARAM_VALUE>& ss)
+        : param(p),
+          value(vs),
+          sections(ss)
     {}
     bool operator==(const PARAM_VALUE & rhs) const
         { return !strcasecmp(param.c_str(), rhs.param.c_str()); }
@@ -26,6 +32,7 @@ struct PARAM_VALUE
 
     std::string param;
     std::vector<std::string> value;
+    std::vector<PARAM_VALUE> sections;
 };
 //-----------------------------------------------------------------------------
 struct MODULE_SETTINGS
@@ -34,9 +41,9 @@ struct MODULE_SETTINGS
         : moduleName(),
           moduleParams()
     {}
-    MODULE_SETTINGS(const MODULE_SETTINGS & rvalue)
-        : moduleName(rvalue.moduleName),
-          moduleParams(rvalue.moduleParams)
+    MODULE_SETTINGS(const std::string& name, const std::vector<PARAM_VALUE>& params)
+        : moduleName(name),
+          moduleParams(params)
     {}
     bool operator==(const MODULE_SETTINGS & rhs) const
         { return !strcasecmp(moduleName.c_str(), rhs.moduleName.c_str()); }
index d115919d0e096142bee210b917eaa0ea7e2a4879..67b4272f127baffb30e45df902c8e95e9ea956a5 100644 (file)
  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-/*
- *    Date: 27.10.2002
- */
-
 /*
  *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
  */
 
-/*
-$Revision: 1.45 $
-$Date: 2010/08/19 13:42:30 $
-$Author: faust $
-*/
+#include "settings_impl.h"
 
+#include "stg/logger.h"
+#include "stg/dotconfpp.h"
+#include "stg/common.h"
+
+#include <stdexcept>
 #include <cstring>
 #include <cerrno>
-#include <string>
 
-#include "stg/logger.h"
-#include "stg/dotconfpp.h"
-#include "settings_impl.h"
+namespace
+{
+
+struct Error : public std::runtime_error
+{
+    Error(const std::string& message) : runtime_error(message) {}
+};
+
+std::vector<std::string> toValues(const DOTCONFDocumentNode& node)
+{
+    std::vector<std::string> values;
+
+    size_t i = 0;
+    const char* value = NULL;
+    while ((value = node.getValue(i++)) != NULL)
+        values.push_back(value);
+
+    return values;
+}
+
+std::vector<PARAM_VALUE> toPVS(const DOTCONFDocumentNode& node)
+{
+    std::vector<PARAM_VALUE> pvs;
+
+    const DOTCONFDocumentNode* child = node.getChildNode();
+    while (child != NULL)
+        {
+        if (child->getName() == NULL)
+            continue;
+
+        if (child->getChildNode() == NULL)
+            pvs.push_back(PARAM_VALUE(child->getName(), toValues(*child)));
+        else
+            pvs.push_back(PARAM_VALUE(child->getName(), toValues(*child), toPVS(*child)));
+
+        child = child->getNextNode();
+        }
+
+    return pvs;
+}
+
+unsigned toPeriod(const char* value)
+{
+    if (value == NULL)
+        throw Error("No detail stat period value.");
+
+    std::string period(value);
+    if (period == "1")
+        return dsPeriod_1;
+    else if (period == "1/2")
+        return dsPeriod_1_2;
+    else if (period == "1/4")
+        return dsPeriod_1_4;
+    else if (period == "1/6")
+        return dsPeriod_1_6;
+
+    throw Error("Invalid detail stat period value: '" + period + "'. Should be one of '1', '1/2', '1/4' or '1/6'.");
+}
+
+}
 
 //-----------------------------------------------------------------------------
 SETTINGS_IMPL::SETTINGS_IMPL(const std::string & cd)
@@ -66,78 +119,6 @@ SETTINGS_IMPL::SETTINGS_IMPL(const std::string & cd)
 {
 }
 //-----------------------------------------------------------------------------
-SETTINGS_IMPL::SETTINGS_IMPL(const SETTINGS_IMPL & rval)
-    : SETTINGS(),
-      strError(),
-      modulesPath(rval.modulesPath),
-      dirName(rval.dirName),
-      confDir(rval.confDir),
-      scriptsDir(rval.scriptsDir),
-      rules(rval.rules),
-      logFile(rval.logFile),
-      pidFile(rval.pidFile),
-      monitorDir(rval.monitorDir),
-      monitoring(rval.monitoring),
-      detailStatWritePeriod(rval.detailStatWritePeriod),
-      statWritePeriod(rval.statWritePeriod),
-      stgExecMsgKey(rval.stgExecMsgKey),
-      executersNum(rval.executersNum),
-      fullFee(rval.fullFee),
-      dayFee(rval.dayFee),
-      dayResetTraff(rval.dayResetTraff),
-      spreadFee(rval.spreadFee),
-      freeMbAllowInet(rval.freeMbAllowInet),
-      dayFeeIsLastDay(rval.dayFeeIsLastDay),
-      writeFreeMbTraffCost(rval.writeFreeMbTraffCost),
-      showFeeInCash(rval.showFeeInCash),
-      messageTimeout(rval.messageTimeout),
-      feeChargeType(rval.feeChargeType),
-      reconnectOnTariffChange(rval.reconnectOnTariffChange),
-      modulesSettings(rval.modulesSettings),
-      storeModuleSettings(rval.storeModuleSettings),
-      logger(GetStgLogger())
-{
-}
-//-----------------------------------------------------------------------------
-int SETTINGS_IMPL::ParseModuleSettings(const DOTCONFDocumentNode * node, std::vector<PARAM_VALUE> * params)
-{
-const DOTCONFDocumentNode * childNode;
-PARAM_VALUE pv;
-const char * value;
-
-pv.param = node->getName();
-
-if (node->getValue(1))
-    {
-    strError = "Unexpected value \'" + std::string(node->getValue(1)) + "\'.";
-    return -1;
-    }
-
-value = node->getValue(0);
-
-if (!value)
-    {
-    strError = "Module name expected.";
-    return -1;
-    }
-
-childNode = node->getChildNode();
-while (childNode)
-    {
-    pv.param = childNode->getName();
-    int i = 0;
-    while ((value = childNode->getValue(i++)) != NULL)
-        {
-        pv.value.push_back(value);
-        }
-    params->push_back(pv);
-    pv.value.clear();
-    childNode = childNode->getNextNode();
-    }
-
-return 0;
-}
-//-----------------------------------------------------------------------------
 void SETTINGS_IMPL::ErrorCallback(void * data, const char * buf)
 {
     printfd(__FILE__, "SETTINGS_IMPL::ErrorCallback() - %s\n", buf);
@@ -207,11 +188,15 @@ while (node)
 
     if (strcasecmp(node->getName(), "DetailStatWritePeriod") == 0)
         {
-        if (ParseDetailStatWritePeriod(node->getValue(0)) != 0)
-            {
-            strError = "Incorrect DetailStatWritePeriod value: \'" + std::string(node->getValue(0)) + "\'";
+        try
+        {
+            detailStatWritePeriod = toPeriod(node->getValue(0));
+        }
+        catch (const Error& error)
+        {
+            strError = error.what();
             return -1;
-            }
+        }
         }
 
     if (strcasecmp(node->getName(), "StatWritePeriod") == 0)
@@ -387,8 +372,13 @@ while (node)
             }
         storeModulesCount++;
 
+        if (node->getValue(0) == NULL)
+            {
+            strError = "No module name in the StoreModule section.";
+            return -1;
+            }
         storeModuleSettings.moduleName = node->getValue(0);
-        ParseModuleSettings(node, &storeModuleSettings.moduleParams);
+        storeModuleSettings.moduleParams = toPVS(*node);
         }
 
     if (strcasecmp(node->getName(), "Modules") == 0)
@@ -406,13 +396,14 @@ while (node)
                 child = child->getNextNode();
                 continue;
                 }
-            MODULE_SETTINGS modSettings;
-            modSettings.moduleParams.clear();
-            modSettings.moduleName = child->getValue();
 
-            ParseModuleSettings(child, &modSettings.moduleParams);
+            if (child->getValue(0) == NULL)
+                {
+                strError = "No module name in the Module section.";
+                return -1;
+                }
 
-            modulesSettings.push_back(modSettings);
+            modulesSettings.push_back(MODULE_SETTINGS(child->getValue(0), toPVS(*child)));
 
             child = child->getNextNode();
             }
@@ -431,29 +422,3 @@ while (node)
 return 0;
 }
 //-----------------------------------------------------------------------------
-int SETTINGS_IMPL::ParseDetailStatWritePeriod(const std::string & detailStatPeriodStr)
-{
-if (detailStatPeriodStr == "1")
-    {
-    detailStatWritePeriod = dsPeriod_1;
-    return 0;
-    }
-else if (detailStatPeriodStr == "1/2")
-    {
-    detailStatWritePeriod = dsPeriod_1_2;
-    return 0;
-    }
-else if (detailStatPeriodStr == "1/4")
-    {
-    detailStatWritePeriod = dsPeriod_1_4;
-    return 0;
-    }
-else if (detailStatPeriodStr == "1/6")
-    {
-    detailStatWritePeriod = dsPeriod_1_6;
-    return 0;
-    }
-
-return -1;
-}
-//-----------------------------------------------------------------------------
index 690137643bbe272e3e9089f51c22f5f0802c3ebc..bab818c6ed473d3ce544eb879184481d1a8a696d 100644 (file)
@@ -1,9 +1,3 @@
- /*
- $Revision: 1.27 $
- $Date: 2010/08/19 13:42:30 $
- $Author: faust $
- */
-
 /*
  *    This program is free software; you can redistribute it and/or modify
  *    it under the terms of the GNU General Public License as published by
  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-/*
- *    Date: 27.10.2002
- */
-
 /*
  *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
  */
 
- /*
- $Revision: 1.27 $
- $Date: 2010/08/19 13:42:30 $
- */
-
-
 #ifndef SETTINGS_IMPL_H
 #define SETTINGS_IMPL_H
 
 #include <vector>
 
 #include "stg/settings.h"
-#include "stg/common.h"
-#include "stg/logger.h"
 #include "stg/module_settings.h"
+#include "stg/ref.h"
 
 //-----------------------------------------------------------------------------
 enum DETAIL_STAT_PERIOD {
-dsPeriod_1,
-dsPeriod_1_2,
-dsPeriod_1_4,
-dsPeriod_1_6
+    dsPeriod_1,
+    dsPeriod_1_2,
+    dsPeriod_1_4,
+    dsPeriod_1_6
 };
 //-----------------------------------------------------------------------------
 class STG_LOGGER;
@@ -59,7 +42,6 @@ class DOTCONFDocumentNode;
 class SETTINGS_IMPL : public SETTINGS {
 public:
     SETTINGS_IMPL(const std::string &);
-    SETTINGS_IMPL(const SETTINGS_IMPL &);
     virtual ~SETTINGS_IMPL() {}
     int Reload() { return ReadSettings(); }
     int ReadSettings();
@@ -74,7 +56,7 @@ public:
     const std::string & GetRulesFileName() const { return rules; }
     const std::string & GetLogFileName() const { return logFile; }
     const std::string & GetPIDFileName() const { return pidFile; }
-    unsigned            GetDetailStatWritePeriod() const 
+    unsigned            GetDetailStatWritePeriod() const
         { return detailStatWritePeriod; }
     unsigned            GetStatWritePeriod() const { return statWritePeriod * 60; }
     unsigned            GetDayFee() const { return dayFee; }
@@ -101,9 +83,6 @@ public:
 
 private:
 
-    int ParseDetailStatWritePeriod(const std::string & str);
-    int ParseModuleSettings(const DOTCONFDocumentNode * dirNameNode, std::vector<PARAM_VALUE> * params);
-
     static void ErrorCallback(void * data, const char * buf);
 
     std::string strError;
@@ -112,7 +91,7 @@ private:
     std::string modulesPath;
     std::vector<std::string> dirName;
     std::string confDir;
-    std::string        scriptsDir;
+    std::string scriptsDir;
     std::string rules;
     std::string logFile;
     std::string pidFile;
@@ -137,7 +116,7 @@ private:
 
     std::vector<MODULE_SETTINGS> modulesSettings;
     MODULE_SETTINGS storeModuleSettings;
-    STG_LOGGER & logger;
+    STG::RefWrapper<STG_LOGGER> logger;
 };
 //-----------------------------------------------------------------------------