This commit is contained in:
aozhiwei 2020-10-10 16:44:43 +08:00
parent d78b90b9be
commit 8a6de93be5
4 changed files with 119 additions and 134 deletions

View File

@ -13,11 +13,82 @@
#include "IMListener.h"
#include "metamgr.h"
const size_t MAX_RANK_HUMAN_NUM = 50;
const size_t MAX_RANK_LIST_NUM = 50;
const size_t MAX_SORTED_LIST_NUM = 5000;
const char* const NAME_MAGIC_SYMBOL = "@";
static bool RankCmpFunc(const cs::MFGuildBasic* a, const cs::MFGuildBasic* b)
{
if (a->guild_lv() > b->guild_lv()) {
return true;
}
if (a->guild_lv() < b->guild_lv()) {
return false;
}
if (a->guild_exp() > b->guild_exp()) {
return true;
}
if (a->guild_exp() < b->guild_exp()) {
return false;
}
return a->guild_id() > b->guild_id();
}
static bool SortedCmpFunc(const cs::MFGuildBasic* a, const cs::MFGuildBasic* b)
{
if (a->guild_lv() > b->guild_lv()) {
return true;
}
if (a->guild_lv() < b->guild_lv()) {
return false;
}
if (a->guild_exp() > b->guild_exp()) {
return true;
}
if (a->guild_exp() < b->guild_exp()) {
return false;
}
return a->guild_id() > b->guild_id();
}
static void DbToGuildBasic(const std::vector<std::string>& row, cs::MFGuildBasic* guild)
{
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[16]));
guild->set_join_cond1(a8::XValue(row[17]));
guild->set_join_cond2(a8::XValue(row[18]));
guild->set__gameid(a8::XValue(row[1]));
guild->set__channel(a8::XValue(row[21]));
guild->set__createtime(a8::XValue(row[19]));
guild->set__modifytime(a8::XValue(row[20]));
guild->set_member_num(a8::XValue(row[22]));
}
static std::string GenSelectGuildSql(const std::string& where)
{
std::string sql =
"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, guild_member_num "
"FROM `guild` ";
sql += where;
return sql;
}
void GuildMgr::Init()
{
rank_cmp_func_ = RankCmpFunc;
sorted_cmp_func_ = SortedCmpFunc;
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();
@ -84,6 +155,8 @@ void GuildMgr::__GuildCreate(f8::JsonHttpRequest* request)
request->resp_xobj->SetVal("errmsg", "");
a8::XObject conn = DBEngine::Instance()->GetConnInfo(guild_id);
guild->set_member_num(1);
guild->set__createtime(App::Instance()->nowtime);
guild->set__modifytime(App::Instance()->nowtime);
DBEngine::Instance()->ExecAsyncScript
(
conn,
@ -223,9 +296,6 @@ void GuildMgr::__GuildUpdate(f8::JsonHttpRequest* request)
long long guild_id = request->request.At("guild_id")->AsXValue();
cs::MFGuildBasic* guild = GetGuildById(guild_id);
if (guild) {
#if 0
guild->set_guild_name(request->request.At("guild_name")->AsXValue().GetString());
#endif
guild->set_guild_badge(request->request.At("guild_badge")->AsXValue());
guild->set_guild_lv(request->request.At("guild_lv")->AsXValue());
guild->set_guild_exp(request->request.At("guild_exp")->AsXValue());
@ -350,7 +420,7 @@ void GuildMgr::__GuildRank(f8::JsonHttpRequest* request)
}
int gameid = request->request.At("gameid")->AsXValue();
std::vector<cs::MFGuildBasic*>* sorted_guild_list = GetGuildRank(gameid);
a8::CommonRank<cs::MFGuildBasic>* sorted_guild_list = GetGuildRank(gameid);
request->resp_xobj->SetVal("errcode", 0);
request->resp_xobj->SetVal("errmsg", "");
@ -360,8 +430,8 @@ void GuildMgr::__GuildRank(f8::JsonHttpRequest* request)
request->resp_xobj->SetVal("_total_count", 0);
a8::MutableXObject* guild_list = a8::MutableXObject::NewArray();
if (sorted_guild_list) {
request->resp_xobj->SetVal("_total_count", sorted_guild_list->size());
for (auto& guild : *sorted_guild_list) {
request->resp_xobj->SetVal("_total_count", sorted_guild_list->Size());
for (auto& guild : sorted_guild_list->GetList()) {
a8::MutableXObject* guild_xobj = a8::MutableXObject::NewObject();
TypeConvert::Convert(guild, guild_xobj);
guild_list->Push(*guild_xobj);
@ -447,7 +517,7 @@ cs::MFGuildBasic* GuildMgr::GetGuildByName(int gameid, int channel, const std::s
return itr != name_hash_.end() ? itr->second : nullptr;
}
std::vector<cs::MFGuildBasic*>* GuildMgr::GetGuildRank(int gameid)
a8::CommonRank<cs::MFGuildBasic>* GuildMgr::GetGuildRank(int gameid)
{
auto itr = rank_list_.find(gameid);
return itr != rank_list_.end() ? &itr->second : nullptr;
@ -464,11 +534,7 @@ void GuildMgr::LoadGuild(int instance_id, long long last_idx)
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, guild_member_num "
"FROM `guild` WHERE idx > %d;",
GenSelectGuildSql("WHERE idx > %d;").c_str(),
{
last_idx
},
@ -482,21 +548,7 @@ void GuildMgr::LoadGuild(int instance_id, long long last_idx)
if (data_set && !data_set->empty()) {
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[16]));
guild->set_join_cond1(a8::XValue(row[17]));
guild->set_join_cond2(a8::XValue(row[18]));
guild->set__gameid(a8::XValue(row[1]));
guild->set__channel(a8::XValue(row[21]));
guild->set_member_num(a8::XValue(row[22]));
DbToGuildBasic(row, guild);
GuildMgr::Instance()->AddGuild(guild);
if (a8::XValue(row[0]).GetInt64() > last_idx) {
last_idx = a8::XValue(row[0]);
@ -519,11 +571,7 @@ 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, guild_member_num "
"FROM `guild` WHERE modifytime > %d;",
GenSelectGuildSql("WHERE modifytime > %d;").c_str(),
{
sync_db_hash_[instance_id]
},
@ -536,25 +584,11 @@ void GuildMgr::SyncGuild(int instance_id)
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[16]));
guild->set_join_cond1(a8::XValue(row[17]));
guild->set_join_cond2(a8::XValue(row[18]));
guild->set__gameid(a8::XValue(row[1]));
guild->set__channel(a8::XValue(row[21]));
guild->set_member_num(a8::XValue(row[22]));
if (a8::XValue(row[20]).GetInt64() > last_sync_time) {
last_sync_time = a8::XValue(row[20]);
}
DbToGuildBasic(row, guild);
GuildMgr::Instance()->UpdateGuild(guild);
if (guild->_modifytime() > last_sync_time) {
last_sync_time = guild->_modifytime();
}
delete guild;
}
if (last_sync_time > GuildMgr::Instance()->sync_db_hash_[instance_id]) {
@ -597,11 +631,7 @@ void GuildMgr::RefreshGuild(long long guild_id)
DBEngine::Instance()->ExecAsyncQuery
(
conn,
"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 "
"FROM `guild` WHERE guild_id = %d;",
GenSelectGuildSql("WHERE guild_id = %d;").c_str(),
{
guild_id
},
@ -611,22 +641,10 @@ void GuildMgr::RefreshGuild(long long guild_id)
{
if (data_set && !data_set->empty()) {
for (auto& row : *data_set) {
cs::MFGuildBasic* guild = GuildMgr::Instance()->GetGuildById(a8::XValue(row[2]));
if (guild) {
#if 0
guild->set_guild_name(row[3]);
#endif
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]));
}
cs::MFGuildBasic* guild = new cs::MFGuildBasic;
DbToGuildBasic(row, guild);
GuildMgr::Instance()->UpdateGuild(guild);
delete guild;
}
}
},
@ -639,48 +657,9 @@ void GuildMgr::RefreshGuild(long long guild_id)
void GuildMgr::GenGuildRank()
{
auto force_rank_list =
[this] (int gameid) -> std::vector<cs::MFGuildBasic*>&
{
auto itr = rank_list_.find(gameid);
if (itr != rank_list_.end()) {
return itr->second;
}
rank_list_[gameid] = std::vector<cs::MFGuildBasic*>();
return rank_list_[gameid];
};
rank_list_.clear();
for (auto& pair : id_hash_) {
auto guild = pair.second;
std::vector<cs::MFGuildBasic*>& rank_list = force_rank_list(guild->_gameid());
UpdateRank(rank_list, guild);
}
}
void GuildMgr::ResortRank(std::vector<cs::MFGuildBasic*>& rank_list)
{
std::sort(rank_list.begin(),
rank_list.end(),
[] (cs::MFGuildBasic* a, cs::MFGuildBasic* b) -> bool
{
return GuildMgr::Instance()->CmpGuild(a, b);
});
}
void GuildMgr::UpdateRank(std::vector<cs::MFGuildBasic*>& rank_list, cs::MFGuildBasic* guild)
{
if (rank_list.size() < MAX_RANK_HUMAN_NUM) {
if (std::find(rank_list.begin(), rank_list.end(), guild) == rank_list.end()) {
rank_list.push_back(guild);
ResortRank(rank_list);
}
} else {
if (CmpGuild(guild, rank_list[rank_list.size() - 1])) {
if (std::find(rank_list.begin(), rank_list.end(), guild) == rank_list.end()) {
rank_list[rank_list.size() - 1] = guild;
ResortRank(rank_list);
}
}
UpdateRank(pair.second);
}
}
@ -688,9 +667,6 @@ void GuildMgr::UpdateGuild(cs::MFGuildBasic* new_guild)
{
auto guild = GetGuildById(new_guild->guild_id());
if (guild) {
#if 0
guild->set_guild_name(new_guild->guild_name());
#endif
guild->set_guild_lv(new_guild->guild_lv());
guild->set_guild_exp(new_guild->guild_exp());
guild->set_guild_badge(new_guild->guild_badge());
@ -702,24 +678,30 @@ void GuildMgr::UpdateGuild(cs::MFGuildBasic* new_guild)
guild->set_join_unlimited((new_guild->join_unlimited()));
guild->set_join_cond1((new_guild->join_cond1()));
guild->set_join_cond2((new_guild->join_cond2()));
UpdateRank(guild);
}
}
bool GuildMgr::CmpGuild(cs::MFGuildBasic* a, cs::MFGuildBasic* b)
void GuildMgr::UpdateRank(cs::MFGuildBasic* guild)
{
if (a->guild_lv() > b->guild_lv()) {
return true;
{
auto rank_list = a8::ForceCreateCommonRankList
(
rank_list_,
guild->_gameid(),
rank_cmp_func_,
MAX_RANK_LIST_NUM);
rank_list.Update(guild);
}
if (a->guild_lv() < b->guild_lv()) {
return false;
{
auto rank_list = a8::ForceCreateCommonRankList
(
sorted_list_,
guild->_gameid(),
sorted_cmp_func_,
MAX_SORTED_LIST_NUM);
rank_list.Update(guild);
}
if (a->guild_exp() > b->guild_exp()) {
return true;
}
if (a->guild_exp() < b->guild_exp()) {
return false;
}
return a->guild_id() > b->guild_id();
}
void GuildMgr::InstallSyncGuildTimer()

View File

@ -1,5 +1,6 @@
#pragma once
#include <a8/commonrank.h>
#include <a8/timer_attacher.h>
namespace cs
@ -29,17 +30,15 @@ class GuildMgr : public a8::Singleton<GuildMgr>
private:
cs::MFGuildBasic* GetGuildById(long long guild_id);
cs::MFGuildBasic* GetGuildByName(int gameid, int channel, const std::string& guild_name);
std::vector<cs::MFGuildBasic*>* GetGuildRank(int gameid);
a8::CommonRank<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);
void UpdateGuild(cs::MFGuildBasic* new_guild);
bool CmpGuild(cs::MFGuildBasic* a, cs::MFGuildBasic* b);
void UpdateRank(cs::MFGuildBasic* guild);
void InstallSyncGuildTimer();
std::string GenGuildName(int gameid, int channel, const std::string& raw_name);
void GuildRename(cs::MFGuildBasic* guild, const std::string& new_name);
@ -51,7 +50,9 @@ class GuildMgr : public a8::Singleton<GuildMgr>
std::map<int, int> sync_db_hash_;
std::map<long long, cs::MFGuildBasic*> id_hash_;
std::map<std::string, cs::MFGuildBasic*> name_hash_;
std::map<int, std::vector<cs::MFGuildBasic*>> rank_list_;
std::map<int, std::vector<cs::MFGuildBasic*>> sorted_list_;
std::map<long long, a8::CommonRank<cs::MFGuildBasic>> rank_list_;
std::map<long long, a8::CommonRank<cs::MFGuildBasic>> sorted_list_;
std::function<bool(const cs::MFGuildBasic*, const cs::MFGuildBasic*)> rank_cmp_func_;
std::function<bool(const cs::MFGuildBasic*, const cs::MFGuildBasic*)> sorted_cmp_func_;
std::map<std::string, std::tuple<timer_list*, std::set<long long>>> search_cache_;
};

View File

@ -115,6 +115,8 @@ message MFGuildBasic
optional int32 _gameid = 100; //gameid
optional int32 _channel = 101; //channel
optional int32 _createtime = 102; //createtime
optional int32 _modifytime = 103; //modifytime
}
//

@ -1 +1 @@
Subproject commit a25550d418277048506bb2815a192e15802dd19e
Subproject commit 3a005b95f4569756f525358f7fa9c116177d264c