diff options
-rw-r--r-- | include/base.h | 15 | ||||
-rw-r--r-- | include/serialize.h | 5 | ||||
-rw-r--r-- | modules/database/db_sql.cpp | 2 | ||||
-rw-r--r-- | modules/database/db_sql_live.cpp | 3 | ||||
-rw-r--r-- | src/serialize.cpp | 12 |
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 */ |