mirror of
https://github.com/anope/anope.git
synced 2026-07-03 09:13:12 +02:00
Bug #1445 - Empty out columns in SQL we have no data for on
insert. This is caused from serialize() only setting a key on certain conditions and otherwise doing nothing at all.
This commit is contained in:
@@ -105,7 +105,7 @@ class DBSQL : public Module, public Pipe
|
||||
continue;
|
||||
obj->UpdateCache();
|
||||
|
||||
const Serialize::Data &data = obj->serialize();
|
||||
Serialize::Data data = obj->serialize();
|
||||
|
||||
std::vector<SQLQuery> create = this->sql->CreateTable(this->prefix + obj->serialize_name(), data);
|
||||
for (unsigned i = 0; i < create.size(); ++i)
|
||||
|
||||
@@ -95,7 +95,7 @@ class DBMySQL : public Module, public Pipe
|
||||
continue;
|
||||
obj->UpdateCache();
|
||||
|
||||
const Serialize::Data &data = obj->serialize();
|
||||
Serialize::Data data = obj->serialize();
|
||||
|
||||
std::vector<SQLQuery> create = this->SQL->CreateTable(this->prefix + obj->serialize_name(), data);
|
||||
for (unsigned i = 0; i < create.size(); ++i)
|
||||
|
||||
@@ -126,7 +126,7 @@ class MySQLService : public SQLProvider
|
||||
|
||||
std::vector<SQLQuery> CreateTable(const Anope::string &table, const Serialize::Data &data) anope_override;
|
||||
|
||||
SQLQuery BuildInsert(const Anope::string &table, unsigned int id, const Serialize::Data &data);
|
||||
SQLQuery BuildInsert(const Anope::string &table, unsigned int id, Serialize::Data &data);
|
||||
|
||||
SQLQuery GetTables(const Anope::string &prefix) anope_override;
|
||||
|
||||
@@ -408,8 +408,14 @@ std::vector<SQLQuery> MySQLService::CreateTable(const Anope::string &table, cons
|
||||
return queries;
|
||||
}
|
||||
|
||||
SQLQuery MySQLService::BuildInsert(const Anope::string &table, unsigned int id, const Serialize::Data &data)
|
||||
SQLQuery MySQLService::BuildInsert(const Anope::string &table, unsigned int id, Serialize::Data &data)
|
||||
{
|
||||
/* Empty columns not present in the data set */
|
||||
const std::set<Anope::string> &known_cols = this->active_schema[table];
|
||||
for (std::set<Anope::string>::iterator it = known_cols.begin(), it_end = known_cols.end(); it != it_end; ++it)
|
||||
if (*it != "id" && data.count(*it) == 0)
|
||||
data[*it] << "";
|
||||
|
||||
Anope::string query_text = "INSERT INTO `" + table + "` (`id`";
|
||||
for (Serialize::Data::const_iterator it = data.begin(), it_end = data.end(); it != it_end; ++it)
|
||||
query_text += ",`" + it->first + "`";
|
||||
|
||||
@@ -48,7 +48,7 @@ class SQLiteService : public SQLProvider
|
||||
|
||||
std::vector<SQLQuery> CreateTable(const Anope::string &table, const Serialize::Data &data) anope_override;
|
||||
|
||||
SQLQuery BuildInsert(const Anope::string &table, unsigned int id, const Serialize::Data &data);
|
||||
SQLQuery BuildInsert(const Anope::string &table, unsigned int id, Serialize::Data &data);
|
||||
|
||||
SQLQuery GetTables(const Anope::string &prefix);
|
||||
|
||||
@@ -253,8 +253,14 @@ std::vector<SQLQuery> SQLiteService::CreateTable(const Anope::string &table, con
|
||||
return queries;
|
||||
}
|
||||
|
||||
SQLQuery SQLiteService::BuildInsert(const Anope::string &table, unsigned int id, const Serialize::Data &data)
|
||||
SQLQuery SQLiteService::BuildInsert(const Anope::string &table, unsigned int id, Serialize::Data &data)
|
||||
{
|
||||
/* Empty columns not present in the data set */
|
||||
const std::set<Anope::string> &known_cols = this->active_schema[table];
|
||||
for (std::set<Anope::string>::iterator it = known_cols.begin(), it_end = known_cols.end(); it != it_end; ++it)
|
||||
if (*it != "id" && data.count(*it) == 0)
|
||||
data[*it] << "";
|
||||
|
||||
Anope::string query_text = "REPLACE INTO `" + table + "` (";
|
||||
if (id > 0)
|
||||
query_text += "`id`,";
|
||||
|
||||
+1
-1
@@ -130,7 +130,7 @@ class SQLProvider : public Service
|
||||
|
||||
virtual std::vector<SQLQuery> CreateTable(const Anope::string &table, const Serialize::Data &data) = 0;
|
||||
|
||||
virtual SQLQuery BuildInsert(const Anope::string &table, unsigned int id, const Serialize::Data &data) = 0;
|
||||
virtual SQLQuery BuildInsert(const Anope::string &table, unsigned int id, Serialize::Data &data) = 0;
|
||||
|
||||
virtual SQLQuery GetTables(const Anope::string &prefix) = 0;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user