10 #include "stg/user_ips.h"
11 #include "stg/user_conf.h"
12 #include "stg/user_stat.h"
13 #include "stg/blowfish.h"
14 #include "stg/plugin_creator.h"
15 #include "stg/logger.h"
16 #include "mysql_store.h"
18 #define adm_enc_passwd "cjeifY8m3"
24 const int pt_mega = 1024 * 1024;
25 const std::string badSyms = "'`";
26 const char repSym = '\"';
27 const int RepitTimes = 3;
30 int GetInt(const std::string & str, T * val, T defaultVal = T())
34 *val = static_cast<T>(strtoll(str.c_str(), &res, 10));
38 *val = defaultVal; //Error!
45 int GetDouble(const std::string & str, double * val, double defaultVal)
49 *val = strtod(str.c_str(), &res);
53 *val = defaultVal; //Error!
60 int GetTime(const std::string & str, time_t * val, time_t defaultVal)
64 *val = strtol(str.c_str(), &res, 10);
68 *val = defaultVal; //Error!
75 //-----------------------------------------------------------------------------
76 std::string ReplaceStr(std::string source, const std::string & symlist, const char chgsym)
78 std::string::size_type pos=0;
80 while( (pos = source.find_first_of(symlist,pos)) != std::string::npos)
81 source.replace(pos, 1,1, chgsym);
86 int GetULongLongInt(const std::string & str, uint64_t * val, uint64_t defaultVal)
90 *val = strtoull(str.c_str(), &res, 10);
94 *val = defaultVal; //Error!
101 PLUGIN_CREATOR<MYSQL_STORE> msc;
104 extern "C" STORE * GetStore();
105 //-----------------------------------------------------------------------------
106 //-----------------------------------------------------------------------------
107 //-----------------------------------------------------------------------------
110 return msc.GetPlugin();
112 //-----------------------------------------------------------------------------
113 MYSQL_STORE_SETTINGS::MYSQL_STORE_SETTINGS()
122 //-----------------------------------------------------------------------------
123 int MYSQL_STORE_SETTINGS::ParseParam(const std::vector<PARAM_VALUE> & moduleParams,
124 const std::string & name, std::string & result)
128 std::vector<PARAM_VALUE>::const_iterator pvi;
129 pvi = find(moduleParams.begin(), moduleParams.end(), pv);
130 if (pvi == moduleParams.end())
132 errorStr = "Parameter \'" + name + "\' not found.";
136 result = pvi->value[0];
140 //-----------------------------------------------------------------------------
141 int MYSQL_STORE_SETTINGS::ParseSettings(const MODULE_SETTINGS & s)
143 if (ParseParam(s.moduleParams, "user", dbUser) < 0 &&
144 ParseParam(s.moduleParams, "dbuser", dbUser) < 0)
146 if (ParseParam(s.moduleParams, "password", dbPass) < 0 &&
147 ParseParam(s.moduleParams, "rootdbpass", dbPass) < 0)
149 if (ParseParam(s.moduleParams, "database", dbName) < 0 &&
150 ParseParam(s.moduleParams, "dbname", dbName) < 0)
152 if (ParseParam(s.moduleParams, "server", dbHost) < 0 &&
153 ParseParam(s.moduleParams, "dbhost", dbHost) < 0)
158 //-----------------------------------------------------------------------------
159 //-----------------------------------------------------------------------------
160 //-----------------------------------------------------------------------------
161 MYSQL_STORE::MYSQL_STORE()
163 version("mysql_store v.0.67"),
167 logger(GetPluginLogger(GetStgLogger(), "store_mysql"))
170 //-----------------------------------------------------------------------------
171 int MYSQL_STORE::MysqlQuery(const char* sQuery,MYSQL * sock) const
175 if( (ret = mysql_query(sock,sQuery)) )
177 for(int i=0; i<RepitTimes; i++)
179 if( (ret = mysql_query(sock,sQuery)) )
180 ;//need to send error result
188 //-----------------------------------------------------------------------------
190 //-----------------------------------------------------------------------------
191 int MYSQL_STORE::ParseSettings()
193 int ret = storeSettings.ParseSettings(settings);
197 errorStr = storeSettings.GetStrError();
200 if(storeSettings.GetDBPassword().length() == 0)
202 errorStr = "Database password must be not empty. Please read Manual.";
206 if (!(sock = mysql_real_connect(&mysql,storeSettings.GetDBHost().c_str(),
207 storeSettings.GetDBUser().c_str(),storeSettings.GetDBPassword().c_str(),
210 errorStr = "Couldn't connect to mysql engine! With error:\n";
211 errorStr += mysql_error(&mysql);
217 if(mysql_select_db(sock, storeSettings.GetDBName().c_str()))
219 std::string res = "CREATE DATABASE " + storeSettings.GetDBName();
221 if(MysqlQuery(res.c_str(),sock))
223 errorStr = "Couldn't create database! With error:\n";
224 errorStr += mysql_error(sock);
230 if(mysql_select_db(sock, storeSettings.GetDBName().c_str()))
232 errorStr = "Couldn't select database! With error:\n";
233 errorStr += mysql_error(sock);
237 ret = CheckAllTables(sock);
242 ret = CheckAllTables(sock);
246 logger("MYSQL_STORE: Current DB schema version: %d", schemaVersion);
254 //-----------------------------------------------------------------------------
255 bool MYSQL_STORE::IsTablePresent(const std::string & str,MYSQL * sock)
259 if (!(result=mysql_list_tables(sock,str.c_str() )))
261 errorStr = "Couldn't get tables list With error:\n";
262 errorStr += mysql_error(sock);
267 my_ulonglong num_rows = mysql_num_rows(result);
270 mysql_free_result(result);
272 return num_rows == 1;
274 //-----------------------------------------------------------------------------
275 int MYSQL_STORE::CheckAllTables(MYSQL * sock)
277 //info-------------------------------------------------------------------------
278 if(!IsTablePresent("info",sock))
280 sprintf(qbuf,"CREATE TABLE info (version INTEGER NOT NULL)");
282 if(MysqlQuery(qbuf,sock))
284 errorStr = "Couldn't create info table With error:\n";
285 errorStr += mysql_error(sock);
290 sprintf(qbuf,"INSERT INTO info SET version=0");
292 if(MysqlQuery(qbuf,sock))
294 errorStr = "Couldn't write default version. With error:\n";
295 errorStr += mysql_error(sock);
303 std::vector<std::string> info;
304 if (GetAllParams(&info, "info", "version"))
311 GetInt(info.front(), &schemaVersion, 0);
314 //admins-----------------------------------------------------------------------
315 if(!IsTablePresent("admins",sock))
317 sprintf(qbuf,"CREATE TABLE admins (login VARCHAR(40) DEFAULT '' PRIMARY KEY,"\
318 "password VARCHAR(150) DEFAULT '*',ChgConf TINYINT DEFAULT 0,"\
319 "ChgPassword TINYINT DEFAULT 0,ChgStat TINYINT DEFAULT 0,"\
320 "ChgCash TINYINT DEFAULT 0,UsrAddDel TINYINT DEFAULT 0,"\
321 "ChgTariff TINYINT DEFAULT 0,ChgAdmin TINYINT DEFAULT 0)");
323 if(MysqlQuery(qbuf,sock))
325 errorStr = "Couldn't create admin table list With error:\n";
326 errorStr += mysql_error(sock);
331 sprintf(qbuf,"INSERT INTO admins SET login='admin',"\
332 "password='geahonjehjfofnhammefahbbbfbmpkmkmmefahbbbfbmpkmkmmefahbbbfbmpkmkaa',"\
333 "ChgConf=1,ChgPassword=1,ChgStat=1,ChgCash=1,UsrAddDel=1,ChgTariff=1,ChgAdmin=1");
335 if(MysqlQuery(qbuf,sock))
337 errorStr = "Couldn't create default admin. With error:\n";
338 errorStr += mysql_error(sock);
344 //tariffs-----------------------------------------------------------------------
345 std::string param, res;
346 if(!IsTablePresent("tariffs",sock))
348 res = "CREATE TABLE tariffs (name VARCHAR(40) DEFAULT '' PRIMARY KEY,";
350 for (int i = 0; i < DIR_NUM; i++)
352 strprintf(¶m, " PriceDayA%d DOUBLE DEFAULT 0.0,", i);
355 strprintf(¶m, " PriceDayB%d DOUBLE DEFAULT 0.0,", i);
358 strprintf(¶m, " PriceNightA%d DOUBLE DEFAULT 0.0,", i);
361 strprintf(¶m, " PriceNightB%d DOUBLE DEFAULT 0.0,", i);
364 strprintf(¶m, " Threshold%d INT DEFAULT 0,", i);
367 strprintf(¶m, " Time%d VARCHAR(15) DEFAULT '0:0-0:0',", i);
370 strprintf(¶m, " NoDiscount%d INT DEFAULT 0,", i);
373 strprintf(¶m, " SinglePrice%d INT DEFAULT 0,", i);
377 res += "PassiveCost DOUBLE DEFAULT 0.0, Fee DOUBLE DEFAULT 0.0,"
378 "Free DOUBLE DEFAULT 0.0, TraffType VARCHAR(10) DEFAULT '',"
379 "period VARCHAR(32) NOT NULL DEFAULT 'month')";
381 if(MysqlQuery(res.c_str(),sock))
383 errorStr = "Couldn't create tariffs table list With error:\n";
384 errorStr += mysql_error(sock);
389 res = "INSERT INTO tariffs SET name='tariff',";
391 for (int i = 0; i < DIR_NUM; i++)
393 strprintf(¶m, " NoDiscount%d=1,", i);
396 strprintf(¶m, " Threshold%d=0,", i);
399 strprintf(¶m, " Time%d='0:0-0:0',", i);
404 strprintf(¶m, " SinglePrice%d=0,", i);
410 strprintf(¶m, " PriceDayA%d=0.0,", i);
415 strprintf(¶m, " PriceDayB%d=0.0,", i);
421 strprintf(¶m, " PriceNightA%d=0.0,", i);
426 strprintf(¶m, " PriceNightB%d=0.0,", i);
431 res += "PassiveCost=0.0, Fee=10.0, Free=0,"\
432 "SinglePrice0=1, SinglePrice1=1,PriceDayA1=0.75,PriceDayB1=0.75,"\
433 "PriceNightA0=1.0,PriceNightB0=1.0,TraffType='up+down',period='month'";
435 if(MysqlQuery(res.c_str(),sock))
437 errorStr = "Couldn't create default tariff. With error:\n";
438 errorStr += mysql_error(sock);
443 sprintf(qbuf,"UPDATE info SET version=1");
445 if(MysqlQuery(qbuf,sock))
447 errorStr = "Couldn't write default version. With error:\n";
448 errorStr += mysql_error(sock);
455 //users-----------------------------------------------------------------------
456 if(!IsTablePresent("users",sock))
458 res = "CREATE TABLE users (login VARCHAR(50) NOT NULL DEFAULT '' PRIMARY KEY, Password VARCHAR(150) NOT NULL DEFAULT '*',"\
459 "Passive INT(3) DEFAULT 0,Down INT(3) DEFAULT 0,DisabledDetailStat INT(3) DEFAULT 0,AlwaysOnline INT(3) DEFAULT 0,Tariff VARCHAR(40) NOT NULL DEFAULT '',"\
460 "Address VARCHAR(254) NOT NULL DEFAULT '',Phone VARCHAR(128) NOT NULL DEFAULT '',Email VARCHAR(50) NOT NULL DEFAULT '',"\
461 "Note TEXT NOT NULL,RealName VARCHAR(254) NOT NULL DEFAULT '',StgGroup VARCHAR(40) NOT NULL DEFAULT '',"\
462 "Credit DOUBLE DEFAULT 0, TariffChange VARCHAR(40) NOT NULL DEFAULT '',";
464 for (int i = 0; i < USERDATA_NUM; i++)
466 strprintf(¶m, " Userdata%d VARCHAR(254) NOT NULL,", i);
470 param = " CreditExpire INT(11) DEFAULT 0,";
473 strprintf(¶m, " IP VARCHAR(254) DEFAULT '*',");
476 for (int i = 0; i < DIR_NUM; i++)
478 strprintf(¶m, " D%d BIGINT(30) DEFAULT 0,", i);
481 strprintf(¶m, " U%d BIGINT(30) DEFAULT 0,", i);
485 strprintf(¶m, "Cash DOUBLE DEFAULT 0,FreeMb DOUBLE DEFAULT 0,LastCashAdd DOUBLE DEFAULT 0,"\
486 "LastCashAddTime INT(11) DEFAULT 0,PassiveTime INT(11) DEFAULT 0,LastActivityTime INT(11) DEFAULT 0,"\
487 "NAS VARCHAR(17) NOT NULL, INDEX (AlwaysOnline), INDEX (IP), INDEX (Address),"\
488 " INDEX (Tariff),INDEX (Phone),INDEX (Email),INDEX (RealName))");
491 if(MysqlQuery(res.c_str(),sock))
493 errorStr = "Couldn't create users table list With error:\n";
494 errorStr += mysql_error(sock);
495 errorStr += "\n\n" + res;
500 res = "INSERT INTO users SET login='test',Address='',AlwaysOnline=0,"\
501 "Credit=0.0,CreditExpire=0,Down=0,Email='',DisabledDetailStat=0,"\
502 "StgGroup='',IP='192.168.1.1',Note='',Passive=0,Password='123456',"\
503 "Phone='', RealName='',Tariff='tariff',TariffChange='',NAS='',";
505 for (int i = 0; i < USERDATA_NUM; i++)
507 strprintf(¶m, " Userdata%d='',", i);
511 for (int i = 0; i < DIR_NUM; i++)
513 strprintf(¶m, " D%d=0,", i);
516 strprintf(¶m, " U%d=0,", i);
520 res += "Cash=10.0,FreeMb=0.0,LastActivityTime=0,LastCashAdd=0,"\
521 "LastCashAddTime=0, PassiveTime=0";
523 if(MysqlQuery(res.c_str(),sock))
525 errorStr = "Couldn't create default user. With error:\n";
526 errorStr += mysql_error(sock);
532 //logs-----------------------------------------------------------------------
533 if(!IsTablePresent("logs"))
535 sprintf(qbuf,"CREATE TABLE logs (unid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, login VARCHAR(40),text TEXT)");
539 errorStr = "Couldn't create admin table list With error:\n";
540 errorStr += mysql_error(sock);
545 //messages---------------------------------------------------------------------
546 if(!IsTablePresent("messages",sock))
548 sprintf(qbuf,"CREATE TABLE messages (login VARCHAR(40) DEFAULT '', id BIGINT, "\
549 "type INT, lastSendTime INT, creationTime INT, showTime INT,"\
550 "stgRepeat INT, repeatPeriod INT, text TEXT)");
552 if(MysqlQuery(qbuf,sock))
554 errorStr = "Couldn't create messages table. With error:\n";
555 errorStr += mysql_error(sock);
561 //month_stat-------------------------------------------------------------------
562 if(!IsTablePresent("stat",sock))
564 res = "CREATE TABLE stat (login VARCHAR(50), month TINYINT, year SMALLINT,";
566 for (int i = 0; i < DIR_NUM; i++)
568 strprintf(¶m, " U%d BIGINT,", i);
571 strprintf(¶m, " D%d BIGINT,", i);
575 res += " cash DOUBLE, INDEX (login))";
577 if(MysqlQuery(res.c_str(),sock))
579 errorStr = "Couldn't create stat table. With error:\n";
580 errorStr += mysql_error(sock);
588 //-----------------------------------------------------------------------------
589 int MYSQL_STORE::MakeUpdates(MYSQL * sock)
591 if (schemaVersion < 1)
593 if (MysqlQuery("ALTER TABLE tariffs ADD period VARCHAR(32) NOT NULL DEFAULT 'month'", sock))
595 errorStr = "Couldn't update tariffs table to version 1. With error:\n";
596 errorStr += mysql_error(sock);
600 if (MysqlQuery("UPDATE info SET version = 1", sock))
602 errorStr = "Couldn't update DB schema version to 1. With error:\n";
603 errorStr += mysql_error(sock);
608 logger("MYSQL_STORE: Updated DB schema to version %d", schemaVersion);
612 //-----------------------------------------------------------------------------
614 int MYSQL_STORE::GetAllParams(std::vector<std::string> * ParamList,
615 const std::string & table, const std::string & name) const
624 sprintf(qbuf,"SELECT %s FROM %s", name.c_str(), table.c_str());
626 if(MysqlGetQuery(qbuf,sock))
628 errorStr = "Couldn't GetAllParams Query for: ";
629 errorStr += name + " - " + table + "\n";
630 errorStr += mysql_error(sock);
635 if (!(res=mysql_store_result(sock)))
637 errorStr = "Couldn't GetAllParams Results for: ";
638 errorStr += name + " - " + table + "\n";
639 errorStr += mysql_error(sock);
643 num = mysql_num_rows(res);
645 for(i = 0; i < num; i++)
647 row = mysql_fetch_row(res);
648 ParamList->push_back(row[0]);
651 mysql_free_result(res);
657 //-----------------------------------------------------------------------------
658 int MYSQL_STORE::GetUsersList(std::vector<std::string> * usersList) const
660 if(GetAllParams(usersList, "users", "login"))
665 //-----------------------------------------------------------------------------
666 int MYSQL_STORE::GetAdminsList(std::vector<std::string> * adminsList) const
668 if(GetAllParams(adminsList, "admins", "login"))
673 //-----------------------------------------------------------------------------
674 int MYSQL_STORE::GetTariffsList(std::vector<std::string> * tariffsList) const
676 if(GetAllParams(tariffsList, "tariffs", "name"))
681 //-----------------------------------------------------------------------------
682 int MYSQL_STORE::AddUser(const std::string & login) const
684 std::string query = "INSERT INTO users SET login='" + login + "',Note='',NAS=''";
686 for (int i = 0; i < USERDATA_NUM; i++)
687 query += ",Userdata" + x2str(i) + "=''";
689 if(MysqlSetQuery(query.c_str()))
691 errorStr = "Couldn't add user:\n";
692 //errorStr += mysql_error(sock);
698 //-----------------------------------------------------------------------------
699 int MYSQL_STORE::DelUser(const std::string & login) const
701 sprintf(qbuf,"DELETE FROM users WHERE login='%s' LIMIT 1", login.c_str());
703 if(MysqlSetQuery(qbuf))
705 errorStr = "Couldn't delete user:\n";
706 //errorStr += mysql_error(sock);
712 //-----------------------------------------------------------------------------
713 int MYSQL_STORE::RestoreUserConf(USER_CONF * conf, const std::string & login) const
720 query = "SELECT login, Password, Passive, Down, DisabledDetailStat, \
721 AlwaysOnline, Tariff, Address, Phone, Email, Note, \
722 RealName, StgGroup, Credit, TariffChange, ";
724 for (int i = 0; i < USERDATA_NUM; i++)
726 sprintf(qbuf, "Userdata%d, ", i);
730 query += "CreditExpire, IP FROM users WHERE login='";
731 query += login + "' LIMIT 1";
733 //sprintf(qbuf,"SELECT * FROM users WHERE login='%s' LIMIT 1", login.c_str());
735 if(MysqlGetQuery(query.c_str(),sock))
737 errorStr = "Couldn't restore Tariff(on query):\n";
738 errorStr += mysql_error(sock);
743 if (!(res=mysql_store_result(sock)))
745 errorStr = "Couldn't restore Tariff(on getting result):\n";
746 errorStr += mysql_error(sock);
751 if (mysql_num_rows(res) != 1)
753 errorStr = "User not found";
758 row = mysql_fetch_row(res);
760 conf->password = row[1];
762 if (conf->password.empty())
764 mysql_free_result(res);
765 errorStr = "User \'" + login + "\' password is blank.";
770 if (GetInt(row[2],&conf->passive) != 0)
772 mysql_free_result(res);
773 errorStr = "User \'" + login + "\' data not read. Parameter Passive.";
778 if (GetInt(row[3], &conf->disabled) != 0)
780 mysql_free_result(res);
781 errorStr = "User \'" + login + "\' data not read. Parameter Down.";
786 if (GetInt(row[4], &conf->disabledDetailStat) != 0)
788 mysql_free_result(res);
789 errorStr = "User \'" + login + "\' data not read. Parameter DisabledDetailStat.";
794 if (GetInt(row[5], &conf->alwaysOnline) != 0)
796 mysql_free_result(res);
797 errorStr = "User \'" + login + "\' data not read. Parameter AlwaysOnline.";
802 conf->tariffName = row[6];
804 if (conf->tariffName.empty())
806 mysql_free_result(res);
807 errorStr = "User \'" + login + "\' tariff is blank.";
812 conf->address = row[7];
813 conf->phone = row[8];
814 conf->email = row[9];
815 conf->note = row[10];
816 conf->realName = row[11];
817 conf->group = row[12];
819 if (GetDouble(row[13], &conf->credit, 0) != 0)
821 mysql_free_result(res);
822 errorStr = "User \'" + login + "\' data not read. Parameter Credit.";
827 conf->nextTariff = row[14];
829 for (int i = 0; i < USERDATA_NUM; i++)
831 conf->userdata[i] = row[15+i];
834 GetTime(row[15+USERDATA_NUM], &conf->creditExpire, 0);
836 std::string ipStr = row[16+USERDATA_NUM];
842 catch (const std::string & s)
844 mysql_free_result(res);
845 errorStr = "User \'" + login + "\' data not read. Parameter IP address. " + s;
851 mysql_free_result(res);
856 //-----------------------------------------------------------------------------
857 int MYSQL_STORE::RestoreUserStat(USER_STAT * stat, const std::string & login) const
867 for (int i = 0; i < DIR_NUM; i++)
869 sprintf(qbuf, "D%d, U%d, ", i, i);
873 query += "Cash, FreeMb, LastCashAdd, LastCashAddTime, PassiveTime, LastActivityTime \
874 FROM users WHERE login = '";
875 query += login + "'";
877 //sprintf(qbuf,"SELECT * FROM users WHERE login='%s' LIMIT 1", login.c_str());
879 if(MysqlGetQuery(query.c_str() ,sock))
881 errorStr = "Couldn't restore UserStat(on query):\n";
882 errorStr += mysql_error(sock);
887 if (!(res=mysql_store_result(sock)))
889 errorStr = "Couldn't restore UserStat(on getting result):\n";
890 errorStr += mysql_error(sock);
895 row = mysql_fetch_row(res);
897 unsigned int startPos=0;
901 for (int i = 0; i < DIR_NUM; i++)
904 sprintf(s, "D%d", i);
905 if (GetULongLongInt(row[startPos+i*2], &traff, 0) != 0)
907 mysql_free_result(res);
908 errorStr = "User \'" + login + "\' stat not read. Parameter " + std::string(s);
912 stat->monthDown[i] = traff;
914 sprintf(s, "U%d", i);
915 if (GetULongLongInt(row[startPos+i*2+1], &traff, 0) != 0)
917 mysql_free_result(res);
918 errorStr = "User \'" + login + "\' stat not read. Parameter " + std::string(s);
922 stat->monthUp[i] = traff;
925 startPos += (2*DIR_NUM);
927 if (GetDouble(row[startPos], &stat->cash, 0) != 0)
929 mysql_free_result(res);
930 errorStr = "User \'" + login + "\' stat not read. Parameter Cash";
935 if (GetDouble(row[startPos+1],&stat->freeMb, 0) != 0)
937 mysql_free_result(res);
938 errorStr = "User \'" + login + "\' stat not read. Parameter FreeMb";
943 if (GetDouble(row[startPos+2], &stat->lastCashAdd, 0) != 0)
945 mysql_free_result(res);
946 errorStr = "User \'" + login + "\' stat not read. Parameter LastCashAdd";
951 if (GetTime(row[startPos+3], &stat->lastCashAddTime, 0) != 0)
953 mysql_free_result(res);
954 errorStr = "User \'" + login + "\' stat not read. Parameter LastCashAddTime";
959 if (GetTime(row[startPos+4], &stat->passiveTime, 0) != 0)
961 mysql_free_result(res);
962 errorStr = "User \'" + login + "\' stat not read. Parameter PassiveTime";
967 if (GetTime(row[startPos+5], &stat->lastActivityTime, 0) != 0)
969 mysql_free_result(res);
970 errorStr = "User \'" + login + "\' stat not read. Parameter LastActivityTime";
975 mysql_free_result(res);
979 //-----------------------------------------------------------------------------
980 int MYSQL_STORE::SaveUserConf(const USER_CONF & conf, const std::string & login) const
985 strprintf(&res,"UPDATE users SET Password='%s', Passive=%d, Down=%d, DisabledDetailStat = %d, "\
986 "AlwaysOnline=%d, Tariff='%s', Address='%s', Phone='%s', Email='%s', "\
987 "Note='%s', RealName='%s', StgGroup='%s', Credit=%f, TariffChange='%s', ",
988 conf.password.c_str(),
991 conf.disabledDetailStat,
993 conf.tariffName.c_str(),
994 (ReplaceStr(conf.address,badSyms,repSym)).c_str(),
995 (ReplaceStr(conf.phone,badSyms,repSym)).c_str(),
996 (ReplaceStr(conf.email,badSyms,repSym)).c_str(),
997 (ReplaceStr(conf.note,badSyms,repSym)).c_str(),
998 (ReplaceStr(conf.realName,badSyms,repSym)).c_str(),
999 (ReplaceStr(conf.group,badSyms,repSym)).c_str(),
1001 conf.nextTariff.c_str()
1004 for (int i = 0; i < USERDATA_NUM; i++)
1006 strprintf(¶m, " Userdata%d='%s',", i,
1007 (ReplaceStr(conf.userdata[i],badSyms,repSym)).c_str());
1011 strprintf(¶m, " CreditExpire=%d,", conf.creditExpire);
1014 std::ostringstream ipStr;
1017 strprintf(¶m, " IP='%s'", ipStr.str().c_str());
1020 strprintf(¶m, " WHERE login='%s' LIMIT 1", login.c_str());
1023 if(MysqlSetQuery(res.c_str()))
1025 errorStr = "Couldn't save user conf:\n";
1026 //errorStr += mysql_error(sock);
1032 //-----------------------------------------------------------------------------
1033 int MYSQL_STORE::SaveUserStat(const USER_STAT & stat, const std::string & login) const
1038 res = "UPDATE users SET";
1040 for (int i = 0; i < DIR_NUM; i++)
1042 strprintf(¶m, " D%d=%lld,", i, stat.monthDown[i]);
1045 strprintf(¶m, " U%d=%lld,", i, stat.monthUp[i]);
1049 strprintf(¶m, " Cash=%f, FreeMb=%f, LastCashAdd=%f, LastCashAddTime=%d,"\
1050 " PassiveTime=%d, LastActivityTime=%d",
1054 stat.lastCashAddTime,
1056 stat.lastActivityTime
1060 strprintf(¶m, " WHERE login='%s' LIMIT 1", login.c_str());
1063 if(MysqlSetQuery(res.c_str()))
1065 errorStr = "Couldn't save user stat:\n";
1066 // errorStr += mysql_error(sock);
1072 //-----------------------------------------------------------------------------
1073 int MYSQL_STORE::WriteLogString(const std::string & str, const std::string & login) const
1075 std::string res, tempStr;
1084 strprintf(&tempStr, "logs_%02d_%4d", lt->tm_mon+1, lt->tm_year+1900);
1085 if (!(sock=MysqlConnect())){
1086 errorStr = "Couldn't connect to Server";
1089 if (!(result=mysql_list_tables(sock,tempStr.c_str() )))
1091 errorStr = "Couldn't get table " + tempStr + ":\n";
1092 errorStr += mysql_error(sock);
1097 my_ulonglong num_rows = mysql_num_rows(result);
1099 mysql_free_result(result);
1103 sprintf(qbuf,"CREATE TABLE logs_%02d_%4d (unid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, login VARCHAR(40),text TEXT)",
1104 lt->tm_mon+1, lt->tm_year+1900);
1106 if(MysqlQuery(qbuf,sock))
1108 errorStr = "Couldn't create WriteDetailedStat table:\n";
1109 errorStr += mysql_error(sock);
1115 strprintf(&res, "%s -- %s",LogDate(t), str.c_str());
1119 strprintf(&send,"INSERT INTO logs_%02d_%4d SET login='%s', text='%s'",
1120 lt->tm_mon+1, lt->tm_year+1900,
1121 login.c_str(), (ReplaceStr(res,badSyms,repSym)).c_str());
1123 if(MysqlQuery(send.c_str(),sock))
1125 errorStr = "Couldn't write log string:\n";
1126 errorStr += mysql_error(sock);
1134 //-----------------------------------------------------------------------------
1135 int MYSQL_STORE::WriteUserChgLog(const std::string & login,
1136 const std::string & admLogin,
1138 const std::string & paramName,
1139 const std::string & oldValue,
1140 const std::string & newValue,
1141 const std::string & message) const
1143 std::string userLogMsg = "Admin \'" + admLogin + "\', " + inet_ntostring(admIP) + ": \'"
1144 + paramName + "\' parameter changed from \'" + oldValue +
1145 "\' to \'" + newValue + "\'. " + message;
1147 return WriteLogString(userLogMsg, login);
1149 //-----------------------------------------------------------------------------
1150 int MYSQL_STORE::WriteUserConnect(const std::string & login, uint32_t ip) const
1152 std::string logStr = "Connect, " + inet_ntostring(ip);
1153 return WriteLogString(logStr, login);
1155 //-----------------------------------------------------------------------------
1156 int MYSQL_STORE::WriteUserDisconnect(const std::string & login,
1157 const DIR_TRAFF & up,
1158 const DIR_TRAFF & down,
1159 const DIR_TRAFF & sessionUp,
1160 const DIR_TRAFF & sessionDown,
1163 const std::string & /*reason*/) const
1165 std::string logStr = "Disconnect, ";
1166 std::ostringstream sssu;
1167 std::ostringstream sssd;
1168 std::ostringstream ssmu;
1169 std::ostringstream ssmd;
1170 std::ostringstream sscash;
1176 sssd << sessionDown;
1180 logStr += " session upload: \'";
1181 logStr += sssu.str();
1182 logStr += "\' session download: \'";
1183 logStr += sssd.str();
1184 logStr += "\' month upload: \'";
1185 logStr += ssmu.str();
1186 logStr += "\' month download: \'";
1187 logStr += ssmd.str();
1188 logStr += "\' cash: \'";
1189 logStr += sscash.str();
1192 return WriteLogString(logStr, login);
1194 //-----------------------------------------------------------------------------
1195 int MYSQL_STORE::SaveMonthStat(const USER_STAT & stat, int month, int year,
1196 const std::string & login) const
1198 std::string param, res;
1200 strprintf(&res, "INSERT INTO stat SET login='%s', month=%d, year=%d,",
1201 login.c_str(), month+1, year+1900);
1203 for (int i = 0; i < DIR_NUM; i++)
1205 strprintf(¶m, " U%d=%lld,", i, stat.monthUp[i]);
1208 strprintf(¶m, " D%d=%lld,", i, stat.monthDown[i]);
1212 strprintf(¶m, " cash=%f", stat.cash);
1215 if(MysqlSetQuery(res.c_str()))
1217 errorStr = "Couldn't SaveMonthStat:\n";
1218 //errorStr += mysql_error(sock);
1224 //-----------------------------------------------------------------------------*/
1225 int MYSQL_STORE::AddAdmin(const std::string & login) const
1227 sprintf(qbuf,"INSERT INTO admins SET login='%s'", login.c_str());
1229 if(MysqlSetQuery(qbuf))
1231 errorStr = "Couldn't add admin:\n";
1232 //errorStr += mysql_error(sock);
1238 //-----------------------------------------------------------------------------*/
1239 int MYSQL_STORE::DelAdmin(const std::string & login) const
1241 sprintf(qbuf,"DELETE FROM admins where login='%s' LIMIT 1", login.c_str());
1243 if(MysqlSetQuery(qbuf))
1245 errorStr = "Couldn't delete admin:\n";
1246 //errorStr += mysql_error(sock);
1252 //-----------------------------------------------------------------------------*/
1253 int MYSQL_STORE::SaveAdmin(const ADMIN_CONF & ac) const
1255 char passwordE[2 * ADM_PASSWD_LEN + 2];
1256 char pass[ADM_PASSWD_LEN + 1];
1257 char adminPass[ADM_PASSWD_LEN + 1];
1259 memset(pass, 0, sizeof(pass));
1260 memset(adminPass, 0, sizeof(adminPass));
1263 InitContext(adm_enc_passwd, strlen(adm_enc_passwd), &ctx);
1265 strncpy(adminPass, ac.password.c_str(), ADM_PASSWD_LEN);
1266 adminPass[ADM_PASSWD_LEN - 1] = 0;
1268 for (int i = 0; i < ADM_PASSWD_LEN/8; i++)
1270 EncryptBlock(pass + 8*i, adminPass + 8*i, &ctx);
1273 pass[ADM_PASSWD_LEN - 1] = 0;
1274 Encode12(passwordE, pass, ADM_PASSWD_LEN);
1276 sprintf(qbuf,"UPDATE admins SET password='%s', ChgConf=%d, ChgPassword=%d, "\
1277 "ChgStat=%d, ChgCash=%d, UsrAddDel=%d, ChgTariff=%d, ChgAdmin=%d "\
1278 "WHERE login='%s' LIMIT 1",
1290 if(MysqlSetQuery(qbuf))
1292 errorStr = "Couldn't save admin:\n";
1293 //errorStr += mysql_error(sock);
1299 //-----------------------------------------------------------------------------
1300 int MYSQL_STORE::RestoreAdmin(ADMIN_CONF * ac, const std::string & login) const
1302 char pass[ADM_PASSWD_LEN + 1];
1303 char password[ADM_PASSWD_LEN + 1];
1304 char passwordE[2*ADM_PASSWD_LEN + 2];
1307 memset(password, 0, sizeof(password));
1313 sprintf(qbuf,"SELECT * FROM admins WHERE login='%s' LIMIT 1", login.c_str());
1315 if(MysqlGetQuery(qbuf,sock))
1317 errorStr = "Couldn't restore admin:\n";
1318 errorStr += mysql_error(sock);
1323 if (!(res=mysql_store_result(sock)))
1325 errorStr = "Couldn't restore admin:\n";
1326 errorStr += mysql_error(sock);
1331 if ( mysql_num_rows(res) == 0)
1333 mysql_free_result(res);
1334 errorStr = "Couldn't restore admin as couldn't found him in table.\n";
1339 row = mysql_fetch_row(res);
1345 mysql_free_result(res);
1346 errorStr = "Error in parameter password";
1351 memset(passwordE, 0, sizeof(passwordE));
1352 strncpy(passwordE, p.c_str(), 2*ADM_PASSWD_LEN);
1354 memset(pass, 0, sizeof(pass));
1356 if (passwordE[0] != 0)
1358 Decode21(pass, passwordE);
1359 InitContext(adm_enc_passwd, strlen(adm_enc_passwd), &ctx);
1361 for (int i = 0; i < ADM_PASSWD_LEN/8; i++)
1363 DecryptBlock(password + 8*i, pass + 8*i, &ctx);
1371 ac->password = password;
1375 if (GetInt(row[2], &a) == 0)
1376 ac->priv.userConf = a;
1379 mysql_free_result(res);
1380 errorStr = "Error in parameter ChgConf";
1385 if (GetInt(row[3], &a) == 0)
1386 ac->priv.userPasswd = a;
1389 mysql_free_result(res);
1390 errorStr = "Error in parameter ChgPassword";
1395 if (GetInt(row[4], &a) == 0)
1396 ac->priv.userStat = a;
1399 mysql_free_result(res);
1400 errorStr = "Error in parameter ChgStat";
1405 if (GetInt(row[5], &a) == 0)
1406 ac->priv.userCash = a;
1409 mysql_free_result(res);
1410 errorStr = "Error in parameter ChgCash";
1415 if (GetInt(row[6], &a) == 0)
1416 ac->priv.userAddDel = a;
1419 mysql_free_result(res);
1420 errorStr = "Error in parameter UsrAddDel";
1425 if (GetInt(row[7], &a) == 0)
1426 ac->priv.tariffChg = a;
1429 mysql_free_result(res);
1430 errorStr = "Error in parameter ChgTariff";
1435 if (GetInt(row[8], &a) == 0)
1436 ac->priv.adminChg = a;
1439 mysql_free_result(res);
1440 errorStr = "Error in parameter ChgAdmin";
1445 mysql_free_result(res);
1449 //-----------------------------------------------------------------------------
1450 int MYSQL_STORE::AddTariff(const std::string & name) const
1452 sprintf(qbuf,"INSERT INTO tariffs SET name='%s'", name.c_str());
1454 if(MysqlSetQuery(qbuf))
1456 errorStr = "Couldn't add tariff:\n";
1457 // errorStr += mysql_error(sock);
1463 //-----------------------------------------------------------------------------
1464 int MYSQL_STORE::DelTariff(const std::string & name) const
1466 sprintf(qbuf,"DELETE FROM tariffs WHERE name='%s' LIMIT 1", name.c_str());
1468 if(MysqlSetQuery(qbuf))
1470 errorStr = "Couldn't delete tariff: ";
1471 // errorStr += mysql_error(sock);
1477 //-----------------------------------------------------------------------------
1478 int MYSQL_STORE::RestoreTariff(TARIFF_DATA * td, const std::string & tariffName) const
1483 sprintf(qbuf,"SELECT * FROM tariffs WHERE name='%s' LIMIT 1", tariffName.c_str());
1485 if(MysqlGetQuery(qbuf,sock))
1487 errorStr = "Couldn't restore Tariff:\n";
1488 errorStr += mysql_error(sock);
1493 if (!(res=mysql_store_result(sock)))
1495 errorStr = "Couldn't restore Tariff:\n";
1496 errorStr += mysql_error(sock);
1502 td->tariffConf.name = tariffName;
1504 row = mysql_fetch_row(res);
1507 for (int i = 0; i<DIR_NUM; i++)
1509 strprintf(¶m, "Time%d", i);
1511 if (str.length() == 0)
1513 mysql_free_result(res);
1514 errorStr = "Cannot read tariff " + tariffName + ". Parameter " + param;
1519 ParseTariffTimeStr(str.c_str(),
1520 td->dirPrice[i].hDay,
1521 td->dirPrice[i].mDay,
1522 td->dirPrice[i].hNight,
1523 td->dirPrice[i].mNight);
1525 strprintf(¶m, "PriceDayA%d", i);
1526 if (GetDouble(row[1+i*8], &td->dirPrice[i].priceDayA, 0.0) < 0)
1528 mysql_free_result(res);
1529 errorStr = "Cannot read tariff " + tariffName + ". Parameter " + param;
1533 td->dirPrice[i].priceDayA /= (1024*1024);
1535 strprintf(¶m, "PriceDayB%d", i);
1536 if (GetDouble(row[2+i*8], &td->dirPrice[i].priceDayB, 0.0) < 0)
1538 mysql_free_result(res);
1539 errorStr = "Cannot read tariff " + tariffName + ". Parameter " + param;
1543 td->dirPrice[i].priceDayB /= (1024*1024);
1545 strprintf(¶m, "PriceNightA%d", i);
1546 if (GetDouble(row[3+i*8], &td->dirPrice[i].priceNightA, 0.0) < 0)
1548 mysql_free_result(res);
1549 errorStr = "Cannot read tariff " + tariffName + ". Parameter " + param;
1553 td->dirPrice[i].priceNightA /= (1024*1024);
1555 strprintf(¶m, "PriceNightB%d", i);
1556 if (GetDouble(row[4+i*8], &td->dirPrice[i].priceNightB, 0.0) < 0)
1558 mysql_free_result(res);
1559 errorStr = "Cannot read tariff " + tariffName + ". Parameter " + param;
1563 td->dirPrice[i].priceNightB /= (1024*1024);
1565 strprintf(¶m, "Threshold%d", i);
1566 if (GetInt(row[5+i*8], &td->dirPrice[i].threshold) < 0)
1568 mysql_free_result(res);
1569 errorStr = "Cannot read tariff " + tariffName + ". Parameter " + param;
1574 strprintf(¶m, "SinglePrice%d", i);
1575 if (GetInt(row[8+i*8], &td->dirPrice[i].singlePrice) < 0)
1577 mysql_free_result(res);
1578 errorStr = "Cannot read tariff " + tariffName + ". Parameter " + param;
1583 strprintf(¶m, "NoDiscount%d", i);
1584 if (GetInt(row[7+i*8], &td->dirPrice[i].noDiscount) < 0)
1586 mysql_free_result(res);
1587 errorStr = "Cannot read tariff " + tariffName + ". Parameter " + param;
1593 if (GetDouble(row[2+8*DIR_NUM], &td->tariffConf.fee, 0.0) < 0)
1595 mysql_free_result(res);
1596 errorStr = "Cannot read tariff " + tariffName + ". Parameter Fee";
1601 if (GetDouble(row[3+8*DIR_NUM], &td->tariffConf.free, 0.0) < 0)
1603 mysql_free_result(res);
1604 errorStr = "Cannot read tariff " + tariffName + ". Parameter Free";
1609 if (GetDouble(row[1+8*DIR_NUM], &td->tariffConf.passiveCost, 0.0) < 0)
1611 mysql_free_result(res);
1612 errorStr = "Cannot read tariff " + tariffName + ". Parameter PassiveCost";
1617 str = row[4+8*DIR_NUM];
1618 param = "TraffType";
1620 if (str.length() == 0)
1622 mysql_free_result(res);
1623 errorStr = "Cannot read tariff " + tariffName + ". Parameter " + param;
1628 td->tariffConf.traffType = TARIFF::StringToTraffType(str);
1630 if (schemaVersion > 0)
1632 str = row[5+8*DIR_NUM];
1635 if (str.length() == 0)
1637 mysql_free_result(res);
1638 errorStr = "Cannot read tariff " + tariffName + ". Parameter " + param;
1643 td->tariffConf.period = TARIFF::StringToPeriod(str);
1647 td->tariffConf.period = TARIFF::MONTH;
1650 mysql_free_result(res);
1654 //-----------------------------------------------------------------------------
1655 int MYSQL_STORE::SaveTariff(const TARIFF_DATA & td, const std::string & tariffName) const
1659 std::string res="UPDATE tariffs SET";
1661 for (int i = 0; i < DIR_NUM; i++)
1663 strprintf(¶m, " PriceDayA%d=%f,", i,
1664 td.dirPrice[i].priceDayA * pt_mega);
1667 strprintf(¶m, " PriceDayB%d=%f,", i,
1668 td.dirPrice[i].priceDayB * pt_mega);
1671 strprintf(¶m, " PriceNightA%d=%f,", i,
1672 td.dirPrice[i].priceNightA * pt_mega);
1675 strprintf(¶m, " PriceNightB%d=%f,", i,
1676 td.dirPrice[i].priceNightB * pt_mega);
1679 strprintf(¶m, " Threshold%d=%d,", i,
1680 td.dirPrice[i].threshold);
1684 strprintf(¶m, " Time%d", i);
1686 strprintf(&s, "%0d:%0d-%0d:%0d",
1687 td.dirPrice[i].hDay,
1688 td.dirPrice[i].mDay,
1689 td.dirPrice[i].hNight,
1690 td.dirPrice[i].mNight);
1692 res += (param + "='" + s + "',");
1694 strprintf(¶m, " NoDiscount%d=%d,", i,
1695 td.dirPrice[i].noDiscount);
1698 strprintf(¶m, " SinglePrice%d=%d,", i,
1699 td.dirPrice[i].singlePrice);
1703 strprintf(¶m, " PassiveCost=%f,", td.tariffConf.passiveCost);
1706 strprintf(¶m, " Fee=%f,", td.tariffConf.fee);
1709 strprintf(¶m, " Free=%f,", td.tariffConf.free);
1712 res += " TraffType='" + TARIFF::TraffTypeToString(td.tariffConf.traffType) + "'";
1714 if (schemaVersion > 0)
1715 res += ", Period='" + TARIFF::PeriodToString(td.tariffConf.period) + "'";
1717 strprintf(¶m, " WHERE name='%s' LIMIT 1", tariffName.c_str());
1720 if(MysqlSetQuery(res.c_str()))
1722 errorStr = "Couldn't save tariff:\n";
1723 //errorStr += mysql_error(sock);
1729 //-----------------------------------------------------------------------------
1730 int MYSQL_STORE::WriteDetailedStat(const std::map<IP_DIR_PAIR, STAT_NODE> & statTree,
1732 const std::string & login) const
1734 std::string res, stTime, endTime, tempStr;
1741 if (lt->tm_hour == 0 && lt->tm_min <= 5)
1749 strprintf(&tempStr, "detailstat_%02d_%4d", lt->tm_mon+1, lt->tm_year+1900);
1751 if (!(sock=MysqlConnect())){
1756 if (!(result=mysql_list_tables(sock,tempStr.c_str() )))
1758 errorStr = "Couldn't get table " + tempStr + ":\n";
1759 errorStr += mysql_error(sock);
1764 my_ulonglong num_rows = mysql_num_rows(result);
1766 mysql_free_result(result);
1770 sprintf(qbuf,"CREATE TABLE detailstat_%02d_%4d (login VARCHAR(40) DEFAULT '',"\
1771 "day TINYINT DEFAULT 0,startTime TIME,endTime TIME,"\
1772 "IP VARCHAR(17) DEFAULT '',dir INT DEFAULT 0,"\
1773 "down BIGINT DEFAULT 0,up BIGINT DEFAULT 0, cash DOUBLE DEFAULT 0.0, INDEX (login), INDEX(dir), INDEX(day), INDEX(IP))",
1774 lt->tm_mon+1, lt->tm_year+1900);
1776 if(MysqlQuery(qbuf,sock))
1778 errorStr = "Couldn't create WriteDetailedStat table:\n";
1779 errorStr += mysql_error(sock);
1788 lt1 = localtime(&lastStat);
1797 lt2 = localtime(&t);
1803 strprintf(&stTime, "%02d:%02d:%02d", h1, m1, s1);
1804 strprintf(&endTime, "%02d:%02d:%02d", h2, m2, s2);
1806 strprintf(&res,"INSERT INTO detailstat_%02d_%4d SET login='%s',"\
1807 "day=%d,startTime='%s',endTime='%s',",
1808 lt->tm_mon+1, lt->tm_year+1900,
1815 std::map<IP_DIR_PAIR, STAT_NODE>::const_iterator stIter;
1816 stIter = statTree.begin();
1818 while (stIter != statTree.end())
1820 strprintf(&tempStr,"IP='%s', dir=%d, down=%lld, up=%lld, cash=%f",
1821 inet_ntostring(stIter->first.ip).c_str(),
1823 stIter->second.down,
1828 if( MysqlQuery((res+tempStr).c_str(),sock) )
1830 errorStr = "Couldn't insert data in WriteDetailedStat:\n";
1831 errorStr += mysql_error(sock);
1836 result=mysql_store_result(sock);
1838 mysql_free_result(result);
1845 //-----------------------------------------------------------------------------
1846 int MYSQL_STORE::AddMessage(STG_MSG * msg, const std::string & login) const
1850 gettimeofday(&tv, NULL);
1852 msg->header.id = static_cast<uint64_t>(tv.tv_sec) * 1000000 + static_cast<uint64_t>(tv.tv_usec);
1854 sprintf(qbuf,"INSERT INTO messages SET login='%s', id=%lld",
1856 static_cast<long long>(msg->header.id)
1859 if(MysqlSetQuery(qbuf))
1861 errorStr = "Couldn't add message:\n";
1862 //errorStr += mysql_error(sock);
1866 return EditMessage(*msg, login);
1868 //-----------------------------------------------------------------------------
1869 int MYSQL_STORE::EditMessage(const STG_MSG & msg, const std::string & login) const
1873 strprintf(&res,"UPDATE messages SET type=%d, lastSendTime=%u, creationTime=%u, "\
1874 "showTime=%u, stgRepeat=%d, repeatPeriod=%u, text='%s' "\
1875 "WHERE login='%s' AND id=%lld LIMIT 1",
1877 msg.header.lastSendTime,
1878 msg.header.creationTime,
1879 msg.header.showTime,
1881 msg.header.repeatPeriod,
1882 (ReplaceStr(msg.text,badSyms,repSym)).c_str(),
1887 if(MysqlSetQuery(res.c_str()))
1889 errorStr = "Couldn't edit message:\n";
1890 //errorStr += mysql_error(sock);
1896 //-----------------------------------------------------------------------------
1897 int MYSQL_STORE::GetMessage(uint64_t id, STG_MSG * msg, const std::string & login) const
1903 sprintf(qbuf,"SELECT * FROM messages WHERE login='%s' AND id=%llu LIMIT 1",
1904 login.c_str(), static_cast<unsigned long long>(id));
1906 if(MysqlGetQuery(qbuf,sock))
1908 errorStr = "Couldn't GetMessage:\n";
1909 errorStr += mysql_error(sock);
1914 if (!(res=mysql_store_result(sock)))
1916 errorStr = "Couldn't GetMessage:\n";
1917 errorStr += mysql_error(sock);
1922 row = mysql_fetch_row(res);
1924 if(row[2]&&str2x(row[2], msg->header.type))
1926 mysql_free_result(res);
1927 errorStr = "Invalid value in message header for user: " + login;
1932 if(row[3] && str2x(row[3], msg->header.lastSendTime))
1934 mysql_free_result(res);
1935 errorStr = "Invalid value in message header for user: " + login;
1940 if(row[4] && str2x(row[4], msg->header.creationTime))
1942 mysql_free_result(res);
1943 errorStr = "Invalid value in message header for user: " + login;
1948 if(row[5] && str2x(row[5], msg->header.showTime))
1950 mysql_free_result(res);
1951 errorStr = "Invalid value in message header for user: " + login;
1956 if(row[6] && str2x(row[6], msg->header.repeat))
1958 mysql_free_result(res);
1959 errorStr = "Invalid value in message header for user: " + login;
1964 if(row[7] && str2x(row[7], msg->header.repeatPeriod))
1966 mysql_free_result(res);
1967 errorStr = "Invalid value in message header for user: " + login;
1972 msg->header.id = id;
1975 mysql_free_result(res);
1979 //-----------------------------------------------------------------------------
1980 int MYSQL_STORE::DelMessage(uint64_t id, const std::string & login) const
1982 sprintf(qbuf,"DELETE FROM messages WHERE login='%s' AND id=%lld LIMIT 1",
1983 login.c_str(), static_cast<long long>(id));
1985 if(MysqlSetQuery(qbuf))
1987 errorStr = "Couldn't delete Message:\n";
1988 //errorStr += mysql_error(sock);
1994 //-----------------------------------------------------------------------------
1995 int MYSQL_STORE::GetMessageHdrs(std::vector<STG_MSG_HDR> * hdrsList, const std::string & login) const
2000 sprintf(qbuf,"SELECT * FROM messages WHERE login='%s'", login.c_str());
2002 if(MysqlGetQuery(qbuf,sock))
2004 errorStr = "Couldn't GetMessageHdrs:\n";
2005 errorStr += mysql_error(sock);
2010 if (!(res=mysql_store_result(sock)))
2012 errorStr = "Couldn't GetMessageHdrs:\n";
2013 errorStr += mysql_error(sock);
2019 my_ulonglong num_rows = mysql_num_rows(res);
2022 for (i = 0; i < num_rows; i++)
2024 row = mysql_fetch_row(res);
2025 if (str2x(row[1], id))
2030 if(str2x(row[2], hdr.type))
2034 if(str2x(row[3], hdr.lastSendTime))
2038 if(str2x(row[4], hdr.creationTime))
2042 if(str2x(row[5], hdr.showTime))
2046 if(str2x(row[6], hdr.repeat))
2050 if(str2x(row[7], hdr.repeatPeriod))
2054 hdrsList->push_back(hdr);
2057 mysql_free_result(res);
2061 //-----------------------------------------------------------------------------
2063 int MYSQL_STORE::MysqlSetQuery(const char * Query) const {
2066 int ret=MysqlGetQuery(Query,sock);
2070 //-----------------------------------------------------------------------------
2071 int MYSQL_STORE::MysqlGetQuery(const char * Query,MYSQL * & sock) const {
2072 if (!(sock=MysqlConnect())) {
2075 return MysqlQuery(Query,sock);
2077 //-----------------------------------------------------------------------------
2078 MYSQL * MYSQL_STORE::MysqlConnect() const {
2080 if ( !(sock=mysql_init(NULL)) ){
2081 errorStr= "mysql init susck\n";
2084 if (!(sock = mysql_real_connect(sock,storeSettings.GetDBHost().c_str(),
2085 storeSettings.GetDBUser().c_str(),storeSettings.GetDBPassword().c_str(),
2088 errorStr = "Couldn't connect to mysql engine! With error:\n";
2089 errorStr += mysql_error(sock);
2093 if(mysql_select_db(sock, storeSettings.GetDBName().c_str())){
2094 errorStr = "Database lost !\n";
2100 //-----------------------------------------------------------------------------