X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/bd66b226090397493de8d87649b2bbad3ac89e36..1c324d5b2380a68f209e65969079677dbaf1c511:/projects/stargazer/plugins/store/firebird/firebird_store_tariffs.cpp diff --git a/projects/stargazer/plugins/store/firebird/firebird_store_tariffs.cpp b/projects/stargazer/plugins/store/firebird/firebird_store_tariffs.cpp index 8967d6ea..58b57139 100644 --- a/projects/stargazer/plugins/store/firebird/firebird_store_tariffs.cpp +++ b/projects/stargazer/plugins/store/firebird/firebird_store_tariffs.cpp @@ -27,24 +27,36 @@ */ #include "firebird_store.h" + #include "stg/ibpp.h" +#include "stg/tariff.h" +#include "stg/tariff_conf.h" +#include "stg/common.h" + +#include + +namespace +{ + +const int pt_mega = 1024 * 1024; + +} //----------------------------------------------------------------------------- -int FIREBIRD_STORE::GetTariffsList(vector * tariffsList) const +int FIREBIRD_STORE::GetTariffsList(std::vector * tariffsList) const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); IBPP::Transaction tr = IBPP::TransactionFactory(db, IBPP::amRead, til, tlr); IBPP::Statement st = IBPP::StatementFactory(db, tr); -string name; - try { tr->Start(); st->Execute("select name from tb_tariffs"); while (st->Fetch()) { + std::string name; st->Get(1, name); tariffsList->push_back(name); } @@ -62,9 +74,9 @@ catch (IBPP::Exception & ex) return 0; } //----------------------------------------------------------------------------- -int FIREBIRD_STORE::AddTariff(const string & name) const +int FIREBIRD_STORE::AddTariff(const std::string & name) const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); IBPP::Transaction tr = IBPP::TransactionFactory(db, IBPP::amWrite, til, tlr); IBPP::Statement st = IBPP::StatementFactory(db, tr); @@ -90,9 +102,9 @@ catch (IBPP::Exception & ex) return 0; } //----------------------------------------------------------------------------- -int FIREBIRD_STORE::DelTariff(const string & name) const +int FIREBIRD_STORE::DelTariff(const std::string & name) const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); IBPP::Transaction tr = IBPP::TransactionFactory(db, IBPP::amWrite, til, tlr); IBPP::Statement st = IBPP::StatementFactory(db, tr); @@ -117,18 +129,14 @@ catch (IBPP::Exception & ex) return 0; } //----------------------------------------------------------------------------- -int FIREBIRD_STORE::SaveTariff(const TARIFF_DATA & td, - const string & tariffName) const +int FIREBIRD_STORE::SaveTariff(const STG::TariffData & td, + const std::string & tariffName) const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); IBPP::Transaction tr = IBPP::TransactionFactory(db, IBPP::amWrite, til, tlr); IBPP::Statement st = IBPP::StatementFactory(db, tr); -int32_t id, i; -double pda, pdb, pna, pnb; -int threshold; - try { tr->Start(); @@ -142,33 +150,63 @@ try printfd(__FILE__, "Tariff '%s' not found in database\n", tariffName.c_str()); return -1; } + int32_t id; st->Get(1, id); st->Close(); - st->Prepare("update tb_tariffs set \ - fee = ?, \ - free = ?, \ - passive_cost = ?, \ - traff_type = ? \ - where pk_tariff = ?"); + + std::string query = "update tb_tariffs set \ + fee = ?, \ + free = ?, \ + passive_cost = ?, \ + traff_type = ?"; + + if (schemaVersion > 0) + query += ", period = ?"; + if (schemaVersion > 1) + query += ", change_policy = ?, \ + change_policy_timeout = ?"; + + query += " where pk_tariff = ?"; + + unsigned num = 5; + st->Prepare(query); st->Set(1, td.tariffConf.fee); st->Set(2, td.tariffConf.free); st->Set(3, td.tariffConf.passiveCost); st->Set(4, td.tariffConf.traffType); - st->Set(5, id); + + if (schemaVersion > 0) + { + st->Set(5, STG::Tariff::toString(td.tariffConf.period)); + ++num; + } + + if (schemaVersion > 1) + { + st->Set(6, STG::Tariff::toString(td.tariffConf.changePolicy)); + IBPP::Timestamp policyTimeout; + time_t2ts(td.tariffConf.changePolicyTimeout, &policyTimeout); + st->Set(7, policyTimeout); + num += 2; + } + + st->Set(num, id); st->Execute(); st->Close(); IBPP::Time tb; IBPP::Time te; - for(i = 0; i < DIR_NUM; i++) + for(int i = 0; i < DIR_NUM; i++) { - tb.SetTime(td.dirPrice[i].hDay, td.dirPrice[i].mDay, 0); - te.SetTime(td.dirPrice[i].hNight, td.dirPrice[i].mNight, 0); + tb.SetTime(td.dirPrice[i].hDay, td.dirPrice[i].mDay, 0); + te.SetTime(td.dirPrice[i].hNight, td.dirPrice[i].mNight, 0); - pda = td.dirPrice[i].priceDayA * 1024 * 1024; - pdb = td.dirPrice[i].priceDayB * 1024 * 1024; + double pda = td.dirPrice[i].priceDayA * 1024 * 1024; + double pdb = td.dirPrice[i].priceDayB * 1024 * 1024; + double pna = 0; + double pnb = 0; if (td.dirPrice[i].singlePrice) { @@ -181,6 +219,7 @@ try pnb = td.dirPrice[i].priceNightB; } + int threshold = 0; if (td.dirPrice[i].noDiscount) { threshold = 0xffFFffFF; @@ -190,26 +229,26 @@ try threshold = td.dirPrice[i].threshold; } - st->Prepare("update tb_tariffs_params set \ - price_day_a = ?, \ - price_day_b = ?, \ - price_night_a = ?, \ - price_night_b = ?, \ - threshold = ?, \ - time_day_begins = ?, \ - time_day_ends = ? \ - where fk_tariff = ? and dir_num = ?"); - st->Set(1, pda); - st->Set(2, pdb); - st->Set(3, pna); - st->Set(4, pnb); - st->Set(5, threshold); - st->Set(6, tb); - st->Set(7, te); - st->Set(8, id); - st->Set(9, i); - st->Execute(); - st->Close(); + st->Prepare("update tb_tariffs_params set \ + price_day_a = ?, \ + price_day_b = ?, \ + price_night_a = ?, \ + price_night_b = ?, \ + threshold = ?, \ + time_day_begins = ?, \ + time_day_ends = ? \ + where fk_tariff = ? and dir_num = ?"); + st->Set(1, pda); + st->Set(2, pdb); + st->Set(3, pna); + st->Set(4, pnb); + st->Set(5, threshold); + st->Set(6, tb); + st->Set(7, te); + st->Set(8, id); + st->Set(9, i); + st->Execute(); + st->Close(); } tr->Commit(); } @@ -225,26 +264,21 @@ catch (IBPP::Exception & ex) return 0; } //----------------------------------------------------------------------------- -int FIREBIRD_STORE::RestoreTariff(TARIFF_DATA * td, - const string & tariffName) const +int FIREBIRD_STORE::RestoreTariff(STG::TariffData * td, + const std::string & tariffName) const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); IBPP::Transaction tr = IBPP::TransactionFactory(db, IBPP::amRead, til, tlr); IBPP::Statement st = IBPP::StatementFactory(db, tr); -int32_t id; -int16_t dir; -int i; -IBPP::Time tb, te; -int h, m, s; td->tariffConf.name = tariffName; try { tr->Start(); - st->Prepare("select * from tb_tariffs where name = ?"); + st->Prepare("select * from tb_tariffs where name = ?"); // TODO: explicit field order! st->Set(1, tariffName); st->Execute(); if (!st->Fetch()) @@ -254,16 +288,24 @@ try tr->Rollback(); return -1; } + int32_t id; st->Get(1, id); st->Get(3, td->tariffConf.fee); st->Get(4, td->tariffConf.free); st->Get(5, td->tariffConf.passiveCost); - st->Get(6, td->tariffConf.traffType); + td->tariffConf.traffType = STG::Tariff::fromInt(Get(st, 6)); + if (schemaVersion > 0) + td->tariffConf.period = STG::Tariff::parsePeriod(Get(st, 7)); + if (schemaVersion > 1) + { + td->tariffConf.changePolicy = STG::Tariff::parseChangePolicy(Get(st, 8)); + td->tariffConf.changePolicyTimeout = ts2time_t(Get(st, 9)); + } st->Close(); st->Prepare("select * from tb_tariffs_params where fk_tariff = ?"); st->Set(1, id); st->Execute(); - i = 0; + int i = 0; while (st->Fetch()) { i++; @@ -274,6 +316,7 @@ try tr->Rollback(); return -1; } + int16_t dir; st->Get(3, dir); st->Get(4, td->dirPrice[dir].priceDayA); td->dirPrice[dir].priceDayA /= 1024*1024; @@ -284,8 +327,8 @@ try st->Get(7, td->dirPrice[dir].priceNightB); td->dirPrice[dir].priceNightB /= 1024*1024; st->Get(8, td->dirPrice[dir].threshold); - if (td->dirPrice[dir].priceDayA == td->dirPrice[dir].priceNightA && - td->dirPrice[dir].priceDayB == td->dirPrice[dir].priceNightB) + if (std::fabs(td->dirPrice[dir].priceDayA - td->dirPrice[dir].priceNightA) < 1.0e-3 / pt_mega && + std::fabs(td->dirPrice[dir].priceDayB - td->dirPrice[dir].priceNightB) < 1.0e-3 / pt_mega) { td->dirPrice[dir].singlePrice = true; } @@ -302,8 +345,11 @@ try td->dirPrice[dir].noDiscount = false; } + IBPP::Time tb; st->Get(9, tb); + IBPP::Time te; st->Get(10, te); + int h, m, s; tb.GetTime(h, m, s); td->dirPrice[dir].hDay = h; td->dirPrice[dir].mDay = m;