From 066e5b3fc08b6b85311e29aad6e78f12aba1a30e Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 4 Nov 2011 02:28:21 -0400 Subject: Delete all tables before flushing not just ones we know about --- modules/database/db_sql.cpp | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) (limited to 'modules/database/db_sql.cpp') diff --git a/modules/database/db_sql.cpp b/modules/database/db_sql.cpp index d411d8b6d..8b2b0e26d 100644 --- a/modules/database/db_sql.cpp +++ b/modules/database/db_sql.cpp @@ -49,13 +49,26 @@ class DBSQL : public Module this->RunBackground(query); } - void AlterTable(const Anope::string &table, const SerializableBase::serialized_data &oldd, const SerializableBase::serialized_data &newd) + void DropAll() + { + SQLResult r = this->sql->RunQuery(this->sql->GetTables()); + for (int i = 0; i < r.Rows(); ++i) + { + const std::map &map = r.Row(i); + for (std::map::const_iterator it = map.begin(); it != map.end(); ++it) + this->DropTable(it->second); + } + } + + void AlterTable(const Anope::string &table, std::set &data, const SerializableBase::serialized_data &newd) { for (SerializableBase::serialized_data::const_iterator it = newd.begin(), it_end = newd.end(); it != it_end; ++it) { - if (oldd.count(it->first) > 0) + if (data.count(it->first) > 0) continue; + data.insert(it->first); + Anope::string query_text = "ALTER TABLE `" + table + "` ADD `" + it->first + "` "; if (it->second.getType() == Serialize::DT_INT) query_text += "int(11)"; @@ -116,7 +129,9 @@ class DBSQL : public Module if (serialized_items == NULL) return EVENT_CONTINUE; - std::map table_layout; + this->DropAll(); + + std::map > table_layout; for (std::list::iterator it = serialized_items->begin(), it_end = serialized_items->end(); it != it_end; ++it) { SerializableBase *base = *it; @@ -125,14 +140,16 @@ class DBSQL : public Module if (data.empty()) continue; - if (table_layout.count(base->serialize_name()) == 0) + std::set &layout = table_layout[base->serialize_name()]; + if (layout.empty()) { - this->DropTable(base->serialize_name()); this->RunBackground(this->sql->CreateTable(base->serialize_name(), data)); + + for (SerializableBase::serialized_data::iterator it2 = data.begin(), it2_end = data.end(); it2 != it2_end; ++it2) + layout.insert(it2->first); } else - this->AlterTable(base->serialize_name(), table_layout[base->serialize_name()], data); - table_layout[base->serialize_name()] = data; + this->AlterTable(base->serialize_name(), layout, data); this->Insert(base->serialize_name(), data); } -- cgit