summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2012-05-08 18:04:49 -0400
committerAdam <Adam@anope.org>2012-05-08 18:04:49 -0400
commit820e4edc2bfc132a526e5c6db51d94f10ddc4542 (patch)
treea6daebbc9958f312475699a061a99ee533cd0858
parent25586f32467334f0366ce0b8bfe16e2d5e005851 (diff)
Fixed some 100% cpu bugs with the new SQL stuff, and fixed sqlite+db_sql_live
-rw-r--r--include/serialize.h4
-rw-r--r--modules/database/db_sql.cpp4
-rw-r--r--modules/database/db_sql_live.cpp17
-rw-r--r--modules/extra/m_mysql.cpp7
-rw-r--r--modules/extra/m_sqlite.cpp7
-rw-r--r--modules/extra/sql.h2
-rw-r--r--src/serialize.cpp14
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;