summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2013-02-14 20:57:40 -0500
committerAdam <Adam@anope.org>2013-02-14 20:57:40 -0500
commit391f2822c8f6da7d6ffa8114817a8baf2aa265d5 (patch)
treeb8c9c566481fe13083d12f0d750ba30ca3e87456
parentf0875c5d85e0a6c1d878aed01673c0d909a8d488 (diff)
This Serialize::Destroy method isn't actually needed anymore. Fixes weirdness from a few Serializable items we had on the stack. Added a comment about why operator< in Reference fails.
-rw-r--r--include/base.h15
-rw-r--r--include/serialize.h5
-rw-r--r--modules/database/db_sql.cpp2
-rw-r--r--modules/database/db_sql_live.cpp3
-rw-r--r--src/serialize.cpp12
5 files changed, 16 insertions, 21 deletions
diff --git a/include/base.h b/include/base.h
index fdd8f3f5c..727918af3 100644
--- a/include/base.h
+++ b/include/base.h
@@ -121,10 +121,17 @@ class Reference : public ReferenceBase
return NULL;
}
- inline bool operator<(const Reference<T> &other) const
- {
- return this < &other;
- }
+ /** Note that we can't have an operator< that returns this->ref < other.ref
+ * because this function is used to sort objects in containers (such as set
+ * or map), and if the references themselves can change if the object they
+ * refer to is invalidated or changed, then this screws with the order that
+ * the objects would be in the container without properly adjusting the
+ * container, resulting in weird stuff.
+ *
+ * As such, we don't allow storing references in containers that require
+ * operator<, because they would not be able to compare what the references
+ * actually referred to.
+ */
inline bool operator==(const Reference<T> &other)
{
diff --git a/include/serialize.h b/include/serialize.h
index b136412e4..b74257f73 100644
--- a/include/serialize.h
+++ b/include/serialize.h
@@ -83,11 +83,6 @@ class CoreExport Serializable : public virtual Base
/* Unique ID (per type, not globally) for this object */
unsigned int id;
- /* Destroys this object. This is effectively the same thing as
- * delete, however it properly cleans up after this object.
- */
- void Destroy();
-
/** Marks the object as potentially being updated "soon".
*/
void QueueUpdate();
diff --git a/modules/database/db_sql.cpp b/modules/database/db_sql.cpp
index 170f7a5c8..74166d6dc 100644
--- a/modules/database/db_sql.cpp
+++ b/modules/database/db_sql.cpp
@@ -185,7 +185,7 @@ class DBSQL : public Module, public Pipe
void OnSerializableDestruct(Serializable *obj) anope_override
{
Serialize::Type *s_type = obj->GetSerializableType();
- if (s_type)
+ if (s_type && obj->id > 0)
this->RunBackground("DELETE FROM `" + this->prefix + s_type->GetName() + "` WHERE `id` = " + stringify(obj->id));
this->updated_items.erase(obj);
}
diff --git a/modules/database/db_sql_live.cpp b/modules/database/db_sql_live.cpp
index 9a769a35c..ae37a7a9b 100644
--- a/modules/database/db_sql_live.cpp
+++ b/modules/database/db_sql_live.cpp
@@ -156,7 +156,8 @@ class DBMySQL : public Module, public Pipe
Serialize::Type *s_type = obj->GetSerializableType();
if (s_type)
{
- this->RunQuery("DELETE FROM `" + this->prefix + s_type->GetName() + "` WHERE `id` = " + stringify(obj->id));
+ if (obj->id > 0)
+ this->RunQuery("DELETE FROM `" + this->prefix + s_type->GetName() + "` WHERE `id` = " + stringify(obj->id));
s_type->objects.erase(obj->id);
}
this->updated_items.erase(obj);
diff --git a/src/serialize.cpp b/src/serialize.cpp
index 4f0068a48..8828965b5 100644
--- a/src/serialize.cpp
+++ b/src/serialize.cpp
@@ -67,6 +67,8 @@ Serializable::Serializable(const Serializable &other) : last_commit(NULL), last_
Serializable::~Serializable()
{
+ FOREACH_MOD(I_OnSerializableDestruct, OnSerializableDestruct(this));
+
SerializableItems->erase(this->s_iter);
delete last_commit;
}
@@ -76,16 +78,6 @@ Serializable &Serializable::operator=(const Serializable &)
return *this;
}
-void Serializable::Destroy()
-{
- if (!this)
- return;
-
- FOREACH_MOD(I_OnSerializableDestruct, OnSerializableDestruct(this));
-
- delete this;
-}
-
void Serializable::QueueUpdate()
{
/* Schedule updater */