bool Guild::LoadRanksFromDB(uint32 GuildId) { Field *fields; QueryResult *result = CharacterDatabase.PQuery("SELECT rname,rights,BankMoneyPerDay,rid FROM guild_rank WHERE guildid = '%u' ORDER BY rid ASC", GuildId); if(!result) return false; bool broken_ranks = false; do { fields = result->Fetch(); std::string rankName = fields[0].GetCppString(); uint32 rankRights = fields[1].GetUInt32(); uint32 rankMoney = fields[2].GetUInt32(); uint32 rankRID = fields[3].GetUInt32(); if(rankRID != m_ranks.size()+1) // guild_rank.rid always store rank+1 broken_ranks = true; if(m_ranks.size()==GR_GUILDMASTER) // prevent loss leader rights rankRights |= GR_RIGHT_ALL; AddRank(rankName,rankRights,rankMoney); }while( result->NextRow() ); delete result; if(m_ranks.size()==0) // empty rank table? { AddRank("Guild Master",GR_RIGHT_ALL,0); broken_ranks = true; } // guild_rank have wrong numbered ranks, repair if(broken_ranks) { sLog.outError("Guild %u have broken `guild_rank` data, repairing...",GuildId); CharacterDatabase.BeginTransaction(); CharacterDatabase.PExecute("DELETE FROM guild_rank WHERE guildid='%u'", GuildId); for(size_t i =0; i < m_ranks.size(); ++i) { // guild_rank.rid always store rank+1 std::string name = m_ranks[i].name; uint32 rights = m_ranks[i].rights; CharacterDatabase.escape_string(name); CharacterDatabase.PExecute( "INSERT INTO guild_rank (guildid,rid,rname,rights) VALUES ('%u', '%u', '%s', '%u')", GuildId, i+1, name.c_str(), rights); } CharacterDatabase.CommitTransaction(); } return true; }
void Guild::CreateRank(std::string name_, uint32 rights) { if (m_Ranks.size() >= GUILD_RANKS_MAX_COUNT) { return; } // ranks are sequence 0,1,2,... where 0 means guildmaster uint32 new_rank_id = m_Ranks.size(); AddRank(name_, rights); // name now can be used for encoding to DB CharacterDatabase.escape_string(name_); CharacterDatabase.PExecute("INSERT INTO guild_rank (guildid,rid,rname,rights) VALUES ('%u', '%u', '%s', '%u')", m_Id, new_rank_id, name_.c_str(), rights); }
void Guild::CreateRank(std::string name_,uint32 rights) { if(m_ranks.size() >= GUILD_MAX_RANKS) return; AddRank(name_,rights,0); for (int i = 0; i < purchased_tabs; ++i) { CreateBankRightForTab(m_ranks.size()-1, uint8(i)); } // guild_rank.rid always store rank+1 value // name now can be used for encoding to DB CharacterDatabase.escape_string(name_); CharacterDatabase.PExecute( "INSERT INTO guild_rank (guildid,rid,rname,rights) VALUES ('%u', '%u', '%s', '%u')", Id, m_ranks.size(), name_.c_str(), rights ); }
bool Guild::LoadRanksFromDB(QueryResult* guildRanksResult) { if (!guildRanksResult) { sLog.outError("Guild %u has broken `guild_rank` data, creating new...", m_Id); CreateDefaultGuildRanks(0); return true; } Field* fields; bool broken_ranks = false; // GUILD RANKS are sequence starting from 0 = GUILD_MASTER (ALL PRIVILEGES) to max 9 (lowest privileges) // the lower rank id is considered higher rank - so promotion does rank-- and demotion does rank++ // between ranks in sequence can not be gaps - so 0,1,2,4 can not be // min ranks count is 5 and max is 10. do { fields = guildRanksResult->Fetch(); // condition that would be true when all ranks in QueryResult will be processed and guild without ranks is being processed if (!fields) { break; } uint32 guildId = fields[0].GetUInt32(); if (guildId < m_Id) { // there is in table guild_rank record which doesn't have guildid in guild table, report error sLog.outErrorDb("Guild %u does not exist but it has a record in guild_rank table, deleting it!", guildId); CharacterDatabase.PExecute("DELETE FROM guild_rank WHERE guildid = '%u'", guildId); continue; } if (guildId > m_Id) // we loaded all ranks for this guild already, break cycle { break; } uint32 rankID = fields[1].GetUInt32(); std::string rankName = fields[2].GetCppString(); uint32 rankRights = fields[3].GetUInt32(); if (rankID != m_Ranks.size()) // guild_rank.ids are sequence 0,1,2,3.. { broken_ranks = true; } // first rank is guildmaster, prevent loss leader rights if (m_Ranks.empty()) { rankRights |= GR_RIGHT_ALL; } AddRank(rankName, rankRights); } while (guildRanksResult->NextRow()); if (m_Ranks.size() < GUILD_RANKS_MIN_COUNT) // if too few ranks, renew them { m_Ranks.clear(); sLog.outError("Guild %u has broken `guild_rank` data, creating new...", m_Id); CreateDefaultGuildRanks(0); // 0 is default locale_idx broken_ranks = false; } // guild_rank have wrong numbered ranks, repair if (broken_ranks) { sLog.outError("Guild %u has broken `guild_rank` data, repairing...", m_Id); CharacterDatabase.BeginTransaction(); CharacterDatabase.PExecute("DELETE FROM guild_rank WHERE guildid='%u'", m_Id); for (size_t i = 0; i < m_Ranks.size(); ++i) { std::string name = m_Ranks[i].Name; uint32 rights = m_Ranks[i].Rights; CharacterDatabase.escape_string(name); CharacterDatabase.PExecute("INSERT INTO guild_rank (guildid,rid,rname,rights) VALUES ('%u', '%u', '%s', '%u')", m_Id, uint32(i), name.c_str(), rights); } CharacterDatabase.CommitTransaction(); } return true; }
bool Guild::LoadRanksFromDB(uint32 GuildId) { Field *fields; // 0 1 2 QueryResult *result = CharacterDatabase.PQuery("SELECT rid,rname,rights FROM guild_rank WHERE guildid = '%u' ORDER BY rid ASC", GuildId); if (!result) { sLog.outError("Guild %u has broken `guild_rank` data, creating new...",GuildId); CreateDefaultGuildRanks(0); return true; } bool broken_ranks = false; // GUILD RANKS are sequence starting from 0 = GUILD_MASTER (ALL PRIVILEGES) to max 9 (lowest privileges) // the lower rank id is considered higher rank - so promotion does rank-- and demotion does rank++ // between ranks in sequence cannot be gaps - so 0,1,2,4 cannot be // min ranks count is 5 and max is 10. do { fields = result->Fetch(); uint32 rankID = fields[0].GetUInt32(); std::string rankName = fields[1].GetCppString(); uint32 rankRights = fields[2].GetUInt32(); if (rankID != m_Ranks.size()) // guild_rank.ids are sequence 0,1,2,3.. broken_ranks = true; //first rank is guildmaster, prevent loss leader rights if (m_Ranks.empty()) rankRights |= GR_RIGHT_ALL; AddRank(rankName,rankRights); }while( result->NextRow() ); delete result; if (m_Ranks.size() < GUILD_RANKS_MIN_COUNT) // if too few ranks, renew them { m_Ranks.clear(); sLog.outError("Guild %u has broken `guild_rank` data, creating new...",GuildId); CreateDefaultGuildRanks(0); // 0 is default locale_idx broken_ranks = false; } // guild_rank have wrong numbered ranks, repair if (broken_ranks) { sLog.outError("Guild %u has broken `guild_rank` data, repairing...",GuildId); CharacterDatabase.BeginTransaction(); CharacterDatabase.PExecute("DELETE FROM guild_rank WHERE guildid='%u'", GuildId); for(size_t i = 0; i < m_Ranks.size(); ++i) { std::string name = m_Ranks[i].Name; uint32 rights = m_Ranks[i].Rights; CharacterDatabase.escape_string(name); CharacterDatabase.PExecute( "INSERT INTO guild_rank (guildid,rid,rname,rights) VALUES ('%u', '%u', '%s', '%u')", GuildId, uint32(i), name.c_str(), rights); } CharacterDatabase.CommitTransaction(); } return true; }