diff options
| author | Adam <Adam@anope.org> | 2010-08-15 01:45:38 -0400 |
|---|---|---|
| committer | Adam <Adam@anope.org> | 2010-08-15 01:45:38 -0400 |
| commit | a950ed8cabfeca55c909f02412b1788bd386dcff (patch) | |
| tree | cfa9a16c2385176490ea849f6a4041ee9456c8eb /modules/extra/mysql | |
| parent | 4d0a1aaabd861bb7cd1e378bd1e600af1d34d5d2 (diff) | |
Rewrote the MySQL API to use threads. This acts similar to before, but is faster. Removed db_mysql_execute for now.
Diffstat (limited to 'modules/extra/mysql')
| -rw-r--r-- | modules/extra/mysql/db_mysql.h | 212 | ||||
| -rw-r--r-- | modules/extra/mysql/db_mysql_execute.cpp | 159 | ||||
| -rw-r--r-- | modules/extra/mysql/db_mysql_read.cpp | 618 | ||||
| -rw-r--r-- | modules/extra/mysql/db_mysql_write.cpp | 1040 |
4 files changed, 0 insertions, 2029 deletions
diff --git a/modules/extra/mysql/db_mysql.h b/modules/extra/mysql/db_mysql.h deleted file mode 100644 index 011c2647d..000000000 --- a/modules/extra/mysql/db_mysql.h +++ /dev/null @@ -1,212 +0,0 @@ -#ifndef DB_MYSQL_H -#define DB_MYSQL_H - -#include "module.h" - -struct NickAliasFlagInfo -{ - std::string Name; - NickNameFlag Flag; -}; - -NickAliasFlagInfo NickAliasFlags[] = { - {"FORBIDDEN", NS_FORBIDDEN}, - {"NOEXPIRE", NS_NO_EXPIRE}, - {"", static_cast<NickNameFlag>(-1)} -}; - -struct NickCoreFlagInfo -{ - std::string Name; - NickCoreFlag Flag; -}; - -NickCoreFlagInfo NickCoreFlags[] = { - {"KILLPROTECT", NI_KILLPROTECT}, - {"SECURE", NI_SECURE}, - {"MSG", NI_MSG}, - {"MEMO_HARDMAX", NI_MEMO_HARDMAX}, - {"MEMO_SIGNON", NI_MEMO_SIGNON}, - {"MEMO_RECEIVE", NI_MEMO_RECEIVE}, - {"PRIVATE", NI_PRIVATE}, - {"HIDE_EMAIL", NI_HIDE_EMAIL}, - {"HIDE_MASK", NI_HIDE_MASK}, - {"HIDE_QUIT", NI_HIDE_QUIT}, - {"KILL_QUICK", NI_KILL_QUICK}, - {"KILL_IMMED", NI_KILL_IMMED}, - {"MEMO_MAIL", NI_MEMO_MAIL}, - {"HIDE_STATUS", NI_HIDE_STATUS}, - {"SUSPENDED", NI_SUSPENDED}, - {"AUTOOP", NI_AUTOOP}, - {"FORBIDDEN", NI_FORBIDDEN}, - {"", static_cast<NickCoreFlag>(-1)} -}; - -struct BotFlagInfo -{ - std::string Name; - BotServFlag Flag; -}; - -BotFlagInfo BotFlags[] = { - {"DONTKICKOPS", BS_DONTKICKOPS}, - {"DONTKICKVOICES", BS_DONTKICKVOICES}, - {"FANTASY", BS_FANTASY}, - {"SYMBIOSIS", BS_SYMBIOSIS}, - {"GREET", BS_GREET}, - {"NOBOT", BS_NOBOT}, - {"KICK_BOLDS", BS_KICK_BOLDS}, - {"KICK_COLORS", BS_KICK_COLORS}, - {"KICK_REVERSES", BS_KICK_REVERSES}, - {"KICK_UNDERLINES", BS_KICK_UNDERLINES}, - {"KICK_BADWORDS", BS_KICK_BADWORDS}, - {"KICK_CAPS", BS_KICK_CAPS}, - {"KICK_FLOOD", BS_KICK_FLOOD}, - {"KICK_REPEAT", BS_KICK_REPEAT}, - {"KICK_ITALICS", BS_KICK_ITALICS}, - {"", static_cast<BotServFlag>(-1)} -}; - -struct ChannelFlagInfo -{ - std::string Name; - ChannelInfoFlag Flag; -}; - -ChannelFlagInfo ChannelFlags[] = { - {"KEEPTOPIC", CI_KEEPTOPIC}, - {"SECUREOPS", CI_SECUREOPS}, - {"PRIVATE", CI_PRIVATE}, - {"TOPICLOCK", CI_TOPICLOCK}, - {"RESTRICTED", CI_RESTRICTED}, - {"PEACE", CI_PEACE}, - {"SECURE", CI_SECURE}, - {"FORBIDDEN", CI_FORBIDDEN}, - {"NO_EXPIRE", CI_NO_EXPIRE}, - {"MEMO_HARDMAX", CI_MEMO_HARDMAX}, - {"OPNOTICE", CI_OPNOTICE}, - {"SECUREFOUNDER", CI_SECUREFOUNDER}, - {"SIGNKICK", CI_SIGNKICK}, - {"SIGNKICK_LEVEL", CI_SIGNKICK_LEVEL}, - {"XOP", CI_XOP}, - {"SUSPENDED", CI_SUSPENDED}, - {"PERSIST", CI_PERSIST}, - {"", static_cast<ChannelInfoFlag>(-1)} -}; - -struct BotServFlagInfo -{ - std::string Name; - BotFlag Flag; -}; - -BotServFlagInfo BotServFlags[] = { - {"PRIVATE", BI_PRIVATE}, - {"", static_cast<BotFlag>(-1)} -}; - -struct MemoFlagInfo -{ - std::string Name; - MemoFlag Flag; -}; - -MemoFlagInfo MemoFlags[] = { - {"UNREAD", MF_UNREAD}, - {"RECEIPT", MF_RECEIPT}, - {"NOTIFYS", MF_NOTIFYS}, - {"", static_cast<MemoFlag>(-1)} -}; - -#define MYSQLPP_MYSQL_HEADERS_BURIED -#include <mysql++/mysql++.h> - -inline std::string SQLAssign(const mysqlpp::String &s) { return s.c_str(); } - -class DBMySQL; -static DBMySQL *me; - -bool ExecuteQuery(mysqlpp::Query &query) -{ - Alog(LOG_DEBUG) << "MySQL: " << query.str(); - - if (!query.execute()) - { - Alog() << "MySQL: error executing query: " << query.error(); - return false; - } - - return true; -} - -mysqlpp::StoreQueryResult StoreQuery(mysqlpp::Query &query) -{ - Alog(LOG_DEBUG) << "MySQL: " << query.str(); - - mysqlpp::StoreQueryResult result = query.store(); - if (!result) - Alog() << "MySQL: error executing query: " << query.error(); - return result; -} - -class DBMySQL : public Module -{ - private: - bool LoadConfig() - { - ConfigReader config; - - Database = config.ReadValue("mysql", "database", "anope", 0); - Server = config.ReadValue("mysql", "server", "127.0.0.1", 0); - SQLUser = config.ReadValue("mysql", "username", "anope", 0); - Password = config.ReadValue("mysql", "password", "", 0); - Port = config.ReadInteger("mysql", "port", "3306", 0, true); - Delay = config.ReadInteger("mysql", "updatedelay", "60", 0, true); - - return !Password.empty(); - } - - public: - mysqlpp::Connection *Con; - mysqlpp::NoExceptions *Ne; - - std::string Database; - std::string Server; - std::string SQLUser; - std::string Password; - unsigned int Port; - unsigned int Delay; - - DBMySQL(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator) - { - me = this; - - this->SetAuthor("Anope"); - this->SetType(DATABASE); - - if (!LoadConfig()) - throw ModuleException(Anope::string("Couldn't load config")); - - Con = new mysqlpp::Connection(false); - Ne = new mysqlpp::NoExceptions(Con); - if (!Con->connect(Database.c_str(), Server.c_str(), SQLUser.c_str(), Password.c_str(), Port)) - { - std::string Error = "MySQL: Error connecting to SQL server: "; - Error += Con->error(); - delete Con; - throw ModuleException(Anope::string(Error)); - } - - mysqlpp::Query query(Con); - query << "SET NAMES 'utf8'"; - ExecuteQuery(query); - } - - virtual ~DBMySQL() - { - delete Ne; - delete Con; - } -}; - -#endif // DB_MYSQL_H diff --git a/modules/extra/mysql/db_mysql_execute.cpp b/modules/extra/mysql/db_mysql_execute.cpp deleted file mode 100644 index 079e88147..000000000 --- a/modules/extra/mysql/db_mysql_execute.cpp +++ /dev/null @@ -1,159 +0,0 @@ -/* RequiredLibraries: mysqlpp */ - -#include "db_mysql.h" - -class FakeNickCore : public NickCore -{ - public: - FakeNickCore() : NickCore("-SQLUser") - { - NickCoreList.erase(this->display); - } - - ~FakeNickCore() - { - NickCoreList[this->display] = this; - Users.clear(); - } - - bool IsServicesOper() const { return true; } - bool HasCommand(const std::string &) const { return true; } - bool HasPriv(const std::string &) const { return true; } -} SQLCore; - -class FakeUser : public User -{ - public: - FakeUser() : User("-SQLUser", "") - { - this->SetIdent("SQL"); - this->host = sstrdup(Config.ServerName); - this->realname = sstrdup("Fake SQL User"); - this->hostip = sstrdup("255.255.255.255"); - this->vhost = NULL; - this->server = Me; - - UserListByNick.erase("-SQLUser"); - --usercnt; - } - - ~FakeUser() - { - UserListByNick["-SQLUser"] = this; - ++usercnt; - - nc = NULL; - } - - void SetNewNick(const std::string &newnick) { this->nick = newnick; } - - void SendMessage(const std::string &, const char *, ...) { } - void SendMessage(const std::string &, const std::string &) { } - - NickCore *Account() const { return nc; } - const bool IsIdentified(bool) const { return nc ? true : false; } - const bool IsRecognized(bool) const { return true; } -} SQLUser; - -class SQLTimer : public Timer -{ - public: - SQLTimer() : Timer(me->Delay, time(NULL), true) - { - mysqlpp::Query query(me->Con); - query << "TRUNCATE TABLE `anope_commands`"; - ExecuteQuery(query); - } - - void Tick(time_t) - { - mysqlpp::Query query(me->Con); - mysqlpp::StoreQueryResult qres; - - query << "SELECT * FROM `anope_commands`"; - qres = StoreQuery(query); - - if (qres && qres.num_rows()) - { - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - User *u; - NickAlias *na = NULL; - bool logout = false; - - /* If they want -SQLUser to execute the command, use it */ - if (qres[i]["nick"] == "-SQLUser") - { - u = &SQLUser; - u->SetNewNick("-SQLUser"); - u->Login(&SQLCore); - logout = true; - } - else - { - /* See if the nick they want to execute the command is registered */ - na = findnick(SQLAssign(qres[i]["nick"])); - if (na) - { - /* If it is and someone is online using that nick, use them */ - if (!na->nc->Users.empty()) - u = na->nc->Users.front(); - /* Make a fake nick and use that logged in as the nick we want to use */ - else - { - u = &SQLUser; - u->SetNewNick(SQLAssign(qres[i]["nick"])); - u->Login(na->nc); - logout = true; - } - } - else - { - /* Check if someone is online using the nick now */ - u = finduser(SQLAssign(qres[i]["nick"])); - /* If they arent make a fake user, and use them */ - if (!u) - { - u = &SQLUser; - u->SetNewNick(SQLAssign(qres[i]["nick"])); - u->Logout(); - logout = true; - } - } - } - - BotInfo *bi = findbot(SQLAssign(qres[i]["service"])); - if (!bi) - { - Alog() << "Warning: SQL command for unknown service " << qres[i]["service"]; - continue; - } - - mod_run_cmd(bi, u, qres[i]["command"].c_str()); - - if (logout) - u->Logout(); - } - - query << "TRUNCATE TABLE `anope_commands`"; - ExecuteQuery(query); - } - } -}; - -class DBMySQLExecute : public DBMySQL -{ - SQLTimer *_SQLTimer; - public: - DBMySQLExecute(const Anope::string &modname, const Anope::string &creator) : DBMySQL(modname, creator) - { - _SQLTimer = new SQLTimer(); - } - - ~DBMySQLExecute() - { - delete _SQLTimer; - } -}; - -MODULE_INIT(DBMySQLExecute) diff --git a/modules/extra/mysql/db_mysql_read.cpp b/modules/extra/mysql/db_mysql_read.cpp deleted file mode 100644 index ff608b700..000000000 --- a/modules/extra/mysql/db_mysql_read.cpp +++ /dev/null @@ -1,618 +0,0 @@ -/* RequiredLibraries: mysqlpp */ - -#include "db_mysql.h" - -static std::vector<std::string> MakeVector(std::string buf) -{ - std::string s; - spacesepstream sep(buf); - std::vector<std::string> params; - - while (sep.GetToken(s)) - { - if (s[0] == ':') - { - s.erase(s.begin()); - if (!s.empty() && !sep.StreamEnd()) - params.push_back(s + " " + sep.GetRemaining()); - else if (!s.empty()) - params.push_back(s); - } - else - params.push_back(s); - } - - return params; -} - -static void LoadDatabase() -{ - mysqlpp::Query query(me->Con); - mysqlpp::StoreQueryResult qres; - - query << "SELECT * FROM `anope_ns_core`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - NickCore *nc = new NickCore(SQLAssign(qres[i]["display"])); - nc->pass = SQLAssign(qres[i]["pass"]); - if (qres[i]["email"].size()) - nc->email = sstrdup(qres[i]["email"].c_str()); - if (qres[i]["greet"].size()) - nc->greet = sstrdup(qres[i]["greet"].c_str()); - if (qres[i]["icq"].size()) - nc->icq = atol(qres[i]["icq"].c_str()); - if (qres[i]["url"].size()) - nc->url = sstrdup(qres[i]["url"].c_str()); - - spacesepstream sep(SQLAssign(qres[i]["flags"])); - std::string buf; - while (sep.GetToken(buf)) - for (int j = 0; NickCoreFlags[j].Flag != -1; ++j) - if (NickCoreFlags[j].Name == buf) - nc->SetFlag(NickCoreFlags[j].Flag); - - nc->language = atoi(qres[i]["language"].c_str()); - nc->channelcount = atoi(qres[i]["channelcount"].c_str()); - nc->memos.memomax = atoi(qres[i]["memomax"].c_str()); - } - - query << "SELECT * FROM `anope_ns_access`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - NickCore *nc = findcore(qres[i]["display"].c_str()); - if (!nc) - { - Alog() << "MySQL: Got NickCore access entry for nonexistant core " << qres[i]["display"]; - continue; - } - - nc->AddAccess(SQLAssign(qres[i]["access"])); - } - - query << "SELECT * FROM `anope_ns_core_metadata`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - NickCore *nc = findcore(qres[i]["display"].c_str()); - if (!nc) - { - Alog() << "MySQL: Got NickCore access entry for nonexistant core " << qres[i]["display"]; - continue; - } - EventReturn MOD_RESULT; - std::vector<std::string> Params = MakeVector(SQLAssign(qres[i]["value"])); - FOREACH_RESULT(I_OnDatabaseReadMetadata, OnDatabaseReadMetadata(nc, SQLAssign(qres[i]["name"]), Params)); - } - - query << "SELECT * FROM `anope_ns_alias`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - NickCore *nc = findcore(qres[i]["display"].c_str()); - if (!nc) - { - Alog() << "MySQL: Got NickAlias for nick " << qres[i]["nick"] << " with nonexistant core " << qres[i]["display"]; - continue; - } - - NickAlias *na = new NickAlias(SQLAssign(qres[i]["nick"]), nc); - na->last_quit = sstrdup(qres[i]["last_quit"].c_str()); - na->last_realname = sstrdup(qres[i]["last_realname"].c_str()); - na->last_usermask = sstrdup(qres[i]["last_usermask"].c_str()); - na->time_registered = atol(qres[i]["time_registered"].c_str()); - na->last_seen = atol(qres[i]["last_seen"].c_str()); - - spacesepstream sep(SQLAssign(qres[i]["flags"])); - std::string buf; - while (sep.GetToken(buf)) - for (int j = 0; NickAliasFlags[j].Flag != -1; ++j) - if (NickAliasFlags[j].Name == buf) - na->SetFlag(NickAliasFlags[j].Flag); - } - - query << "SELECT * FROM `anope_ns_alias_metadata`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - NickAlias *na = findnick(SQLAssign(qres[i]["nick"])); - if (!na) - { - Alog() << "MySQL: Got metadata for nonexistant nick " << qres[i]["nick"]; - continue; - } - EventReturn MOD_RESULT; - std::vector<std::string> Params = MakeVector(SQLAssign(qres[i]["value"])); - FOREACH_RESULT(I_OnDatabaseReadMetadata, OnDatabaseReadMetadata(na, SQLAssign(qres[i]["name"]), Params)); - } - - query << "SELECT * FROM `anope_bs_core`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - BotInfo *bi = findbot(SQLAssign(qres[i]["nick"])); - if (!bi) - bi = new BotInfo(SQLAssign(qres[i]["nick"])); - bi->user = SQLAssign(qres[i]["user"]); - bi->host = SQLAssign(qres[i]["host"]); - bi->real = SQLAssign(qres[i]["rname"]); - - if (qres[i]["flags"].size()) - { - spacesepstream sep(SQLAssign(qres[i]["flags"])); - std::string buf; - while (sep.GetToken(buf)) - for (unsigned j = 0; BotServFlags[j].Flag != -1; ++j) - if (buf == BotServFlags[j].Name) - { - bi->SetFlag(BotServFlags[j].Flag); - break; - } - } - bi->created = atol(qres[i]["created"]); - bi->chancount = atol(qres[i]["chancount"]); - } - - query << "SELECT * FROM `anope_bs_info_metadata`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - BotInfo *bi = findbot(SQLAssign(qres[i]["botname"])); - if (!bi) - { - Alog() << "MySQL: BotInfo metadata for nonexistant bot " << qres[i]["botname"]; - continue; - } - - EventReturn MOD_RESULT; - std::vector<std::string> Params = MakeVector(SQLAssign(qres[i]["value"])); - FOREACH_RESULT(I_OnDatabaseReadMetadata, OnDatabaseReadMetadata(bi, SQLAssign(qres[i]["name"]), Params)); - } - - query << "SELECT * FROM `anope_cs_info`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - NickCore *nc; - if (qres[i]["founder"].size()) - { - nc = findcore(qres[i]["founder"].c_str()); - if (!nc) - { - Alog() << "MySQL: Channel " << qres[i]["name"] << " with nonexistant founder " << qres[i]["founder"]; - continue; - } - } - - ChannelInfo *ci = new ChannelInfo(SQLAssign(qres[i]["name"])); - ci->founder = nc; - if (qres[i]["successor"].size()) - ci->successor = findcore(qres[i]["successor"].c_str()); - ci->desc = sstrdup(qres[i]["descr"].c_str()); - if (qres[i]["url"].size()) - ci->url = sstrdup(qres[i]["url"].c_str()); - if (qres[i]["email"].size()) - ci->email = sstrdup(qres[i]["email"].c_str()); - ci->time_registered = atol(qres[i]["time_registered"]); - ci->last_used = atol(qres[i]["last_used"]); - if (qres[i]["last_topic"].size()) - ci->last_topic = sstrdup(qres[i]["last_topic"].c_str()); - if (qres[i]["last_topic_setter"].size()) - ci->last_topic_setter = SQLAssign(qres[i]["last_topic_setter"]); - if (qres[i]["last_topic_time"].size()) - ci->last_topic_time = atol(qres[i]["last_topic_time"].c_str()); - if (qres[i]["flags"].size()) - { - std::string buf; - spacesepstream sep(SQLAssign(qres[i]["flags"])); - while (sep.GetToken(buf)) - for (int j = 0; ChannelFlags[j].Flag != -1; ++j) - if (buf == ChannelFlags[j].Name) - { - ci->SetFlag(ChannelFlags[j].Flag); - break; - } - } - if (qres[i]["forbidby"].size()) - ci->forbidby = sstrdup(qres[i]["forbidby"].c_str()); - if (qres[i]["forbidreason"].size()) - ci->forbidreason = sstrdup(qres[i]["forbidreason"].c_str()); - ci->bantype = atoi(qres[i]["bantype"].c_str()); - if (qres[i]["mlock_on"].size()) - { - std::vector<Anope::string> modes; - std::string buf; - - spacesepstream sep(SQLAssign(qres[i]["mlock_on"])); - while (sep.GetToken(buf)) - modes.push_back(Anope::string(buf)); - - ci->Extend("db_mlock_modes_on", new ExtensibleItemRegular<std::vector<Anope::string> >(modes)); - } - if (qres[i]["mlock_off"].size()) - { - std::vector<Anope::string> modes; - std::string buf; - - spacesepstream sep(SQLAssign(qres[i]["mlock_off"])); - while (sep.GetToken(buf)) - modes.push_back(Anope::string(buf)); - - ci->Extend("db_mlock_modes_off", new ExtensibleItemRegular<std::vector<Anope::string> >(modes)); - } - if (qres[i]["mlock_params"].size()) - { - std::vector<std::pair<Anope::string, Anope::string> > mlp; - std::string buf, buf2; - - spacesepstream sep(SQLAssign(qres[i]["mlock_params"])); - - while (sep.GetToken(buf) && sep.GetToken(buf2)) - mlp.push_back(std::make_pair(Anope::string(buf), Anope::string(buf2))); - - ci->Extend("db_mlp", new ExtensibleItemRegular<std::vector<std::pair<Anope::string, Anope::string> > >(mlp)); - } - if (qres[i]["entry_message"].size()) - ci->entry_message = sstrdup(qres[i]["entry_message"].c_str()); - ci->memos.memomax = atoi(qres[i]["memomax"].c_str()); - if (qres[i]["botnick"].size()) - ci->bi = findbot(SQLAssign(qres[i]["botnick"])); - if (ci->bi) - { - if (qres[i]["botflags"].size()) - { - std::string buf; - spacesepstream sep(SQLAssign(qres[i]["botflags"])); - while (sep.GetToken(buf)) - for (int j = 0; BotFlags[j].Flag != -1; ++j) - if (buf == BotFlags[j].Name) - { - ci->botflags.SetFlag(BotFlags[j].Flag); - break; - } - } - } - if (qres[i]["capsmin"].size()) - ci->capsmin = atoi(qres[i]["capsmin"].c_str()); - if (qres[i]["capspercent"].size()) - ci->capspercent = atoi(qres[i]["capspercent"].c_str()); - if (qres[i]["floodlines"].size()) - ci->floodlines = atoi(qres[i]["floodlines"].c_str()); - if (qres[i]["floodsecs"].size()) - ci->floodsecs = atoi(qres[i]["floodsecs"].c_str()); - if (qres[i]["repeattimes"].size()) - ci->repeattimes = atoi(qres[i]["repeattimes"].c_str()); - } - - query << "SELECT * FROM `anope_cs_ttb"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - ChannelInfo *ci = cs_findchan(SQLAssign(qres[i]["channel"])); - if (!ci) - { - Alog() << "MySQL: Channel ttb for nonexistant channel " << qres[i]["channel"]; - continue; - } - - ci->ttb[atoi(qres[i]["ttb_id"].c_str())] = atoi(qres[i]["value"].c_str()); - } - - query << "SELECT * FROM `anope_bs_badwords`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - ChannelInfo *ci = cs_findchan(SQLAssign(qres[i]["channel"])); - if (!ci) - { - Alog() << "MySQL: Channel badwords entry for nonexistant channel " << qres[i]["channel"]; - continue; - } - - BadWordType BWTYPE = BW_ANY; - if (qres[i]["type"] == "SINGLE") - BWTYPE = BW_SINGLE; - else if (qres[i]["type"] == "START") - BWTYPE = BW_START; - else if (qres[i]["type"] == "END") - BWTYPE = BW_END; - ci->AddBadWord(SQLAssign(qres[i]["word"]), BWTYPE); - } - - query << "SELECT * FROM `anope_cs_access`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - ChannelInfo *ci = cs_findchan(SQLAssign(qres[i]["channel"])); - if (!ci) - { - Alog() << "MySQL: Channel access entry for nonexistant channel " << qres[i]["channel"]; - continue; - } - NickCore *nc = findcore(qres[i]["display"]); - if (!nc) - { - Alog() << "MySQL: Channel access entry for " << ci->name << " with nonexistant nick " << qres[i]["display"]; - continue; - } - - ci->AddAccess(nc, atoi(qres[i]["level"]), SQLAssign(qres[i]["creator"]), atol(qres[i]["last_seen"])); - } - - query << "SELECT * FROM `anope_cs_akick`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - ChannelInfo *ci = cs_findchan(SQLAssign(qres[i]["channel"])); - if (!ci) - { - Alog() << "MySQL: Channel akick entry for nonexistant channel " << qres[i]["channel"]; - continue; - } - NickCore *nc = NULL; - spacesepstream sep(qres[i]["flags"]); - std::string flag, mask; - bool stuck = false; - while (sep.GetToken(flag)) - if (flag == "ISNICK") - nc = findcore(qres[i]["mask"]); - else if (flag == "STUCK") - stuck = true; - AutoKick *ak; - if (nc) - ak = ci->AddAkick(SQLAssign(qres[i]["creator"]), nc, SQLAssign(qres[i]["reason"]), atol(qres[i]["created"].c_str()), atol(qres[i]["last_used"].c_str())); - else - ak = ci->AddAkick(SQLAssign(qres[i]["creator"]), SQLAssign(qres[i]["mask"]), SQLAssign(qres[i]["reason"]), atol(qres[i]["created"].c_str()), atol(qres[i]["last_used"].c_str())); - if (stuck) - ak->SetFlag(AK_STUCK); - if (nc) - ak->SetFlag(AK_ISNICK); - } - - query << "SELECT * FROM `anope_cs_levels`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - ChannelInfo *ci = cs_findchan(SQLAssign(qres[i]["channel"])); - if (!ci) - { - Alog() << "MySQL: Channel level entry for nonexistant channel " << qres[i]["channel"]; - continue; - } - ci->levels[atoi(qres[i]["position"])] = atoi(qres[i]["level"]); - } - - query << "SELECT * FROM `anope_cs_info_metadata`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - ChannelInfo *ci = cs_findchan(SQLAssign(qres[i]["channel"])); - if (!ci) - { - Alog() << "MySQL: Channel metadata for nonexistant channel " << qres[i]["channel"]; - continue; - } - - EventReturn MOD_RESULT; - std::vector<std::string> Params = MakeVector(SQLAssign(qres[i]["value"])); - FOREACH_RESULT(I_OnDatabaseReadMetadata, OnDatabaseReadMetadata(ci, SQLAssign(qres[i]["name"]), Params)); - } - - query << "SELECT * FROM `anope_ns_request`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - NickRequest *nr = new NickRequest(qres[i]["nick"].c_str()); - nr->passcode = SQLAssign(qres[i]["passcode"]); - nr->password = SQLAssign(qres[i]["password"]); - nr->email = sstrdup(qres[i]["email"].c_str()); - nr->requested = atol(qres[i]["requested"].c_str()); - } - - EventReturn MOD_RESULT; - query << "SELECT * FROM `anope_extra`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - std::vector<std::string> params = MakeVector(SQLAssign(qres[i]["data"])); - FOREACH_RESULT(I_OnDatabaseRead, OnDatabaseRead(params)); - } - - query << "SELECT * FROM `anope_ns_core_metadata`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - NickCore *nc = findcore(qres[i]["nick"].c_str()); - if (nc) - { - std::vector<std::string> params = MakeVector(SQLAssign(qres[i]["value"])); - FOREACH_RESULT(I_OnDatabaseReadMetadata, OnDatabaseReadMetadata(nc, SQLAssign(qres[i]["name"]), params)); - } - } - - query << "SELECT * FROM `anope_ns_alias_metadata`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - NickAlias *na = findnick(SQLAssign(qres[i]["nick"])); - if (na) - { - std::vector<std::string> params = MakeVector(SQLAssign(qres[i]["value"])); - FOREACH_RESULT(I_OnDatabaseReadMetadata, OnDatabaseReadMetadata(na, SQLAssign(qres[i]["name"]), params)); - } - } - - query << "SELECT * FROM `anope_cs_info_metadata`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - ChannelInfo *ci = cs_findchan(SQLAssign(qres[i]["channel"])); - if (ci) - { - std::vector<std::string> params = MakeVector(SQLAssign(qres[i]["value"])); - FOREACH_RESULT(I_OnDatabaseReadMetadata, OnDatabaseReadMetadata(ci, SQLAssign(qres[i]["name"]), params)); - } - } - - query << "SELECT * FROM `anope_ms_info`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - MemoInfo *mi = NULL; - if (qres[i]["serv"] == "NICK") - { - NickCore *nc = findcore(qres[i]["receiver"].c_str()); - if (nc) - mi = &nc->memos; - } - else if (qres[i]["serv"] == "CHAN") - { - ChannelInfo *ci = cs_findchan(SQLAssign(qres[i]["receiver"])); - if (ci) - mi = &ci->memos; - } - if (mi) - { - Memo *m = new Memo(); - mi->memos.push_back(m); - m->sender = SQLAssign(qres[i]["sender"]); - if (mi->memos.size() > 1) - { - m->number = mi->memos[mi->memos.size() - 2]->number + 1; - if (m->number < 1) - { - for (unsigned j = 0; j < mi->memos.size(); ++j) - mi->memos[j]->number = j + 1; - } - } - else - m->number = 1; - m->time = atol(qres[i]["time"].c_str()); - m->text = sstrdup(qres[i]["text"].c_str()); - - if (qres[i]["flags"].size()) - { - spacesepstream sep(SQLAssign(qres[i]["flags"])); - std::string buf; - while (sep.GetToken(buf)) - for (unsigned j = 0; MemoFlags[j].Flag != -1; ++j) - if (MemoFlags[j].Name == buf) - m->SetFlag(MemoFlags[j].Flag); - } - } - } - - query << "SELECT * FROM `anope_os_akills`"; - qres = StoreQuery(query); - - if (qres && SGLine) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - ci::string user = qres[i]["user"].c_str(); - ci::string host = qres[i]["host"].c_str(); - ci::string by = qres[i]["xby"].c_str(); - std::string reason = SQLAssign(qres[i]["reason"]); - time_t seton = atol(qres[i]["seton"].c_str()); - time_t expires = atol(qres[i]["expire"].c_str()); - - XLine *x = SGLine->Add(NULL, NULL, user + "@" + host, expires, reason); - if (x) - { - x->By = by; - x->Created = seton; - } - } - - query << "SELECT * FROM `anope_os_xlines`"; - qres = StoreQuery(query); - - if (qres) - for (size_t i = 0, end = qres.num_rows(); i < end; ++i) - { - ci::string mask = qres[i]["mask"].c_str(); - ci::string by = qres[i]["xby"].c_str(); - std::string reason = SQLAssign(qres[i]["reason"]); - time_t seton = atol(qres[i]["seton"].c_str()); - time_t expires = atol(qres[i]["expires"].c_str()); - - XLine *x = NULL; - if (qres[i]["type"] == "SNLINE" && SNLine) - x = SNLine->Add(NULL, NULL, mask, expires, reason); - else if (qres[i]["type"] == "SQLINE" && SQLine) - x = SQLine->Add(NULL, NULL, mask, expires, reason); - else if (qres[i]["type"] == "SZLINE" && SZLine) - x = SZLine->Add(NULL, NULL,mask, expires, reason); - if (x) - { - x->By = by; - x->Created = seton; - } - } -} - -class DBMySQLRead : public DBMySQL -{ - public: - DBMySQLRead(const Anope::string &modname, const Anope::string &creator) : DBMySQL(modname, creator) - { - Implementation i[] = { I_OnLoadDatabase }; - ModuleManager::Attach(i, this, 1); - } - - ~DBMySQLRead() - { - } - - EventReturn OnLoadDatabase() - { - LoadDatabase(); - - /* No need to ever reload this again, although this should never be triggered again */ - ModuleManager::Detach(I_OnLoadDatabase, this); - - return EVENT_STOP; - } -}; - -MODULE_INIT(DBMySQLRead) diff --git a/modules/extra/mysql/db_mysql_write.cpp b/modules/extra/mysql/db_mysql_write.cpp deleted file mode 100644 index 5d2ef2a78..000000000 --- a/modules/extra/mysql/db_mysql_write.cpp +++ /dev/null @@ -1,1040 +0,0 @@ -/* RequiredLibraries: mysqlpp */ - -#include "db_mysql.h" - -static std::string BuildFlagsList(ChannelInfo *ci) -{ - std::string ret; - - for (int i = 0; ChannelFlags[i].Flag != -1; ++i) - if (ci->HasFlag(ChannelFlags[i].Flag)) - ret += " " + ChannelFlags[i].Name; - - if (!ret.empty()) - ret.erase(ret.begin()); - - return ret; -} - -static std::string BuildFlagsList(NickAlias *na) -{ - std::string ret; - - for (int i = 0; NickAliasFlags[i].Flag != -1; ++i) - if (na->HasFlag(NickAliasFlags[i].Flag)) - ret += " " + NickAliasFlags[i].Name; - - if (!ret.empty()) - ret.erase(ret.begin()); - - return ret; -} - -static std::string BuildFlagsList(NickCore *nc) -{ - std::string ret; - - for (int i = 0; NickCoreFlags[i].Flag != -1; ++i) - if (nc->HasFlag(NickCoreFlags[i].Flag)) - ret += " " + NickCoreFlags[i].Name; - - if (!ret.empty()) - ret.erase(ret.begin()); - - return ret; -} - -static std::string BuildFlagsList(Memo *m) -{ - std::string ret; - - for (int i = 0; MemoFlags[i].Flag != -1; ++i) - if (m->HasFlag(MemoFlags[i].Flag)) - ret += " " + MemoFlags[i].Name; - - if (!ret.empty()) - ret.erase(ret.begin()); - - return ret; -} - -static std::string MakeMLock(ChannelInfo *ci, bool status) -{ - std::string ret; - - for (std::list<Mode *>::iterator it = ModeManager::Modes.begin(), it_end = ModeManager::Modes.end(); it != it_end; ++it) - { - if ((*it)->Class == MC_CHANNEL) - { - ChannelMode *cm = debug_cast<ChannelMode *>(*it); - - if (ci->HasMLock(cm->Name, status)) - ret += " " + cm->NameAsString; - } - } - - if (!ret.empty()) - ret.erase(ret.begin()); - - return ret; -} - -static inline std::string GetMLockOn(ChannelInfo *ci) -{ - return MakeMLock(ci, true); -} - -static inline std::string GetMLockOff(ChannelInfo *ci) -{ - return MakeMLock(ci, false); -} - -static std::string GetMLockParams(ChannelInfo *ci) -{ - std::string ret; - - for (std::list<Mode *>::iterator it = ModeManager::Modes.begin(), it_end = ModeManager::Modes.end(); it != it_end; ++it) - { - if ((*it)->Class == MC_CHANNEL) - { - ChannelMode *cm = debug_cast<ChannelMode *>(*it); - - std::string param; - if (ci->GetParam(cm->Name, param)) - ret += " " + cm->NameAsString + " " + param; - } - } - - if (!ret.empty()) - ret.erase(ret.begin()); - - return ret; -} - -static std::string GetBotFlags(Flags<BotServFlag>& Flags) -{ - std::string buf; - - for (int i = 0; BotFlags[i].Flag != -1; ++i) - if (Flags.HasFlag(BotFlags[i].Flag)) - buf += " " + BotFlags[i].Name; - - if (!buf.empty()) - buf.erase(buf.begin()); - - return buf; -} - -static std::string GetBotServFlags(BotInfo *bi) -{ - std::string buf; - - for (int i = 0; BotServFlags[i].Flag != -1; ++i) - if (bi->HasFlag(BotSer |
