X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/4844bbe6135addc1ffdc33ed0576aebea0153e6d..0907aa4037b12b6b88ee24495d4577a064d4f8db:/projects/stargazer/tariffs_impl.cpp diff --git a/projects/stargazer/tariffs_impl.cpp b/projects/stargazer/tariffs_impl.cpp index d2ea7c9a..9cc829dd 100644 --- a/projects/stargazer/tariffs_impl.cpp +++ b/projects/stargazer/tariffs_impl.cpp @@ -36,70 +36,61 @@ #include "stg/logger.h" #include "stg/store.h" #include "stg/admin.h" +#include "stg/admin_conf.h" #include "tariffs_impl.h" -using namespace std; +using STG::TariffsImpl; //----------------------------------------------------------------------------- -TARIFFS_IMPL::TARIFFS_IMPL(STORE * st) - : TARIFFS(), - tariffs(), - store(st), - WriteServLog(GetStgLogger()), - strError(), +TariffsImpl::TariffsImpl(Store * st) + : store(st), + WriteServLog(Logger::get()), noTariff(NO_TARIFF_NAME) { -pthread_mutex_init(&mutex, NULL); ReadTariffs(); } //----------------------------------------------------------------------------- -TARIFFS_IMPL::~TARIFFS_IMPL() +int TariffsImpl::ReadTariffs() { -pthread_mutex_destroy(&mutex); -} -//----------------------------------------------------------------------------- -int TARIFFS_IMPL::ReadTariffs() -{ -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +std::lock_guard lock(m_mutex); -vector tariffsList; +std::vector tariffsList; if (store->GetTariffsList(&tariffsList)) { WriteServLog("Cannot get tariffs list."); WriteServLog("%s", store->GetStrError().c_str()); } -int tariffsNum = tariffsList.size(); +Data::size_type tariffsNum = tariffsList.size(); -for (int i = 0; i < tariffsNum; i++) +for (Data::size_type i = 0; i < tariffsNum; i++) { - TARIFF_DATA td; + TariffData td; if (store->RestoreTariff(&td, tariffsList[i])) { WriteServLog("Cannot read tariff %s.", tariffsList[i].c_str()); WriteServLog("%s", store->GetStrError().c_str()); return -1; } - tariffs.push_back(TARIFF_IMPL(td)); + tariffs.push_back(TariffImpl(td)); } return 0; } //----------------------------------------------------------------------------- -int TARIFFS_IMPL::GetTariffsNum() const +size_t TariffsImpl::Count() const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +std::lock_guard lock(m_mutex); return tariffs.size(); } //----------------------------------------------------------------------------- -const TARIFF * TARIFFS_IMPL::FindByName(const string & name) const +const STG::Tariff* TariffsImpl::FindByName(const std::string & name) const { if (name == NO_TARIFF_NAME) return &noTariff; -STG_LOCKER lock(&mutex, __FILE__, __LINE__); -list::const_iterator ti; -ti = find(tariffs.begin(), tariffs.end(), TARIFF_IMPL(name)); +std::lock_guard lock(m_mutex); +const auto ti = find(tariffs.begin(), tariffs.end(), TariffImpl(name)); if (ti != tariffs.end()) return &(*ti); @@ -107,28 +98,27 @@ if (ti != tariffs.end()) return NULL; } //----------------------------------------------------------------------------- -int TARIFFS_IMPL::Chg(const TARIFF_DATA & td, const ADMIN * admin) +int TariffsImpl::Chg(const TariffData & td, const Admin * admin) { -const PRIV * priv = admin->GetPriv(); +const auto& priv = admin->priv(); -if (!priv->tariffChg) +if (!priv.tariffChg) { - string s = admin->GetLogStr() + " Change tariff \'" + std::string s = admin->logStr() + " Change tariff \'" + td.tariffConf.name + "\'. Access denied."; strError = "Access denied."; WriteServLog(s.c_str()); return -1; } -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +std::lock_guard lock(m_mutex); -list::iterator ti; -ti = find(tariffs.begin(), tariffs.end(), TARIFF_IMPL(td.tariffConf.name)); +auto ti = find(tariffs.begin(), tariffs.end(), TariffImpl(td.tariffConf.name)); if (ti == tariffs.end()) { strError = "Tariff \'" + td.tariffConf.name + "\' cannot be changed. Tariff does not exist."; - WriteServLog("%s %s", admin->GetLogStr().c_str(), strError.c_str()); + WriteServLog("%s %s", admin->logStr().c_str(), strError.c_str()); return -1; } @@ -136,83 +126,96 @@ if (ti == tariffs.end()) if (store->SaveTariff(td, td.tariffConf.name)) { - string error = "Tariff " + td.tariffConf.name + " writing error. " + store->GetStrError(); + std::string error = "Tariff " + td.tariffConf.name + " writing error. " + store->GetStrError(); WriteServLog(error.c_str()); return -1; } WriteServLog("%s Tariff \'%s\' changed.", - admin->GetLogStr().c_str(), td.tariffConf.name.c_str()); + admin->logStr().c_str(), td.tariffConf.name.c_str()); return 0; } //----------------------------------------------------------------------------- -int TARIFFS_IMPL::Del(const string & name, const ADMIN * admin) +int TariffsImpl::Del(const std::string & name, const Admin * admin) { -const PRIV * priv = admin->GetPriv(); +const auto& priv = admin->priv(); -if (!priv->tariffChg) +if (!priv.tariffChg) { - string s = admin->GetLogStr() + " Delete tariff \'" + std::string s = admin->logStr() + " Delete tariff \'" + name + "\'. Access denied."; strError = "Access denied."; WriteServLog(s.c_str()); return -1; } -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +TariffData td; -list::iterator ti; -ti = find(tariffs.begin(), tariffs.end(), TARIFF_IMPL(name)); - -if (ti == tariffs.end()) { - strError = "Tariff \'" + name + "\' cannot be deleted. Tariff does not exist."; - WriteServLog("%s %s", admin->GetLogStr().c_str(), strError.c_str()); - return -1; + std::lock_guard lock(m_mutex); + + const auto ti = find(tariffs.begin(), tariffs.end(), TariffImpl(name)); + + if (ti == tariffs.end()) + { + strError = "Tariff \'" + name + "\' cannot be deleted. Tariff does not exist."; + WriteServLog("%s %s", admin->logStr().c_str(), strError.c_str()); + return -1; + } + + if (store->DelTariff(name)) + { + WriteServLog("Cannot delete tariff %s.", name.c_str()); + WriteServLog("%s", store->GetStrError().c_str()); + return -1; + } + + td = ti->GetTariffData(); + + tariffs.erase(ti); } -if (store->DelTariff(name)) +auto ni = onDelNotifiers.begin(); +while (ni != onDelNotifiers.end()) { - WriteServLog("Cannot delete tariff %s.", name.c_str()); - WriteServLog("%s", store->GetStrError().c_str()); - return -1; + (*ni)->Notify(td); + ++ni; } -tariffs.erase(ti); - WriteServLog("%s Tariff \'%s\' deleted.", - admin->GetLogStr().c_str(), + admin->logStr().c_str(), name.c_str()); return 0; } //----------------------------------------------------------------------------- -int TARIFFS_IMPL::Add(const string & name, const ADMIN * admin) +int TariffsImpl::Add(const std::string & name, const Admin * admin) { -const PRIV * priv = admin->GetPriv(); +const auto& priv = admin->priv(); -if (!priv->tariffChg) +if (!priv.tariffChg) { - string s = admin->GetLogStr() + " Add tariff \'" + std::string s = admin->logStr() + " Add tariff \'" + name + "\'. Access denied."; strError = "Access denied."; WriteServLog(s.c_str()); return -1; } -STG_LOCKER lock(&mutex, __FILE__, __LINE__); + { + std::lock_guard lock(m_mutex); -list::iterator ti; -ti = find(tariffs.begin(), tariffs.end(), TARIFF_IMPL(name)); + const auto ti = find(tariffs.begin(), tariffs.end(), TariffImpl(name)); -if (ti != tariffs.end()) - { - strError = "Tariff \'" + name + "\' cannot be added. Tariff already exist."; - WriteServLog("%s %s", admin->GetLogStr().c_str(), strError.c_str()); - return -1; - } + if (ti != tariffs.end()) + { + strError = "Tariff \'" + name + "\' cannot be added. Tariff already exist."; + WriteServLog("%s %s", admin->logStr().c_str(), strError.c_str()); + return -1; + } -tariffs.push_back(TARIFF_IMPL(name)); + tariffs.push_back(TariffImpl(name)); + } if (store->AddTariff(name) < 0) { @@ -221,21 +224,53 @@ if (store->AddTariff(name) < 0) return -1; } +// Fire all "on add" notifiers +auto ni = onAddNotifiers.begin(); +while (ni != onAddNotifiers.end()) + { + (*ni)->Notify(tariffs.back().GetTariffData()); + ++ni; + } + WriteServLog("%s Tariff \'%s\' added.", - admin->GetLogStr().c_str(), name.c_str()); + admin->logStr().c_str(), name.c_str()); return 0; } //----------------------------------------------------------------------------- -void TARIFFS_IMPL::GetTariffsData(std::list * tdl) +void TariffsImpl::GetTariffsData(std::vector * tdl) const { assert(tdl != NULL && "Tariffs data list is not null"); -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +std::lock_guard lock(m_mutex); -std::list::const_iterator it = tariffs.begin(); +auto it = tariffs.begin(); for (; it != tariffs.end(); ++it) { tdl->push_back(it->GetTariffData()); } } //----------------------------------------------------------------------------- +void TariffsImpl::AddNotifierAdd(NotifierBase * n) +{ +std::lock_guard lock(m_mutex); +onAddNotifiers.insert(n); +} +//----------------------------------------------------------------------------- +void TariffsImpl::DelNotifierAdd(NotifierBase * n) +{ +std::lock_guard lock(m_mutex); +onAddNotifiers.erase(n); +} +//----------------------------------------------------------------------------- +void TariffsImpl::AddNotifierDel(NotifierBase * n) +{ +std::lock_guard lock(m_mutex); +onDelNotifiers.insert(n); +} +//----------------------------------------------------------------------------- +void TariffsImpl::DelNotifierDel(NotifierBase * n) +{ +std::lock_guard lock(m_mutex); +onDelNotifiers.erase(n); +} +//-----------------------------------------------------------------------------