refactor(World/WorldState): use prepared statements (#22582)

This commit is contained in:
Jelle Meeus
2025-07-27 22:04:03 -07:00
committed by GitHub
parent 970b6cf7b6
commit fc4b2939ee
3 changed files with 14 additions and 3 deletions

View File

@@ -616,6 +616,10 @@ void CharacterDatabaseConnection::DoPrepareStatements()
"ON DUPLICATE KEY UPDATE state = VALUES(state)", CONNECTION_ASYNC);
PrepareStatement(CHAR_DELETE_INSTANCE_SAVED_DATA, "DELETE FROM instance_saved_go_state_data WHERE id = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_SANITIZE_INSTANCE_SAVED_DATA, "DELETE FROM instance_saved_go_state_data WHERE id NOT IN (SELECT instance.id FROM instance)", CONNECTION_ASYNC);
// world_state
PrepareStatement(CHAR_SEL_WORLD_STATE, "SELECT Id, Data FROM world_state", CONNECTION_SYNCH);
PrepareStatement(CHAR_REP_WORLD_STATE, "REPLACE INTO world_state (Id, Data) VALUES(?, ?)", CONNECTION_ASYNC);
}
CharacterDatabaseConnection::CharacterDatabaseConnection(MySQLConnectionInfo& connInfo) : MySQLConnection(connInfo)

View File

@@ -528,6 +528,9 @@ enum CharacterDatabaseStatements : uint32
CHAR_DELETE_INSTANCE_SAVED_DATA,
CHAR_SANITIZE_INSTANCE_SAVED_DATA,
CHAR_SEL_WORLD_STATE,
CHAR_REP_WORLD_STATE,
MAX_CHARACTERDATABASE_STATEMENTS
};

View File

@@ -47,7 +47,9 @@ WorldState::~WorldState()
void WorldState::Load()
{
QueryResult result = CharacterDatabase.Query("SELECT Id, Data FROM world_state");
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_WORLD_STATE);
PreparedQueryResult result = CharacterDatabase.Query(stmt);
if (result)
{
do
@@ -205,8 +207,10 @@ void WorldState::Save(WorldStateSaveIds saveId)
void WorldState::SaveHelper(std::string& stringToSave, WorldStateSaveIds saveId)
{
CharacterDatabase.Execute("DELETE FROM world_state WHERE Id='{}'", saveId);
CharacterDatabase.Execute("INSERT INTO world_state(Id,Data) VALUES('{}','{}')", saveId, stringToSave.data());
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_WORLD_STATE);
stmt->SetData(0, saveId);
stmt->SetData(1, stringToSave);
CharacterDatabase.Execute(stmt);
}
bool WorldState::IsConditionFulfilled(uint32 conditionId, uint32 state) const