diff --git a/src/game/guild.cpp b/src/game/guild.cpp index 0e5339b..648219f 100644 --- a/src/game/guild.cpp +++ b/src/game/guild.cpp @@ -92,6 +92,17 @@ namespace return true; } + bool PrepareGuildCommentList(CStmt& stmt, uint32_t guildId) + { + const std::string query = std::string("SELECT id, name, content FROM guild_comment") + get_table_postfix() + + " WHERE guild_id=? ORDER BY notice DESC, id DESC LIMIT " + std::to_string(GUILD_COMMENT_MAX_COUNT); + + if (!PrepareGameStmt(stmt, query)) + return false; + + return stmt.BindParam(MYSQL_TYPE_LONG, &guildId); + } + struct FGuildNameSender { FGuildNameSender(uint32_t id, const char* guild_name) : id(id), name(guild_name) @@ -1131,45 +1142,55 @@ void CGuild::RefreshComment(LPCHARACTER ch) void CGuild::RefreshCommentForce(DWORD player_id) { LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(player_id); - if (ch == NULL) { + if (ch == NULL) return; - } - - auto pmsg = DBManager::instance().DirectQuery("SELECT id, name, content FROM guild_comment%s WHERE guild_id = %u ORDER BY notice DESC, id DESC LIMIT %d", get_table_postfix(), m_data.guild_id, GUILD_COMMENT_MAX_COUNT); TPacketGCGuild pack; pack.header = GC::GUILD; - pack.length = sizeof(pack)+1; + pack.length = sizeof(pack) + 1; pack.subheader = GuildSub::GC::COMMENTS; - BYTE count = pmsg->Get()->uiNumRows; - LPDESC d = ch->GetDesc(); if (!d) return; - pack.length += (sizeof(DWORD)+CHARACTER_NAME_MAX_LEN+1+GUILD_COMMENT_MAX_LEN+1)*(WORD)count; - d->BufferedPacket(&pack,sizeof(pack)); - d->BufferedPacket(&count, 1); + CStmt stmt; + uint32_t id = 0; char szName[CHARACTER_NAME_MAX_LEN + 1]; char szContent[GUILD_COMMENT_MAX_LEN + 1]; + memset(szName, 0, sizeof(szName)); memset(szContent, 0, sizeof(szContent)); - for (uint i = 0; i < pmsg->Get()->uiNumRows; i++) + if (!PrepareGuildCommentList(stmt, m_data.guild_id) + || !stmt.BindResult(MYSQL_TYPE_LONG, &id) + || !stmt.BindResult(MYSQL_TYPE_STRING, szName, sizeof(szName)) + || !stmt.BindResult(MYSQL_TYPE_STRING, szContent, sizeof(szContent)) + || !stmt.Execute()) { - MYSQL_ROW row = mysql_fetch_row(pmsg->Get()->pSQLResult); - DWORD id = strtoul(row[0], NULL, 10); + return; + } - strlcpy(szName, row[1], sizeof(szName)); - strlcpy(szContent, row[2], sizeof(szContent)); + BYTE count = static_cast(stmt.iRows); + + pack.length += (sizeof(DWORD) + CHARACTER_NAME_MAX_LEN + 1 + GUILD_COMMENT_MAX_LEN + 1) * static_cast(count); + d->BufferedPacket(&pack, sizeof(pack)); + d->BufferedPacket(&count, 1); + + for (BYTE i = 0; i < count; ++i) + { + memset(szName, 0, sizeof(szName)); + memset(szContent, 0, sizeof(szContent)); + + if (!stmt.Fetch()) + break; d->BufferedPacket(&id, sizeof(id)); d->BufferedPacket(szName, sizeof(szName)); - if (i == pmsg->Get()->uiNumRows - 1) - d->Packet(szContent, sizeof(szContent)); // 마지막 줄이면 보내기 + if (i == count - 1) + d->Packet(szContent, sizeof(szContent)); else d->BufferedPacket(szContent, sizeof(szContent)); }