1
This commit is contained in:
parent
a47743f91b
commit
a400648dd9
@ -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_);
|
||||
}
|
||||
}
|
||||
|
@ -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_;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user