Files
Sun1602/Server/DatabaseProxy/ProxyNodes/DBQueryProxyQuestNode.cpp
T
2022-10-26 12:25:11 +08:00

185 lines
6.9 KiB
C++

#include "stdafx.h"
#include "DBQueryProxyNode.h"
#include <VersionControl.h>
//==================================================================================================
#pragma warning(push, 4)
namespace nsQuery {
;
//==================================================================================================
void QuestUpdateNode::UpdateAndCompareData()
{
if (record_changed_ != this->eRecordChange_Default) {
return;
};
if (commited_data_.quest_version_ != latest_data_.quest_version_)
{
record_changed_ = this->eRecordChange_Changed;
return;
};
if (::memcmp(commited_data_.quest_stream_progress_, latest_data_.quest_stream_progress_,
sizeof(commited_data_.quest_stream_progress_)) != 0)
{
record_changed_ = this->eRecordChange_Changed;
return;
};
if (::memcmp(commited_data_.quest_stream_complete_, latest_data_.quest_stream_complete_,
sizeof(commited_data_.quest_stream_complete_)) != 0)
{
record_changed_ = this->eRecordChange_Changed;
return;
};
; // no changed
return;
}
//==================================================================================================
// G->D update stream
void DBQueryProxyNode::CharacterNode::StoreQuest(const MSG_DG_CHARINFO_QUEST_CMD& quest_block)
{
//QuestUpdateNode* const update_node = &quest_table_;
QuestResultRecord* const record = &quest_table_.latest_data_;
BOOST_STATIC_ASSERT(sizeof(quest_block.m_pProgrQStream) ==
sizeof(record->quest_stream_progress_) &&
sizeof(quest_block.m_pProgrQStream) == MAX_PROGR_QUESTSTREAM_SIZE);
BOOST_STATIC_ASSERT(sizeof(quest_block.m_pComplQStream) ==
sizeof(record->quest_stream_complete_) &&
sizeof(quest_block.m_pComplQStream) == MAX_COMPL_QUESTSTREAM_SIZE);
//ZeroMemory(&quest_table_.latest_data_, sizeof(quest_table_.latest_data_));
record->quest_version_ = QUESTPART_PROGR::QUESTPART_PROGR_VERSION;
CopyMemory(record->quest_stream_progress_, quest_block.m_pProgrQStream,
sizeof(record->quest_stream_progress_));
CopyMemory(record->quest_stream_complete_, quest_block.m_pComplQStream,
sizeof(record->quest_stream_complete_));
quest_table_.UpdateAndCompareData();
}
// D->G send stream
void DBQueryProxyNode::CharacterNode::LoadQuest(MSG_DG_CHARINFO_QUEST_CMD* quest_block) const
{
const QuestResultRecord* const record = &quest_table_.latest_data_;
CopyMemory(quest_block->m_pProgrQStream, record->quest_stream_progress_,
sizeof(quest_block->m_pProgrQStream));
CopyMemory(quest_block->m_pComplQStream, record->quest_stream_complete_,
sizeof(quest_block->m_pComplQStream));
}
//==================================================================================================
bool DBQueryProxyNode::CharacterNode::DBResult(const Query_Quest_Select& query_result)
{
// 1st load
const int number_of_rows = query_result.GetResultRowNum();
//const Query_Quest_Select::sQueryParam& parameters = query_result.parameters_[0];
if (number_of_rows != 0)
{ // setup default information
const Query_Quest_Select::sQueryResult& record = query_result.result_records_[0];
QuestUpdateNode* const update_node = &quest_table_;
QuestResultRecord* const latest_data = &update_node->latest_data_;
ZeroMemory(latest_data, sizeof(*latest_data));
FlowControl::FCAssert(\
VersionControl::QuestConverter(latest_data->quest_version_,
latest_data->quest_stream_progress_,
latest_data->quest_stream_complete_,
record.quest_version_,
record.quest_stream_progress_,
record.quest_stream_complete_));
update_node->commited_data_ = *latest_data;
}
else
{ // setup default information
QuestUpdateNode* const update_node = &quest_table_;
ZeroMemory(&update_node->latest_data_, sizeof(update_node->latest_data_));
update_node->latest_data_.quest_version_ = QUESTPART_PROGR::QUESTPART_PROGR_VERSION;
update_node->commited_data_ = update_node->latest_data_;
}
//
return true;
}
bool DBQueryProxyNode::CharacterNode::DBResult(const Query_Quest_Update& query_result)
{
const Query_Quest_Update::sQueryParam& parameters = query_result.parameters_[0];
QuestUpdateNode* const update_node = &quest_table_;
ASSERT(update_node->query_ == &query_result &&
update_node->record_changed_ == update_node->eRecordChange_Changed);
update_node->record_changed_ = update_node->eRecordChange_Default;
update_node->query_ = NULL; // external delete control
update_node->commited_data_ = parameters;
//
return true;
}
bool DBQueryProxyNode::CharacterNode::UpdateQuest()
{
const bool loaded_quest = (shared_.state & this->eState_Loaded_QuestInfo) != 0;
if (loaded_quest == false) {
return true;
};
//
DBUser* const db_user = db_character_->GetParentDBUser();
if (db_user == NULL)
{
return true; // °­Á¦..transaction success..
}
const USERGUID user_guid = db_user->GetUserGuid();
const CHARGUID char_guid = db_character_->GetCharGuid();
//
QuestUpdateNode* update_node = &quest_table_;
if (update_node->query_ != NULL) {
return false; //in transaction
}
update_node->UpdateAndCompareData();
if (update_node->record_changed_ == update_node->eRecordChange_Default) {
return true;
};
//
STRING_SAFER_QUERY64 query_buffer;
bool changed_events = false;
//
switch (update_node->record_changed_)
{
case update_node->eRecordChange_Changed: // update
{
query_buffer.MakeString(_T("{?=call S_Quest_Update (?,?,?,?)}"));
Query_Quest_Update* const query = Query_Quest_Update::ALLOC();
query->SetQuery(query_buffer);
query->SetUserKey(user_guid);
query->set_char_guid(char_guid);
// setup parameters
Query_Quest_Update::sQueryParam* parameters = &query->parameters_[0];
static_cast<QuestResultRecord&>(*parameters) = update_node->latest_data_;
parameters->char_guid_ = char_guid;
//
update_node->query_ = query;
};
break;
}
if (changed_events == false && update_node->query_) {
changed_events = true;
}
if (update_node->query_)
{
db_user->DBQuery(DG_CHARINFO, DG_CHARINFO_UPDATE_INTER_QUEST_DBR,
update_node->query_);
}
if (changed_events) {
return false;
}
return true;
}
//==================================================================================================
}; //end of namespace