]> git.stg.codes - stg.git/commitdiff
Додано можливість стирання не доставлених повідомлень за тайм-аутом
authorMaxim Mamontov <faust@gts.dp.ua>
Wed, 26 Jan 2011 15:56:39 +0000 (17:56 +0200)
committerMaxim Mamontov <faust@gts.dp.ua>
Wed, 26 Jan 2011 15:56:39 +0000 (17:56 +0200)
projects/stargazer/settings.cpp
projects/stargazer/settings.h
projects/stargazer/user.cpp

index 9fcacc01c2c12caccb36d7fb262163d800d4bdb2..7aa2950fa4fa83a44570134dd715a41090a0bc3e 100644 (file)
@@ -28,16 +28,15 @@ $Date: 2010/08/19 13:42:30 $
 $Author: faust $
 */
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
+#include <cstring>
+#include <cerrno>
 #include <string>
 
-using namespace std;
-
 #include "settings.h"
-#include "common.h"
+#include "stg_logger.h"
+#include "dotconfpp.h"
+
+using namespace std;
 
 //-----------------------------------------------------------------------------
 SETTINGS::SETTINGS()
@@ -57,6 +56,7 @@ SETTINGS::SETTINGS()
       dayFeeIsLastDay(false),
       writeFreeMbTraffCost(false),
       showFeeInCash(true),
+      messageTimeout(0),
       logger(GetStgLogger())
 {
 }
@@ -64,7 +64,6 @@ SETTINGS::SETTINGS()
 SETTINGS::SETTINGS(const std::string & cd)
     : confDir(cd),
       scriptDir(cd),
-      pidFile(),
       monitoring(false),
       detailStatWritePeriod(dsPeriod_1_6),
       statWritePeriod(10),
@@ -78,6 +77,7 @@ SETTINGS::SETTINGS(const std::string & cd)
       dayFeeIsLastDay(false),
       writeFreeMbTraffCost(false),
       showFeeInCash(true),
+      messageTimeout(0),
       logger(GetStgLogger())
 {
 }
@@ -85,22 +85,23 @@ SETTINGS::SETTINGS(const std::string & cd)
 SETTINGS::SETTINGS(const SETTINGS & rval)
     : confDir(rval.confDir),
       scriptDir(rval.scriptDir),
+      pidFile(rval.pidFile),
+      monitoring(rval.monitoring),
       detailStatWritePeriod(dsPeriod_1_6),
       statWritePeriod(10),
+      stgExecMsgKey(rval.stgExecMsgKey),
+      executersNum(rval.executersNum),
+      fullFee(rval.fullFee),
       dayFee(0),
       dayResetTraff(0),
+      spreadFee(rval.spreadFee),
       freeMbAllowInet(false),
       dayFeeIsLastDay(false),
       writeFreeMbTraffCost(false),
+      showFeeInCash(rval.showFeeInCash),
+      messageTimeout(rval.messageTimeout),
       logger(GetStgLogger())
 {
-spreadFee = rval.spreadFee;
-pidFile = rval.pidFile;
-stgExecMsgKey = rval.stgExecMsgKey;
-executersNum = rval.executersNum;
-showFeeInCash = rval.showFeeInCash;
-fullFee = rval.fullFee;
-monitoring = rval.monitoring;
 }
 //-----------------------------------------------------------------------------
 SETTINGS::~SETTINGS()
