diff --git a/.travis.yml b/.travis.yml index 54a5074..fa93a2e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -41,7 +41,7 @@ before_install: before_script: - mkdir build - cd build - - cmake -DCMAKE_BUILD_TYPE=Release .. + - cmake -DCMAKE_BUILD_TYPE=Release .. script: - make diff --git a/CMakeLists.txt b/CMakeLists.txt index e2fd6e5..1c67a45 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,9 @@ PROJECT (libslave) OPTION (BUILD_STATIC "Force building static library" ON) OPTION (WITH_TESTING "Enable building the tests framework" OFF) +SET (THREADS_PREFER_PTHREAD_FLAG ON) +FIND_PACKAGE (Threads REQUIRED) + # Build flags SET (CMAKE_CXX_STANDARD 14) SET (CMAKE_CXX_STANDARD_REQUIRED TRUE) @@ -21,66 +24,55 @@ IF (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" ADD_DEFINITIONS (-Wall) ENDIF () -# Fixes a lot of annoying warnings about auto_ptr deprecation -ADD_DEFINITIONS (-DBOOST_NO_AUTO_PTR) - -SET (BOOST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +SET (BOOST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/boost) SET (MYSQL_SRC ${CMAKE_CURRENT_SOURCE_DIR}/mysql) SET (MYSQL_BIN ${CMAKE_BINARY_DIR}/mysql) FILE (MAKE_DIRECTORY ${MYSQL_BIN}) -INCLUDE_DIRECTORIES ( - BEFORE SYSTEM - ${MYSQL_BIN}/include - ${MYSQL_SRC}/include - ${MYSQL_SRC}/libbinlogevents/export - ${BOOST_DIR}/boost_1_69_0/boost -) -ADD_CUSTOM_TARGET ( - fix_static_build - WORKING_DIRECTORY ${MYSQL_BIN} - COMMAND sed -i '/GET_TARGET_PROPERTY.*libmysql/s/libmysql/perconaserverclient/' ${MYSQL_SRC}/scripts/CMakeLists.txt -) ADD_CUSTOM_TARGET ( - mysql_configure - WORKING_DIRECTORY ${MYSQL_BIN} - DEPENDS fix_static_build - COMMAND "${CMAKE_COMMAND}" + mysql_configure + WORKING_DIRECTORY ${MYSQL_BIN} + COMMAND "${CMAKE_COMMAND}" -DCMAKE_BUILD_TYPE=Release -DDISABLE_SHARED=1 -DENABLED_PROFILING=0 -DWITHOUT_SERVER=1 -DWITH_CLIENT_PROTOCOL_TRACING=0 -DWITH_DEFAULT_FEATURE_SET=0 - -DWITH_SSL=bundled + -DWITH_SSL=system -DWITH_ZLIB=bundled -DWITH_LIBEVENT=bundled -DWITH_LZ4=bundled -DWITH_PROTOBUF=bundled -DWITH_EDITLINE=bundled - -DDOWNLOAD_BOOST=1 -DWITH_BOOST=${BOOST_DIR} + -DDOWNLOAD_BOOST=1 + -DDOWNLOAD_BOOST_TIMEOUT=1200 + -DWITH_BOOST=${BOOST_DIR} ${MYSQL_SRC} ) + ADD_CUSTOM_TARGET ( - mysqlclient_build - WORKING_DIRECTORY ${MYSQL_BIN} - DEPENDS mysql_configure - COMMAND ${CMAKE_COMMAND} --build . --target perconaserverclient + binlogevents_build + WORKING_DIRECTORY ${MYSQL_BIN} + DEPENDS mysql_configure + COMMAND ${CMAKE_COMMAND} --build . --target binlogevents_static ) + ADD_CUSTOM_TARGET ( - binlogevents_build - WORKING_DIRECTORY ${MYSQL_BIN} - DEPENDS mysql_configure - COMMAND ${CMAKE_COMMAND} --build . --target binlogevents_static + mysql_client_build + WORKING_DIRECTORY ${MYSQL_BIN} + DEPENDS binlogevents_build + COMMAND ${CMAKE_COMMAND} --build . --target perconaserverclient ) -ADD_LIBRARY (mysqlclient STATIC IMPORTED) -ADD_DEPENDENCIES (mysqlclient mysqlclient_build) -SET_PROPERTY (TARGET mysqlclient PROPERTY IMPORTED_LOCATION ${MYSQL_BIN}/archive_output_directory/libperconaserverclient.a) - ADD_LIBRARY (binlogevents STATIC IMPORTED) ADD_DEPENDENCIES (binlogevents binlogevents_build) -SET_PROPERTY (TARGET binlogevents PROPERTY IMPORTED_LOCATION ${MYSQL_BIN}/libbinlogevents/lib/libbinlogevents.a) +SET_PROPERTY (TARGET binlogevents PROPERTY IMPORTED_LOCATION ${MYSQL_BIN}/libbinlogevents/lib/${CMAKE_STATIC_LIBRARY_PREFIX}binlogevents${CMAKE_STATIC_LIBRARY_SUFFIX}) + +ADD_LIBRARY (libmysql STATIC IMPORTED) +ADD_DEPENDENCIES (libmysql mysql_client_build) +SET_TARGET_PROPERTIES (libmysql PROPERTIES IMPORTED_LOCATION ${MYSQL_BIN}/archive_output_directory/${CMAKE_STATIC_LIBRARY_PREFIX}perconaserverclient${CMAKE_STATIC_LIBRARY_SUFFIX}) +SET_TARGET_PROPERTIES (libmysql PROPERTIES INTERFACE_LINK_LIBRARIES binlogevents) ADD_DEFINITIONS (-DDBUG_OFF) SET (LINK_TYPE STATIC) @@ -94,9 +86,15 @@ FILE (GLOB HDR "*.h") INSTALL (FILES ${HDR} DESTINATION include) AUX_SOURCE_DIRECTORY (${CMAKE_CURRENT_SOURCE_DIR} SRC) -# Most probably static mysql is built without fPIC, so, we can't build dynamic library with it ADD_LIBRARY (slave ${LINK_TYPE} ${SRC}) -TARGET_LINK_LIBRARIES (slave ${MYSQL_LIBS} -lpthread) +TARGET_LINK_LIBRARIES (slave PUBLIC libmysql ssl crypto Threads::Threads m rt dl) +TARGET_INCLUDE_DIRECTORIES (slave PUBLIC + ${MYSQL_BIN}/include + ${MYSQL_SRC} + ${MYSQL_SRC}/include + ${MYSQL_SRC}/libbinlogevents/export + ${BOOST_DIR}/boost_1_70_0 + ) INSTALL (TARGETS slave DESTINATION lib64) IF (WITH_TESTING) diff --git a/collate.cpp b/collate.cpp index 62ca6d8..cdebfbc 100644 --- a/collate.cpp +++ b/collate.cpp @@ -1,11 +1,10 @@ +#include "nanomysql.h" +#include "collate.h" + #include #include #include -#include #include -#include -#include "nanomysql.h" -#include "collate.h" using namespace slave; @@ -20,15 +19,15 @@ collate_map_t slave::readCollateMap(nanomysql::Connection& conn) conn.query("SHOW CHARACTER SET"); conn.store(nanores); - for (nanomysql::Connection::result_t::const_iterator i = nanores.begin(); i != nanores.end(); ++i) + for (const auto& nanore : nanores) { - std::map::const_iterator z = i->find("Charset"); - if (z == i->end()) + auto z = nanore.find("Charset"); + if (z == nanore.end()) throw std::runtime_error("Slave::readCollateMap(): SHOW CHARACTER SET query did not return 'Charset'"); const std::string name = z->second.data; - z = i->find("Maxlen"); - if (z == i->end()) + z = nanore.find("Maxlen"); + if (z == nanore.end()) throw std::runtime_error("Slave::readCollateMap(): SHOW CHARACTER SET query did not return 'Maxlen'"); const int maxlen = atoi(z->second.data.c_str()); @@ -40,17 +39,17 @@ collate_map_t slave::readCollateMap(nanomysql::Connection& conn) conn.query("SHOW COLLATION"); conn.store(nanores); - for (nanomysql::Connection::result_t::const_iterator i = nanores.begin(); i != nanores.end(); ++i) + for (const auto& nanore : nanores) { collate_info ci; - std::map::const_iterator z = i->find("Collation"); - if (z == i->end()) + auto z = nanore.find("Collation"); + if (z == nanore.end()) throw std::runtime_error("Slave::readCollateMap(): SHOW COLLATION query did not return 'Collation'"); ci.name = z->second.data; - z = i->find("Charset"); - if (z == i->end()) + z = nanore.find("Charset"); + if (z == nanore.end()) throw std::runtime_error("Slave::readCollateMap(): SHOW COLLATION query did not return 'Charset'"); ci.charset = z->second.data; diff --git a/field.cpp b/field.cpp index 6174f04..4d0b0ef 100644 --- a/field.cpp +++ b/field.cpp @@ -117,7 +117,7 @@ const char* Field_decimal::unpack(const char *from) int value_length = decimal_string_size(&dec); char buffer[ value_length ]; - if (::decimal2string(&dec, (char*)&buffer, &value_length, zerofill ? precision : 0, scale, '0') != E_DEC_OK) { + if (::decimal2string(&dec, (char*)&buffer, &value_length, zerofill ? precision : 0, scale) != E_DEC_OK) { throw std::runtime_error("Field_decimal::unpack(): decimal2string() failed"); } diff --git a/mysql b/mysql index 9c1901d..2847fe1 160000 --- a/mysql +++ b/mysql @@ -1 +1 @@ -Subproject commit 9c1901dd55d00307a23b6ec26df01218a6bac372 +Subproject commit 2847fe1ea9e1ee8df931508ac8b4504dc1a6cbf9 diff --git a/nanomysql.h b/nanomysql.h index f656957..a51eb71 100644 --- a/nanomysql.h +++ b/nanomysql.h @@ -19,7 +19,7 @@ #include "MysqlGuard.h" #include "nanofield.h" #include -#include +#include #include namespace nanomysql { @@ -176,7 +176,7 @@ class Connection { { _mysql_res_wrap re(::mysql_use_result(m_conn)); - if (re.s == NULL) { + if (re.s == nullptr) { throw_error("mysql_use_result() failed"); } @@ -197,7 +197,7 @@ class Connection { while (1) { MYSQL_ROW row = ::mysql_fetch_row(re.s); - if (row == NULL) { + if (row == nullptr) { if (::mysql_errno(m_conn) != 0) { throw_error("mysql_fetch_row() failed"); } diff --git a/slave_log_event.cpp b/slave_log_event.cpp index 9f8bf25..731b3d8 100644 --- a/slave_log_event.cpp +++ b/slave_log_event.cpp @@ -381,6 +381,9 @@ bool read_log_event(const char* buf, uint event_len, Basic_event_info& bei, Even case TRANSACTION_CONTEXT_EVENT: case VIEW_CHANGE_EVENT: case XA_PREPARE_LOG_EVENT: + case PARTIAL_UPDATE_ROWS_EVENT: + case START_5_7_ENCRYPTION_EVENT: + case MARIA_EVENTS_BEGIN: if (event_stat) event_stat->tickOther(); return false; diff --git a/slave_log_event.h b/slave_log_event.h index 8bf4c5a..1e8c650 100644 --- a/slave_log_event.h +++ b/slave_log_event.h @@ -87,6 +87,29 @@ enum Log_event_type XA_PREPARE_LOG_EVENT= 38, + /* + * Extension of UPDATE_ROWS_EVENT, allowing partial values according + * to binlog_row_value_options. + */ + PARTIAL_UPDATE_ROWS_EVENT = 39, + + /* + * Add new events here - right above this comment! + * Existing events (except ENUM_END_EVENT) should never change their numbers + */ + + /* New MySQL events are to be added right above this comment */ + MYSQL_END_EVENT, + + /* Add new Percona Server events here - its ids should go downwards + * starting from MARIA_EVENTS_BEGIN, i.e. 159, 158 .. + * till MYSQL_END_EVENT + */ + + START_5_7_ENCRYPTION_EVENT = 159, + + MARIA_EVENTS_BEGIN = 160, + ENUM_END_EVENT }; diff --git a/table.h b/table.h index cf92b10..2bf95cd 100644 --- a/table.h +++ b/table.h @@ -30,7 +30,7 @@ namespace slave { -typedef std::unique_ptr PtrField; +typedef std::shared_ptr PtrField; typedef std::function callback; typedef std::function&)> ddl_callback; typedef EventKind filter;