From 01fd2611e676b465a2d85c6ca231a157fa8af874 Mon Sep 17 00:00:00 2001 From: Chris Miles Date: Sat, 17 May 2025 16:06:00 -0500 Subject: [PATCH] Cut down on task saves --- zone/task_manager.cpp | 129 ++++++++++++++---------------------------- 1 file changed, 42 insertions(+), 87 deletions(-) diff --git a/zone/task_manager.cpp b/zone/task_manager.cpp index 3e6ec9992..7d0083bd6 100644 --- a/zone/task_manager.cpp +++ b/zone/task_manager.cpp @@ -290,6 +290,12 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *cts) LogTasks("character_id [{}]", character_id); + auto ct = CharacterTasksRepository::NewEntity(); + std::vector ct_entries; + + auto cta = CharacterActivitiesRepository::NewEntity(); + std::vector cta_entries; + if (cts->m_active_task_count > 0 || cts->m_active_task.task_id != TASKSLOTEMPTY || cts->m_active_shared_task.task_id != TASKSLOTEMPTY) { @@ -303,7 +309,6 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *cts) int slot = active_task.slot; if (active_task.updated) { - LogTasks( "character_id [{}] updating task_index [{}] task_id [{}]", character_id, @@ -311,32 +316,15 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *cts) task_id ); - std::string query = StringFormat( - "REPLACE INTO character_tasks (charid, taskid, slot, type, acceptedtime, was_rewarded) " - "VALUES (%i, %i, %i, %i, %i, %d)", - character_id, - task_id, - slot, - static_cast(task_data->type), - active_task.accepted_time, - active_task.was_rewarded - ); - - auto results = database.QueryDatabase(query); - if (!results.Success()) { - LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); - } - else { - active_task.updated = false; - } + ct.charid = character_id; + ct.taskid = task_id; + ct.slot = slot; + ct.type = static_cast(task_data->type); + ct.acceptedtime = active_task.accepted_time; + ct.was_rewarded = active_task.was_rewarded; + ct_entries.emplace_back(ct); } - std::string query = - "REPLACE INTO character_activities (charid, taskid, activityid, donecount, completed) " - "VALUES "; - - int updated_activity_count = 0; - for (int activity_index = 0; activity_index < task_data->activity_count; ++activity_index) { if (!active_task.activity[activity_index].updated) { continue; @@ -350,54 +338,31 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *cts) activity_index ); - if (updated_activity_count == 0) { - query += - StringFormat( - "(%i, %i, %i, %i, %i)", character_id, task_id, activity_index, - active_task.activity[activity_index].done_count, - active_task.activity[activity_index].activity_state == - ActivityCompleted - ); - } - else { - query += - StringFormat( - ", (%i, %i, %i, %i, %i)", character_id, task_id, activity_index, - active_task.activity[activity_index].done_count, - active_task.activity[activity_index].activity_state == - ActivityCompleted - ); - } - - updated_activity_count++; - } - - if (updated_activity_count == 0) { - continue; - } - - auto results = database.QueryDatabase(query); - - if (!results.Success()) { - LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); - continue; - } - - active_task.updated = false; - for (int activity_index = 0; activity_index < task_data->activity_count; ++activity_index) { - active_task.activity[activity_index].updated = false; + cta.charid = character_id; + cta.taskid = task_id; + cta.activityid = activity_index; + cta.donecount = active_task.activity[activity_index].done_count; + cta.completed = active_task.activity[activity_index].activity_state == ActivityCompleted ? 1 : 0; + cta_entries.emplace_back(cta); } } } + if (!ct_entries.empty()) { + CharacterTasksRepository::ReplaceMany(content_db, ct_entries); + } + if (!cta_entries.empty()) { + CharacterActivitiesRepository::ReplaceMany(content_db, cta_entries); + } + if (!RuleB(TaskSystem, RecordCompletedTasks) || (cts->m_completed_tasks.size() <= (unsigned int) cts->m_last_completed_task_loaded)) { cts->m_last_completed_task_loaded = cts->m_completed_tasks.size(); return true; } - const char *completed_task_query = "REPLACE INTO completed_tasks (charid, completedtime, taskid, activityid) " - "VALUES (%i, %i, %i, %i)"; + auto completed_task = CompletedTasksRepository::NewEntity(); + std::vector completed_task_entries; for ( unsigned int task_index = cts->m_last_completed_task_loaded; @@ -423,19 +388,11 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *cts) // This indicates this task was completed at the given time. We infer that all // none optional activities were completed. // - std::string query = StringFormat( - completed_task_query, - character_id, - t.completed_time, - task_id, - -1 - ); - - auto results = database.QueryDatabase(query); - if (!results.Success()) { - LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); - continue; - } + completed_task.charid = character_id; + completed_task.completedtime = t.completed_time; + completed_task.taskid = task_id; + completed_task.activityid = -1; + completed_task_entries.emplace_back(completed_task); // If the Rule to record non-optional task completion is not enabled, don't save it if (!RuleB(TaskSystem, RecordCompletedOptionalActivities)) { @@ -449,20 +406,18 @@ bool TaskManager::SaveClientState(Client *client, ClientTaskState *cts) continue; } - query = StringFormat( - completed_task_query, - character_id, - t.completed_time, - task_id, activity_id - ); - - results = database.QueryDatabase(query); - if (!results.Success()) { - LogError(ERR_MYSQLERROR, results.ErrorMessage().c_str()); - } + completed_task.charid = character_id; + completed_task.completedtime = t.completed_time; + completed_task.taskid = task_id; + completed_task.activityid = activity_id; + completed_task_entries.emplace_back(completed_task); } } + if (!completed_task_entries.empty()) { + CompletedTasksRepository::ReplaceMany(content_db, completed_task_entries); + } + cts->m_last_completed_task_loaded = cts->m_completed_tasks.size(); return true; }