This commit is contained in:
aozhiwei 2020-10-08 19:08:29 +08:00
parent a47743f91b
commit a400648dd9
2 changed files with 84 additions and 0 deletions

View File

@ -1,6 +1,7 @@
#include "precompile.h"
#include <a8/udplog.h>
#include <a8/timer.h>
#include "guildmgr.h"
#include "typeconvert.h"
@ -19,6 +20,7 @@ void GuildMgr::Init()
for (int i = 0; i < mysql_cluster_conf->Size(); ++i) {
int instance_id = mysql_cluster_conf->At(i)->At("instance_id")->AsXValue();
pending_db_hash_[instance_id] = 0;
sync_db_hash_[instance_id] = App::Instance()->nowtime;
LoadGuild(instance_id, 0);
}
}
@ -336,8 +338,66 @@ void GuildMgr::LoadGuild(int instance_id, long long last_idx)
instance_id);
}
void GuildMgr::SyncGuild(int instance_id)
{
DBEngine::Instance()->ExecAsyncQuery
(
*JsonDataMgr::Instance()->GetMysqlConf(instance_id),
"SELECT idx, gameid, guild_id, guild_name, guild_lv, guild_exp, guild_badge, guild_notice, "
" guild_declaration, owner_id, owner_name, owner_avatar_url, "
" creator_id, creator_name, creator_avatar_url, guild_status, "
" join_unlimited, join_cond1, join_cond2, createtime, modifytime, channel "
"FROM `guild` WHERE modifytime > %d;",
{
sync_db_hash_[instance_id]
},
a8::XParams()
.SetSender(instance_id),
[] (a8::XParams& param, const f8::DataSet* data_set)
{
int instance_id = param.sender;
if (data_set && !data_set->empty()) {
int last_sync_time = GuildMgr::Instance()->sync_db_hash_[instance_id];
for (auto& row : *data_set) {
cs::MFGuildBasic* guild = new cs::MFGuildBasic;
guild->set_guild_id(a8::XValue(row[2]));
guild->set_guild_name(row[3]);
guild->set_guild_lv(a8::XValue(row[4]));
guild->set_guild_exp(a8::XValue(row[5]));
guild->set_guild_badge(a8::XValue(row[6]));
guild->set_guild_declaration(row[8]);
guild->set_owner_id(row[9]);
guild->set_owner_name(row[10]);
guild->set_owner_avatar_url(row[11]);
guild->set_join_unlimited(a8::XValue(row[13]));
guild->set_join_cond1(a8::XValue(row[14]));
guild->set_join_cond2(a8::XValue(row[15]));
guild->set__gameid(a8::XValue(row[1]));
guild->set__channel(a8::XValue(row[18]));
GuildMgr::Instance()->AddGuild(guild);
if (a8::XValue(row[17]).GetInt64() > last_sync_time) {
last_sync_time = a8::XValue(row[17]);
}
delete guild;
}
if (last_sync_time > GuildMgr::Instance()->sync_db_hash_[instance_id]) {
GuildMgr::Instance()->sync_db_hash_[instance_id] = last_sync_time;
}
}
},
[] (a8::XParams& param, int error_code, const std::string& error_msg)
{
abort();
},
instance_id);
}
void GuildMgr::OnOneDBDone(int instance_id)
{
if (pending_db_hash_.find(instance_id) == pending_db_hash_.end() ||
pending_db_hash_[instance_id] == 1) {
abort();
}
pending_db_hash_[instance_id] = 1;
load_done_ = true;
for (auto& pair : pending_db_hash_) {
@ -350,6 +410,7 @@ void GuildMgr::OnOneDBDone(int instance_id)
if (load_done_) {
a8::UdpLog::Instance()->Debug("all db done guild_num:%d", {guild_hash_.size()});
GenGuildRank();
InstallSyncGuildTimer();
}
}
@ -461,3 +522,20 @@ bool GuildMgr::CmpGuild(cs::MFGuildBasic* a, cs::MFGuildBasic* b)
}
return a->guild_id() > b->guild_id();
}
void GuildMgr::InstallSyncGuildTimer()
{
auto mysql_cluster_conf = JsonDataMgr::Instance()->GetMysqlClusterConf();
for (int i = 0; i < mysql_cluster_conf->Size(); ++i) {
int instance_id = mysql_cluster_conf->At(i)->At("instance_id")->AsXValue();
a8::Timer::Instance()->AddRepeatTimerAndAttach
(1000 * 60,
a8::XParams()
.SetSender(instance_id),
[] (const a8::XParams& param)
{
GuildMgr::Instance()->SyncGuild(param.sender);
},
&timer_attacher_.timer_list_);
}
}

View File

@ -1,5 +1,7 @@
#pragma once
#include <a8/timer_attacher.h>
namespace cs
{
class MFGuildBasic;
@ -26,16 +28,20 @@ class GuildMgr : public a8::Singleton<GuildMgr>
std::vector<cs::MFGuildBasic*>* GetGuildRank(int gameid);
void AddGuild(cs::MFGuildBasic* guild);
void LoadGuild(int instance_id, long long last_idx);
void SyncGuild(int instance_id);
void OnOneDBDone(int instance_id);
void RefreshGuild(long long guild_id);
void GenGuildRank();
void ResortRank(std::vector<cs::MFGuildBasic*>& rank_list);
void UpdateRank(std::vector<cs::MFGuildBasic*>& rank_list, cs::MFGuildBasic* guild);
bool CmpGuild(cs::MFGuildBasic* a, cs::MFGuildBasic* b);
void InstallSyncGuildTimer();
private:
a8::TimerAttacher timer_attacher_;
bool load_done_ = false;
std::map<int, int> pending_db_hash_;
std::map<int, int> sync_db_hash_;
std::map<long long, cs::MFGuildBasic*> guild_hash_;
std::map<int, std::vector<cs::MFGuildBasic*>> sorted_game_guild_list_;
};