]> git.stg.codes - stg.git/blobdiff - projects/stargazer/plugins/store/mysql/mysql_store.cpp
Fix divert_cap in FreeBSD.
[stg.git] / projects / stargazer / plugins / store / mysql / mysql_store.cpp
index 198b5f3b812375fcfe88ef3fa532865f45eb1cac..a4ee430930b95b9b4a9602ea3747edcb7ce12252 100644 (file)
@@ -1,20 +1,21 @@
-#include <sys/time.h>
-#include <cerrno>
-#include <cstdio>
-#include <cstdlib>
-#include <algorithm>
-
-#include <mysql.h>
-#include <errmsg.h>
+#include "mysql_store.h"
 
 #include "stg/common.h"
 #include "stg/user_ips.h"
 #include "stg/user_conf.h"
 #include "stg/user_stat.h"
+#include "stg/admin_conf.h"
+#include "stg/tariff_conf.h"
 #include "stg/blowfish.h"
-#include "stg/plugin_creator.h"
 #include "stg/logger.h"
-#include "mysql_store.h"
+
+#include <algorithm>
+#include <sys/time.h>
+#include <cerrno>
+#include <cstdio>
+#include <cstdlib>
+
+#include <mysql/errmsg.h>
 
 #define adm_enc_passwd "cjeifY8m3"
 
@@ -99,29 +100,26 @@ int GetULongLongInt(const std::string & str, uint64_t * val, uint64_t defaultVal
     return 0;
 } 
 
-PLUGIN_CREATOR<MYSQL_STORE> msc;
 }
 
-extern "C" STORE * GetStore();
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-STORE * GetStore()
+extern "C" STG::Store* GetStore()
 {
-return msc.GetPlugin();
+    static MYSQL_STORE plugin;
+    return &plugin;
 }
 //-----------------------------------------------------------------------------
 MYSQL_STORE_SETTINGS::MYSQL_STORE_SETTINGS()
     : settings(NULL)
+    , dbPort(0)
 {
 }
 //-----------------------------------------------------------------------------
-int MYSQL_STORE_SETTINGS::ParseParam(const std::vector<PARAM_VALUE> & moduleParams,
+int MYSQL_STORE_SETTINGS::ParseParam(const std::vector<STG::ParamValue> & moduleParams,
                                      const std::string & name, std::string & result)
 {
-PARAM_VALUE pv;
+STG::ParamValue pv;
 pv.param = name;
-std::vector<PARAM_VALUE>::const_iterator pvi;
+std::vector<STG::ParamValue>::const_iterator pvi;
 pvi = find(moduleParams.begin(), moduleParams.end(), pv);
 if (pvi == moduleParams.end() || pvi->value.empty())
     {
@@ -134,7 +132,7 @@ result = pvi->value[0];
 return 0;
 }
 //-----------------------------------------------------------------------------
-int MYSQL_STORE_SETTINGS::ParseSettings(const MODULE_SETTINGS & s)
+int MYSQL_STORE_SETTINGS::ParseSettings(const STG::ModuleSettings & s)
 {
 if (ParseParam(s.moduleParams, "user", dbUser) < 0 &&
     ParseParam(s.moduleParams, "dbuser", dbUser) < 0)
@@ -149,15 +147,27 @@ if (ParseParam(s.moduleParams, "server", dbHost) < 0 &&
     ParseParam(s.moduleParams, "dbhost", dbHost) < 0)
     return -1;
 
+// not required
+std::string dbPortAsString;
+if (ParseParam(s.moduleParams, "port", dbPortAsString) == 0 ||
+    ParseParam(s.moduleParams, "dbport", dbPortAsString) == 0)
+{
+    if (GetInt<unsigned int>(dbPortAsString, &dbPort, 0) != 0)
+    {
+        errorStr = "Can't parse db port from string: \"" + dbPortAsString + "\"\n";
+        return -1;
+    }
+}
+
 return 0;
 }
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 MYSQL_STORE::MYSQL_STORE()
-    : version("mysql_store v.0.67"),
+    : version("mysql_store v.0.68"),
       schemaVersion(0),
-      logger(GetPluginLogger(GetStgLogger(), "store_mysql"))
+      logger(STG::PluginLogger::get("store_mysql"))
 {
 }
 //-----------------------------------------------------------------------------
@@ -198,7 +208,7 @@ else
     MYSQL * sock;
     if (!(sock = mysql_real_connect(&mysql,storeSettings.GetDBHost().c_str(),
             storeSettings.GetDBUser().c_str(),storeSettings.GetDBPassword().c_str(),
-            0,0,NULL,0)))
+            0,storeSettings.GetDBPort(),NULL,0)))
         {
             errorStr = "Couldn't connect to mysql engine! With error:\n";
             errorStr += mysql_error(&mysql);
@@ -222,12 +232,13 @@ else
             {
                  if(mysql_select_db(sock, storeSettings.GetDBName().c_str()))
                  {
-                    errorStr = "Couldn't select database! With error:\n";
-                    errorStr += mysql_error(sock);
-                    mysql_close(sock);
-                    ret = -1;
+                     errorStr = "Couldn't select database! With error:\n";
+                     errorStr += mysql_error(sock);
+                     mysql_close(sock);
+                     ret = -1;
                  }
-                 ret = CheckAllTables(sock);
+                 else
+                     ret = CheckAllTables(sock);
             }
         }
         else
