152 lines
5.2 KiB
C++
152 lines
5.2 KiB
C++
#include "stdafx.h"
|
|
#include "DBQueryProxyNode.h"
|
|
|
|
#ifdef C_NA_0_20100520_ACSYSTEM_CHANGED
|
|
#include <VersionControl.h>
|
|
|
|
#include "QueryObjects/DBHandler.h"
|
|
|
|
//==================================================================================================
|
|
|
|
namespace nsQuery {
|
|
;
|
|
|
|
//==================================================================================================
|
|
|
|
bool DBQueryProxyNode::CharacterNode::DBResult(const Query_Char_Achievement_Select& query_result)
|
|
{
|
|
DBCharacter_Achievements* const achievement_info = db_character_->GetAchievementInfo();
|
|
achievement_info->init();
|
|
|
|
const int result_row_count = query_result.GetResultRowNum();
|
|
|
|
for (int i = 0; i < result_row_count; ++i)
|
|
{
|
|
const Query_Char_Achievement_Select::sQueryResult& result_record = \
|
|
query_result.result_records_[i];
|
|
//_NA_001990_ACSYSTEM_ADD_INCREASE_INDEX
|
|
if (achievement_info->achievement_max_index_ == MAX_ACHIEVEMENT_COUNT)
|
|
return true;
|
|
|
|
DBCharacter_Achievement* const dest = \
|
|
&achievement_info->achievement_info_[achievement_info->achievement_max_index_++];
|
|
|
|
dest->set_normal();
|
|
dest->index_number_ = result_record.index_number_;
|
|
dest->is_reward_ = result_record.is_reward_;
|
|
|
|
BOOST_STATIC_ASSERT(\
|
|
sizeof(dest->object_value_[0]) == sizeof(result_record.object_value_[0]) &&
|
|
sizeof(dest->object_value_) == sizeof(result_record.object_value_));
|
|
//
|
|
CopyMemory(dest->object_value_, result_record.object_value_, sizeof(dest->object_value_));
|
|
|
|
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
bool DBQueryProxyNode::CharacterNode::DBResult(const Query_Char_Achievement_Update& query_result)
|
|
{
|
|
const Query_Char_Achievement_Update::sQueryParam* parameter = &query_result.parameters_[0];
|
|
|
|
//_NA_001990_ACSYSTEM_ADD_INCREASE_INDEX
|
|
DBCharacter_Achievements* achievement_info = db_character_->GetAchievementInfo();
|
|
|
|
DBCharacter_Achievement* achievement_elem = achievement_info->find(parameter->index_number_);
|
|
if (achievement_elem != NULL)
|
|
achievement_elem->unlock();
|
|
|
|
if (query_result.IsError() || !query_result.ResultSuccess())
|
|
{
|
|
if (query_result.IsError())
|
|
{
|
|
SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"](%s):%s",
|
|
query_result.GetQuery(), query_result.GetErrorMsg());
|
|
|
|
}
|
|
else
|
|
{
|
|
SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"] : ErrorCode[ %d ]",
|
|
query_result.parameters_[0].result_);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//_NA_001990_ACSYSTEM_ADD_INCREASE_INDEX
|
|
if (achievement_elem)
|
|
achievement_elem->set_normal();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool DBQueryProxyNode::CharacterNode::UpdateAchievement()
|
|
{
|
|
const bool loaded_ac = (shared_.state & this->eState_Loaded_Achievement) != 0;
|
|
if (loaded_ac == false) {
|
|
return true;
|
|
};
|
|
DBUser* const db_user = db_character_->GetParentDBUser();
|
|
if (db_user == NULL)
|
|
{
|
|
return true; // °Á¦..transaction success..
|
|
}
|
|
// CHANGES: f110628.1L, the load balance updating implemented. updater='db_user->DBQuery'
|
|
const int number_of_pending_queries = \
|
|
g_DBHandler.GetNumberOfDBConnectionQueuingQueries(db_user);
|
|
if (number_of_pending_queries > g_DBHandler.kMaxNumberOfSpecializedConcurrentBusyUpdateQueries) {
|
|
return false; // pendings
|
|
};
|
|
DBCharacter_Achievements* achievement_info = db_character_->GetAchievementInfo();
|
|
bool changed_events = false;
|
|
|
|
STRING_SAFER_QUERY128 query_buffer;
|
|
//_NA_001990_ACSYSTEM_ADD
|
|
query_buffer.MakeString("{?=call S_ACSystem_Update(?,?,?,?,?,?,?,?,?,?,?,?,?)}");
|
|
|
|
for (int i = 0; i < achievement_info->achievement_max_index_; ++i)
|
|
{
|
|
DBCharacter_Achievement& achievement = achievement_info->achievement_info_[i];
|
|
if(achievement.is_modification() && !achievement.is_update_lock())
|
|
{
|
|
Query_Char_Achievement_Update* query = Query_Char_Achievement_Update::ALLOC();
|
|
|
|
query->SetQuery(query_buffer);
|
|
query->SetUserKey(db_user_->GetUserGuid());
|
|
query->set_char_guid(db_character_->GetCharGuid());
|
|
//
|
|
Query_Char_Achievement_Update::sQueryParam* const parameter = &query->parameters_[0];
|
|
|
|
parameter->index_number_ = achievement.index_number_;
|
|
parameter->is_reward_ = achievement.is_reward_;
|
|
parameter->character_guid_ = db_character_->GetCharGuid();
|
|
|
|
BOOST_STATIC_ASSERT(\
|
|
sizeof(parameter->object_value_[0]) == sizeof(achievement.object_value_[0]) &&
|
|
sizeof(parameter->object_value_) == sizeof(achievement.object_value_));
|
|
// CHANGES: f101112.5L, fixed a misusing macro, changes '_countof' to 'sizeof'
|
|
CopyMemory(parameter->object_value_, achievement.object_value_,
|
|
sizeof(parameter->object_value_));
|
|
|
|
db_user->DBQuery(DG_CHARINFO, DG_CHARINFO_UPDATE_ACHIEVEMENT_DBR, query);
|
|
|
|
achievement.lock();
|
|
changed_events = true;
|
|
SUNLOG(eDEV_LOG, "achievement update charguid(%d) index(%d)",parameter->character_guid_,parameter->index_number_);
|
|
}
|
|
}
|
|
//
|
|
if (changed_events) {
|
|
return false;
|
|
};
|
|
return true;
|
|
}
|
|
//==================================================================================================
|
|
|
|
}; //end of namespace
|
|
|
|
#endif //C_NA_0_20100520_ACSYSTEM_CHANGED
|
|
|