mirror of
https://github.com/wesnoth/wesnoth
synced 2025-05-18 20:02:31 +00:00
Merge pull request #224 from AI0867/wesnothd_memory_leak
Fix a memory leak in forum_user_handler
This commit is contained in:
commit
d8aea90eaa
@ -115,7 +115,8 @@ bool fuh::user_exists(const std::string& name) {
|
|||||||
|
|
||||||
// Make a test query for this username
|
// Make a test query for this username
|
||||||
try {
|
try {
|
||||||
return mysql_fetch_row(db_query("SELECT username FROM " + db_users_table_ + " WHERE UPPER(username)=UPPER('" + name + "')"));
|
mysql_result res = db_query("SELECT username FROM " + db_users_table_ + " WHERE UPPER(username)=UPPER('" + name + "')");
|
||||||
|
return mysql_fetch_row(res.get());
|
||||||
} catch (error& e) {
|
} catch (error& e) {
|
||||||
ERR_UH << "Could not execute test query for user '" << name << "' :" << e.message << std::endl;
|
ERR_UH << "Could not execute test query for user '" << name << "' :" << e.message << std::endl;
|
||||||
// If the database is down just let all usernames log in
|
// If the database is down just let all usernames log in
|
||||||
@ -248,7 +249,13 @@ void fuh::set_lastlogin(const std::string& user, const time_t& lastlogin) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MYSQL_RES* fuh::db_query(const std::string& sql) {
|
struct result_deleter {
|
||||||
|
void operator()(MYSQL_RES *result) {
|
||||||
|
mysql_free_result(result);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
fuh::mysql_result fuh::db_query(const std::string& sql) {
|
||||||
if(mysql_query(conn, sql.c_str())) {
|
if(mysql_query(conn, sql.c_str())) {
|
||||||
WRN_UH << "not connected to database, reconnecting..." << std::endl;
|
WRN_UH << "not connected to database, reconnecting..." << std::endl;
|
||||||
//Try to reconnect and execute query again
|
//Try to reconnect and execute query again
|
||||||
@ -258,11 +265,12 @@ MYSQL_RES* fuh::db_query(const std::string& sql) {
|
|||||||
throw error("Error querying database.");
|
throw error("Error querying database.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return mysql_store_result(conn);
|
return mysql_result(mysql_store_result(conn), result_deleter());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string fuh::db_query_to_string(const std::string& sql) {
|
std::string fuh::db_query_to_string(const std::string& sql) {
|
||||||
return std::string(mysql_fetch_row(db_query(sql))[0]);
|
mysql_result res = db_query(sql);
|
||||||
|
return std::string(mysql_fetch_row(res.get())[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -292,7 +300,8 @@ bool fuh::extra_row_exists(const std::string& name) {
|
|||||||
|
|
||||||
// Make a test query for this username
|
// Make a test query for this username
|
||||||
try {
|
try {
|
||||||
return mysql_fetch_row(db_query("SELECT username FROM " + db_extra_table_ + " WHERE UPPER(username)=UPPER('" + name + "')"));
|
mysql_result res = db_query("SELECT username FROM " + db_extra_table_ + " WHERE UPPER(username)=UPPER('" + name + "')");
|
||||||
|
return mysql_fetch_row(res.get());
|
||||||
} catch (error& e) {
|
} catch (error& e) {
|
||||||
ERR_UH << "Could not execute test query for user '" << name << "' :" << e.message << std::endl;
|
ERR_UH << "Could not execute test query for user '" << name << "' :" << e.message << std::endl;
|
||||||
return false;
|
return false;
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
#include <mysql/mysql.h>
|
#include <mysql/mysql.h>
|
||||||
|
|
||||||
// The [user_handler] section in the server configuration
|
// The [user_handler] section in the server configuration
|
||||||
@ -93,8 +94,13 @@ class fuh : public user_handler {
|
|||||||
|
|
||||||
std::string db_name_, db_host_, db_user_, db_password_, db_users_table_, db_extra_table_;
|
std::string db_name_, db_host_, db_user_, db_password_, db_users_table_, db_extra_table_;
|
||||||
|
|
||||||
|
// std::unique_ptr would be better, as the object isn't actually shared
|
||||||
|
// boost::scoped_ptr cannot be returned, so we can't use that
|
||||||
|
// TODO C++11: switch to std::unique_ptr
|
||||||
|
typedef boost::shared_ptr<MYSQL_RES> mysql_result;
|
||||||
|
|
||||||
// Throws user_handler::error
|
// Throws user_handler::error
|
||||||
MYSQL_RES* db_query(const std::string& query);
|
mysql_result db_query(const std::string& query);
|
||||||
|
|
||||||
// Throws user_handler::error via db_query()
|
// Throws user_handler::error via db_query()
|
||||||
std::string db_query_to_string(const std::string& query);
|
std::string db_query_to_string(const std::string& query);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user