diff --git a/CMakeLists.txt b/CMakeLists.txt index 3013ab39c982..115a76db934b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,4 @@ - -# set minimum version +# set minimum version cmake_minimum_required(VERSION 3.1) project(wesnoth) @@ -58,6 +57,13 @@ option(ENABLE_TESTS "Build unit tests") option(ENABLE_NLS "Enable building of translations" ${ENABLE_GAME}) option(ENABLE_HISTORY "Enable using GNU history for history in lua console" ON) +# boost::asio::post is new with 1.66 +if(ENABLE_MYSQL) + set(BOOST_VERSION "1.66") +else() + set(BOOST_VERSION "1.56") +endif(ENABLE_MYSQL) + # set what std version to use if(NOT CXX_STD) set(CXX_STD "14") @@ -80,7 +86,7 @@ else() set(CRYPTO_LIBRARY "-framework Security") endif() -find_package(Boost 1.56 REQUIRED COMPONENTS iostreams program_options regex system thread random) +find_package(Boost ${BOOST_VERSION} REQUIRED COMPONENTS iostreams program_options regex system thread random) # no, gettext executables are not required when NLS is deactivated find_package(Gettext) @@ -535,7 +541,7 @@ if(ENABLE_GAME OR ENABLE_TESTS) endif(ENABLE_GAME OR ENABLE_TESTS) if(ENABLE_TESTS) - find_package( Boost 1.56 REQUIRED COMPONENTS unit_test_framework ) + find_package( Boost ${BOOST_VERSION} REQUIRED COMPONENTS unit_test_framework ) endif(ENABLE_TESTS) if(ENABLE_GAME) @@ -567,8 +573,8 @@ if(ENABLE_GAME) endif(ENABLE_HISTORY AND HISTORY_FOUND) endif(ENABLE_GAME) -find_package(Boost 1.56 REQUIRED COMPONENTS filesystem) -find_package(Boost 1.56 REQUIRED COMPONENTS locale) +find_package(Boost ${BOOST_VERSION} REQUIRED COMPONENTS filesystem) +find_package(Boost ${BOOST_VERSION} REQUIRED COMPONENTS locale) if(ENABLE_POT_UPDATE_TARGET) find_package(TranslationTools REQUIRED) diff --git a/SConstruct b/SConstruct index e3da1fe279a8..f5e06d9edf68 100755 --- a/SConstruct +++ b/SConstruct @@ -184,7 +184,11 @@ if env['distcc']: if env['ccache']: env.Tool('ccache') -boost_version = '1.56.0' +# boost::asio::post is new with 1.66 +if env["forum_user_handler"]: + boost_version = "1.66" +else: + boost_version = "1.56" def SortHelpText(a, b): diff --git a/src/server/common/dbconn.cpp b/src/server/common/dbconn.cpp index 3119f583a425..44082defe3e8 100644 --- a/src/server/common/dbconn.cpp +++ b/src/server/common/dbconn.cpp @@ -40,7 +40,8 @@ dbconn::dbconn(const config& c) account_ = mariadb::account::create(c["db_host"].str(), c["db_user"].str(), c["db_password"].str()); account_->set_connect_option(mysql_option::MYSQL_SET_CHARSET_NAME, std::string("utf8mb4")); account_->set_schema(c["db_name"].str()); - connection_ = mariadb::connection::create(account_); + // initialize sync query connection + connection_ = create_connection(); } catch(const mariadb::exception::base& e) { @@ -55,14 +56,33 @@ void dbconn::log_sql_exception(const std::string& text, const mariadb::exception << "error id: " << e.error_id() << std::endl; } +mariadb::connection_ref dbconn::create_connection() +{ + return mariadb::connection::create(account_); +} + // // queries // +/* simple test async query that will taken a noticeable amount of time to complete */ +int dbconn::async_test_query(int limit) +{ + std::string sql = "with recursive TEST(T) as " + "( " + "select 1 " + "union all " + "select T+1 from TEST where T < ? " + ") " + "select count(*) from TEST"; + int t = get_single_long(create_connection(), sql, limit); + return t; +} + std::string dbconn::get_uuid() { try { - return get_single_string("SELECT UUID()"); + return get_single_string(connection_, "SELECT UUID()"); } catch(const mariadb::exception::base& e) { @@ -81,7 +101,7 @@ std::string dbconn::get_tournaments() try { tournaments t; - get_complex_results(t, db_tournament_query_); + get_complex_results(connection_, t, db_tournament_query_); return t.str(); } catch(const mariadb::exception::base& e) @@ -95,7 +115,7 @@ bool dbconn::user_exists(const std::string& name) { try { - return exists("SELECT 1 FROM `"+db_users_table_+"` WHERE UPPER(username)=UPPER(?)", name); + return exists(connection_, "SELECT 1 FROM `"+db_users_table_+"` WHERE UPPER(username)=UPPER(?)", name); } catch(const mariadb::exception::base& e) { @@ -108,7 +128,7 @@ bool dbconn::extra_row_exists(const std::string& name) { try { - return exists("SELECT 1 FROM `"+db_extra_table_+"` WHERE UPPER(username)=UPPER(?)", name); + return exists(connection_, "SELECT 1 FROM `"+db_extra_table_+"` WHERE UPPER(username)=UPPER(?)", name); } catch(const mariadb::exception::base& e) { @@ -121,7 +141,8 @@ bool dbconn::is_user_in_group(const std::string& name, int group_id) { try { - return exists("SELECT 1 FROM `"+db_users_table_+"` u, `"+db_user_group_table_+"` ug WHERE UPPER(u.username)=UPPER(?) AND u.USER_ID = ug.USER_ID AND ug.GROUP_ID = ?", name, group_id); + return exists(connection_, "SELECT 1 FROM `"+db_users_table_+"` u, `"+db_user_group_table_+"` ug WHERE UPPER(u.username)=UPPER(?) AND u.USER_ID = ug.USER_ID AND ug.GROUP_ID = ?", + name, group_id); } catch(const mariadb::exception::base& e) { @@ -136,7 +157,8 @@ ban_check dbconn::get_ban_info(const std::string& name, const std::string& ip) { // selected ban_type value must be part of user_handler::BAN_TYPE ban_check b; - get_complex_results(b, "select ban_userid, ban_email, case when ban_ip != '' then 1 when ban_userid != 0 then 2 when ban_email != '' then 3 end as ban_type, ban_end from `"+db_banlist_table_+"` where (ban_ip = ? or ban_userid = (select user_id from `"+db_users_table_+"` where UPPER(username) = UPPER(?)) or UPPER(ban_email) = (select UPPER(user_email) from `"+db_users_table_+"` where UPPER(username) = UPPER(?))) AND ban_exclude = 0 AND (ban_end = 0 OR ban_end >= ?)", ip, name, name, std::time(nullptr)); + get_complex_results(connection_, b, "select ban_userid, ban_email, case when ban_ip != '' then 1 when ban_userid != 0 then 2 when ban_email != '' then 3 end as ban_type, ban_end from `"+db_banlist_table_+"` where (ban_ip = ? or ban_userid = (select user_id from `"+db_users_table_+"` where UPPER(username) = UPPER(?)) or UPPER(ban_email) = (select UPPER(user_email) from `"+db_users_table_+"` where UPPER(username) = UPPER(?))) AND ban_exclude = 0 AND (ban_end = 0 OR ban_end >= ?)", + ip, name, name, std::time(nullptr)); return b; } catch(const mariadb::exception::base& e) @@ -150,7 +172,7 @@ std::string dbconn::get_user_string(const std::string& table, const std::string& { try { - return get_single_string("SELECT `"+column+"` from `"+table+"` WHERE UPPER(username)=UPPER(?)", name); + return get_single_string(connection_, "SELECT `"+column+"` from `"+table+"` WHERE UPPER(username)=UPPER(?)", name); } catch(const mariadb::exception::base& e) { @@ -162,7 +184,7 @@ int dbconn::get_user_int(const std::string& table, const std::string& column, co { try { - return get_single_int("SELECT `"+column+"` from `"+table+"` WHERE UPPER(username)=UPPER(?)", name); + return static_cast(get_single_long(connection_, "SELECT `"+column+"` from `"+table+"` WHERE UPPER(username)=UPPER(?)", name)); } catch(const mariadb::exception::base& e) { @@ -176,9 +198,9 @@ void dbconn::write_user_int(const std::string& column, const std::string& name, { if(!extra_row_exists(name)) { - modify("INSERT INTO `"+db_extra_table_+"` VALUES(?,?,'0')", name, value); + modify(connection_, "INSERT INTO `"+db_extra_table_+"` VALUES(?,?,'0')", name, value); } - modify("UPDATE `"+db_extra_table_+"` SET "+column+"=? WHERE UPPER(username)=UPPER(?)", value, name); + modify(connection_, "UPDATE `"+db_extra_table_+"` SET "+column+"=? WHERE UPPER(username)=UPPER(?)", value, name); } catch(const mariadb::exception::base& e) { @@ -190,8 +212,8 @@ void dbconn::insert_game_info(const std::string& uuid, int game_id, const std::s { try { - modify("INSERT INTO `"+db_game_info_table_+"`(INSTANCE_UUID, GAME_ID, INSTANCE_VERSION, GAME_NAME, MAP_NAME, ERA_NAME, RELOAD, OBSERVERS, PUBLIC, PASSWORD, MAP_SOURCE_ADDON, MAP_VERSION, ERA_SOURCE_ADDON, ERA_VERSION) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", - uuid, game_id, version, name, map_name, era_name, reload, observers, is_public, has_password, map_source, map_version, era_source, era_version); + modify(connection_, "INSERT INTO `"+db_game_info_table_+"`(INSTANCE_UUID, GAME_ID, INSTANCE_VERSION, GAME_NAME, MAP_NAME, ERA_NAME, RELOAD, OBSERVERS, PUBLIC, PASSWORD, MAP_SOURCE_ADDON, MAP_VERSION, ERA_SOURCE_ADDON, ERA_VERSION) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + uuid, game_id, version, name, map_name, era_name, reload, observers, is_public, has_password, map_source, map_version, era_source, era_version); } catch(const mariadb::exception::base& e) { @@ -202,8 +224,8 @@ void dbconn::update_game_end(const std::string& uuid, int game_id, const std::st { try { - modify("UPDATE `"+db_game_info_table_+"` SET END_TIME = CURRENT_TIMESTAMP, REPLAY_NAME = ? WHERE INSTANCE_UUID = ? AND GAME_ID = ?", - replay_location, uuid, game_id); + modify(connection_, "UPDATE `"+db_game_info_table_+"` SET END_TIME = CURRENT_TIMESTAMP, REPLAY_NAME = ? WHERE INSTANCE_UUID = ? AND GAME_ID = ?", + replay_location, uuid, game_id); } catch(const mariadb::exception::base& e) { @@ -214,8 +236,8 @@ void dbconn::insert_game_player_info(const std::string& uuid, int game_id, const { try { - modify("INSERT INTO `"+db_game_player_info_table_+"`(INSTANCE_UUID, GAME_ID, USER_ID, SIDE_NUMBER, IS_HOST, FACTION, CLIENT_VERSION, CLIENT_SOURCE, USER_NAME) VALUES(?, ?, IFNULL((SELECT user_id FROM `"+db_users_table_+"` WHERE username = ?), -1), ?, ?, ?, ?, ?, ?)", - uuid, game_id, username, side_number, is_host, faction, version, source, current_user); + modify(connection_, "INSERT INTO `"+db_game_player_info_table_+"`(INSTANCE_UUID, GAME_ID, USER_ID, SIDE_NUMBER, IS_HOST, FACTION, CLIENT_VERSION, CLIENT_SOURCE, USER_NAME) VALUES(?, ?, IFNULL((SELECT user_id FROM `"+db_users_table_+"` WHERE username = ?), -1), ?, ?, ?, ?, ?, ?)", + uuid, game_id, username, side_number, is_host, faction, version, source, current_user); } catch(const mariadb::exception::base& e) { @@ -226,8 +248,8 @@ void dbconn::insert_modification_info(const std::string& uuid, int game_id, cons { try { - modify("INSERT INTO `"+db_game_modification_info_table_+"`(INSTANCE_UUID, GAME_ID, MODIFICATION_NAME, SOURCE_ADDON, VERSION) VALUES(?, ?, ?, ?, ?)", - uuid, game_id, modification_name, modification_source, modification_version); + modify(connection_, "INSERT INTO `"+db_game_modification_info_table_+"`(INSTANCE_UUID, GAME_ID, MODIFICATION_NAME, SOURCE_ADDON, VERSION) VALUES(?, ?, ?, ?, ?)", + uuid, game_id, modification_name, modification_source, modification_version); } catch(const mariadb::exception::base& e) { @@ -238,7 +260,7 @@ void dbconn::set_oos_flag(const std::string& uuid, int game_id) { try { - modify("UPDATE `"+db_game_info_table_+"` SET OOS = 1 WHERE INSTANCE_UUID = ? AND GAME_ID = ?", + modify(connection_, "UPDATE `"+db_game_info_table_+"` SET OOS = 1 WHERE INSTANCE_UUID = ? AND GAME_ID = ?", uuid, game_id); } catch(const mariadb::exception::base& e) @@ -252,18 +274,18 @@ void dbconn::set_oos_flag(const std::string& uuid, int game_id) // therefore for queries that can return multiple rows of multiple columns, implement a class to define how the results should be read // template -void dbconn::get_complex_results(rs_base& base, const std::string& sql, Args&&... args) +void dbconn::get_complex_results(mariadb::connection_ref connection, rs_base& base, const std::string& sql, Args&&... args) { - mariadb::result_set_ref rslt = select(sql, args...); + mariadb::result_set_ref rslt = select(connection, sql, args...); base.read(rslt); } // // get single values // template -std::string dbconn::get_single_string(const std::string& sql, Args&&... args) +std::string dbconn::get_single_string(mariadb::connection_ref connection, const std::string& sql, Args&&... args) { - mariadb::result_set_ref rslt = select(sql, args...); + mariadb::result_set_ref rslt = select(connection, sql, args...); if(rslt->next()) { return rslt->get_string(0); @@ -274,9 +296,9 @@ std::string dbconn::get_single_string(const std::string& sql, Args&&... args) } } template -int dbconn::get_single_int(const std::string& sql, Args&&... args) +long dbconn::get_single_long(mariadb::connection_ref connection, const std::string& sql, Args&&... args) { - mariadb::result_set_ref rslt = select(sql, args...); + mariadb::result_set_ref rslt = select(connection, sql, args...); if(rslt->next()) { // mariadbpp checks for strict integral equivalence, but we don't care @@ -292,19 +314,22 @@ int dbconn::get_single_int(const std::string& sql, Args&&... args) case mariadb::value::type::unsigned32: case mariadb::value::type::signed32: return rslt->get_signed32(0); + case mariadb::value::type::unsigned64: + case mariadb::value::type::signed64: + return rslt->get_signed64(0); default: - throw mariadb::exception::base("Value retrieved was not an int!"); + throw mariadb::exception::base("Value retrieved was not a long!"); } } else { - throw mariadb::exception::base("No int value found in the database!"); + throw mariadb::exception::base("No long value found in the database!"); } } template -bool dbconn::exists(const std::string& sql, Args&&... args) +bool dbconn::exists(mariadb::connection_ref connection, const std::string& sql, Args&&... args) { - mariadb::result_set_ref rslt = select(sql, args...); + mariadb::result_set_ref rslt = select(connection, sql, args...); return rslt->next(); } @@ -312,38 +337,32 @@ bool dbconn::exists(const std::string& sql, Args&&... args) // select or modify values // template -mariadb::result_set_ref dbconn::select(const std::string& sql, Args&&... args) +mariadb::result_set_ref dbconn::select(mariadb::connection_ref connection, const std::string& sql, Args&&... args) { try { - mariadb::statement_ref stmt = query(sql, args...); - return mariadb::result_set_ref(stmt->query()); + mariadb::statement_ref stmt = query(connection, sql, args...); + mariadb::result_set_ref rslt = mariadb::result_set_ref(stmt->query()); + return rslt; } catch(const mariadb::exception::base& e) { - if(!connection_->connected()) - { - ERR_SQL << "Connection is invalid!" << std::endl; - } - ERR_SQL << "SQL query failed for query: `"+sql+"`!" << std::endl; + ERR_SQL << "SQL query failed for query: `"+sql+"`" << std::endl; throw e; } } template -int dbconn::modify(const std::string& sql, Args&&... args) +int dbconn::modify(mariadb::connection_ref connection, const std::string& sql, Args&&... args) { try { - mariadb::statement_ref stmt = query(sql, args...); - return stmt->insert(); + mariadb::statement_ref stmt = query(connection, sql, args...); + int count = stmt->insert(); + return count; } catch(const mariadb::exception::base& e) { - if(!connection_->connected()) - { - ERR_SQL << "Connection is invalid!" << std::endl; - } - ERR_SQL << "SQL query failed for query: `"+sql+"`!" << std::endl; + ERR_SQL << "SQL query failed for query: `"+sql+"`" << std::endl; throw e; } } @@ -352,9 +371,9 @@ int dbconn::modify(const std::string& sql, Args&&... args) // start of recursive unpacking of variadic template in order to be able to call correct parameterized setters on query // template -mariadb::statement_ref dbconn::query(const std::string& sql, Args&&... args) +mariadb::statement_ref dbconn::query(mariadb::connection_ref connection, const std::string& sql, Args&&... args) { - mariadb::statement_ref stmt = connection_->create_statement(sql); + mariadb::statement_ref stmt = connection->create_statement(sql); prepare(stmt, 0, args...); return stmt; } diff --git a/src/server/common/dbconn.hpp b/src/server/common/dbconn.hpp index 02a6e6e41722..b6112eaccf90 100644 --- a/src/server/common/dbconn.hpp +++ b/src/server/common/dbconn.hpp @@ -31,6 +31,9 @@ class dbconn { public: dbconn(const config& c); + + int async_test_query(int limit); + std::string get_uuid(); std::string get_tournaments(); bool user_exists(const std::string& name); @@ -60,27 +63,28 @@ class dbconn std::string db_tournament_query_; void log_sql_exception(const std::string& text, const mariadb::exception::base& e); + mariadb::connection_ref create_connection(); template - void get_complex_results(rs_base& base, const std::string& sql, Args&&... args); + void get_complex_results(mariadb::connection_ref connection, rs_base& base, const std::string& sql, Args&&... args); template - std::string get_single_string(const std::string& sql, Args&&... args); + std::string get_single_string(mariadb::connection_ref connection, const std::string& sql, Args&&... args); template - int get_single_int(const std::string& sql, Args&&... args); + long get_single_long(mariadb::connection_ref connection, const std::string& sql, Args&&... args); template - bool exists(const std::string& sql, Args&&... args); + bool exists(mariadb::connection_ref connection, const std::string& sql, Args&&... args); template - mariadb::result_set_ref select(const std::string& sql, Args&&... args); + mariadb::result_set_ref select(mariadb::connection_ref connection, const std::string& sql, Args&&... args); template - int modify(const std::string& sql, Args&&... args); + int modify(mariadb::connection_ref connection, const std::string& sql, Args&&... args); template - mariadb::statement_ref query(const std::string& sql, Args&&... args); + mariadb::statement_ref query(mariadb::connection_ref connection, const std::string& sql, Args&&... args); template void prepare(mariadb::statement_ref stmt, int i, Arg arg, Args&&... args); diff --git a/src/server/common/forum_user_handler.cpp b/src/server/common/forum_user_handler.cpp index cd61e92699a1..668581fd3ce0 100644 --- a/src/server/common/forum_user_handler.cpp +++ b/src/server/common/forum_user_handler.cpp @@ -34,7 +34,7 @@ namespace { } fuh::fuh(const config& c) - : conn(c) + : conn_(c) , db_users_table_(c["db_users_table"].str()) , db_extra_table_(c["db_extra_table"].str()) , mp_mod_group_(0) @@ -109,11 +109,11 @@ void fuh::user_logged_in(const std::string& name) { } bool fuh::user_exists(const std::string& name) { - return conn.user_exists(name); + return conn_.user_exists(name); } bool fuh::user_is_active(const std::string& name) { - int user_type = conn.get_user_int(db_users_table_, "user_type", name); + int user_type = conn_.get_user_int(db_users_table_, "user_type", name); return user_type != USER_INACTIVE && user_type != USER_IGNORE; } @@ -121,14 +121,14 @@ bool fuh::user_is_moderator(const std::string& name) { if(!user_exists(name)){ return false; } - return conn.get_user_int(db_extra_table_, "user_is_moderator", name) == 1 || (mp_mod_group_ != 0 && conn.is_user_in_group(name, mp_mod_group_)); + return conn_.get_user_int(db_extra_table_, "user_is_moderator", name) == 1 || (mp_mod_group_ != 0 && conn_.is_user_in_group(name, mp_mod_group_)); } void fuh::set_is_moderator(const std::string& name, const bool& is_moderator) { if(!user_exists(name)){ return; } - conn.write_user_int("user_is_moderator", name, is_moderator); + conn_.write_user_int("user_is_moderator", name, is_moderator); } fuh::ban_info fuh::user_is_banned(const std::string& name, const std::string& addr) @@ -139,7 +139,7 @@ fuh::ban_info fuh::user_is_banned(const std::string& name, const std::string& ad // prepared SQL statement API right now. However, they are basically // never used on forums.wesnoth.org, so this shouldn't be a problem // for the time being. - ban_check b = conn.get_ban_info(name, addr); + ban_check b = conn_.get_ban_info(name, addr); switch(b.get_ban_type()) { case BAN_NONE: @@ -188,47 +188,55 @@ std::string fuh::user_info(const std::string& name) { } std::string fuh::get_hash(const std::string& user) { - return conn.get_user_string(db_users_table_, "user_password", user); + return conn_.get_user_string(db_users_table_, "user_password", user); } std::time_t fuh::get_lastlogin(const std::string& user) { - return std::time_t(conn.get_user_int(db_extra_table_, "user_lastvisit", user)); + return std::time_t(conn_.get_user_int(db_extra_table_, "user_lastvisit", user)); } std::time_t fuh::get_registrationdate(const std::string& user) { - return std::time_t(conn.get_user_int(db_users_table_, "user_regdate", user)); + return std::time_t(conn_.get_user_int(db_users_table_, "user_regdate", user)); } void fuh::set_lastlogin(const std::string& user, const std::time_t& lastlogin) { - conn.write_user_int("user_lastvisit", user, static_cast(lastlogin)); + conn_.write_user_int("user_lastvisit", user, static_cast(lastlogin)); } std::string fuh::get_uuid(){ - return conn.get_uuid(); + return conn_.get_uuid(); } std::string fuh::get_tournaments(){ - return conn.get_tournaments(); + return conn_.get_tournaments(); } void fuh::db_insert_game_info(const std::string& uuid, int game_id, const std::string& version, const std::string& name, const std::string& map_name, const std::string& era_name, int reload, int observers, int is_public, int has_password, const std::string& map_source, const std::string& map_version, const std::string& era_source, const std::string& era_version){ - conn.insert_game_info(uuid, game_id, version, name, map_name, era_name, reload, observers, is_public, has_password, map_source, map_version, era_source, era_version); + conn_.insert_game_info(uuid, game_id, version, name, map_name, era_name, reload, observers, is_public, has_password, map_source, map_version, era_source, era_version); } void fuh::db_update_game_end(const std::string& uuid, int game_id, const std::string& replay_location){ - conn.update_game_end(uuid, game_id, replay_location); + conn_.update_game_end(uuid, game_id, replay_location); } void fuh::db_insert_game_player_info(const std::string& uuid, int game_id, const std::string& username, int side_number, int is_host, const std::string& faction, const std::string& version, const std::string& source, const std::string& current_user){ - conn.insert_game_player_info(uuid, game_id, username, side_number, is_host, faction, version, source, current_user); + conn_.insert_game_player_info(uuid, game_id, username, side_number, is_host, faction, version, source, current_user); } void fuh::db_insert_modification_info(const std::string& uuid, int game_id, const std::string& modification_name, const std::string& modification_source, const std::string& modification_version){ - conn.insert_modification_info(uuid, game_id, modification_name, modification_source, modification_version); + conn_.insert_modification_info(uuid, game_id, modification_name, modification_source, modification_version); } void fuh::db_set_oos_flag(const std::string& uuid, int game_id){ - conn.set_oos_flag(uuid, game_id); + conn_.set_oos_flag(uuid, game_id); +} + +void fuh::async_test_query(boost::asio::io_service& io_service, int limit) { + boost::asio::post([this, limit, &io_service] { + ERR_UH << "async test query starts!" << std::endl; + int i = conn_.async_test_query(limit); + boost::asio::post(io_service, [i]{ ERR_UH << "async test query output: " << i << std::endl; }); + }); } #endif //HAVE_MYSQLPP diff --git a/src/server/common/forum_user_handler.hpp b/src/server/common/forum_user_handler.hpp index f8f74b37827c..823bcba5d1d9 100644 --- a/src/server/common/forum_user_handler.hpp +++ b/src/server/common/forum_user_handler.hpp @@ -74,8 +74,10 @@ class fuh : public user_handler { void db_insert_modification_info(const std::string& uuid, int game_id, const std::string& modification_name, const std::string& modification_source, const std::string& modification_version); void db_set_oos_flag(const std::string& uuid, int game_id); + void async_test_query(boost::asio::io_service& io_service, int limit); + private: - dbconn conn; + dbconn conn_; std::string db_users_table_; std::string db_extra_table_; int mp_mod_group_; diff --git a/src/server/common/user_handler.hpp b/src/server/common/user_handler.hpp index d50a83e78143..94bf86f9afd7 100644 --- a/src/server/common/user_handler.hpp +++ b/src/server/common/user_handler.hpp @@ -21,6 +21,8 @@ class config; #include #include +#include + /** * An interface class to handle nick registration * To activate it put a [user_handler] section into the @@ -141,4 +143,5 @@ class user_handler { virtual void db_insert_game_player_info(const std::string& uuid, int game_id, const std::string& username, int side_number, int is_host, const std::string& faction, const std::string& version, const std::string& source, const std::string& current_user) =0; virtual void db_insert_modification_info(const std::string& uuid, int game_id, const std::string& modification_name, const std::string& modification_source, const std::string& modification_version) =0; virtual void db_set_oos_flag(const std::string& uuid, int game_id) =0; + virtual void async_test_query(boost::asio::io_service& io_service, int limit) =0; }; diff --git a/utils/travis/docker_run.sh b/utils/travis/docker_run.sh index 96b5886329c4..5c05155a58a5 100755 --- a/utils/travis/docker_run.sh +++ b/utils/travis/docker_run.sh @@ -122,26 +122,33 @@ else ccache -s ccache -z +# remove once 1804 isn't used anymore + elif [ "$IMAGE" == "1804" ]; then + scons wesnoth wesnothd campaignd boost_unit_tests build="$CFG" \ + ctool=$CC cxxtool=$CXX cxx_std=$CXXSTD \ + extra_flags_config="-pipe" strict="$STRICT" forum_user_handler=false \ + nls="$NLS" enable_lto="$LTO" sanitize="$SAN" jobs=2 --debug=time + BUILD_RET=$? else scons wesnoth wesnothd campaignd boost_unit_tests build="$CFG" \ ctool=$CC cxxtool=$CXX cxx_std=$CXXSTD \ extra_flags_config="-pipe" strict="$STRICT" forum_user_handler=true \ nls="$NLS" enable_lto="$LTO" sanitize="$SAN" jobs=2 --debug=time BUILD_RET=$? - -# rename debug executables to what the tests expect - if [ "$CFG" == "debug" ]; then - mv wesnoth-debug wesnoth - mv wesnothd-debug wesnothd - mv campaignd-debug campaignd - mv boost_unit_tests-debug boost_unit_tests - fi fi if [ $BUILD_RET != 0 ]; then exit $BUILD_RET fi +# rename debug executables to what the tests expect + if [ "$CFG" == "debug" ]; then + mv wesnoth-debug wesnoth + mv wesnothd-debug wesnothd + mv campaignd-debug campaignd + mv boost_unit_tests-debug boost_unit_tests + fi + if [ "$UPLOAD_ID" != "" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then bzip2 -9 -k wesnoth bzip2 -9 -k wesnothd