Use a transaction around the DELETE + INSERT of the after_connection_commands

Otherwise we can imagine that two clients changing this value at the same
time would mix things up.

ref #3275
This commit is contained in:
louiz’
2018-03-18 02:54:34 +01:00
parent c8e96fc31b
commit 5af0a8040c
2 changed files with 31 additions and 1 deletions
+21
View File
@@ -106,6 +106,8 @@ void Database::set_after_connection_commands(const Database::IrcServerOptions& s
const auto id = server_options.col<Id>();
if (id == Id::unset_value)
return ;
Transaction transaction;
auto query = Database::after_connection_commands.del();
query.where() << ForeignKey{} << "=" << id;
query.execute(*Database::db);
@@ -330,4 +332,23 @@ std::string Database::gen_uuid()
return uuid_str;
}
Transaction::Transaction()
{
const auto result = Database::raw_exec("BEGIN");
if (std::get<bool>(result) == false)
log_error("Failed to create SQL transaction: ", std::get<std::string>(result));
else
this->success = true;
}
Transaction::~Transaction()
{
if (this->success)
{
const auto result = Database::raw_exec("END");
if (std::get<bool>(result) == false)
log_error("Failed to end SQL transaction: ", std::get<std::string>(result));
}
}
#endif
+10 -1
View File
@@ -203,11 +203,20 @@ class Database
static auto raw_exec(const std::string& query)
{
Database::db->raw_exec(query);
return Database::db->raw_exec(query);
}
private:
static std::string gen_uuid();
static std::map<CacheKey, EncodingIn::real_type> encoding_in_cache;
};
class Transaction
{
public:
Transaction();
~Transaction();
bool success{false};
};
#endif /* USE_DATABASE */