diff options
author | Adam <Adam@anope.org> | 2013-03-16 20:08:39 -0500 |
---|---|---|
committer | Adam <Adam@anope.org> | 2013-03-16 20:08:39 -0500 |
commit | 810685cb739dc32690bd571492629293b4a0e1fd (patch) | |
tree | 64829c1d9ca668ed97b59cf18acd9bbca856783d /modules | |
parent | 1a0e6b0be3f901462d4376c882f1dc7304bedaf9 (diff) |
Have db_flatfile store object ids if they are set, even though it doesn't use them, so that if other database modules that use them are loaded they can keep track of objects properly
Diffstat (limited to 'modules')
-rw-r--r-- | modules/database/db_flatfile.cpp | 22 | ||||
-rw-r--r-- | modules/database/db_sql.cpp | 16 |
2 files changed, 30 insertions, 8 deletions
diff --git a/modules/database/db_flatfile.cpp b/modules/database/db_flatfile.cpp index 09fde3242..a7e65f1cb 100644 --- a/modules/database/db_flatfile.cpp +++ b/modules/database/db_flatfile.cpp @@ -36,11 +36,12 @@ class LoadData : public Serialize::Data { public: std::fstream *fs; + unsigned int id; std::map<Anope::string, Anope::string> data; std::stringstream ss; bool read; - LoadData() : fs(NULL), read(false) { } + LoadData() : fs(NULL), id(0), read(false) { } std::iostream& operator[](const Anope::string &key) anope_override { @@ -48,7 +49,17 @@ class LoadData : public Serialize::Data { for (Anope::string token; std::getline(*this->fs, token.str());) { - if (token.find("DATA ") != 0) + if (token.find("ID ") == 0) + { + try + { + this->id = convertTo<unsigned int>(token.substr(3)); + } + catch (const ConvertException &) { } + + continue; + } + else if (token.find("DATA ") != 0) break; size_t sp = token.find(' ', 5); // Skip DATA @@ -83,6 +94,7 @@ class LoadData : public Serialize::Data void Reset() { + id = 0; read = false; data.clear(); } @@ -225,7 +237,9 @@ class DBFlatFile : public Module, public Pipe fd.clear(); fd.seekg(pos[j]); - stype->Unserialize(NULL, ld); + Serializable *obj = stype->Unserialize(NULL, ld); + if (obj != NULL) + obj->id = ld.id; ld.Reset(); } } @@ -292,6 +306,8 @@ class DBFlatFile : public Module, public Pipe continue; *data.fs << "OBJECT " << s_type->GetName(); + if (base->id) + *data.fs << "\nID " << base->id; base->Serialize(data); *data.fs << "\nEND\n"; } diff --git a/modules/database/db_sql.cpp b/modules/database/db_sql.cpp index 3bb0efde2..ab6a1b259 100644 --- a/modules/database/db_sql.cpp +++ b/modules/database/db_sql.cpp @@ -63,6 +63,7 @@ class DBSQL : public Module, public Pipe bool shutting_down; bool loading_databases; bool loaded; + bool imported; void RunBackground(const Query &q, Interface *iface = NULL) { @@ -86,7 +87,7 @@ class DBSQL : public Module, public Pipe } public: - DBSQL(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, DATABASE), sql("", ""), sqlinterface(this), shutting_down(false), loading_databases(false), loaded(false) + DBSQL(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, DATABASE), sql("", ""), sqlinterface(this), shutting_down(false), loading_databases(false), loaded(false), imported(false) { this->SetAuthor("Anope"); @@ -121,17 +122,22 @@ class DBSQL : public Module, public Pipe this->RunBackground(create[i]); Query insert = this->sql->BuildInsert(this->prefix + s_type->GetName(), obj->id, data); - if (this->loaded) + if (this->imported) this->RunBackground(insert, new ResultSQLSQLInterface(this, obj)); else - /* If we aren't loading these objects then we are importing them, so don't do asynchronous - * queries in case for some reason the core has to shut down, it will cut short the import + { + /* On the first loop we may be importing objects from another database module, so don't do asynchronous + * queries in case the core has to shut down, it will cut short the import */ - this->sql->RunQuery(insert); + Result r = this->sql->RunQuery(insert); + if (r.GetID() > 0) + obj->id = r.GetID(); + } } } this->updated_items.clear(); + this->imported = true; } void OnReload() anope_override |