diff options
33 files changed, 164 insertions, 189 deletions
diff --git a/include/access.h b/include/access.h index b29572dfc..558dbeb5c 100644 --- a/include/access.h +++ b/include/access.h @@ -73,7 +73,6 @@ class CoreExport ChanAccess : public Serializable ChanAccess(AccessProvider *p); virtual ~ChanAccess(); - const Anope::string serialize_name() const anope_override; Serialize::Data serialize() const anope_override; static Serializable* unserialize(Serializable *obj, Serialize::Data &); diff --git a/include/account.h b/include/account.h index ff9c70727..8b4920fe4 100644 --- a/include/account.h +++ b/include/account.h @@ -134,7 +134,6 @@ class CoreExport NickAlias : public Extensible, public Flags<NickNameFlag, NS_EN time_t last_seen; /* When it was seen online for the last time */ serialize_obj<NickCore> nc; /* I'm an alias of this */ - const Anope::string serialize_name() const anope_override; Serialize::Data serialize() const anope_override; static Serializable* unserialize(Serializable *obj, Serialize::Data &); @@ -218,7 +217,6 @@ class CoreExport NickCore : public Extensible, public Flags<NickCoreFlag, NI_END time_t lastmail; /* Last time this nick record got a mail */ std::list<serialize_obj<NickAlias> > aliases; /* List of aliases */ - const Anope::string serialize_name() const anope_override; Serialize::Data serialize() const anope_override; static Serializable* unserialize(Serializable *obj, Serialize::Data &); diff --git a/include/bots.h b/include/bots.h index 521ab8c03..fa3053b57 100644 --- a/include/bots.h +++ b/include/bots.h @@ -62,7 +62,6 @@ class CoreExport BotInfo : public User, public Flags<BotFlag, BI_END>, public Se */ virtual ~BotInfo(); - const Anope::string serialize_name() const; Serialize::Data serialize() const; static Serializable* unserialize(Serializable *obj, Serialize::Data &); diff --git a/include/memo.h b/include/memo.h index 8ece00d6a..1879f89b3 100644 --- a/include/memo.h +++ b/include/memo.h @@ -38,7 +38,6 @@ class CoreExport Memo : public Flags<MemoFlag>, public Serializable public: Memo(); - const Anope::string serialize_name() const anope_override; Serialize::Data serialize() const anope_override; static Serializable* unserialize(Serializable *obj, Serialize::Data &); diff --git a/include/oper.h b/include/oper.h index d388c4339..6a18d3e2b 100644 --- a/include/oper.h +++ b/include/oper.h @@ -40,7 +40,6 @@ class CoreExport XLine : public Serializable bool HasNickOrReal() const; bool IsRegex() const; - const Anope::string serialize_name() const anope_override; Serialize::Data serialize() const anope_override; static Serializable* unserialize(Serializable *obj, Serialize::Data &data); }; diff --git a/include/regchannel.h b/include/regchannel.h index b22ebf677..0f5bb022a 100644 --- a/include/regchannel.h +++ b/include/regchannel.h @@ -95,7 +95,7 @@ struct CoreExport BadWord : Serializable Anope::string word; BadWordType type; - const Anope::string serialize_name() const anope_override; + BadWord() : Serializable("BadWord") { } Serialize::Data serialize() const anope_override; static Serializable* unserialize(Serializable *obj, Serialize::Data &); }; @@ -125,7 +125,6 @@ class CoreExport AutoKick : public Flags<AutoKickFlag>, public Serializable time_t addtime; time_t last_used; - const Anope::string serialize_name() const anope_override; Serialize::Data serialize() const anope_override; static Serializable* unserialize(Serializable *obj, Serialize::Data &); }; @@ -142,7 +141,6 @@ struct CoreExport ModeLock : Serializable ModeLock(ChannelInfo *ch, bool s, ChannelModeName n, const Anope::string &p, const Anope::string &se = "", time_t c = Anope::CurTime); - const Anope::string serialize_name() const anope_override; Serialize::Data serialize() const anope_override; static Serializable* unserialize(Serializable *obj, Serialize::Data &); }; @@ -160,7 +158,7 @@ struct CoreExport LogSetting : Serializable Anope::string creator; time_t created; - const Anope::string serialize_name() const anope_override; + LogSetting() : Serializable("LogSetting") { } Serialize::Data serialize() const anope_override; static Serializable* unserialize(Serializable *obj, Serialize::Data &); }; @@ -219,7 +217,6 @@ class CoreExport ChannelInfo : public Extensible, public Flags<ChannelInfoFlag, int16_t floodlines, floodsecs; /* For FLOOD kicker */ int16_t repeattimes; /* For REPEAT kicker */ - const Anope::string serialize_name() const anope_override; Serialize::Data serialize() const anope_override; static Serializable* unserialize(Serializable *obj, Serialize::Data &); diff --git a/include/serialize.h b/include/serialize.h index 67eb6b8ce..fd8e925ab 100644 --- a/include/serialize.h +++ b/include/serialize.h @@ -62,18 +62,22 @@ namespace Serialize extern void RegisterTypes(); +class SerializeType; + class CoreExport Serializable : public virtual Base { private: static std::list<Serializable *> *serializable_items; - + SerializeType *s_type; private: - std::list<Serializable *>::iterator s_iter; + std::list<Serializable *>::iterator s_iter; // Iterator into serializable_items + Serialize::Data last_commit; time_t last_commit_time; - protected: Serializable(); + protected: + Serializable(const Anope::string &serialize_type); Serializable(const Serializable &); virtual ~Serializable(); @@ -93,7 +97,8 @@ class CoreExport Serializable : public virtual Base bool IsTSCached(); void UpdateTS(); - virtual const Anope::string serialize_name() const = 0; + SerializeType* GetSerializableType() const; + virtual Serialize::Data serialize() const = 0; static const std::list<Serializable *> &GetItems(); @@ -108,12 +113,19 @@ class CoreExport SerializeType Anope::string name; unserialize_func unserialize; + Module *owner; + time_t timestamp; public: std::map<unsigned int, Serializable *> objects; - SerializeType(const Anope::string &n, unserialize_func f); + /** Creates a new serializable type + * @param n Type name + * @param f Func to unserialize objects + * @param owner Owner of this type. Leave NULL for the core. + */ + SerializeType(const Anope::string &n, unserialize_func f, Module *owner = NULL); ~SerializeType(); const Anope::string &GetName(); @@ -125,6 +137,8 @@ class CoreExport SerializeType time_t GetTimestamp() const; void UpdateTimestamp(); + Module* GetOwner() const; + static SerializeType *Find(const Anope::string &name); static const std::vector<Anope::string> &GetTypeOrder(); diff --git a/modules/commands/cs_entrymsg.cpp b/modules/commands/cs_entrymsg.cpp index e5b8d2221..1fce5fac0 100644 --- a/modules/commands/cs_entrymsg.cpp +++ b/modules/commands/cs_entrymsg.cpp @@ -20,7 +20,7 @@ struct EntryMsg : Serializable Anope::string message; time_t when; - EntryMsg(ChannelInfo *c, const Anope::string &cname, const Anope::string &cmessage, time_t ct = Anope::CurTime) + EntryMsg(ChannelInfo *c, const Anope::string &cname, const Anope::string &cmessage, time_t ct = Anope::CurTime) : Serializable("EntryMsg") { this->ci = c; this->creator = cname; @@ -28,11 +28,6 @@ struct EntryMsg : Serializable this->when = ct; } - const Anope::string serialize_name() const anope_override - { - return "EntryMsg"; - } - Serialize::Data serialize() const anope_override { Serialize::Data data; diff --git a/modules/commands/cs_seen.cpp b/modules/commands/cs_seen.cpp index ce88efa44..8ae12ba7e 100644 --- a/modules/commands/cs_seen.cpp +++ b/modules/commands/cs_seen.cpp @@ -33,15 +33,10 @@ struct SeenInfo : Serializable Anope::string message; // for part/kick/quit time_t last; // the time when the user was last seen - SeenInfo() + SeenInfo() : Serializable("SeenInfo") { } - const Anope::string serialize_name() const anope_override - { - return "SeenInfo"; - } - Serialize::Data serialize() const anope_override { Serialize::Data data; diff --git a/modules/commands/cs_set_misc.cpp b/modules/commands/cs_set_misc.cpp index 9b8879bbd..251a2b480 100644 --- a/modules/commands/cs_set_misc.cpp +++ b/modules/commands/cs_set_misc.cpp @@ -18,15 +18,10 @@ struct CSMiscData : ExtensibleItem, Serializable Anope::string name; Anope::string data; - CSMiscData(ChannelInfo *c, const Anope::string &n, const Anope::string &d) : ci(c), name(n), data(d) + CSMiscData(ChannelInfo *c, const Anope::string &n, const Anope::string &d) : Serializable("CSMiscData"), ci(c), name(n), data(d) { } - const Anope::string serialize_name() const anope_override - { - return "CSMiscData"; - } - Serialize::Data serialize() const anope_override { Serialize::Data sdata; diff --git a/modules/commands/cs_suspend.cpp b/modules/commands/cs_suspend.cpp index e7969c926..9cb829ad1 100644 --- a/modules/commands/cs_suspend.cpp +++ b/modules/commands/cs_suspend.cpp @@ -18,15 +18,10 @@ struct ChanSuspend : ExtensibleItem, Serializable Anope::string chan; time_t when; - ChanSuspend() + ChanSuspend() : Serializable("ChanSuspend") { } - const Anope::string serialize_name() const - { - return "ChanSuspend"; - } - Serialize::Data serialize() const anope_override { Serialize::Data sd; diff --git a/modules/commands/hs_request.cpp b/modules/commands/hs_request.cpp index 94b181f51..8a9de386b 100644 --- a/modules/commands/hs_request.cpp +++ b/modules/commands/hs_request.cpp @@ -30,10 +30,7 @@ struct HostRequest : ExtensibleItem, Serializable Anope::string host; time_t time; - const Anope::string serialize_name() const anope_override - { - return "HostRequest"; - } + HostRequest() : Serializable("HostRequest") { } Serialize::Data serialize() const anope_override { diff --git a/modules/commands/ns_ajoin.cpp b/modules/commands/ns_ajoin.cpp index 5a33fb7db..d3b2cadb8 100644 --- a/modules/commands/ns_ajoin.cpp +++ b/modules/commands/ns_ajoin.cpp @@ -26,10 +26,7 @@ struct AJoinEntry : Serializable Anope::string channel; Anope::string key; - const Anope::string serialize_name() const anope_override - { - return "AJoinEntry"; - } + AJoinEntry() : Serializable("AJoinEntry") { } Serialize::Data serialize() const anope_override { diff --git a/modules/commands/ns_set_misc.cpp b/modules/commands/ns_set_misc.cpp index c4c7b4ae3..0b7011892 100644 --- a/modules/commands/ns_set_misc.cpp +++ b/modules/commands/ns_set_misc.cpp @@ -19,15 +19,10 @@ struct NSMiscData : ExtensibleItem, Serializable Anope::string name; Anope::string data; - NSMiscData(NickCore *ncore, const Anope::string &n, const Anope::string &d) : nc(ncore), name(n), data(d) + NSMiscData(NickCore *ncore, const Anope::string &n, const Anope::string &d) : Serializable("NSMiscData"), nc(ncore), name(n), data(d) { } - const Anope::string serialize_name() const anope_override - { - return "NSMiscData"; - } - Serialize::Data serialize() const anope_override { Serialize::Data sdata; diff --git a/modules/commands/ns_suspend.cpp b/modules/commands/ns_suspend.cpp index dd3da66f6..6b316379e 100644 --- a/modules/commands/ns_suspend.cpp +++ b/modules/commands/ns_suspend.cpp @@ -18,15 +18,10 @@ struct NickSuspend : ExtensibleItem, Serializable Anope::string nick; time_t when; - NickSuspend() + NickSuspend() : Serializable("NickSuspend") { } - const Anope::string serialize_name() const - { - return "NickSuspend"; - } - Serialize::Data serialize() const anope_override { Serialize::Data sd; diff --git a/modules/commands/os_forbid.h b/modules/commands/os_forbid.h index dcc5a9d6e..f79b63616 100644 --- a/modules/commands/os_forbid.h +++ b/modules/commands/os_forbid.h @@ -18,7 +18,7 @@ struct ForbidData : Serializable time_t expires; ForbidType type; - const Anope::string serialize_name() const anope_override { return "ForbidData"; } + ForbidData() : Serializable("ForbidData") { } Serialize::Data serialize() const anope_override; static Serializable* unserialize(Serializable *obj, Serialize::Data &data); }; diff --git a/modules/commands/os_ignore.h b/modules/commands/os_ignore.h index 7c9bf3db5..38042a72d 100644 --- a/modules/commands/os_ignore.h +++ b/modules/commands/os_ignore.h @@ -17,7 +17,7 @@ struct IgnoreData : Serializable Anope::string reason; time_t time; /* When do we stop ignoring them? */ - const Anope::string serialize_name() const anope_override { return "IgnoreData"; } + IgnoreData() : Serializable("IgnoreData") { } Serialize::Data serialize() const anope_override; static Serializable* unserialize(Serializable *obj, Serialize::Data &data); }; diff --git a/modules/commands/os_news.h b/modules/commands/os_news.h index e2ad1fc4f..426121fb7 100644 --- a/modules/commands/os_news.h +++ b/modules/commands/os_news.h @@ -22,7 +22,7 @@ struct NewsItem : Serializable Anope::string who; time_t time; - const Anope::string serialize_name() const anope_override { return "NewsItem"; } + NewsItem() : Serializable("NewsItem") { } Serialize::Data serialize() const anope_override; static Serializable* unserialize(Serializable *obj, Serialize::Data &data); }; diff --git a/modules/commands/os_oper.cpp b/modules/commands/os_oper.cpp index 528ff7382..e2e7b4ab3 100644 --- a/modules/commands/os_oper.cpp +++ b/modules/commands/os_oper.cpp @@ -15,12 +15,7 @@ struct MyOper : Oper, Serializable { - MyOper(const Anope::string &n, OperType *o) : Oper(n, o) { } - - const Anope::string serialize_name() const anope_override - { - return "Oper"; - } + MyOper(const Anope::string &n, OperType *o) : Oper(n, o), Serializable("Oper") { } Serialize::Data serialize() const anope_override { diff --git a/modules/commands/os_session.h b/modules/commands/os_session.h index aa32d9d58..ee37a7594 100644 --- a/modules/commands/os_session.h +++ b/modules/commands/os_session.h @@ -19,7 +19,7 @@ struct Exception : Serializable time_t time; /* When this exception was added */ time_t expires; /* Time when it expires. 0 == no expiry */ - const Anope::string serialize_name() const anope_override { return "Exception"; } + Exception() : Serializable("Exception") { } Serialize::Data serialize() const anope_override; static Serializable* unserialize(Serializable *obj, Serialize::Data &data); }; diff --git a/modules/commands/os_stats.cpp b/modules/commands/os_stats.cpp index dd5bf9ee0..a418396bd 100644 --- a/modules/commands/os_stats.cpp +++ b/modules/commands/os_stats.cpp @@ -15,10 +15,7 @@ struct Stats : Serializable { - const Anope::string serialize_name() const - { - return "Stats"; - } + Stats() : Serializable("Stats") { } Serialize::Data serialize() const anope_override { diff --git a/modules/database/db_flatfile.cpp b/modules/database/db_flatfile.cpp index a4ab5ce9a..4649a3666 100644 --- a/modules/database/db_flatfile.cpp +++ b/modules/database/db_flatfile.cpp @@ -82,42 +82,58 @@ class DBFlatFile : public Module EventReturn OnLoadDatabase() anope_override { - std::fstream db; - db.open(DatabaseFile.c_str(), std::ios_base::in); + std::map<Module *, std::fstream *> databases; + databases[NULL] = new std::fstream(DatabaseFile.c_str(), std::ios_base::in); - if (!db.is_open()) + if (!databases[NULL]->is_open()) { + delete databases[NULL]; Log() << "Unable to open " << DatabaseFile << " for reading!"; return EVENT_CONTINUE; } - SerializeType *st = NULL; - Serialize::Data data; - std::multimap<SerializeType *, Serialize::Data> objects; - for (Anope::string buf, token; std::getline(db, buf.str());) - { - spacesepstream sep(buf); - - if (!sep.GetToken(token)) - continue; + const std::vector<Anope::string> type_order = SerializeType::GetTypeOrder(); - if (token == "OBJECT" && sep.GetToken(token)) + for (unsigned i = 0; i < type_order.size(); ++i) + { + SerializeType *stype = SerializeType::Find(type_order[i]); + if (stype && !databases.count(stype->GetOwner())) { - st = SerializeType::Find(token); - data.clear(); + Anope::string db_name = db_dir + "/module_" + stype->GetOwner()->name + ".db"; + databases[stype->GetOwner()] = new std::fstream(db_name.c_str(), std::ios_base::in); } - else if (token == "DATA" && st != NULL && sep.GetToken(token)) - data[token] << sep.GetRemaining(); - else if (token == "END" && st != NULL) - { - objects.insert(std::make_pair(st, data)); + } - st = NULL; - data.clear(); + std::multimap<SerializeType *, Serialize::Data> objects; + for (std::map<Module *, std::fstream *>::iterator it = databases.begin(), it_end = databases.end(); it != it_end; ++it) + { + std::fstream *db = it->second; + SerializeType *st = NULL; + Serialize::Data data; + for (Anope::string buf, token; std::getline(*db, buf.str());) + { + spacesepstream sep(buf); + + if (!sep.GetToken(token)) + continue; + + if (token == "OBJECT" && sep.GetToken(token)) + { + st = SerializeType::Find(token); + data.clear(); + } + else if (token == "DATA" && st != NULL && sep.GetToken(token)) + data[token] << sep.GetRemaining(); + else if (token == "END" && st != NULL) + { + objects.insert(std::make_pair(st, data)); + + st = NULL; + data.clear(); + } } } - const std::vector<Anope::string> type_order = SerializeType::GetTypeOrder(); for (unsigned i = 0; i < type_order.size(); ++i) { SerializeType *stype = SerializeType::Find(type_order[i]); @@ -129,7 +145,11 @@ class DBFlatFile : public Module it->first->Unserialize(NULL, it->second); } - db.close(); + for (std::map<Module *, std::fstream *>::iterator it = databases.begin(), it_end = databases.end(); it != it_end; ++it) + { + it->second->close(); + delete it->second; + } return EVENT_STOP; } @@ -143,9 +163,11 @@ class DBFlatFile : public Module if (IsFile(DatabaseFile)) rename(DatabaseFile.c_str(), tmp_db.c_str()); - std::fstream db(DatabaseFile.c_str(), std::ios_base::out | std::ios_base::trunc); - if (!db.is_open()) + std::map<Module *, std::fstream *> databases; + databases[NULL] = new std::fstream(DatabaseFile.c_str(), std::ios_base::out | std::ios_base::trunc); + if (!databases[NULL]->is_open()) { + delete databases[NULL]; Log() << "Unable to open " << DatabaseFile << " for writing"; if (IsFile(tmp_db)) rename(tmp_db.c_str(), DatabaseFile.c_str()); @@ -156,19 +178,30 @@ class DBFlatFile : public Module for (std::list<Serializable *>::const_iterator it = items.begin(), it_end = items.end(); it != it_end; ++it) { Serializable *base = *it; + SerializeType *s_type = base->GetSerializableType(); + + if (!s_type) + continue; + Serialize::Data data = base->serialize(); + + if (!databases.count(s_type->GetOwner())) + { + Anope::string db_name = db_dir + "/module_" + s_type->GetOwner()->name + ".db"; + databases[s_type->GetOwner()] = new std::fstream(db_name.c_str(), std::ios_base::out | std::ios_base::trunc); + } + std::fstream *fd = databases[s_type->GetOwner()]; - db << "OBJECT " << base->serialize_name() << "\n"; + *fd << "OBJECT " << s_type->GetName() << "\n"; for (Serialize::Data::iterator dit = data.begin(), dit_end = data.end(); dit != dit_end; ++dit) - db << "DATA " << dit->first << " " << dit->second.astr() << "\n"; - db << "END\n"; + *fd << "DATA " << dit->first << " " << dit->second.astr() << "\n"; + *fd << "END\n"; } - db.close(); - - if (db.good() == false) + if (databases[NULL]->good() == false) { Log() << "Unable to write database"; + databases[NULL]->close(); if (!Config->NoBackupOkay) quitting = true; if (IsFile(tmp_db)) @@ -177,6 +210,12 @@ class DBFlatFile : public Module else unlink(tmp_db.c_str()); + for (std::map<Module *, std::fstream *>::iterator it = databases.begin(), it_end = databases.end(); it != it_end; ++it) + { + it->second->close(); + delete it->second; + } + return EVENT_CONTINUE; } }; diff --git a/modules/database/db_sql.cpp b/modules/database/db_sql.cpp index c07bdaa59..acc59b668 100644 --- a/modules/database/db_sql.cpp +++ b/modules/database/db_sql.cpp @@ -105,13 +105,17 @@ class DBSQL : public Module, public Pipe continue; obj->UpdateCache(); + SerializeType *s_type = obj->GetSerializableType(); + if (!s_type) + continue; + Serialize::Data data = obj->serialize(); - std::vector<SQLQuery> create = this->sql->CreateTable(this->prefix + obj->serialize_name(), data); + std::vector<SQLQuery> create = this->sql->CreateTable(this->prefix + s_type->GetName(), data); for (unsigned i = 0; i < create.size(); ++i) this->RunBackground(create[i]); - SQLQuery insert = this->sql->BuildInsert(this->prefix + obj->serialize_name(), obj->id, data); + SQLQuery insert = this->sql->BuildInsert(this->prefix + s_type->GetName(), obj->id, data); this->RunBackground(insert, new ResultSQLSQLInterface(this, obj)); } } @@ -188,7 +192,9 @@ class DBSQL : public Module, public Pipe void OnSerializableDestruct(Serializable *obj) anope_override { - this->RunBackground("DELETE FROM `" + this->prefix + obj->serialize_name() + "` WHERE `id` = " + stringify(obj->id)); + SerializeType *s_type = obj->GetSerializableType(); + if (s_type) + this->RunBackground("DELETE FROM `" + this->prefix + s_type->GetName() + "` WHERE `id` = " + stringify(obj->id)); } void OnSerializableUpdate(Serializable *obj) anope_override diff --git a/modules/database/db_sql_live.cpp b/modules/database/db_sql_live.cpp index 4dca16d26..2aa3b73e6 100644 --- a/modules/database/db_sql_live.cpp +++ b/modules/database/db_sql_live.cpp @@ -95,18 +95,20 @@ class DBMySQL : public Module, public Pipe continue; obj->UpdateCache(); + SerializeType *s_type = obj->GetSerializableType(); + if (!s_type) + continue; + Serialize::Data data = obj->serialize(); - std::vector<SQLQuery> create = this->SQL->CreateTable(this->prefix + obj->serialize_name(), data); + std::vector<SQLQuery> create = this->SQL->CreateTable(this->prefix + s_type->GetName(), data); for (unsigned i = 0; i < create.size(); ++i) this->RunQueryResult(create[i]); - SQLResult res = this->RunQueryResult(this->SQL->BuildInsert(this->prefix + obj->serialize_name(), obj->id, data)); + SQLResult res = this->RunQueryResult(this->SQL->BuildInsert(this->prefix + s_type->GetName(), obj->id, data)); if (res.GetID() > 0) obj->id = res.GetID(); - SerializeType *stype = SerializeType::Find(obj->serialize_name()); - if (stype) - stype->objects.erase(obj->id); + s_type->objects.erase(obj->id); } } @@ -144,15 +146,16 @@ class DBMySQL : public Module, public Pipe { if (!this->CheckInit()) return; - this->RunQuery("DELETE FROM `" + this->prefix + obj->serialize_name() + "` WHERE `id` = " + stringify(obj->id)); - SerializeType *stype = SerializeType::Find(obj->serialize_name()); - if (stype) - stype->objects.erase(obj->id); + SerializeType *s_type = obj->GetSerializableType(); + if (!s_type) + return; + this->RunQuery("DELETE FROM `" + this->prefix + s_type->GetName() + "` WHERE `id` = " + stringify(obj->id)); + s_type->objects.erase(obj->id); } void OnSerializePtrAssign(Serializable *obj) anope_override { - SerializeType *stype = SerializeType::Find(obj->serialize_name()); + SerializeType *stype = obj->GetSerializableType(); if (stype == NULL || !this->CheckInit() || stype->GetTimestamp() == Anope::CurTime) return; @@ -160,7 +163,7 @@ class DBMySQL : public Module, public Pipe return; obj->UpdateCache(); - SQLResult res = this->RunQueryResult("SELECT * FROM `" + this->prefix + obj->serialize_name() + "` WHERE `id` = " + stringify(obj->id)); + SQLResult res = this->RunQueryResult("SELECT * FROM `" + this->prefix + stype->GetName() + "` WHERE `id` = " + stringify(obj->id)); if (res.Rows() == 0) obj->destroy(); diff --git a/modules/protocol/inspircd11.cpp b/modules/protocol/inspircd11.cpp index 1eba8321f..e3c121f9c 100644 --- a/modules/protocol/inspircd11.cpp +++ b/modules/protocol/inspircd11.cpp @@ -875,7 +875,7 @@ struct IRCDMessageRSQuit : IRCDMessage else s = Server::Find(params[0]); - source.GetServer()->Delete(source.GetServer()->GetName() + " " + source.GetServer()->GetUplink()->GetName()); + source.GetServer()->Delete(source.GetServer()->GetName() + " " + (s ? s->GetName() : "<unknown>")); return true; } diff --git a/src/access.cpp b/src/access.cpp index 6ff842fd8..6b22ba871 100644 --- a/src/access.cpp +++ b/src/access.cpp @@ -90,7 +90,7 @@ const std::list<AccessProvider *>& AccessProvider::GetProviders() return providers; } -ChanAccess::ChanAccess(AccessProvider *p) : provider(p) +ChanAccess::ChanAccess(AccessProvider *p) : Serializable("ChanAccess"), provider(p) { } @@ -98,11 +98,6 @@ ChanAccess::~ChanAccess() { } -const Anope::string ChanAccess::serialize_name() const -{ - return "ChanAccess"; -} - Serialize::Data ChanAccess::serialize() const { Serialize::Data data; diff --git a/src/bots.cpp b/src/bots.cpp index ffe814351..38f37c41d 100644 --- a/src/bots.cpp +++ b/src/bots.cpp @@ -21,7 +21,7 @@ serialize_checker<botinfo_map> BotListByNick("BotInfo"); serialize_checker<botinfouid_map> BotListByUID("BotInfo"); -BotInfo::BotInfo(const Anope::string &nnick, const Anope::string &nuser, const Anope::string &nhost, const Anope::string &nreal, const Anope::string &bmodes) : User(nnick, nuser, nhost, "", "", Me, nreal, Anope::CurTime, "", ts6_uid_retrieve()), Flags<BotFlag, BI_END>(BotFlagString), botmodes(bmodes) +BotInfo::BotInfo(const Anope::string &nnick, const Anope::string &nuser, const Anope::string &nhost, const Anope::string &nreal, const Anope::string &bmodes) : User(nnick, nuser, nhost, "", "", Me, nreal, Anope::CurTime, "", ts6_uid_retrieve()), Flags<BotFlag, BI_END>(BotFlagString), Serializable("BotInfo"), botmodes(bmodes) { this->lastmsg = this->created = Anope::CurTime; this->introduced = false; @@ -71,11 +71,6 @@ BotInfo::~BotInfo() BotListByUID->erase(this->uid); } -const Anope::string BotInfo::serialize_name() const -{ - return "BotInfo"; -} - Serialize::Data BotInfo::serialize() const { Serialize::Data data; diff --git a/src/memoserv.cpp b/src/memoserv.cpp index c2e1de939..61ea73b72 100644 --- a/src/memoserv.cpp +++ b/src/memoserv.cpp @@ -18,12 +18,7 @@ #include "users.h" #include "account.h" -Memo::Memo() : Flags<MemoFlag>(MemoFlagStrings) { } - -const Anope::string Memo::serialize_name() const -{ - return "Memo"; -} +Memo::Memo() : Flags<MemoFlag>(MemoFlagStrings), Serializable("Memo") { } Serialize::Data Memo::serialize() const { diff --git a/src/nickalias.cpp b/src/nickalias.cpp index 6db16c44c..3137a827a 100644 --- a/src/nickalias.cpp +++ b/src/nickalias.cpp @@ -29,7 +29,7 @@ static nickservheld_map NickServHelds; * @param nick The nick * @param nickcore The nickcore for this nick */ -NickAlias::NickAlias(const Anope::string &nickname, NickCore* nickcore) : Flags<NickNameFlag, NS_END>(NickNameFlagStrings) +NickAlias::NickAlias(const Anope::string &nickname, NickCore* nickcore) : Flags<NickNameFlag, NS_END>(NickNameFlagStrings), Serializable("NickAlias") { if (nickname.empty()) throw CoreException("Empty nick passed to NickAlias constructor"); @@ -240,11 +240,6 @@ time_t NickAlias::GetVhostCreated() const return this->vhost_created; } -const Anope::string NickAlias::serialize_name() const -{ - return "NickAlias"; -} - Serialize::Data NickAlias::serialize() const { Serialize::Data data; diff --git a/src/nickcore.cpp b/src/nickcore.cpp index de64a7e9e..4c3a774b1 100644 --- a/src/nickcore.cpp +++ b/src/nickcore.cpp @@ -19,7 +19,7 @@ serialize_checker<nickcore_map> NickCoreList("NickCore"); /** Default constructor * @param display The display nick */ -NickCore::NickCore(const Anope::string &coredisplay) : Flags<NickCoreFlag, NI_END>(NickCoreFlagStrings) +NickCore::NickCore(const Anope::string &coredisplay) : Flags<NickCoreFlag, NI_END>(NickCoreFlagStrings), Serializable("NickCore") { if (coredisplay.empty()) throw CoreException("Empty display passed to NickCore constructor"); @@ -60,11 +60,6 @@ NickCore::~NickCore() } } -const Anope::string NickCore::serialize_name() const -{ - return "NickCore"; -} - Serialize::Data NickCore::serialize() const { Serialize::Data data; diff --git a/src/operserv.cpp b/src/operserv.cpp index de49c55b9..b339a697f 100644 --- a/src/operserv.cpp +++ b/src/operserv.cpp @@ -45,7 +45,7 @@ void XLine::InitRegex() } } -XLine::XLine(const Anope::string &mask, const Anope::string &reason, const Anope::string &uid) : Mask(mask), Created(0), Expires(0), Reason(reason), UID(uid) +XLine::XLine(const Anope::string &mask, const Anope::string &reason, const Anope::string &uid) : Serializable("XLine"), Mask(mask), Created(0), Expires(0), Reason(reason), UID(uid) { regex = NULL; manager = NULL; @@ -53,7 +53,7 @@ XLine::XLine(const Anope::string &mask, const Anope::string &reason, const Anope this->InitRegex(); } -XLine::XLine(const Anope::string &mask, const Anope::string &by, const time_t expires, const Anope::string &reason, const Anope::string &uid) : Mask(mask), By(by), Created(Anope::CurTime), Expires(expires), Reason(reason), UID(uid) +XLine::XLine(const Anope::string &mask, const Anope::string &by, const time_t expires, const Anope::string &reason, const Anope::string &uid) : Serializable("XLine"), Mask(mask), By(by), Created(Anope::CurTime), Expires(expires), Reason(reason), UID(uid) { regex = NULL; manager = NULL; @@ -138,11 +138,6 @@ bool XLine::IsRegex() const return !this->Mask.empty() && this->Mask[0] == '/' && this->Mask[this->Mask.length() - 1] == '/'; } -const Anope::string XLine::serialize_name() const -{ - return "XLine"; -} - Serialize::Data XLine::serialize() const { Serialize::Data data; diff --git a/src/regchannel.cpp b/src/regchannel.cpp index 99554a6d5..e0f371117 100644 --- a/src/regchannel.cpp +++ b/src/regchannel.cpp @@ -23,11 +23,6 @@ serialize_checker<registered_channel_map> RegisteredChannelList("ChannelInfo"); -const Anope::string BadWord::serialize_name() const -{ - return "BadWord"; -} - Serialize::Data BadWord::serialize() const { Serialize::Data data; @@ -61,13 +56,8 @@ Serializable* BadWord::unserialize(Serializable *obj, Serialize::Data &data) return bw; } -AutoKick::AutoKick() : Flags<AutoKickFlag>(AutoKickFlagString) -{ -} - -const Anope::string AutoKick::serialize_name() const +AutoKick::AutoKick() : Flags<AutoKickFlag>(AutoKickFlagString), Serializable("AutoKick") { - return "AutoKick"; } Serialize::Data AutoKick::serialize() const @@ -121,15 +111,10 @@ Serializable* AutoKick::unserialize(Serializable *obj, Serialize::Data &data) return ak; } -ModeLock::ModeLock(ChannelInfo *ch, bool s, ChannelModeName n, const Anope::string &p, const Anope::string &se, time_t c) : ci(ch), set(s), name(n), param(p), setter(se), created(c) +ModeLock::ModeLock(ChannelInfo *ch, bool s, ChannelModeName n, const Anope::string &p, const Anope::string &se, time_t c) : Serializable("ModeLock"), ci(ch), set(s), name(n), param(p), setter(se), created(c) { } -const Anope::string ModeLock::serialize_name() const -{ - return "ModeLock"; -} - Serialize::Data ModeLock::serialize() const { Serialize::Data data; @@ -192,11 +177,6 @@ Serializable* ModeLock::unserialize(Serializable *obj, Serialize::Data &data) } } -const Anope::string LogSetting::serialize_name() const -{ - return "LogSetting"; -} - Serialize::Data LogSetting::serialize() const { Serialize::Data data; @@ -246,7 +226,8 @@ Serializable* LogSetting::unserialize(Serializable *obj, Serialize::Data &data) /** Default constructor * @param chname The channel name */ -ChannelInfo::ChannelInfo(const Anope::string &chname) : Flags<ChannelInfoFlag, CI_END>(ChannelInfoFlagStrings), access("ChanAccess"), akick("AutoKick"), +ChannelInfo::ChannelInfo(const Anope::string &chname) : Flags<ChannelInfoFlag, CI_END>(ChannelInfoFlagStrings), Serializable("ChannelInfo"), + access("ChanAccess"), akick("AutoKick"), badwords("BadWord"), mode_locks("ModeLock"), log_settings("LogSetting"), botflags(BotServFlagStrings) { if (chname.empty()) @@ -291,7 +272,8 @@ ChannelInfo::ChannelInfo(const Anope::string &chname) : Flags<ChannelInfoFlag, C /** Copy constructor * @param ci The ChannelInfo to copy settings to */ -ChannelInfo::ChannelInfo(const ChannelInfo &ci) : Flags<ChannelInfoFlag, CI_END>(ChannelInfoFlagStrings), access("ChanAccess"), akick("AutoKick"), +ChannelInfo::ChannelInfo(const ChannelInfo &ci) : Flags<ChannelInfoFlag, CI_END>(ChannelInfoFlagStrings), Serializable("ChannelInfo"), + access("ChanAccess"), akick("AutoKick"), badwords("BadWord"), mode_locks("ModeLock"), log_settings("LogSetting"), botflags(BotServFlagStrings) { *this = ci; @@ -384,11 +366,6 @@ ChannelInfo::~ChannelInfo() --this->founder->channelcount; } -const Anope::string ChannelInfo::serialize_name() const -{ - return "ChannelInfo"; -} - Serialize::Data ChannelInfo::serialize() const { Serialize::Data data; diff --git a/src/serialize.cpp b/src/serialize.cpp index 7bcf12283..39d0cdd8f 100644 --- a/src/serialize.cpp +++ b/src/serialize.cpp @@ -72,22 +72,31 @@ unsigned stringstream::getMax() const Serializable::Serializable() : last_commit_time(0), id(0) { + throw CoreException("Default Serializable constructor?"); +} + +Serializable::Serializable(const Anope::string &serialize_type) : last_commit_time(0), id(0) +{ if (serializable_items == NULL) serializable_items = new std::list<Serializable *>(); serializable_items->push_back(this); + this->s_type = SerializeType::Find(serialize_type); + this->s_iter = serializable_items->end(); --this->s_iter; FOREACH_MOD(I_OnSerializableConstruct, OnSerializableConstruct(this)); } -Serializable::Serializable(const Serializable &) : last_commit_time(0), id(0) +Serializable::Serializable(const Serializable &other) : last_commit_time(0), id(0) { serializable_items->push_back(this); this->s_iter = serializable_items->end(); --this->s_iter; + this->s_type = other.s_type; + FOREACH_MOD(I_OnSerializableConstruct, OnSerializableConstruct(this)); } @@ -136,12 +145,17 @@ void Serializable::UpdateTS() this->last_commit_time = Anope::CurTime; } +SerializeType* Serializable::GetSerializableType() const +{ + return this->s_type; +} + const std::list<Serializable *> &Serializable::GetItems() { return *serializable_items; } -SerializeType::SerializeType(const Anope::string &n, unserialize_func f) : name(n), unserialize(f), timestamp(0) +SerializeType::SerializeType(const Anope::string &n, unserialize_func f, Module *o) : name(n), unserialize(f), owner(o), timestamp(0) { type_order.push_back(this->name); types[this->name] = this; @@ -180,6 +194,11 @@ void SerializeType::UpdateTimestamp() this->timestamp = Anope::CurTime; } +Module* SerializeType::GetOwner() const +{ + return this->owner; +} + SerializeType *SerializeType::Find(const Anope::string &name) { Anope::map<SerializeType *>::iterator it = types.find(name); |