@@ -254,7 +265,7 @@ if (!(result=mysql_list_tables(sock,str.c_str() )))
     errorStr = "Couldn't get tables list With error:\n";
     errorStr += mysql_error(sock);
     mysql_close(sock);
-    return -1;
+    return false;
 }
 
 my_ulonglong num_rows =  mysql_num_rows(result);
@@ -701,7 +712,7 @@ int MYSQL_STORE::AddUser(const std::string & login) const
 std::string query = "INSERT INTO users SET login='" + login + "',Note='',NAS=''";
 
 for (int i = 0; i < USERDATA_NUM; i++)
-    query += ",Userdata" + x2str(i) + "=''";
+    query += ",Userdata" + std::to_string(i) + "=''";
 
 if(MysqlSetQuery(query.c_str()))
 {
@@ -727,7 +738,7 @@ if(MysqlSetQuery(qbuf))
 return 0;
 }
 //-----------------------------------------------------------------------------
-int MYSQL_STORE::RestoreUserConf(USER_CONF * conf, const std::string & login) const
+int MYSQL_STORE::RestoreUserConf(STG::UserConf * conf, const std::string & login) const
 {
 MYSQL_RES *res;
 MYSQL_ROW row;
@@ -851,10 +862,10 @@ for (int i = 0; i < USERDATA_NUM; i++)
 GetTime(row[15+USERDATA_NUM], &conf->creditExpire, 0);
     
 std::string ipStr = row[16+USERDATA_NUM];
-USER_IPS i;
+STG::UserIPs i;
 try
     {
-    i = StrToIPS(ipStr);
+    i = STG::UserIPs::parse(ipStr);
     }
 catch (const std::string & s)
     {
@@ -871,7 +882,7 @@ mysql_close(sock);
 return 0;
 }
 //-----------------------------------------------------------------------------
-int MYSQL_STORE::RestoreUserStat(USER_STAT * stat, const std::string & login) const
+int MYSQL_STORE::RestoreUserStat(STG::UserStat * stat, const std::string & login) const
 {
 MYSQL_RES *res;
 MYSQL_ROW row;
@@ -994,7 +1005,7 @@ mysql_close(sock);
 return 0;
 }
 //-----------------------------------------------------------------------------
-int MYSQL_STORE::SaveUserConf(const USER_CONF & conf, const std::string & login) const
+int MYSQL_STORE::SaveUserConf(const STG::UserConf & conf, const std::string & login) const
 {
 std::string param;
 std::string res;
@@ -1047,7 +1058,7 @@ if(MysqlSetQuery(res.c_str()))
 return 0;
 }
 //-----------------------------------------------------------------------------
-int MYSQL_STORE::SaveUserStat(const USER_STAT & stat, const std::string & login) const
+int MYSQL_STORE::SaveUserStat(const STG::UserStat & stat, const std::string & login) const
 {
 std::string param;
 std::string res;
@@ -1171,10 +1182,10 @@ return WriteLogString(logStr, login);
 }
 //-----------------------------------------------------------------------------
 int MYSQL_STORE::WriteUserDisconnect(const std::string & login,
-                                     const DIR_TRAFF & up,
-                                     const DIR_TRAFF & down,
-                                     const DIR_TRAFF & sessionUp,
-                                     const DIR_TRAFF & sessionDown,
+                                     const STG::DirTraff & up,
+                                     const STG::DirTraff & down,
+                                     const STG::DirTraff & sessionUp,
+                                     const STG::DirTraff & sessionDown,
                                      double cash,
                                      double /*freeMb*/,
                                      const std::string & /*reason*/) const
@@ -1209,7 +1220,7 @@ logStr += "\'";
 return WriteLogString(logStr, login);
 }
 //-----------------------------------------------------------------------------
