diff --git a/src/game/guild.cpp b/src/game/guild.cpp index 648219f..0f7d95a 100644 --- a/src/game/guild.cpp +++ b/src/game/guild.cpp @@ -103,6 +103,76 @@ namespace return stmt.BindParam(MYSQL_TYPE_LONG, &guildId); } + bool InsertGuildRecord(const char* name, uint32_t masterPid, uint32_t& guildId) + { + CStmt stmt; + const std::string query = std::string("INSERT INTO guild") + get_table_postfix() + + "(name, master, sp, level, exp, skill_point, skill) " + + "VALUES(?, ?, 1000, 1, 0, 0, '\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0')"; + + guildId = 0; + + if (!PrepareGameStmt(stmt, query)) + return false; + + if (!stmt.BindParam(MYSQL_TYPE_STRING, const_cast(name)) + || !stmt.BindParam(MYSQL_TYPE_LONG, &masterPid) + || !stmt.Execute()) + { + return false; + } + + guildId = static_cast(stmt.GetInsertId()); + return true; + } + + bool InsertGuildGrade(uint32_t guildId, int grade, const char* gradeName, int authFlag) + { + CStmt stmt; + const std::string query = std::string("INSERT INTO guild_grade") + get_table_postfix() + " VALUES(?, ?, ?, ?)"; + + if (!PrepareGameStmt(stmt, query)) + return false; + + if (!stmt.BindParam(MYSQL_TYPE_LONG, &guildId) + || !stmt.BindParam(MYSQL_TYPE_LONG, &grade) + || !stmt.BindParam(MYSQL_TYPE_STRING, const_cast(gradeName)) + || !stmt.BindParam(MYSQL_TYPE_LONG, &authFlag)) + { + return false; + } + + return stmt.Execute(); + } + + bool LoadGuildInviteLimit(uint32_t guildId, uint32_t& inviteLimit, bool& found) + { + CStmt stmt; + const std::string query = "SELECT value FROM guild_invite_limit WHERE id=?"; + + inviteLimit = 0; + found = false; + + if (!PrepareGameStmt(stmt, query)) + return false; + + if (!stmt.BindParam(MYSQL_TYPE_LONG, &guildId) + || !stmt.BindResult(MYSQL_TYPE_LONG, &inviteLimit) + || !stmt.Execute()) + { + return false; + } + + if (stmt.iRows == 0) + return true; + + if (!stmt.Fetch()) + return false; + + found = true; + return true; + } + struct FGuildNameSender { FGuildNameSender(uint32_t id, const char* guild_name) : id(id), name(guild_name) @@ -149,22 +219,15 @@ CGuild::CGuild(TGuildCreateParameter & cp) m_data.grade_array[i].auth_flag = 0; } - auto pmsg = DBManager::instance().DirectQuery( - "INSERT INTO guild%s(name, master, sp, level, exp, skill_point, skill) " - "VALUES('%s', %u, 1000, 1, 0, 0, '\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0')", - get_table_postfix(), m_data.name, m_data.master_pid); - - // TODO if error occur? - m_data.guild_id = pmsg->Get()->uiInsertID; + InsertGuildRecord(m_data.name, m_data.master_pid, m_data.guild_id); for (int i = 0; i < GUILD_GRADE_COUNT; ++i) { - DBManager::instance().Query("INSERT INTO guild_grade%s VALUES(%u, %d, '%s', %d)", - get_table_postfix(), - m_data.guild_id, - i + 1, - m_data.grade_array[i].grade_name, - m_data.grade_array[i].auth_flag); + InsertGuildGrade( + m_data.guild_id, + i + 1, + m_data.grade_array[i].grade_name, + m_data.grade_array[i].auth_flag); } ComputeGuildPoints(); @@ -2200,13 +2263,13 @@ CGuild::GuildJoinErrCode CGuild::VerifyGuildJoinableCondition( const LPCHARACTER } else if ( LC_IsBrazil() == true ) { - auto pMsg = DBManager::instance().DirectQuery("SELECT value FROM guild_invite_limit WHERE id=%d", GetID()); + uint32_t inviteLimit = 0; + bool hasInviteLimit = false; - if ( pMsg->Get()->uiNumRows > 0 ) + if (LoadGuildInviteLimit(GetID(), inviteLimit, hasInviteLimit) && hasInviteLimit) { - MYSQL_ROW row = mysql_fetch_row(pMsg->Get()->pSQLResult); time_t limit_time=0; - str_to_number( limit_time, row[0] ); + limit_time = inviteLimit; if (test_server) { diff --git a/src/libsql/Statement.cpp b/src/libsql/Statement.cpp index a34e7a8..56dcaec 100644 --- a/src/libsql/Statement.cpp +++ b/src/libsql/Statement.cpp @@ -188,3 +188,11 @@ unsigned long long CStmt::GetAffectedRows() const return mysql_stmt_affected_rows(m_pkStmt); } + +unsigned long long CStmt::GetInsertId() const +{ + if (!m_pkStmt) + return 0; + + return mysql_stmt_insert_id(m_pkStmt); +} diff --git a/src/libsql/Statement.h b/src/libsql/Statement.h index 3a52e1f..6623773 100644 --- a/src/libsql/Statement.h +++ b/src/libsql/Statement.h @@ -19,6 +19,7 @@ class CStmt bool Fetch(); unsigned long GetResultLength(unsigned int index) const; unsigned long long GetAffectedRows() const; + unsigned long long GetInsertId() const; void Error(const char * c_pszMsg);