From: Maxim Mamontov Date: Wed, 26 Jan 2011 15:56:39 +0000 (+0200) Subject: Додано можливість стирання не доставлених повідомлень за тайм-аутом X-Git-Tag: 2.407-rc3~196 X-Git-Url: https://git.stg.codes/stg.git/commitdiff_plain/bf69e959b3e75cb3eb3748e93df9dcfe5b82aa17 Додано можливість стирання не доставлених повідомлень за тайм-аутом --- diff --git a/projects/stargazer/settings.cpp b/projects/stargazer/settings.cpp index 9fcacc01..7aa2950f 100644 --- a/projects/stargazer/settings.cpp +++ b/projects/stargazer/settings.cpp @@ -28,16 +28,15 @@ $Date: 2010/08/19 13:42:30 $ $Author: faust $ */ -#include -#include -#include -#include +#include +#include #include -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(value, *val)) { strError = "Cannot convert \'" + value + "\' to integer."; @@ -136,6 +135,16 @@ if (str2x(value, *val)) return 0; } //----------------------------------------------------------------------------- +int SETTINGS::ParseUnsigned(const string & value, unsigned * val) +{ +if (str2x(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 * 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 & SETTINGS::GetModulesSettings() const -{ -return modulesSettings; -} -//----------------------------------------------------------------------------- -/*int SETTINGS::GetExecutersWaitTimeout() const -{ -return executersWaitTimeout; -}*/ -//----------------------------------------------------------------------------- diff --git a/projects/stargazer/settings.h b/projects/stargazer/settings.h index a9256cc9..03ace0a0 100644 --- a/projects/stargazer/settings.h +++ b/projects/stargazer/settings.h @@ -34,16 +34,13 @@ */ -#ifndef settingsh_h -#define settingsh_h 1 +#ifndef SETTINGS_H +#define SETTINGS_H -#include #include -#include #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 & GetModulesSettings() const; + const MODULE_SETTINGS & GetStoreModuleSettings() const + { return storeModuleSettings; }; + const vector & 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 modulesSettings; MODULE_SETTINGS storeModuleSettings; @@ -139,4 +143,3 @@ private: }; //----------------------------------------------------------------------------- #endif - diff --git a/projects/stargazer/user.cpp b/projects/stargazer/user.cpp index 3d9371fd..267967d0 100644 --- a/projects/stargazer/user.cpp +++ b/projects/stargazer/user.cpp @@ -605,7 +605,7 @@ void USER::Run() { STG_LOCKER lock(&mutex, __FILE__, __LINE__); -if (stgTime - lastWriteStat > settings->GetStatWritePeriod()) +if (stgTime > static_cast(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::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(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)