-int MYSQL_STORE::SaveMonthStat(const USER_STAT & stat, int month, int year, 
+int MYSQL_STORE::SaveMonthStat(const STG::UserStat & stat, int month, int year, 
                                 const std::string & login) const
 {
 std::string param, res;
@@ -1267,7 +1278,7 @@ if(MysqlSetQuery(qbuf))
 return 0;
 }
 //-----------------------------------------------------------------------------*/
-int MYSQL_STORE::SaveAdmin(const ADMIN_CONF & ac) const
+int MYSQL_STORE::SaveAdmin(const STG::AdminConf & ac) const
 {
 char passwordE[2 * ADM_PASSWD_LEN + 2];
 char pass[ADM_PASSWD_LEN + 1];
@@ -1314,7 +1325,7 @@ if(MysqlSetQuery(qbuf))
 return 0;
 }
 //-----------------------------------------------------------------------------
-int MYSQL_STORE::RestoreAdmin(ADMIN_CONF * ac, const std::string & login) const
+int MYSQL_STORE::RestoreAdmin(STG::AdminConf * ac, const std::string & login) const
 {
 char pass[ADM_PASSWD_LEN + 1];
 char password[ADM_PASSWD_LEN + 1];
@@ -1492,7 +1503,7 @@ if(MysqlSetQuery(qbuf))
 return 0;
 }
 //-----------------------------------------------------------------------------
-int MYSQL_STORE::RestoreTariff(TARIFF_DATA * td, const std::string & tariffName) const
+int MYSQL_STORE::RestoreTariff(STG::TariffData * td, const std::string & tariffName) const
 {
 MYSQL_RES *res;
 MYSQL_ROW row;
@@ -1642,7 +1653,7 @@ if (GetDouble(row[1+8*DIR_NUM], &td->tariffConf.passiveCost, 0.0) < 0)
         return -1;
         }
 
-td->tariffConf.traffType = TARIFF::StringToTraffType(str);
+td->tariffConf.traffType = STG::Tariff::parseTraffType(str);
 
 if (schemaVersion > 0)
 {
@@ -1657,11 +1668,11 @@ if (schemaVersion > 0)
         return -1;
         }
 
-    td->tariffConf.period = TARIFF::StringToPeriod(str);
+    td->tariffConf.period = STG::Tariff::parsePeriod(str);
     }
 else
     {
-    td->tariffConf.period = TARIFF::MONTH;
+    td->tariffConf.period = STG::Tariff::MONTH;
     }
 
 if (schemaVersion > 1)
@@ -1677,7 +1688,7 @@ if (schemaVersion > 1)
         return -1;
         }
 
-    td->tariffConf.changePolicy = TARIFF::StringToChangePolicy(str);
+    td->tariffConf.changePolicy = STG::Tariff::parseChangePolicy(str);
 
     str = row[7+8*DIR_NUM];
     param = "ChangePolicyTimeout";
@@ -1694,7 +1705,7 @@ if (schemaVersion > 1)
     }
 else
     {
-    td->tariffConf.changePolicy = TARIFF::ALLOW;
+    td->tariffConf.changePolicy = STG::Tariff::ALLOW;
     td->tariffConf.changePolicyTimeout = 0;
     }
 
@@ -1703,7 +1714,7 @@ mysql_close(sock);
 return 0;
 }
 //-----------------------------------------------------------------------------
