X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/90e389f6ec12e60a62c362296ffcf314feb5b03d..5e7cbf1bbd282c0b18a09c5e77e237a4e20f6e32:/projects/stargazer/plugins/store/postgresql/postgresql_store_tariffs.cpp diff --git a/projects/stargazer/plugins/store/postgresql/postgresql_store_tariffs.cpp b/projects/stargazer/plugins/store/postgresql/postgresql_store_tariffs.cpp index bb647563..fd0b38bc 100644 --- a/projects/stargazer/plugins/store/postgresql/postgresql_store_tariffs.cpp +++ b/projects/stargazer/plugins/store/postgresql/postgresql_store_tariffs.cpp @@ -29,16 +29,25 @@ #include #include #include +#include #include +#include "stg/common.h" #include "postgresql_store.h" #include "stg/locker.h" +namespace +{ + +const int pt_mega = 1024 * 1024; + +} + //----------------------------------------------------------------------------- -int POSTGRESQL_STORE::GetTariffsList(vector * tariffsList) const +int POSTGRESQL_STORE::GetTariffsList(std::vector * tariffsList) const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); if (PQstatus(connection) != CONNECTION_OK) { @@ -92,9 +101,9 @@ return 0; } //----------------------------------------------------------------------------- -int POSTGRESQL_STORE::AddTariff(const string & name) const +int POSTGRESQL_STORE::AddTariff(const std::string & name) const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); if (PQstatus(connection) != CONNECTION_OK) { @@ -121,13 +130,13 @@ if (EscapeString(ename)) { printfd(__FILE__, "POSTGRESQL_STORE::AddTariff(): 'Failed to escape name'\n"); if (RollbackTransaction()) - { - printfd(__FILE__, "POSTGRESQL_STORE::AddTariff(): 'Failed to rollback transaction'\n"); - } + { + printfd(__FILE__, "POSTGRESQL_STORE::AddTariff(): 'Failed to rollback transaction'\n"); + } return -1; } -std::stringstream query; +std::ostringstream query; query << "SELECT sp_add_tariff('" << ename << "', " << DIR_NUM << ")"; result = PQexec(connection, query.str().c_str()); @@ -155,9 +164,9 @@ if (CommitTransaction()) return 0; } //----------------------------------------------------------------------------- -int POSTGRESQL_STORE::DelTariff(const string & name) const +int POSTGRESQL_STORE::DelTariff(const std::string & name) const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); if (PQstatus(connection) != CONNECTION_OK) { @@ -184,13 +193,13 @@ if (EscapeString(ename)) { printfd(__FILE__, "POSTGRESQL_STORE::AddTariff(): 'Failed to escape name'\n"); if (RollbackTransaction()) - { - printfd(__FILE__, "POSTGRESQL_STORE::AddTariff(): 'Failed to rollback transaction'\n"); - } + { + printfd(__FILE__, "POSTGRESQL_STORE::AddTariff(): 'Failed to rollback transaction'\n"); + } return -1; } -std::stringstream query; +std::ostringstream query; query << "DELETE FROM tb_tariffs WHERE name = '" << ename << "'"; result = PQexec(connection, query.str().c_str()); @@ -219,9 +228,9 @@ return 0; } //----------------------------------------------------------------------------- int POSTGRESQL_STORE::SaveTariff(const TARIFF_DATA & td, - const string & tariffName) const + const std::string & tariffName) const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); if (PQstatus(connection) != CONNECTION_OK) { @@ -248,20 +257,18 @@ if (EscapeString(ename)) { printfd(__FILE__, "POSTGRESQL_STORE::SaveTariff(): 'Failed to escape name'\n"); if (RollbackTransaction()) - { - printfd(__FILE__, "POSTGRESQL_STORE::SaveTariff(): 'Failed to rollback transaction'\n"); - } + { + printfd(__FILE__, "POSTGRESQL_STORE::SaveTariff(): 'Failed to rollback transaction'\n"); + } return -1; } -int32_t id, i; -double pda, pdb, pna, pnb; -int threshold; - -std::stringstream query; -query << "SELECT pk_tariff FROM tb_tariffs WHERE name = '" << ename << "'"; + { + std::ostringstream query; + query << "SELECT pk_tariff FROM tb_tariffs WHERE name = '" << ename << "'"; -result = PQexec(connection, query.str().c_str()); + result = PQexec(connection, query.str().c_str()); + } if (PQresultStatus(result) != PGRES_TUPLES_OK) { @@ -283,28 +290,42 @@ if (tuples != 1) printfd(__FILE__, "POSTGRESQL_STORE::SaveTariff(): 'Invalid number of tuples. Wanted 1, actulally %d'\n", tuples); PQclear(result); if (RollbackTransaction()) - { - printfd(__FILE__, "POSTGRESQL_STORE::SaveTariff(): 'Failed to rollback transaction'\n"); - } + { + printfd(__FILE__, "POSTGRESQL_STORE::SaveTariff(): 'Failed to rollback transaction'\n"); + } return -1; } -std::stringstream tuple; -tuple << PQgetvalue(result, 0, 0); +int32_t id; -PQclear(result); + { + std::stringstream tuple; + tuple << PQgetvalue(result, 0, 0); -tuple >> id; + PQclear(result); -query.str(""); -query << "UPDATE tb_tariffs SET \ - fee = " << td.tariffConf.fee << ", \ - free = " << td.tariffConf.free << ", \ - passive_cost = " << td.tariffConf.passiveCost << ", \ - traff_type = " << td.tariffConf.traffType << " \ - WHERE pk_tariff = " << id; + tuple >> id; + } -result = PQexec(connection, query.str().c_str()); + { + std::ostringstream query; + query << "UPDATE tb_tariffs SET \ + fee = " << td.tariffConf.fee << ", \ + free = " << td.tariffConf.free << ", \ + passive_cost = " << td.tariffConf.passiveCost << ", \ + traff_type = " << td.tariffConf.traffType; + + if (version > 6) + query << ", period = '" << TARIFF::PeriodToString(td.tariffConf.period) << "'"; + + if (version > 7) + query << ", change_policy = '" << TARIFF::ChangePolicyToString(td.tariffConf.changePolicy) << "', \ + change_policy_timeout = CAST('" << formatTime(td.tariffConf.changePolicyTimeout) << "' AS TIMESTAMP)"; + + query << " WHERE pk_tariff = " << id; + + result = PQexec(connection, query.str().c_str()); + } if (PQresultStatus(result) != PGRES_COMMAND_OK) { @@ -320,11 +341,12 @@ if (PQresultStatus(result) != PGRES_COMMAND_OK) PQclear(result); -for(i = 0; i < DIR_NUM; i++) +for(int i = 0; i < DIR_NUM; i++) { - - 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) { @@ -337,6 +359,7 @@ for(i = 0; i < DIR_NUM; i++) pnb = td.dirPrice[i].priceNightB * 1024 * 1024; } + int threshold = 0; if (td.dirPrice[i].noDiscount) { threshold = 0xffFFffFF; @@ -346,22 +369,24 @@ for(i = 0; i < DIR_NUM; i++) threshold = td.dirPrice[i].threshold; } - std::stringstream query; - query << "UPDATE tb_tariffs_params SET \ - price_day_a = " << pda << ", \ - price_day_b = " << pdb << ", \ - price_night_a = " << pna << ", \ - price_night_b = " << pnb << ", \ - threshold = " << threshold << ", \ - time_day_begins = CAST('" << td.dirPrice[i].hDay - << ":" - << td.dirPrice[i].mDay << "' AS TIME), \ - time_day_ends = CAST('" << td.dirPrice[i].hNight - << ":" - << td.dirPrice[i].mNight << "' AS TIME) \ - WHERE fk_tariff = " << id << " AND dir_num = " << i; - - result = PQexec(connection, query.str().c_str()); + { + std::ostringstream query; + query << "UPDATE tb_tariffs_params SET \ + price_day_a = " << pda << ", \ + price_day_b = " << pdb << ", \ + price_night_a = " << pna << ", \ + price_night_b = " << pnb << ", \ + threshold = " << threshold << ", \ + time_day_begins = CAST('" << td.dirPrice[i].hDay + << ":" + << td.dirPrice[i].mDay << "' AS TIME), \ + time_day_ends = CAST('" << td.dirPrice[i].hNight + << ":" + << td.dirPrice[i].mNight << "' AS TIME) \ + WHERE fk_tariff = " << id << " AND dir_num = " << i; + + result = PQexec(connection, query.str().c_str()); + } if (PQresultStatus(result) != PGRES_COMMAND_OK) { @@ -388,9 +413,9 @@ return 0; } //----------------------------------------------------------------------------- int POSTGRESQL_STORE::RestoreTariff(TARIFF_DATA * td, - const string & tariffName) const + const std::string & tariffName) const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); if (PQstatus(connection) != CONNECTION_OK) { @@ -417,21 +442,29 @@ if (EscapeString(ename)) { printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to escape name'\n"); if (RollbackTransaction()) - { - printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to rollback transaction'\n"); - } + { + printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to rollback transaction'\n"); + } return -1; } td->tariffConf.name = tariffName; -std::stringstream query; +std::ostringstream query; query << "SELECT pk_tariff, \ fee, \ - free, \ - passive_cost, \ - traff_type \ - FROM tb_tariffs WHERE name = '" << ename << "'"; + free, \ + passive_cost, \ + traff_type"; + +if (version > 6) + query << ", period"; + +if (version > 7) + query << ", change_policy \ + , change_policy_timeout"; + +query << " FROM tb_tariffs WHERE name = '" << ename << "'"; result = PQexec(connection, query.str().c_str()); @@ -455,25 +488,37 @@ if (tuples != 1) printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Invalid number of tuples. Wanted 1, actulally %d'\n", tuples); PQclear(result); if (RollbackTransaction()) - { - printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to rollback transaction'\n"); - } + { + printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to rollback transaction'\n"); + } return -1; } -std::stringstream tuple; -tuple << PQgetvalue(result, 0, 0) << " "; -tuple << PQgetvalue(result, 0, 1) << " "; -tuple << PQgetvalue(result, 0, 2) << " "; -tuple << PQgetvalue(result, 0, 3) << " "; -tuple << PQgetvalue(result, 0, 4) << " "; - int id; -tuple >> id; -tuple >> td->tariffConf.fee; -tuple >> td->tariffConf.free; -tuple >> td->tariffConf.passiveCost; -tuple >> td->tariffConf.traffType; + + { + std::stringstream tuple; + tuple << PQgetvalue(result, 0, 0) << " "; + tuple << PQgetvalue(result, 0, 1) << " "; + tuple << PQgetvalue(result, 0, 2) << " "; + tuple << PQgetvalue(result, 0, 3) << " "; + tuple << PQgetvalue(result, 0, 4) << " "; + + tuple >> id; + tuple >> td->tariffConf.fee; + tuple >> td->tariffConf.free; + tuple >> td->tariffConf.passiveCost; + tuple >> td->tariffConf.traffType; + } + +if (version > 6) + td->tariffConf.period = TARIFF::StringToPeriod(PQgetvalue(result, 0, 5)); + +if (version > 7) + { + td->tariffConf.changePolicy = TARIFF::StringToChangePolicy(PQgetvalue(result, 0, 6)); + td->tariffConf.changePolicyTimeout = readTime(PQgetvalue(result, 0, 7)); + } PQclear(result); @@ -481,15 +526,15 @@ query.str(""); query << "SELECT dir_num, \ price_day_a, \ price_day_b, \ - price_night_a, \ - price_night_b, \ - threshold, \ - EXTRACT(hour FROM time_day_begins), \ - EXTRACT(minute FROM time_day_begins), \ - EXTRACT(hour FROM time_day_ends), \ - EXTRACT(minute FROM time_day_ends) \ - FROM tb_tariffs_params \ - WHERE fk_tariff = " << id; + price_night_a, \ + price_night_b, \ + threshold, \ + EXTRACT(hour FROM time_day_begins), \ + EXTRACT(minute FROM time_day_begins), \ + EXTRACT(hour FROM time_day_ends), \ + EXTRACT(minute FROM time_day_ends) \ + FROM tb_tariffs_params \ + WHERE fk_tariff = " << id; result = PQexec(connection, query.str().c_str()); @@ -499,9 +544,9 @@ if (PQresultStatus(result) != PGRES_TUPLES_OK) PQclear(result); printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): '%s'\n", strError.c_str()); if (RollbackTransaction()) - { - printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to rollback transaction'\n"); - } + { + printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to rollback transaction'\n"); + } return -1; } @@ -514,37 +559,39 @@ if (tuples != DIR_NUM) for (int i = 0; i < std::min(tuples, DIR_NUM); ++i) { - std::stringstream tuple; - tuple << PQgetvalue(result, i, 0) << " "; - tuple << PQgetvalue(result, i, 1) << " "; - tuple << PQgetvalue(result, i, 2) << " "; - tuple << PQgetvalue(result, i, 3) << " "; - tuple << PQgetvalue(result, i, 4) << " "; - tuple << PQgetvalue(result, i, 5) << " "; - tuple << PQgetvalue(result, i, 6) << " "; - tuple << PQgetvalue(result, i, 7) << " "; - tuple << PQgetvalue(result, i, 8) << " "; - tuple << PQgetvalue(result, i, 9) << " "; - int dir; - tuple >> dir; - tuple >> td->dirPrice[dir].priceDayA; - td->dirPrice[dir].priceDayA /= 1024 * 1024; - tuple >> td->dirPrice[dir].priceDayB; - td->dirPrice[dir].priceDayB /= 1024 * 1024; - tuple >> td->dirPrice[dir].priceNightA; - td->dirPrice[dir].priceNightA /= 1024 * 1024; - tuple >> td->dirPrice[dir].priceNightB; - td->dirPrice[dir].priceNightB /= 1024 * 1024; - tuple >> td->dirPrice[dir].threshold; - tuple >> td->dirPrice[dir].hDay; - tuple >> td->dirPrice[dir].mDay; - tuple >> td->dirPrice[dir].hNight; - tuple >> td->dirPrice[dir].mNight; - - if (td->dirPrice[dir].priceDayA == td->dirPrice[dir].priceNightA && - td->dirPrice[dir].priceDayB == td->dirPrice[dir].priceNightB) + { + std::stringstream tuple; + tuple << PQgetvalue(result, i, 0) << " "; + tuple << PQgetvalue(result, i, 1) << " "; + tuple << PQgetvalue(result, i, 2) << " "; + tuple << PQgetvalue(result, i, 3) << " "; + tuple << PQgetvalue(result, i, 4) << " "; + tuple << PQgetvalue(result, i, 5) << " "; + tuple << PQgetvalue(result, i, 6) << " "; + tuple << PQgetvalue(result, i, 7) << " "; + tuple << PQgetvalue(result, i, 8) << " "; + tuple << PQgetvalue(result, i, 9) << " "; + + tuple >> dir; + tuple >> td->dirPrice[dir].priceDayA; + td->dirPrice[dir].priceDayA /= 1024 * 1024; + tuple >> td->dirPrice[dir].priceDayB; + td->dirPrice[dir].priceDayB /= 1024 * 1024; + tuple >> td->dirPrice[dir].priceNightA; + td->dirPrice[dir].priceNightA /= 1024 * 1024; + tuple >> td->dirPrice[dir].priceNightB; + td->dirPrice[dir].priceNightB /= 1024 * 1024; + tuple >> td->dirPrice[dir].threshold; + tuple >> td->dirPrice[dir].hDay; + tuple >> td->dirPrice[dir].mDay; + tuple >> td->dirPrice[dir].hNight; + tuple >> td->dirPrice[dir].mNight; + } + + 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; }