X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/641204dfbdb9fc870cdd2e7f9e3169a44693e7bf..4e101b93cafd0881518fc2be53c051d47d374d93:/projects/stargazer/plugins/store/postgresql/postgresql_store_users.cpp diff --git a/projects/stargazer/plugins/store/postgresql/postgresql_store_users.cpp b/projects/stargazer/plugins/store/postgresql/postgresql_store_users.cpp index 6a40979f..4cd64418 100644 --- a/projects/stargazer/plugins/store/postgresql/postgresql_store_users.cpp +++ b/projects/stargazer/plugins/store/postgresql/postgresql_store_users.cpp @@ -33,13 +33,13 @@ #include -#include "stg_const.h" -#include "postgresql_store.h" -#include "stg_locker.h" +#include "stg/const.h" +#include "stg/locker.h" #include "../../../stg_timer.h" +#include "postgresql_store.h" //----------------------------------------------------------------------------- -int POSTGRESQL_STORE::GetUsersList(vector * usersList) const +int POSTGRESQL_STORE::GetUsersList(std::vector * usersList) const { STG_LOCKER lock(&mutex, __FILE__, __LINE__); @@ -95,7 +95,7 @@ return 0; } //----------------------------------------------------------------------------- -int POSTGRESQL_STORE::AddUser(const string & name) const +int POSTGRESQL_STORE::AddUser(const std::string & name) const { STG_LOCKER lock(&mutex, __FILE__, __LINE__); @@ -130,7 +130,7 @@ if (EscapeString(elogin)) return -1; } -std::stringstream query; +std::ostringstream query; query << "SELECT sp_add_user('" << elogin << "')"; result = PQexec(connection, query.str().c_str()); @@ -159,7 +159,7 @@ return 0; } //----------------------------------------------------------------------------- -int POSTGRESQL_STORE::DelUser(const string & login) const +int POSTGRESQL_STORE::DelUser(const std::string & login) const { STG_LOCKER lock(&mutex, __FILE__, __LINE__); @@ -194,7 +194,7 @@ if (EscapeString(elogin)) return -1; } -std::stringstream query; +std::ostringstream query; query << "DELETE FROM tb_users WHERE name = '" << elogin << "'"; result = PQexec(connection, query.str().c_str()); @@ -223,7 +223,7 @@ return 0; } //----------------------------------------------------------------------------- int POSTGRESQL_STORE::SaveUserStat(const USER_STAT & stat, - const string & login) const + const std::string & login) const { STG_LOCKER lock(&mutex, __FILE__, __LINE__); @@ -231,7 +231,7 @@ return SaveStat(stat, login); } //----------------------------------------------------------------------------- int POSTGRESQL_STORE::SaveStat(const USER_STAT & stat, - const string & login, + const std::string & login, int year, int month) const { @@ -266,7 +266,7 @@ if (EscapeString(elogin)) return -1; } -std::stringstream query; +std::ostringstream query; query << "UPDATE tb_users SET " "cash = " << stat.cash << ", " "free_mb = " << stat.freeMb << ", " @@ -334,7 +334,7 @@ return 0; //----------------------------------------------------------------------------- int POSTGRESQL_STORE::SaveUserConf(const USER_CONF & conf, - const string & login) const + const std::string & login) const { STG_LOCKER lock(&mutex, __FILE__, __LINE__); @@ -369,7 +369,7 @@ if (EscapeString(elogin)) return -1; } -std::stringstream query; +std::ostringstream query; query << "SELECT pk_user FROM tb_users WHERE name = '" << elogin << "'"; result = PQexec(connection, query.str().c_str()); @@ -400,14 +400,16 @@ if (tuples != 1) return -1; } -std::stringstream tuple; -tuple << PQgetvalue(result, 0, 0); +uint32_t uid; -PQclear(result); + { + std::stringstream tuple; + tuple << PQgetvalue(result, 0, 0); -uint32_t uid; + PQclear(result); -tuple >> uid; + tuple >> uid; + } std::string eaddress = conf.address; std::string eemail = conf.email; @@ -603,7 +605,7 @@ return 0; //----------------------------------------------------------------------------- int POSTGRESQL_STORE::RestoreUserStat(USER_STAT * stat, - const string & login) const + const std::string & login) const { STG_LOCKER lock(&mutex, __FILE__, __LINE__); @@ -638,14 +640,16 @@ if (EscapeString(elogin)) return -1; } -std::stringstream query; -query << "SELECT cash, free_mb, " - "last_activity_time, last_cash_add, " - "last_cash_add_time, passive_time " - "FROM tb_users " - "WHERE name = '" << elogin << "'"; + { + std::ostringstream query; + query << "SELECT cash, free_mb, " + "last_activity_time, last_cash_add, " + "last_cash_add_time, passive_time " + "FROM tb_users " + "WHERE name = '" << elogin << "'"; -result = PQexec(connection, query.str().c_str()); + result = PQexec(connection, query.str().c_str()); + } if (PQresultStatus(result) != PGRES_TUPLES_OK) { @@ -673,29 +677,32 @@ if (tuples != 1) return -1; } -std::stringstream tuple; -tuple << PQgetvalue(result, 0, 0) << " "; -tuple << PQgetvalue(result, 0, 1) << " "; -stat->lastActivityTime = TS2Int(PQgetvalue(result, 0, 2)); -tuple << PQgetvalue(result, 0, 3) << " "; -stat->lastCashAddTime = TS2Int(PQgetvalue(result, 0, 4)); -tuple << PQgetvalue(result, 0, 5) << " "; - -PQclear(result); + { + std::stringstream tuple; + tuple << PQgetvalue(result, 0, 0) << " "; + tuple << PQgetvalue(result, 0, 1) << " "; + stat->lastActivityTime = TS2Int(PQgetvalue(result, 0, 2)); + tuple << PQgetvalue(result, 0, 3) << " "; + stat->lastCashAddTime = TS2Int(PQgetvalue(result, 0, 4)); + tuple << PQgetvalue(result, 0, 5) << " "; -tuple >> stat->cash - >> stat->freeMb - >> stat->lastCashAdd - >> stat->passiveTime; + PQclear(result); -query.str(""); + tuple >> stat->cash + >> stat->freeMb + >> stat->lastCashAdd + >> stat->passiveTime; + } -query << "SELECT dir_num, upload, download " - "FROM tb_stats_traffic " - "WHERE fk_user IN (SELECT pk_user FROM tb_users WHERE name = '" << elogin << "') AND " - "DATE_TRUNC('month', stats_date) = DATE_TRUNC('month', CAST('" << Int2TS(stgTime) << "' AS TIMESTAMP))"; + { + std::ostringstream query; + query << "SELECT dir_num, upload, download " + "FROM tb_stats_traffic " + "WHERE fk_user IN (SELECT pk_user FROM tb_users WHERE name = '" << elogin << "') AND " + "DATE_TRUNC('month', stats_date) = DATE_TRUNC('month', CAST('" << Int2TS(stgTime) << "' AS TIMESTAMP))"; -result = PQexec(connection, query.str().c_str()); + result = PQexec(connection, query.str().c_str()); + } if (PQresultStatus(result) != PGRES_TUPLES_OK) { @@ -738,7 +745,7 @@ return 0; //----------------------------------------------------------------------------- int POSTGRESQL_STORE::RestoreUserConf(USER_CONF * conf, - const string & login) const + const std::string & login) const { STG_LOCKER lock(&mutex, __FILE__, __LINE__); @@ -773,21 +780,23 @@ if (EscapeString(elogin)) return -1; } -std::stringstream query; -query << "SELECT tb_users.pk_user, tb_users.address, tb_users.always_online, " - "tb_users.credit, tb_users.credit_expire, tb_users.disabled, " - "tb_users.disabled_detail_stat, tb_users.email, tb_users.grp, " - "tb_users.note, tb_users.passive, tb_users.passwd, tb_users.phone, " - "tb_users.real_name, tf1.name, tf2.name, tb_corporations.name " - "FROM tb_users LEFT JOIN tb_tariffs AS tf1 " - "ON tf1.pk_tariff = tb_users.fk_tariff " - "LEFT JOIN tb_tariffs AS tf2 " - "ON tf2.pk_tariff = tb_users.fk_tariff_change " - "LEFT JOIN tb_corporations " - "ON tb_corporations.pk_corporation = tb_users.fk_corporation " - "WHERE tb_users.name = '" << elogin << "'"; + { + std::ostringstream query; + query << "SELECT tb_users.pk_user, tb_users.address, tb_users.always_online, " + "tb_users.credit, tb_users.credit_expire, tb_users.disabled, " + "tb_users.disabled_detail_stat, tb_users.email, tb_users.grp, " + "tb_users.note, tb_users.passive, tb_users.passwd, tb_users.phone, " + "tb_users.real_name, tf1.name, tf2.name, tb_corporations.name " + "FROM tb_users LEFT JOIN tb_tariffs AS tf1 " + "ON tf1.pk_tariff = tb_users.fk_tariff " + "LEFT JOIN tb_tariffs AS tf2 " + "ON tf2.pk_tariff = tb_users.fk_tariff_change " + "LEFT JOIN tb_corporations " + "ON tb_corporations.pk_corporation = tb_users.fk_corporation " + "WHERE tb_users.name = '" << elogin << "'"; -result = PQexec(connection, query.str().c_str()); + result = PQexec(connection, query.str().c_str()); + } if (PQresultStatus(result) != PGRES_TUPLES_OK) { @@ -817,43 +826,46 @@ if (tuples != 1) uint32_t uid; -std::stringstream tuple; - -tuple << PQgetvalue(result, 0, 0) << " "; // uid -conf->address = PQgetvalue(result, 0, 1); // address -conf->alwaysOnline = !strncmp(PQgetvalue(result, 0, 2), "t", 1); -tuple << PQgetvalue(result, 0, 3) << " "; // credit -conf->creditExpire = TS2Int(PQgetvalue(result, 0, 4)); // creditExpire -conf->disabled = !strncmp(PQgetvalue(result, 0, 5), "t", 1); -conf->disabledDetailStat = !strncmp(PQgetvalue(result, 0, 6), "t", 1); -conf->email = PQgetvalue(result, 0, 7); // email -conf->group = PQgetvalue(result, 0, 8); // group -conf->note = PQgetvalue(result, 0, 9); // note -conf->passive = !strncmp(PQgetvalue(result, 0, 10), "t", 1); -conf->password = PQgetvalue(result, 0, 11); // password -conf->phone = PQgetvalue(result, 0, 12); // phone -conf->realName = PQgetvalue(result, 0, 13); // realName -conf->tariffName = PQgetvalue(result, 0, 14); // tariffName -conf->nextTariff = PQgetvalue(result, 0, 15); // nextTariff -conf->corp = PQgetvalue(result, 0, 16); // corp + { + std::stringstream tuple; + tuple << PQgetvalue(result, 0, 0) << " "; // uid + conf->address = PQgetvalue(result, 0, 1); // address + conf->alwaysOnline = !strncmp(PQgetvalue(result, 0, 2), "t", 1); + tuple << PQgetvalue(result, 0, 3) << " "; // credit + conf->creditExpire = TS2Int(PQgetvalue(result, 0, 4)); // creditExpire + conf->disabled = !strncmp(PQgetvalue(result, 0, 5), "t", 1); + conf->disabledDetailStat = !strncmp(PQgetvalue(result, 0, 6), "t", 1); + conf->email = PQgetvalue(result, 0, 7); // email + conf->group = PQgetvalue(result, 0, 8); // group + conf->note = PQgetvalue(result, 0, 9); // note + conf->passive = !strncmp(PQgetvalue(result, 0, 10), "t", 1); + conf->password = PQgetvalue(result, 0, 11); // password + conf->phone = PQgetvalue(result, 0, 12); // phone + conf->realName = PQgetvalue(result, 0, 13); // realName + conf->tariffName = PQgetvalue(result, 0, 14); // tariffName + conf->nextTariff = PQgetvalue(result, 0, 15); // nextTariff + conf->corp = PQgetvalue(result, 0, 16); // corp -PQclear(result); + PQclear(result); -if (conf->tariffName == "") - conf->tariffName = NO_TARIFF_NAME; -if (conf->corp == "") - conf->corp = NO_CORP_NAME; + if (conf->tariffName == "") + conf->tariffName = NO_TARIFF_NAME; + if (conf->corp == "") + conf->corp = NO_CORP_NAME; -tuple >> uid - >> conf->credit; + tuple >> uid + >> conf->credit; + } -query.str(""); -query << "SELECT name FROM tb_services " - "WHERE pk_service IN (SELECT fk_service " - "FROM tb_users_services " - "WHERE fk_user = " << uid << ")"; + { + std::ostringstream query; + query << "SELECT name FROM tb_services " + "WHERE pk_service IN (SELECT fk_service " + "FROM tb_users_services " + "WHERE fk_user = " << uid << ")"; -result = PQexec(connection, query.str().c_str()); + result = PQexec(connection, query.str().c_str()); + } if (PQresultStatus(result) != PGRES_TUPLES_OK) { @@ -876,12 +888,14 @@ for (int i = 0; i < tuples; ++i) PQclear(result); -query.str(""); -query << "SELECT num, data " - "FROM tb_users_data " - "WHERE fk_user = " << uid; + { + std::ostringstream query; + query << "SELECT num, data " + "FROM tb_users_data " + "WHERE fk_user = " << uid; -result = PQexec(connection, query.str().c_str()); + result = PQexec(connection, query.str().c_str()); + } if (PQresultStatus(result) != PGRES_TUPLES_OK) { @@ -906,18 +920,24 @@ for (int i = 0; i < tuples; ++i) } else { - conf->userdata[i] = PQgetvalue(result, i, 1); + if (num < USERDATA_NUM && + num >= 0) + { + conf->userdata[num] = PQgetvalue(result, i, 1); + } } } PQclear(result); -query.str(""); -query << "SELECT host(ip), masklen(ip) " - "FROM tb_allowed_ip " - "WHERE fk_user = " << uid; + { + std::ostringstream query; + query << "SELECT host(ip), masklen(ip) " + "FROM tb_allowed_ip " + "WHERE fk_user = " << uid; -result = PQexec(connection, query.str().c_str()); + result = PQexec(connection, query.str().c_str()); + } if (PQresultStatus(result) != PGRES_TUPLES_OK) { @@ -966,13 +986,13 @@ return 0; } //----------------------------------------------------------------------------- -int POSTGRESQL_STORE::WriteUserChgLog(const string & login, - const string & admLogin, +int POSTGRESQL_STORE::WriteUserChgLog(const std::string & login, + const std::string & admLogin, uint32_t admIP, - const string & paramName, - const string & oldValue, - const string & newValue, - const string & message = "") const + const std::string & paramName, + const std::string & oldValue, + const std::string & newValue, + const std::string & message = "") const { STG_LOCKER lock(&mutex, __FILE__, __LINE__); @@ -1052,11 +1072,11 @@ if (EscapeString(enew)) return -1; } -std::stringstream query; +std::ostringstream query; query << "SELECT sp_add_param_log_entry(" "'" << elogin << "', " "'" << eadminLogin << "', CAST('" - << inet_ntostring(admIP) << "/24' AS INET), " + << inet_ntostring(admIP) << "/32' AS INET), " "'" << eparam << "', " "CAST('" << Int2TS(stgTime) << "' AS TIMESTAMP), " "'" << eold << "', " @@ -1089,7 +1109,7 @@ return 0; } //----------------------------------------------------------------------------- -int POSTGRESQL_STORE::WriteUserConnect(const string & login, uint32_t ip) const +int POSTGRESQL_STORE::WriteUserConnect(const std::string & login, uint32_t ip) const { STG_LOCKER lock(&mutex, __FILE__, __LINE__); @@ -1124,7 +1144,7 @@ if (EscapeString(elogin)) return -1; } -std::stringstream query; +std::ostringstream query; if (version < 6) { query << "SELECT sp_add_session_log_entry(" @@ -1168,7 +1188,7 @@ return 0; } //----------------------------------------------------------------------------- -int POSTGRESQL_STORE::WriteUserDisconnect(const string & login, +int POSTGRESQL_STORE::WriteUserDisconnect(const std::string & login, const DIR_TRAFF & up, const DIR_TRAFF & down, const DIR_TRAFF & sessionUp, @@ -1222,26 +1242,28 @@ if (EscapeString(ereason)) return -1; } -std::stringstream query; -if (version < 6) - { - // Old database version - no freeMb logging support - query << "SELECT sp_add_session_log_entry(" - "'" << elogin << "', " - "CAST('" << Int2TS(stgTime) << "' AS TIMESTAMP), " - "'d', CAST('0.0.0.0/0' AS INET), " - << cash << ")"; - } -else { - query << "SELECT sp_add_session_log_entry(" - "'" << elogin << "', " - "CAST('" << Int2TS(stgTime) << "' AS TIMESTAMP), " - "'d', CAST('0.0.0.0/0' AS INET), " - << cash << ", " << freeMb << ", '" << ereason << "')"; - } + std::ostringstream query; + if (version < 6) + { + // Old database version - no freeMb logging support + query << "SELECT sp_add_session_log_entry(" + "'" << elogin << "', " + "CAST('" << Int2TS(stgTime) << "' AS TIMESTAMP), " + "'d', CAST('0.0.0.0/0' AS INET), " + << cash << ")"; + } + else + { + query << "SELECT sp_add_session_log_entry(" + "'" << elogin << "', " + "CAST('" << Int2TS(stgTime) << "' AS TIMESTAMP), " + "'d', CAST('0.0.0.0/0' AS INET), " + << cash << ", " << freeMb << ", '" << ereason << "')"; + } -result = PQexec(connection, query.str().c_str()); + result = PQexec(connection, query.str().c_str()); + } if (PQresultStatus(result) != PGRES_TUPLES_OK) { @@ -1287,7 +1309,7 @@ PQclear(result); for (int i = 0; i < DIR_NUM; ++i) { - std::stringstream query; + std::ostringstream query; query << "INSERT INTO tb_sessions_data " "(fk_session_log, " "dir_num, " @@ -1330,9 +1352,9 @@ return 0; } //----------------------------------------------------------------------------- -int POSTGRESQL_STORE::WriteDetailedStat(const map * statTree, +int POSTGRESQL_STORE::WriteDetailedStat(const std::map & statTree, time_t lastStat, - const string & login) const + const std::string & login) const { STG_LOCKER lock(&mutex, __FILE__, __LINE__); @@ -1367,12 +1389,12 @@ if (EscapeString(elogin)) return -1; } -map::const_iterator it; +std::map::const_iterator it; time_t currTime = time(NULL); -for (it = statTree->begin(); it != statTree->end(); ++it) +for (it = statTree.begin(); it != statTree.end(); ++it) { - std::stringstream query; + std::ostringstream query; query << "INSERT INTO tb_detail_stats " "(till_time, from_time, fk_user, " "dir_num, ip, download, upload, cost) " @@ -1413,7 +1435,7 @@ return 0; } //----------------------------------------------------------------------------- -int POSTGRESQL_STORE::SaveMonthStat(const USER_STAT & stat, int month, int year, const string & login) const +int POSTGRESQL_STORE::SaveMonthStat(const USER_STAT & stat, int month, int year, const std::string & login) const { STG_LOCKER lock(&mutex, __FILE__, __LINE__); @@ -1426,21 +1448,23 @@ int POSTGRESQL_STORE::SaveUserServices(uint32_t uid, { PGresult * result; -std::stringstream query; -query << "DELETE FROM tb_users_services WHERE fk_user = " << uid; + { + std::ostringstream query; + query << "DELETE FROM tb_users_services WHERE fk_user = " << uid; -result = PQexec(connection, query.str().c_str()); + result = PQexec(connection, query.str().c_str()); + + if (PQresultStatus(result) != PGRES_COMMAND_OK) + { + strError = PQresultErrorMessage(result); + PQclear(result); + printfd(__FILE__, "POSTGRESQL_STORE::SaveUserServices(): '%s'\n", strError.c_str()); + return -1; + } -if (PQresultStatus(result) != PGRES_COMMAND_OK) - { - strError = PQresultErrorMessage(result); PQclear(result); - printfd(__FILE__, "POSTGRESQL_STORE::SaveUserServices(): '%s'\n", strError.c_str()); - return -1; } -PQclear(result); - std::vector::const_iterator it; for (it = services.begin(); it != services.end(); ++it) @@ -1453,7 +1477,7 @@ for (it = services.begin(); it != services.end(); ++it) return -1; } - std::stringstream query; + std::ostringstream query; query << "INSERT INTO tb_users_services " "(fk_user, fk_service) " "VALUES " @@ -1484,10 +1508,12 @@ int POSTGRESQL_STORE::SaveUserIPs(uint32_t uid, { PGresult * result; -std::stringstream query; -query << "DELETE FROM tb_allowed_ip WHERE fk_user = " << uid; + { + std::ostringstream query; + query << "DELETE FROM tb_allowed_ip WHERE fk_user = " << uid; -result = PQexec(connection, query.str().c_str()); + result = PQexec(connection, query.str().c_str()); + } if (PQresultStatus(result) != PGRES_COMMAND_OK) { @@ -1501,7 +1527,7 @@ PQclear(result); for (int i = 0; i < ips.Count(); ++i) { - std::stringstream query; + std::ostringstream query; query << "INSERT INTO tb_allowed_ip " "(fk_user, ip) " "VALUES " @@ -1541,7 +1567,7 @@ for (unsigned i = 0; i < data.size(); ++i) PGresult * result; - std::stringstream query; + std::ostringstream query; query << "SELECT sp_set_user_data(" << uid << ", " << "CAST(" << i << " AS SMALLINT), "