From f298cee118d04db26bebbe125f474f608e165131 Mon Sep 17 00:00:00 2001 From: Mordred Date: Tue, 12 Sep 2017 00:24:32 +0200 Subject: [PATCH] Added c++MysqlConnector --- src/servers/Server_Common/CMakeLists.txt | 8 ++- .../Server_Common/Database/DatabaseNew.cpp | 44 ++++++++++++++ .../Server_Common/Database/DatabaseNew.h | 60 +++++++++++++++++++ src/servers/Server_Zone/CMakeLists.txt | 10 ++-- src/servers/Server_Zone/ServerZone.cpp | 18 ++++++ 5 files changed, 134 insertions(+), 6 deletions(-) create mode 100644 src/servers/Server_Common/Database/DatabaseNew.cpp create mode 100644 src/servers/Server_Common/Database/DatabaseNew.h diff --git a/src/servers/Server_Common/CMakeLists.txt b/src/servers/Server_Common/CMakeLists.txt index 3dce76c2..a6d70d7f 100644 --- a/src/servers/Server_Common/CMakeLists.txt +++ b/src/servers/Server_Common/CMakeLists.txt @@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 2.6) project(Sapphire) include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/sapphire/datReader/") +include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/MySQLpp/include/") include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/ChaiScript-6.0.0/include/") if(UNIX) @@ -23,6 +24,9 @@ if(UNIX) else() add_definitions(-D_WIN32_WINNT=0x601) include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/MySQL/") + include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/MySQLpp/") + include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/MySQLpp/includes/") + message(STATUS "Using boost in /libraries/external") message(STATUS "Setting MSVC flags") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHc") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") @@ -82,7 +86,7 @@ set_target_properties(Common PROPERTIES ) if (UNIX) - target_link_libraries(Common xivdat mysqlclient) + target_link_libraries( Common xivdat mysqlclient ) else() - target_link_libraries(Common xivdat libmysql) + target_link_libraries( Common xivdat libmysql ) endif() diff --git a/src/servers/Server_Common/Database/DatabaseNew.cpp b/src/servers/Server_Common/Database/DatabaseNew.cpp new file mode 100644 index 00000000..0eb74aa8 --- /dev/null +++ b/src/servers/Server_Common/Database/DatabaseNew.cpp @@ -0,0 +1,44 @@ +#include "DatabaseNew.h" + +#include "src/servers/Server_Common/Logging/Logger.h" + +extern Core::Logger g_log; + +Core::Db::DatabaseNew::DatabaseNew() +{ + m_driver = get_driver_instance(); +} + +Core::Db::DatabaseNew::~DatabaseNew() +{ + +} + +bool Core::Db::DatabaseNew::initialize( const DbParams& params ) +{ + uint32_t i; + + g_log.info( "Database: Connecting to " + params.hostname + ", database " + params.databaseName + "..." ); + + m_pConnections = new DbConnection[params.connectionCount]; + for( i = 0; i < params.connectionCount; ++i ) + { + try + { + std::string host = "tcp://" + params.hostname + ":" + std::to_string( params.port ); + m_pConnections[i].conn = m_driver->connect( host.c_str(), params.username.c_str(), params.password.c_str() ); + m_pConnections[i].conn->setSchema( params.databaseName.c_str() ); + bool myTrue = true; + m_pConnections[i].conn->setClientOption( "OPT_RECONNECT", &myTrue ); + m_pConnections[i].conn->setClientOption( "SET_CHARSET_NAME", "utf8" ); + } + catch( sql::SQLException &e ) + { + g_log.fatal( "Database: Connection failed: " + std::string( e.what() ) ); + return false; + } + } + + + return true; +} \ No newline at end of file diff --git a/src/servers/Server_Common/Database/DatabaseNew.h b/src/servers/Server_Common/Database/DatabaseNew.h new file mode 100644 index 00000000..b0439d5f --- /dev/null +++ b/src/servers/Server_Common/Database/DatabaseNew.h @@ -0,0 +1,60 @@ +#ifndef SAPPHIRE_DATABASENEW_H +#define SAPPHIRE_DATABASENEW_H + +#include + +#include "mysql_connection.h" + +#include +#include +#include +#include + +namespace Core +{ +namespace Db +{ + +struct DbParams +{ + std::string hostname; + std::string username; + std::string password; + std::string databaseName; + uint16_t port; + uint32_t bufferSize; + uint32_t connectionCount; +}; + +struct DbConnection +{ + std::mutex lock; + sql::Connection *conn; +}; + +class DatabaseNew +{ +private: + sql::Driver * m_driver; + sql::Connection *m_con; + sql::Statement *m_stmt; + sql::ResultSet *m_res; + + DbConnection *m_pConnections; + +public: + DatabaseNew(); + ~DatabaseNew(); + + bool initialize( const DbParams& params ); + + +}; + +} +} + + + + +#endif //SAPPHIRE_DATABASENEW_H diff --git a/src/servers/Server_Zone/CMakeLists.txt b/src/servers/Server_Zone/CMakeLists.txt index f5abcffe..9a98c457 100644 --- a/src/servers/Server_Zone/CMakeLists.txt +++ b/src/servers/Server_Zone/CMakeLists.txt @@ -4,8 +4,9 @@ cmake_policy(SET CMP0014 OLD) project(Sapphire_Zone) -include_directories("../../libraries/external/ChaiScript-6.0.0/include/") -include_directories("../../libraries/sapphire/datReader/") +include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/ChaiScript-6.0.0/include/") +include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/sapphire/datReader/") +include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/MySQLpp/include/") include_directories("../") file(GLOB SERVER_PUBLIC_INCLUDE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/* ${CMAKE_CURRENT_SOURCE_DIR}/Script/*) @@ -77,6 +78,7 @@ include_directories(${Boost_INCLUDE_DIR}) link_directories(${BOOST_LIBRARYDIR}) link_directories(${SERVER_COMMON_DIR}) link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/sapphire/datReader) +link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../libraries/external/MySQLpp/lib/opt) if(CMAKE_SIZEOF_VOID_P EQUAL 4) # 32 bit link @@ -104,9 +106,9 @@ set_target_properties(server_zone PROPERTIES ) if (UNIX) - target_link_libraries (server_zone Common xivdat pthread mysqlclient dl z) + target_link_libraries ( server_zone Common xivdat pthread mysqlclient dl z ) else() - target_link_libraries (server_zone Common xivdat libmysql zlib1) + target_link_libraries ( server_zone Common xivdat libmysql zlib1 mysqlcppconn ) endif() target_link_libraries(server_zone ${Boost_LIBRARIES} ${Boost_LIBRARIES}) diff --git a/src/servers/Server_Zone/ServerZone.cpp b/src/servers/Server_Zone/ServerZone.cpp index 8d5bb5dc..8997bef1 100644 --- a/src/servers/Server_Zone/ServerZone.cpp +++ b/src/servers/Server_Zone/ServerZone.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -33,6 +34,7 @@ Core::Logger g_log; Core::Db::Database g_database; +Core::Db::DatabaseNew g_dbNew; Core::DebugCommandHandler g_gameCommandMgr; Core::Scripting::ScriptManager g_scriptMgr; Core::Data::ExdData g_exdData; @@ -164,6 +166,22 @@ bool Core::ServerZone::loadSettings( int32_t argc, char* argv[] ) params.port = m_pConfig->getValue< uint16_t >( "Settings.General.Mysql.Port", 3306 ); params.username = m_pConfig->getValue< std::string >( "Settings.General.Mysql.Username", "root" ); + Db::DbParams params1; + params1.bufferSize = 16384; + params1.connectionCount = 3; + params1.databaseName = m_pConfig->getValue< std::string >( "Settings.General.Mysql.Database", "sapphire" ); + params1.hostname = m_pConfig->getValue< std::string >( "Settings.General.Mysql.Host", "127.0.0.1" ); + params1.password = m_pConfig->getValue< std::string >( "Settings.General.Mysql.Pass", "" ); + params1.port = m_pConfig->getValue< uint16_t >( "Settings.General.Mysql.Port", 3306 ); + params1.username = m_pConfig->getValue< std::string >( "Settings.General.Mysql.Username", "root" ); + + + if( !g_dbNew.initialize( params1 ) ) + { + std::this_thread::sleep_for( std::chrono::milliseconds( 5000 ) ); + return false; + } + if( !g_database.initialize( params ) ) { std::this_thread::sleep_for( std::chrono::milliseconds( 5000 ) );