@@ -126,8 +127,6 @@ return -1;
 //-----------------------------------------------------------------------------
 int SETTINGS::ParseInt(const string & value, int * val)
 {
-/*char *res;
-*val = strtol(value.c_str(), &res, 10);*/
 if (str2x<int>(value, *val))
     {
     strError = "Cannot convert \'" + value + "\' to integer.";
@@ -136,6 +135,16 @@ if (str2x<int>(value, *val))
 return 0;
 }
 //-----------------------------------------------------------------------------
+int SETTINGS::ParseUnsigned(const string & value, unsigned * val)
+{
+if (str2x<unsigned>(value, *val))
+    {
+    strError = "Cannot convert \'" + value + "\' to unsigned integer.";
+    return -1;
+    }
+return 0;
+}
+//-----------------------------------------------------------------------------
 int SETTINGS::ParseIntInRange(const string & value, int min, int max, int * val)
 {
 if (ParseInt(value, val) != 0)
@@ -147,13 +156,25 @@ if (*val < min || *val > max)
     return -1;
     }
 
+return 0;
+}
+//-----------------------------------------------------------------------------
+int SETTINGS::ParseUnsignedInRange(const string & value, unsigned min, unsigned max, unsigned * val)
+{
+if (ParseUnsigned(value, val) != 0)
+    return -1;
+
+if (*val < min || *val > max)
+    {
+    strError = "Value \'" + value + "\' out of range.";
+    return -1;
+    }
+
 return 0;
 }
 //-----------------------------------------------------------------------------
 int SETTINGS::ParseModuleSettings(const DOTCONFDocumentNode * node, vector<PARAM_VALUE> * params)
 {
-/*if (!node)
-    return 0;*/
 const DOTCONFDocumentNode * childNode;
 PARAM_VALUE pv;
 const char * value;
@@ -179,34 +200,18 @@ while (childNode)
     {
     pv.param = childNode->getName();
     int i = 0;
-    while ((value = childNode->getValue(i)) != NULL)
+    while ((value = childNode->getValue(i++)) != NULL)
         {
-        //printfd(__FILE__, "--> param=\'%s\' value=\'%s\'\n", childNode->getName(), value);
         pv.value.push_back(value);
-        i++;
         }
     params->push_back(pv);
     pv.value.clear();
     childNode = childNode->getNextNode();
     }
 
-/*for (unsigned i = 0; i < params->size(); i++)
-    {
-    printfd(__FILE__, "param \'%s\'\n", (*params)[i].param.c_str());
-    for (unsigned j = 0; j < (*params)[i].value.size(); j++)
-        {
-        printfd(__FILE__, "value \'%s\'\n", (*params)[i].value[j].c_str());
-        }
-    }*/
-
 return 0;
 }
 //-----------------------------------------------------------------------------