-int MYSQL_STORE::SaveTariff(const TARIFF_DATA & td, const std::string & tariffName) const
+int MYSQL_STORE::SaveTariff(const STG::TariffData & td, const std::string & tariffName) const
 {
 std::string param;
 
@@ -1760,13 +1771,13 @@ res += param;
 strprintf(&param, " Free=%f,", td.tariffConf.free);
 res += param;
 
-res += " TraffType='" + TARIFF::TraffTypeToString(td.tariffConf.traffType) + "'";
+res += " TraffType='" + STG::Tariff::toString(td.tariffConf.traffType) + "'";
 
 if (schemaVersion > 0)
-    res += ", Period='" + TARIFF::PeriodToString(td.tariffConf.period) + "'";
+    res += ", Period='" + STG::Tariff::toString(td.tariffConf.period) + "'";
 
 if (schemaVersion > 1)
-    res += ", change_policy='" + TARIFF::ChangePolicyToString(td.tariffConf.changePolicy) + "'"\
+    res += ", change_policy='" + STG::Tariff::toString(td.tariffConf.changePolicy) + "'"\
            ", change_policy_timeout='" + formatTime(td.tariffConf.changePolicy) + "'";
 
 strprintf(&param, " WHERE name='%s' LIMIT 1", tariffName.c_str());
@@ -1782,7 +1793,7 @@ if(MysqlSetQuery(res.c_str()))
 return 0;
 }
 //-----------------------------------------------------------------------------
-int MYSQL_STORE::WriteDetailedStat(const std::map<IP_DIR_PAIR, STAT_NODE> & statTree, 
+int MYSQL_STORE::WriteDetailedStat(const STG::TraffStat & statTree, 
                                    time_t lastStat, 
                                    const std::string & login) const
 {
@@ -1867,7 +1878,7 @@ strprintf(&res,"INSERT INTO detailstat_%02d_%4d SET login='%s',"\
     endTime.c_str()
     );
 
-std::map<IP_DIR_PAIR, STAT_NODE>::const_iterator stIter;
+STG::TraffStat::const_iterator stIter;
 stIter = statTree.begin();
 
 while (stIter != statTree.end())
@@ -1898,7 +1909,7 @@ mysql_close(sock);
 return 0;
 }
 //-----------------------------------------------------------------------------
-int MYSQL_STORE::AddMessage(STG_MSG * msg, const std::string & login) const
+int MYSQL_STORE::AddMessage(STG::Message * msg, const std::string & login) const
 {
 struct timeval tv;
 
@@ -1921,7 +1932,7 @@ if(MysqlSetQuery(qbuf))
 return EditMessage(*msg, login);
 }
 //-----------------------------------------------------------------------------
-int MYSQL_STORE::EditMessage(const STG_MSG & msg, const std::string & login) const
+int MYSQL_STORE::EditMessage(const STG::Message & msg, const std::string & login) const
 {
 std::string res;
 
@@ -1949,7 +1960,7 @@ if(MysqlSetQuery(res.c_str()))
 return 0;
 }
 //-----------------------------------------------------------------------------
-int MYSQL_STORE::GetMessage(uint64_t id, STG_MSG * msg, const std::string & login) const
+int MYSQL_STORE::GetMessage(uint64_t id, STG::Message * msg, const std::string & login) const
 {
 MYSQL_RES *res;
 MYSQL_ROW row;
@@ -2047,7 +2058,7 @@ if(MysqlSetQuery(qbuf))
 return 0;
 }
 //-----------------------------------------------------------------------------
-int MYSQL_STORE::GetMessageHdrs(std::vector<STG_MSG_HDR> * hdrsList, const std::string & login) const
+int MYSQL_STORE::GetMessageHdrs(std::vector<STG::Message::Header> * hdrsList, const std::string & login) const
 {
 MYSQL_RES *res;
 MYSQL_ROW row;
@@ -2080,7 +2091,7 @@ for (i = 0; i < num_rows; i++)
     if (str2x(row[1], id))
         continue;
     
-    STG_MSG_HDR hdr;
+    STG::Message::Header hdr;
     if (row[2]) 
         if(str2x(row[2], hdr.type))
             continue;
@@ -2138,7 +2149,7 @@ MYSQL *  MYSQL_STORE::MysqlConnect() const {
     }
     if (!(sock = mysql_real_connect(sock,storeSettings.GetDBHost().c_str(),
             storeSettings.GetDBUser().c_str(),storeSettings.GetDBPassword().c_str(),
-            0,0,NULL,0)))
+            0,storeSettings.GetDBPort(),NULL,0)))
         {
             errorStr = "Couldn't connect to mysql engine! With error:\n";
             errorStr += mysql_error(sock);