diff options
author | Adam <Adam@anope.org> | 2012-05-08 18:04:49 -0400 |
---|---|---|
committer | Adam <Adam@anope.org> | 2012-05-08 18:04:49 -0400 |
commit | 820e4edc2bfc132a526e5c6db51d94f10ddc4542 (patch) | |
tree | a6daebbc9958f312475699a061a99ee533cd0858 | |
parent | 25586f32467334f0366ce0b8bfe16e2d5e005851 (diff) |
Fixed some 100% cpu bugs with the new SQL stuff, and fixed sqlite+db_sql_live
-rw-r--r-- | include/serialize.h | 4 | ||||
-rw-r--r-- | modules/database/db_sql.cpp | 4 | ||||
-rw-r--r-- | modules/database/db_sql_live.cpp | 17 | ||||
-rw-r--r-- | modules/extra/m_mysql.cpp | 7 | ||||
-rw-r--r-- | modules/extra/m_sqlite.cpp | 7 | ||||
-rw-r--r-- | modules/extra/sql.h | 2 | ||||
-rw-r--r-- | src/serialize.cpp | 14 |
7 files changed, 41 insertions, 14 deletions
diff --git a/include/serialize.h b/include/serialize.h index 82287d5ab..441c4da8c 100644 --- a/include/serialize.h +++ b/include/serialize.h @@ -70,6 +70,7 @@ class CoreExport Serializable : public virtual Base private: std::list<Serializable *>::iterator s_iter; Serialize::Data last_commit; + time_t last_commit_time; protected: Serializable(); @@ -89,6 +90,9 @@ class CoreExport Serializable : public virtual Base bool IsCached(); void UpdateCache(); + bool IsTSCached(); + void UpdateTS(); + virtual const Anope::string serialize_name() const = 0; virtual Serialize::Data serialize() const = 0; diff --git a/modules/database/db_sql.cpp b/modules/database/db_sql.cpp index 9702bd400..ef272c3f0 100644 --- a/modules/database/db_sql.cpp +++ b/modules/database/db_sql.cpp @@ -109,7 +109,6 @@ class DBSQL : public Module, public Pipe 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); this->RunBackground(insert, new ResultSQLSQLInterface(this, obj)); } @@ -179,6 +178,9 @@ class DBSQL : public Module, public Pipe void OnSerializableUpdate(Serializable *obj) anope_override { + if (obj->IsTSCached()) + return; + obj->UpdateTS(); this->updated_items.insert(obj); this->Notify(); } diff --git a/modules/database/db_sql_live.cpp b/modules/database/db_sql_live.cpp index 5ab04618e..1f2b9851c 100644 --- a/modules/database/db_sql_live.cpp +++ b/modules/database/db_sql_live.cpp @@ -59,9 +59,9 @@ class DBMySQL : public Module, public Pipe { SQLResult res = SQL->RunQuery(query); if (!res.GetError().empty()) - Log(LOG_DEBUG) << "SQlive got error " << res.GetError() << " for " + res.finished_query; + Log(LOG_DEBUG) << "SQL-live got error " << res.GetError() << " for " + res.finished_query; else - Log(LOG_DEBUG) << "SQLive got " << res.Rows() << " rows for " << res.finished_query; + Log(LOG_DEBUG) << "SQL-live got " << res.Rows() << " rows for " << res.finished_query; return res; } throw SQLException("No SQL!"); @@ -95,11 +95,6 @@ class DBMySQL : public Module, public Pipe continue; obj->UpdateCache(); - static std::set<Serializable *> working_objects; // XXX - if (working_objects.count(obj)) - continue; - working_objects.insert(obj); - const Serialize::Data &data = obj->serialize(); std::vector<SQLQuery> create = this->SQL->CreateTable(this->prefix + obj->serialize_name(), data); @@ -112,8 +107,6 @@ class DBMySQL : public Module, public Pipe SerializeType *stype = SerializeType::Find(obj->serialize_name()); if (stype) stype->objects.erase(obj->id); - - working_objects.erase(obj); } } @@ -198,8 +191,7 @@ class DBMySQL : public Module, public Pipe if (!this->CheckInit() || obj->GetTimestamp() == Anope::CurTime) return; - SQLQuery query("SELECT * FROM `" + this->prefix + obj->GetName() + "` WHERE (`timestamp` > FROM_UNIXTIME(@ts@) OR `timestamp` IS NULL)"); - query.setValue("ts", obj->GetTimestamp()); + SQLQuery query("SELECT * FROM `" + this->prefix + obj->GetName() + "` WHERE (`timestamp` > " + this->SQL->FromUnixtime(obj->GetTimestamp()) + " OR `timestamp` IS NULL)"); obj->UpdateTimestamp(); @@ -263,6 +255,9 @@ class DBMySQL : public Module, public Pipe void OnSerializableUpdate(Serializable *obj) anope_override { + if (obj->IsTSCached()) + return; + obj->UpdateTS(); this->updated_items.insert(obj); this->Notify(); } diff --git a/modules/extra/m_mysql.cpp b/modules/extra/m_mysql.cpp index 2edf21745..fef040336 100644 --- a/modules/extra/m_mysql.cpp +++ b/modules/extra/m_mysql.cpp @@ -135,6 +135,8 @@ class MySQLService : public SQLProvider bool CheckConnection(); Anope::string BuildQuery(const SQLQuery &q); + + Anope::string FromUnixtime(time_t); }; /** The SQL thread used to execute queries @@ -481,6 +483,11 @@ Anope::string MySQLService::BuildQuery(const SQLQuery &q) return real_query; } +Anope::string MySQLService::FromUnixtime(time_t t) +{ + return "FROM_UNIXTIME(" + stringify(t) + ")"; +} + void DispatcherThread::Run() { this->Lock(); diff --git a/modules/extra/m_sqlite.cpp b/modules/extra/m_sqlite.cpp index 4cf66cb5f..136e9d0dc 100644 --- a/modules/extra/m_sqlite.cpp +++ b/modules/extra/m_sqlite.cpp @@ -53,6 +53,8 @@ class SQLiteService : public SQLProvider SQLQuery GetTables(const Anope::string &prefix); Anope::string BuildQuery(const SQLQuery &q); + + Anope::string FromUnixtime(time_t); }; class ModuleSQLite : public Module @@ -297,5 +299,10 @@ Anope::string SQLiteService::BuildQuery(const SQLQuery &q) return real_query; } +Anope::string SQLiteService::FromUnixtime(time_t t) +{ + return "datetime('" + stringify(t) + "', 'unixepoch')"; +} + MODULE_INIT(ModuleSQLite) diff --git a/modules/extra/sql.h b/modules/extra/sql.h index 03c3c7694..62d7b73c0 100644 --- a/modules/extra/sql.h +++ b/modules/extra/sql.h @@ -132,5 +132,7 @@ class SQLProvider : public Service virtual SQLQuery BuildInsert(const Anope::string &table, unsigned int id, const Serialize::Data &data) = 0; virtual SQLQuery GetTables(const Anope::string &prefix) = 0; + + virtual Anope::string FromUnixtime(time_t) = 0; }; diff --git a/src/serialize.cpp b/src/serialize.cpp index 9ff3fca1d..7bcf12283 100644 --- a/src/serialize.cpp +++ b/src/serialize.cpp @@ -70,7 +70,7 @@ unsigned stringstream::getMax() const return this->_max; } -Serializable::Serializable() : id(0) +Serializable::Serializable() : last_commit_time(0), id(0) { if (serializable_items == NULL) serializable_items = new std::list<Serializable *>(); @@ -82,7 +82,7 @@ Serializable::Serializable() : id(0) FOREACH_MOD(I_OnSerializableConstruct, OnSerializableConstruct(this)); } -Serializable::Serializable(const Serializable &) : id(0) +Serializable::Serializable(const Serializable &) : last_commit_time(0), id(0) { serializable_items->push_back(this); this->s_iter = serializable_items->end(); @@ -126,6 +126,16 @@ void Serializable::UpdateCache() this->last_commit = this->serialize(); } +bool Serializable::IsTSCached() +{ + return this->last_commit_time == Anope::CurTime; +} + +void Serializable::UpdateTS() +{ + this->last_commit_time = Anope::CurTime; +} + const std::list<Serializable *> &Serializable::GetItems() { return *serializable_items; |