-string SETTINGS::GetStrError() const
-{
-return strError;
-}
-//-----------------------------------------------------------------------------
 void SETTINGS::ErrorCallback(void * data, const char * buf)
 {
     printfd(__FILE__, buf);
@@ -293,7 +298,7 @@ while (node)
 
     if (strcasecmp(node->getName(), "StatWritePeriod") == 0)
         {
-        if (ParseIntInRange(node->getValue(0), 1, 1440, &statWritePeriod) != 0)
+        if (ParseUnsignedInRange(node->getValue(0), 1, 1440, &statWritePeriod) != 0)
             {
             strError = "Incorrect StatWritePeriod value: \'" + string(node->getValue(0)) + "\'";
             return -1;
@@ -312,7 +317,7 @@ while (node)
 
     if (strcasecmp(node->getName(), "ExecutersNum") == 0)
         {
-        if (ParseIntInRange(node->getValue(0), 1, 1024, &executersNum) != 0)
+        if (ParseUnsignedInRange(node->getValue(0), 1, 1024, &executersNum) != 0)
             {
             strError = "Incorrect ExecutersNum value: \'" + string(node->getValue(0)) + "\'";
             return -1;
@@ -320,19 +325,9 @@ while (node)
         //printfd(__FILE__, "DayResetTraff: %d\n", dayResetTraff);
         }
 
-    /*if (strcasecmp(node->getName(), "ExecutersWaitTimeout") == 0)
-        {
-        if (ParseIntInRange(node->getValue(0), 1, 600, &executersWaitTimeout) != 0)
-            {
-            strError = "Incorrect ExecutersWaitTimeout value: \'" + string(node->getValue(0)) + "\'";
-            return -1;
-            }
-        //printfd(__FILE__, "DayResetTraff: %d\n", dayResetTraff);
-        }*/
-
     if (strcasecmp(node->getName(), "DayFee") == 0)
         {
-        if (ParseIntInRange(node->getValue(0), 0, 31, &dayFee) != 0)
+        if (ParseUnsignedInRange(node->getValue(0), 0, 31, &dayFee) != 0)
             {
             strError = "Incorrect DayFee value: \'" + string(node->getValue(0)) + "\'";
             return -1;
@@ -352,7 +347,7 @@ while (node)
 
     if (strcasecmp(node->getName(), "DayResetTraff") == 0)
         {
-        if (ParseIntInRange(node->getValue(0), 0, 31, &dayResetTraff) != 0)
+        if (ParseUnsignedInRange(node->getValue(0), 0, 31, &dayResetTraff) != 0)
             {
             strError = "Incorrect DayResetTraff value: \'" + string(node->getValue(0)) + "\'";
             return -1;
@@ -422,6 +417,16 @@ while (node)
             }
         }
 
+    if (strcasecmp(node->getName(), "MessageTimeout") == 0)
+        {
+        if (ParseUnsigned(node->getValue(0), &messageTimeout) != 0)
+            {
+            strError = "Incorrect MessageTimeout value: \'" + string(node->getValue(0)) + "\'";
+            return -1;
+            }
+        //printfd(__FILE__, "MessageTimeout: %d\n", messageTimeout);
+        }
+
     if (strcasecmp(node->getName(), "DirNames") == 0)
         {
         // íÙ ×ÎÕÔÒÉ ÓÅËÃÉÉ DirNames
@@ -437,7 +442,6 @@ while (node)
                 if (dirNameNode && dirNameNode->getValue(0))
                     {
                     dirName[i] = dirNameNode->getValue(0);
-                    //printfd(__FILE__, "dirName[%d]: %s\n", i, dirName[i].c_str());
                     }
                 }
             }
@@ -463,8 +467,6 @@ while (node)
             }
         storeModulesCount++;
 
-        //storeModuleSettings.clear(); //TODO To make constructor
-        //printfd(__FILE__, "StoreModule %s\n", node->getValue());
         storeModuleSettings.moduleName = node->getValue(0);
         ParseModuleSettings(node, &storeModuleSettings.moduleParams);
         }
@@ -483,7 +485,6 @@ while (node)
         while (child)
             {
             // íÙ ×ÎÕÔÒÉ ÓÅËÃÉÉ
-            //printfd(__FILE__, "Module \'%s\'\n", child->getValue(0));
             if (strcasecmp(child->getName(), "Module") != 0)
                 {
                 child = child->getNextNode();
@@ -504,9 +505,6 @@ while (node)
     node = node->getNextNode();
     }
 
-//sort(modulesSettings.begin(), modulesSettings.end());
-//modulesSettings.erase(unique(modulesSettings.begin(), modulesSettings.end()), modulesSettings.end());
-
 return 0;
 }
 //-----------------------------------------------------------------------------
@@ -536,23 +534,3 @@ else if (detailStatPeriodStr == "1/6")
 return -1;
 }
 //-----------------------------------------------------------------------------
-int SETTINGS::Reload ()
-{
-return ReadSettings();
-}
-//-----------------------------------------------------------------------------
-const MODULE_SETTINGS & SETTINGS::GetStoreModuleSettings() const
-{
-return storeModuleSettings;
-}
-//-----------------------------------------------------------------------------
-const vector<MODULE_SETTINGS> & SETTINGS::GetModulesSettings() const
-{
-return modulesSettings;
-}
-//-----------------------------------------------------------------------------
-/*int SETTINGS::GetExecutersWaitTimeout() const
-{
-return executersWaitTimeout;
-}*/
-//-----------------------------------------------------------------------------
index a9256cc9ed5d9cc54bd61ff81ee76d7fae1c3d31..03ace0a0bb07e38c3d01fda81cf1429daefa0150 100644 (file)
  */
 
 
-#ifndef settingsh_h
-#define settingsh_h 1
+#ifndef SETTINGS_H
+#define SETTINGS_H
 
-#include <sys/types.h>
 #include <vector>
-#include <dotconfpp.h>
 
 #include "common.h"
 #include "base_settings.h"
-#include "stg_logger.h"
 
 using namespace std;
 
@@ -56,6 +53,9 @@ dsPeriod_1_4,
 dsPeriod_1_6,
 };
 //-----------------------------------------------------------------------------
+class STG_LOGGER;
+class DOTCONFDocumentNode;
+//-----------------------------------------------------------------------------
 class SETTINGS
 {
 public:
@@ -63,26 +63,25 @@ public:
     SETTINGS(const std::string &);
     SETTINGS(const SETTINGS &);
     virtual ~SETTINGS();
-    int Reload();
+    int Reload() { return ReadSettings(); };
     int ReadSettings();
 
-    string GetStrError() const;
+    string GetStrError() const { return strError; };
 
     int             GetExecMsgKey() const { return stgExecMsgKey; };
-    int             GetExecutersNum() const { return executersNum; };
-    //int             GetExecutersWaitTimeout() const;
+    size_t          GetExecutersNum() const { return executersNum; };
     const string &  GetDirName(int num) const { return dirName[num]; };
     const string &  GetConfDir() const { return confDir; };
     const string &  GetScriptDir() const { return scriptDir; };
     const string &  GetRulesFileName() const { return rules; };
     const string &  GetLogFileName() const { return logFile; };
     const string &  GetPIDFileName() const { return pidFile; };
-    int             GetDetailStatWritePeriod() const 
+    unsigned        GetDetailStatWritePeriod() const 
         { return detailStatWritePeriod; };
-    int             GetStatWritePeriod() const { return statWritePeriod * 60; };
-    int             GetDayFee() const { return dayFee; };
+    unsigned        GetStatWritePeriod() const { return statWritePeriod * 60; };
+    unsigned        GetDayFee() const { return dayFee; };
     bool            GetFullFee() const { return fullFee; };
-    int             GetDayResetTraff() const { return dayResetTraff; };
+    unsigned        GetDayResetTraff() const { return dayResetTraff; };
     bool            GetSpreadFee() const { return spreadFee; };
     bool            GetFreeMbAllowInet() const { return freeMbAllowInet; };
     bool            GetDayFeeIsLastDay() const { return dayFeeIsLastDay; };
@@ -91,15 +90,20 @@ public:
     bool            GetShowFeeInCash() const { return showFeeInCash; };
     const string  & GetMonitorDir() const { return monitorDir; };
     bool            GetMonitoring() const { return monitoring; };
+    unsigned        GetMessageTimeout() const { return messageTimeout * 3600 * 24; };
 
     const string &  GetModulesPath() const { return modulesPath; };
-    const MODULE_SETTINGS         & GetStoreModuleSettings() const;
-    const vector<MODULE_SETTINGS> & GetModulesSettings() const;
+    const MODULE_SETTINGS         & GetStoreModuleSettings() const
+        { return storeModuleSettings; };
+    const vector<MODULE_SETTINGS> & GetModulesSettings() const
+        { return modulesSettings; };
 
 private:
 
     int ParseInt(const string & value, int * val);
+    int ParseUnsigned(const string & value, unsigned * val);
     int ParseIntInRange(const string & value, int min, int max, int * val);
+    int ParseUnsignedInRange(const string & value, unsigned min, unsigned max, unsigned * val);
     int ParseYesNo(const string & value, bool * val);
     int ParseDetailStatWritePeriod(const string & detailStatPeriodStr);
 
@@ -118,19 +122,19 @@ private:
     string      pidFile;
     string      monitorDir;
     bool        monitoring;
-    int         detailStatWritePeriod;
-    int         statWritePeriod;
+    unsigned    detailStatWritePeriod;
+    unsigned    statWritePeriod;
     int         stgExecMsgKey;
-    int         executersNum;
-    //int         executersWaitTimeout;
+    size_t      executersNum;
     bool        fullFee;
-    int         dayFee;        // ÄÅÎØ ÓÎÑÔÉÑ ÁÂÏÎÐÌÁÔÙ
-    int         dayResetTraff; // îÁÞÁÌÏ ÕÞÅÔÎÏÇÏ ÐÅÒÉÏÄÁ: ÄÅÎØ ÏÂÎÕÌÅÎÉÑ ÔÒÁÆÉËÁ É ÓÍÅÎÙ ÔÁÒÉÆÁ
+    unsigned    dayFee;        // ÄÅÎØ ÓÎÑÔÉÑ ÁÂÏÎÐÌÁÔÙ
+    unsigned    dayResetTraff; // îÁÞÁÌÏ ÕÞÅÔÎÏÇÏ ÐÅÒÉÏÄÁ: ÄÅÎØ ÏÂÎÕÌÅÎÉÑ ÔÒÁÆÉËÁ É ÓÍÅÎÙ ÔÁÒÉÆÁ
     bool        spreadFee;
     bool        freeMbAllowInet;
     bool        dayFeeIsLastDay; // áð ÓÎÉÍÁÅÔÓÑ × ËÏÎÃÅ ÍÅÓÑÃÁ (true) ÉÌÉ × ÎÁÞÁÌÅ (false)
     bool        writeFreeMbTraffCost; // ðÉÓÁÔØ × ÄÅÔÁÌØÎÕÀ ÓÔÁÔÉÓÔÉËÕ ÓÔÏÉÍÏÓÔØ ÔÒÁÆÉËÁ, ÅÓÌÉ ÅÝÅ ÅÓÔØ ÐÒÅÄÏÐÌÁÞÅÎÎÙÊ ÔÒÁÆÉË
     bool        showFeeInCash; // ðÏËÁÚÙ×ÁÔØ ÐÏÌØÚÏ×ÁÔÅÌÀ áð ÎÅ ÓÞÅÔÕ É ÐÏÚ×ÏÌÑÔØ ÅÅ ÉÓÐÏÌØÚÏ×ÁÔØ
+    unsigned    messageTimeout; // ÷ÒÅÍÑ ÖÉÚÎÉ ÎÅÏÔÐÒÁ×ÌÅÎÎÏÇÏ ÓÏÏÂÝÅÎÉÑ × ÓÅËÕÎÄÁÈ
 
     vector<MODULE_SETTINGS> modulesSettings;
     MODULE_SETTINGS         storeModuleSettings;
@@ -139,4 +143,3 @@ private:
 };
 //-----------------------------------------------------------------------------
 #endif
-
index 3d9371fda7f7c5110f200c92175f31668ef00416..267967d085eaab6f181c0e71db4aa41142e7cc09 100644 (file)
@@ -605,7 +605,7 @@ void USER::Run()
 {
 STG_LOCKER lock(&mutex, __FILE__, __LINE__);
 
-if (stgTime - lastWriteStat > settings->GetStatWritePeriod())
+if (stgTime > static_cast<time_t>(lastWriteStat + settings->GetStatWritePeriod()))
     {
     printfd(__FILE__, "USER::WriteStat user=%s\n", GetLogin().c_str());
     WriteStat();
@@ -1256,11 +1256,26 @@ for (unsigned i = 0; i < hdrsList.size(); i++)
 std::list<STG_MSG>::iterator it(messages.begin());
 while (it != messages.end())
     {
+    printfd(__FILE__, "Message timeout: %d, delta: %f\n", settings->GetMessageTimeout(), difftime(stgTime, it->header.creationTime));
+    if (settings->GetMessageTimeout() > 0 &&
+        difftime(stgTime, it->header.creationTime) > settings->GetMessageTimeout())
+        {
+        // Timeout exceeded
+        if (store->DelMessage(it->header.id, login))
+            {
+            WriteServLog("Error deleting message: '%s'", store->GetStrError().c_str());
+            printfd(__FILE__, "Error deleting message: '%s'\n", store->GetStrError().c_str());
+            }
+        messages.erase(it++);
+        continue;
+        }
     if (static_cast<time_t>(it->header.lastSendTime + it->header.repeatPeriod * 60) < stgTime)
         {
         if (SendMessage(*it))
             {
-            return -1;
+            // We need to check all messages in queue for timeout
+            ++it;
+            continue;
             }
         it->header.repeat--;
         if (it->header.repeat < 0)