]> git.stg.codes - stg.git/blobdiff - projects/stargazer/plugins/store/postgresql/postgresql_store_users.cpp
Use std::jthread and C++17.
[stg.git] / projects / stargazer / plugins / store / postgresql / postgresql_store_users.cpp
index 3331a07d411692bfe957d6085b8e968afc903a75..6919ed0002f5fb1fae8bab26b938d1fa9d95ad7c 100644 (file)
  *
  */
 
+#include "postgresql_store.h"
+
+#include "stg/user_conf.h"
+#include "stg/user_stat.h"
+#include "stg/user_ips.h"
+#include "stg/user_traff.h"
+#include "stg/common.h"
+#include "stg/const.h"
+#include "stg/locker.h"
+#include "../../../stg_timer.h"
+
 #include <string>
 #include <vector>
 #include <sstream>
 
 #include <libpq-fe.h>
 
-#include "stg/const.h"
-#include "stg/locker.h"
-#include "../../../stg_timer.h"
-#include "postgresql_store.h"
-
 //-----------------------------------------------------------------------------
 int POSTGRESQL_STORE::GetUsersList(std::vector<std::string> * usersList) const
 {
-STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+STG_LOCKER lock(&mutex);
 
 if (PQstatus(connection) != CONNECTION_OK)
     {
@@ -97,7 +103,7 @@ return 0;
 //-----------------------------------------------------------------------------
 int POSTGRESQL_STORE::AddUser(const std::string & name) const
 {
-STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+STG_LOCKER lock(&mutex);
 
 if (PQstatus(connection) != CONNECTION_OK)
     {
@@ -161,7 +167,7 @@ return 0;
 //-----------------------------------------------------------------------------
 int POSTGRESQL_STORE::DelUser(const std::string & login) const
 {
-STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+STG_LOCKER lock(&mutex);
 
 if (PQstatus(connection) != CONNECTION_OK)
     {
@@ -222,15 +228,15 @@ if (CommitTransaction())
 return 0;
 }
 //-----------------------------------------------------------------------------
-int POSTGRESQL_STORE::SaveUserStat(const USER_STAT & stat,
+int POSTGRESQL_STORE::SaveUserStat(const STG::UserStat & stat,
                                    const std::string & login) const
 {
-STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+STG_LOCKER lock(&mutex);
 
 return SaveStat(stat, login);
 }
 //-----------------------------------------------------------------------------
-int POSTGRESQL_STORE::SaveStat(const USER_STAT & stat,
+int POSTGRESQL_STORE::SaveStat(const STG::UserStat & stat,
                                const std::string & login,
                                int year,
                                int month) const
@@ -270,9 +276,9 @@ std::ostringstream query;
 query << "UPDATE tb_users SET "
             "cash = " << stat.cash << ", "
             "free_mb = " << stat.freeMb << ", "
-            "last_activity_time = CAST('" << Int2TS(stat.lastActivityTime) << "' AS TIMESTAMP), "
+            "last_activity_time = CAST('" << formatTime(stat.lastActivityTime) << "' AS TIMESTAMP), "
             "last_cash_add = " << stat.lastCashAdd << ", "
-            "last_cash_add_time = CAST('" << Int2TS(stat.lastCashAddTime) << "' AS TIMESTAMP), "
+            "last_cash_add_time = CAST('" << formatTime(stat.lastCashAddTime) << "' AS TIMESTAMP), "
             "passive_time = " << stat.passiveTime << " "
          "WHERE name = '" << elogin << "'";
 
@@ -333,10 +339,10 @@ return 0;
 }
 
 //-----------------------------------------------------------------------------
-int POSTGRESQL_STORE::SaveUserConf(const USER_CONF & conf,
+int POSTGRESQL_STORE::SaveUserConf(const STG::UserConf & conf,
                                  const std::string & login) const
 {
-STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+STG_LOCKER lock(&mutex);
 
 if (PQstatus(connection) != CONNECTION_OK)
     {
@@ -527,7 +533,7 @@ query << "UPDATE tb_users SET "
              "address = '" << eaddress << "', "
              "always_online = " << (conf.alwaysOnline ? "'t'" : "'f'") << ", "
              "credit = " << conf.credit << ", "
-             "credit_expire = CAST('" << Int2TS(conf.creditExpire) << "' AS TIMESTAMP), "
+             "credit_expire = CAST('" << formatTime(conf.creditExpire) << "' AS TIMESTAMP), "
              "disabled = " << (conf.disabled ? "'t'" : "'f'") << ", "
              "disabled_detail_stat = " << (conf.disabledDetailStat ? "'t'" : "'f'") << ", "
              "email = '" << eemail << "', "
@@ -564,7 +570,7 @@ if (PQresultStatus(result) != PGRES_COMMAND_OK)
 
 PQclear(result);
 
-if (SaveUserServices(uid, conf.service))
+if (SaveUserServices(uid, conf.services))
     {
     printfd(__FILE__, "POSTGRESQL_STORE::SaveUserConf(): 'Failed to save user's services'\n");
     if (RollbackTransaction())
@@ -604,10 +610,10 @@ return 0;
 }
 
 //-----------------------------------------------------------------------------
-int POSTGRESQL_STORE::RestoreUserStat(USER_STAT * stat,
+int POSTGRESQL_STORE::RestoreUserStat(STG::UserStat * stat,
                                     const std::string & login) const
 {
-STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+STG_LOCKER lock(&mutex);
 
 if (PQstatus(connection) != CONNECTION_OK)
     {
@@ -681,9 +687,9 @@ if (tuples != 1)
     std::stringstream tuple;
     tuple << PQgetvalue(result, 0, 0) << " ";
     tuple << PQgetvalue(result, 0, 1) << " ";
-    stat->lastActivityTime = TS2Int(PQgetvalue(result, 0, 2));
+    stat->lastActivityTime = readTime(PQgetvalue(result, 0, 2));
     tuple << PQgetvalue(result, 0, 3) << " ";
-    stat->lastCashAddTime = TS2Int(PQgetvalue(result, 0, 4));
+    stat->lastCashAddTime = readTime(PQgetvalue(result, 0, 4));
     tuple << PQgetvalue(result, 0, 5) << " ";
 
     PQclear(result);
@@ -699,7 +705,7 @@ if (tuples != 1)
     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))";
+                   "DATE_TRUNC('month', stats_date) = DATE_TRUNC('month', CAST('" << formatTime(stgTime) << "' AS TIMESTAMP))";
 
     result = PQexec(connection, query.str().c_str());
     }
@@ -744,10 +750,10 @@ return 0;
 }
 
 //-----------------------------------------------------------------------------
-int POSTGRESQL_STORE::RestoreUserConf(USER_CONF * conf,
+int POSTGRESQL_STORE::RestoreUserConf(STG::UserConf * conf,
                                     const std::string & login) const
 {
-STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+STG_LOCKER lock(&mutex);
 
 if (PQstatus(connection) != CONNECTION_OK)
     {
@@ -832,7 +838,7 @@ uint32_t 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->creditExpire = readTime(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
@@ -883,7 +889,7 @@ tuples = PQntuples(result);
 
 for (int i = 0; i < tuples; ++i)
     {
-    conf->service.push_back(PQgetvalue(result, i, 0));
+    conf->services.push_back(PQgetvalue(result, i, 0));
     }
 
 PQclear(result);
@@ -953,26 +959,22 @@ if (PQresultStatus(result) != PGRES_TUPLES_OK)
 
 tuples = PQntuples(result);
 
-conf->ips.Erase();
+STG::UserIPs ips;
 for (int i = 0; i < tuples; ++i)
     {
-    IP_MASK ipm;
-
-    int ip, mask;
+    STG::IPMask im;
 
-    ip = inet_strington(PQgetvalue(result, i, 0));
+    im.ip = inet_strington(PQgetvalue(result, i, 0));
 
-    if (str2x(PQgetvalue(result, i, 1), mask))
+    if (str2x(PQgetvalue(result, i, 1), im.mask))
         {
         printfd(__FILE__, "POSTGRESQL_STORE::RestoreUserConf(): 'Failed to fetch mask'\n");
         continue;
         }
 
-    ipm.ip = ip;
-    ipm.mask = mask;
-
-    conf->ips.Add(ipm);
+    ips.add(im);
     }
+conf->ips = ips;
 
 PQclear(result);
 
@@ -994,7 +996,7 @@ int POSTGRESQL_STORE::WriteUserChgLog(const std::string & login,
                                     const std::string & newValue,
                                     const std::string & message = "") const
 {
-STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+STG_LOCKER lock(&mutex);
 
 if (PQstatus(connection) != CONNECTION_OK)
     {
@@ -1078,7 +1080,7 @@ query << "SELECT sp_add_param_log_entry("
             "'" << eadminLogin << "', CAST('"
             << inet_ntostring(admIP) << "/32' AS INET), "
             "'" << eparam << "', "
-            "CAST('" << Int2TS(stgTime) << "' AS TIMESTAMP), "
+            "CAST('" << formatTime(stgTime) << "' AS TIMESTAMP), "
             "'" << eold << "', "
             "'" << enew << "', "
             "'" << emessage << "')";
@@ -1111,7 +1113,7 @@ return 0;
 //-----------------------------------------------------------------------------
 int POSTGRESQL_STORE::WriteUserConnect(const std::string & login, uint32_t ip) const
 {
-STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+STG_LOCKER lock(&mutex);
 
 if (PQstatus(connection) != CONNECTION_OK)
     {
@@ -1149,7 +1151,7 @@ if (version < 6)
     {
     query << "SELECT sp_add_session_log_entry("
                  "'" << elogin << "', "
-                 "CAST('" << Int2TS(stgTime) << "' AS TIMESTAMP), "
+                 "CAST('" << formatTime(stgTime) << "' AS TIMESTAMP), "
                  "'c', CAST('"
                  << inet_ntostring(ip) << "/32' AS INET), 0)";
     }
@@ -1157,7 +1159,7 @@ else
     {
     query << "SELECT sp_add_session_log_entry("
                  "'" << elogin << "', "
-                 "CAST('" << Int2TS(stgTime) << "' AS TIMESTAMP), "
+                 "CAST('" << formatTime(stgTime) << "' AS TIMESTAMP), "
                  "'c', CAST('"
                  << inet_ntostring(ip) << "/32' AS INET), 0, 0, '')";
     }
@@ -1189,15 +1191,15 @@ return 0;
 
 //-----------------------------------------------------------------------------
 int POSTGRESQL_STORE::WriteUserDisconnect(const std::string & login,
-                    const DIR_TRAFF & monthUp,
-                    const DIR_TRAFF & monthDown,
-                    const DIR_TRAFF & sessionUp,
-                    const DIR_TRAFF & sessionDown,
+                    const STG::DirTraff & monthUp,
+                    const STG::DirTraff & monthDown,
+                    const STG::DirTraff & sessionUp,
+                    const STG::DirTraff & sessionDown,
                     double cash,
                     double freeMb,
                     const std::string & reason) const
 {
-STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+STG_LOCKER lock(&mutex);
 
 if (PQstatus(connection) != CONNECTION_OK)
     {
@@ -1249,7 +1251,7 @@ if (EscapeString(ereason))
         // Old database version - no freeMb logging support
         query << "SELECT sp_add_session_log_entry("
                     "'" << elogin << "', "
-                    "CAST('" << Int2TS(stgTime) << "' AS TIMESTAMP), "
+                    "CAST('" << formatTime(stgTime) << "' AS TIMESTAMP), "
                     "'d', CAST('0.0.0.0/0' AS INET), "
                     << cash << ")";
         }
@@ -1257,7 +1259,7 @@ if (EscapeString(ereason))
         {
         query << "SELECT sp_add_session_log_entry("
                     "'" << elogin << "', "
-                    "CAST('" << Int2TS(stgTime) << "' AS TIMESTAMP), "
+                    "CAST('" << formatTime(stgTime) << "' AS TIMESTAMP), "
                     "'d', CAST('0.0.0.0/0' AS INET), "
                     << cash << ", " << freeMb << ", '" << ereason << "')";
         }
@@ -1352,11 +1354,11 @@ return 0;
 }
 
 //-----------------------------------------------------------------------------
-int POSTGRESQL_STORE::WriteDetailedStat(const std::map<IP_DIR_PAIR, STAT_NODE> & statTree,
+int POSTGRESQL_STORE::WriteDetailedStat(const STG::TraffStat & statTree,
                                       time_t lastStat,
                                       const std::string & login) const
 {
-STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+STG_LOCKER lock(&mutex);
 
 if (PQstatus(connection) != CONNECTION_OK)
     {
@@ -1369,8 +1371,6 @@ if (PQstatus(connection) != CONNECTION_OK)
         }
     }
 
-PGresult * result;
-
 if (StartTransaction())
     {
     printfd(__FILE__, "POSTGRESQL_STORE::WriteDetailedStat(): 'Failed to start transaction'\n");
@@ -1389,7 +1389,7 @@ if (EscapeString(elogin))
     return -1;
     }
 
-std::map<IP_DIR_PAIR, STAT_NODE>::const_iterator it;
+STG::TraffStat::const_iterator it;
 time_t currTime = time(NULL);
 
 for (it = statTree.begin(); it != statTree.end(); ++it)
@@ -1399,8 +1399,8 @@ for (it = statTree.begin(); it != statTree.end(); ++it)
                 "(till_time, from_time, fk_user, "
                  "dir_num, ip, download, upload, cost) "
              "VALUES ("
-                "CAST('" << Int2TS(currTime) << "' AS TIMESTAMP), "
-                "CAST('" << Int2TS(lastStat) << "' AS TIMESTAMP), "
+                "CAST('" << formatTime(currTime) << "' AS TIMESTAMP), "
+                "CAST('" << formatTime(lastStat) << "' AS TIMESTAMP), "
                 "(SELECT pk_user FROM tb_users WHERE name = '" << elogin << "'), "
                 << it->first.dir << ", "
                 << "CAST('" << inet_ntostring(it->first.ip) << "' AS INET), "
@@ -1408,7 +1408,7 @@ for (it = statTree.begin(); it != statTree.end(); ++it)
                 << it->second.up << ", "
                 << it->second.cash << ")";
 
-    result = PQexec(connection, query.str().c_str());
+    PGresult * result = PQexec(connection, query.str().c_str());
 
     if (PQresultStatus(result) != PGRES_COMMAND_OK)
         {
@@ -1435,9 +1435,9 @@ return 0;
 }
 
 //-----------------------------------------------------------------------------
-int POSTGRESQL_STORE::SaveMonthStat(const USER_STAT & stat, int month, int year, const std::string & login) const
+int POSTGRESQL_STORE::SaveMonthStat(const STG::UserStat & stat, int month, int year, const std::string & login) const
 {
-STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+STG_LOCKER lock(&mutex);
 
 return SaveStat(stat, login, year, month);
 }
@@ -1504,7 +1504,7 @@ return 0;
 
 //-----------------------------------------------------------------------------
 int POSTGRESQL_STORE::SaveUserIPs(uint32_t uid,
-                                  const USER_IPS & ips) const
+                                  const STG::UserIPs & ips) const
 {
 PGresult * result;
 
@@ -1525,7 +1525,7 @@ if (PQresultStatus(result) != PGRES_COMMAND_OK)
 
 PQclear(result);
 
-for (size_t i = 0; i < ips.Count(); ++i)
+for (size_t i = 0; i < ips.count(); ++i)
     {
     std::ostringstream query;
     query << "INSERT INTO tb_allowed_ip "