diff options
Diffstat (limited to 'src/server/game/Instances/InstanceSaveMgr.cpp')
-rwxr-xr-x | src/server/game/Instances/InstanceSaveMgr.cpp | 37 |
1 files changed, 4 insertions, 33 deletions
diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp index d75b3dd4d88..62cc1843d9f 100755 --- a/src/server/game/Instances/InstanceSaveMgr.cpp +++ b/src/server/game/Instances/InstanceSaveMgr.cpp @@ -227,39 +227,14 @@ bool InstanceSave::UnloadIfEmpty() return true; } -void InstanceSaveManager::_DelHelper(const char *fields, const char *table, const char *queryTail, ...) -{ - Tokens fieldTokens(fields, ','); - ASSERT(fieldTokens.size() != 0); - - va_list ap; - char szQueryTail [MAX_QUERY_LEN]; - va_start(ap, queryTail); - vsnprintf(szQueryTail, MAX_QUERY_LEN, queryTail, ap); - va_end(ap); - - QueryResult result = CharacterDatabase.PQuery("SELECT %s FROM %s %s", fields, table, szQueryTail); - if (result) - { - do - { - Field *fields = result->Fetch(); - std::ostringstream ss; - for (size_t i = 0; i < fieldTokens.size(); i++) - { - std::string fieldValue = fields[i].GetString(); - CharacterDatabase.escape_string(fieldValue); - ss << (i != 0 ? " AND " : "") << fieldTokens[i] << " = '" << fieldValue << "'"; - } - CharacterDatabase.DirectPExecute("DELETE FROM %s WHERE %s", table, ss.str().c_str()); - } while (result->NextRow()); - } -} - void InstanceSaveManager::LoadInstances() { uint32 oldMSTime = getMSTime(); + // Delete expired instances (Instance related spawns are removed in the following cleanup queries) + CharacterDatabase.DirectExecute("DELETE i FROM instance i LEFT JOIN instance_reset ir ON mapid = map AND i.difficulty = ir.difficulty " + "WHERE (i.resettime > 0 AND i.resettime < UNIX_TIMESTAMP()) OR (ir.resettime IS NOT NULL AND ir.resettime < UNIX_TIMESTAMP())"); + // Delete invalid character_instance and group_instance references CharacterDatabase.DirectExecute("DELETE ci.* FROM character_instance AS ci LEFT JOIN characters AS c ON ci.guid = c.guid WHERE c.guid IS NULL"); CharacterDatabase.DirectExecute("DELETE gi.* FROM group_instance AS gi LEFT JOIN groups AS g ON gi.guid = g.guid WHERE g.guid IS NULL"); @@ -386,10 +361,6 @@ void InstanceSaveManager::LoadResetTimes() } while (result->NextRow()); } - // clean expired instances, references to them will be deleted in CleanupInstances - // must be done before calculating new reset times - _DelHelper("id, map, instance.difficulty", "instance", "LEFT JOIN instance_reset ON mapid = map AND instance.difficulty = instance_reset.difficulty WHERE (instance.resettime < '"UI64FMTD"' AND instance.resettime > '0') OR (NOT instance_reset.resettime IS NULL AND instance_reset.resettime < '"UI64FMTD"')", (uint64)now, (uint64)now); - ResetTimeMapDiffInstances::const_iterator in_itr; // calculate new global reset times for expired instances and those that have never been reset yet |