summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libmysql/CMakeLists.txt164
-rw-r--r--libmysql/libmysql_rpm_version.in48
-rw-r--r--libmysql/rpm_support.cc41
-rw-r--r--libmysqld/CMakeLists.txt13
4 files changed, 260 insertions, 6 deletions
diff --git a/libmysql/CMakeLists.txt b/libmysql/CMakeLists.txt
index f67b3962c1a..72fee72af77 100644
--- a/libmysql/CMakeLists.txt
+++ b/libmysql/CMakeLists.txt
@@ -23,7 +23,7 @@ INCLUDE_DIRECTORIES(
${ZLIB_INCLUDE_DIR})
ADD_DEFINITIONS(${SSL_DEFINES})
-SET(CLIENT_API_FUNCTIONS
+SET(CLIENT_API_FUNCTIONS_5_1
get_tty_password
handle_options
load_defaults
@@ -58,6 +58,7 @@ mysql_field_count
mysql_field_seek
mysql_field_tell
mysql_free_result
+mysql_get_parameters
mysql_get_client_info
mysql_get_host_info
mysql_get_proto_info
@@ -129,12 +130,164 @@ mysql_server_init
mysql_server_end
mysql_set_character_set
mysql_get_character_set_info
-mysql_stmt_next_result
+)
-CACHE INTERNAL "Functions exported by client API"
+SET(CLIENT_API_FUNCTIONS_5_5
+mysql_stmt_next_result
+# Client plugins
+mysql_client_find_plugin
+mysql_client_register_plugin
+mysql_load_plugin
+mysql_load_plugin_v
+mysql_plugin_options
+# Async API
+mysql_autocommit_cont
+mysql_autocommit_start
+mysql_change_user_cont
+mysql_change_user_start
+mysql_close_cont
+mysql_close_slow_part_cont
+mysql_close_slow_part_start
+mysql_close_start
+mysql_commit_cont
+mysql_commit_start
+mysql_fetch_row_cont
+mysql_fetch_row_start
+mysql_free_result_cont
+mysql_free_result_start
+mysql_kill_cont
+mysql_kill_start
+mysql_list_dbs_cont
+mysql_list_dbs_start
+mysql_list_fields_cont
+mysql_list_fields_start
+mysql_list_processes_cont
+mysql_list_processes_start
+mysql_list_tables_cont
+mysql_list_tables_start
+mysql_next_result_cont
+mysql_next_result_start
+mysql_ping_cont
+mysql_ping_start
+mysql_query_cont
+mysql_query_start
+mysql_read_query_result_cont
+mysql_read_query_result_start
+mysql_real_connect_cont
+mysql_real_connect_start
+mysql_real_query_cont
+mysql_real_query_start
+mysql_refresh_cont
+mysql_refresh_start
+mysql_rollback_cont
+mysql_rollback_start
+mysql_select_db_cont
+mysql_select_db_start
+mysql_send_query_cont
+mysql_send_query_start
+mysql_set_character_set_cont
+mysql_set_character_set_start
+mysql_set_server_option_cont
+mysql_set_server_option_start
+mysql_shutdown_cont
+mysql_shutdown_start
+mysql_stat_cont
+mysql_stat_start
+mysql_stmt_close_cont
+mysql_stmt_close_start
+mysql_stmt_execute_cont
+mysql_stmt_execute_start
+mysql_stmt_fetch_cont
+mysql_stmt_fetch_start
+mysql_stmt_free_result_cont
+mysql_stmt_free_result_start
+mysql_stmt_next_result_cont
+mysql_stmt_next_result_start
+mysql_stmt_prepare_cont
+mysql_stmt_prepare_start
+mysql_stmt_reset_cont
+mysql_stmt_reset_start
+mysql_stmt_send_long_data_cont
+mysql_stmt_send_long_data_start
+mysql_stmt_store_result_cont
+mysql_stmt_store_result_start
+mysql_store_result_cont
+mysql_store_result_start
+)
+SET(CLIENT_API_FUNCTIONS
+ ${CLIENT_API_FUNCTIONS_5_1}
+ ${CLIENT_API_FUNCTIONS_5_5}
+ CACHE INTERNAL
+ "Client functions"
)
+IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
+ # When building RPM, or DEB package on Debian, use ELF symbol versioning
+ # for compatibility with distribution packages, so client shared library can
+ # painlessly replace the one supplied by the distribution.
+
+ # Also list of exported symbols in distributions may differ from what is considered
+ # official API. Define CLIENT_API_EXTRA for the set of symbols, that required to
+ # be exported on different platforms.
+
+ IF(RPM)
+ # Fedora & Co declared following functions as part of API
+ # These functions are alias of another function (given mysql_ prefix=. The
+ # renaming is handled in rpm_support.cc below
+ SET(CLIENT_API_EXTRA
+ mysql_default_charset_info
+ mysql_get_charset
+ mysql_get_charset_by_csname
+ mysql_net_realloc
+ mysql_client_errors
+ )
+ # Add special script to fix symbols renames by Fedora
+ SET(CLIENT_SOURCES_EXTRA ${CLIENT_SOURCES} rpm_support.cc)
+ SET(VERSION_SCRIPT_TEMPLATE
+ ${CMAKE_CURRENT_SOURCE_DIR}/libmysql_rpm_version.in)
+ ELSEIF(DEB)
+ # libmyodbc on Ubuntu is using functions below
+ # If we don't export them, linker would just remove
+ # them (they are not used inside libmysqlclient)
+ SET(CLIENT_API_EXTRA
+ strfill
+ init_dynamic_string
+ )
+ # MySQL supplied with Ubuntu does not have versioning, bug Debian does.
+ IF(DEB MATCHES "debian")
+ SET(VERSION_SCRIPT_TEMPLATE ${CMAKE_CURRENT_SOURCE_DIR}/libmysql.ver.in)
+ ENDIF()
+ ENDIF()
+
+ IF(VERSION_SCRIPT_TEMPLATE)
+ # Generate version script.
+ # Create semicolon separated lists of functions to export from
+ # Since RPM packages use separate versioning for 5.1 API
+ # and 5.5 API (libmysqlclient_16 vs libmysqlclient_18),
+ # we need 2 lists.
+ SET (CLIENT_API_5_1_LIST)
+ FOREACH (f ${CLIENT_API_FUNCTIONS_5_1})
+ SET(CLIENT_API_5_1_LIST "${CLIENT_API_5_1_LIST}\n${f};")
+ ENDFOREACH()
+
+ SET (CLIENT_API_5_5_LIST)
+ FOREACH (f ${CLIENT_API_FUNCTIONS_5_5})
+ SET(CLIENT_API_5_5_LIST "${CLIENT_API_5_5_LIST}\n${f};")
+ ENDFOREACH()
+
+ CONFIGURE_FILE(
+ ${VERSION_SCRIPT_TEMPLATE}
+ ${CMAKE_CURRENT_BINARY_DIR}/libmysql.version
+ @ONLY@
+ )
+ SET(VERSION_SCRIPT_LINK_FLAGS
+ "-Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/libmysql.version")
+ ENDIF()
+
+ENDIF()
+
+
SET(CLIENT_SOURCES
get_password.c
libmysql.c
@@ -146,6 +299,7 @@ SET(CLIENT_SOURCES
../sql/net_serv.cc
../sql-common/pack.c
../sql/password.c
+ ${CLIENT_SOURCES_EXTRA}
)
ADD_CONVENIENCE_LIBRARY(clientlib ${CLIENT_SOURCES})
DTRACE_INSTRUMENT(clientlib)
@@ -193,13 +347,13 @@ IF(NOT DISABLE_SHARED)
OUTPUT_NAME mysqlclient
VERSION "${OS_SHARED_LIB_VERSION}"
SOVERSION "${SHARED_LIB_MAJOR_VERSION}")
- IF(LINK_FLAG_NO_UNDEFINED)
+ IF(LINK_FLAG_NO_UNDEFINED OR VERSION_SCRIPT_LINK_FLAGS)
GET_TARGET_PROPERTY(libmysql_link_flags libmysql LINK_FLAGS)
IF(NOT libmysql_link_flag)
SET(libmysql_link_flags)
ENDIF()
SET_TARGET_PROPERTIES(libmysql PROPERTIES LINK_FLAGS
- "${libmysql_link_flags} ${LINK_FLAG_NO_UNDEFINED}")
+ "${libmysql_link_flags} ${LINK_FLAG_NO_UNDEFINED} ${VERSION_SCRIPT_LINK_FLAGS}")
ENDIF()
# clean direct output needs to be set several targets have the same name
#(mysqlclient in this case)
diff --git a/libmysql/libmysql_rpm_version.in b/libmysql/libmysql_rpm_version.in
new file mode 100644
index 00000000000..ad15c8aa2c8
--- /dev/null
+++ b/libmysql/libmysql_rpm_version.in
@@ -0,0 +1,48 @@
+# This version script is heavily inspired by Fedora's and Mageia's version scripts for
+# MySQL client shared library. It is used in MariaDB for building RPMs.
+
+libmysqlclient_16 {
+ global:
+@CLIENT_API_5_1_LIST@
+
+# some stuff from Mageia, I have no idea why it is there
+# But too afraid to throw anything away
+ _fini;
+ _init;
+ my_init;
+ my_progname;
+ myodbc_remove_escape;
+
+# These are documented in Paul DuBois' MySQL book, so we treat them as part
+# of the de-facto API.
+ free_defaults;
+ handle_options;
+ load_defaults;
+ my_print_help;
+# pure-ftpd requires this
+ my_make_scrambled_password;
+# hydra requires this
+ scramble;
+# DBD::mysql requires this
+ is_prefix;
+ local:
+ *;
+};
+
+libmysqlclient_18 {
+ global:
+ @CLIENT_API_5_5_LIST@
+#
+# Ideally the following symbols wouldn't be exported, but various applications
+# require them. We limit the namespace damage by prefixing mysql_
+# (see mysql-dubious-exports.patch), which means the symbols are not present
+# in libmysqlclient_16.
+#
+# mysql-connector-odbc requires these
+ mysql_default_charset_info;
+ mysql_get_charset;
+ mysql_get_charset_by_csname;
+ mysql_net_realloc;
+# PHP's mysqli.so requires this (via the ER() macro)
+ mysql_client_errors;
+};
diff --git a/libmysql/rpm_support.cc b/libmysql/rpm_support.cc
new file mode 100644
index 00000000000..8c9a1e8683d
--- /dev/null
+++ b/libmysql/rpm_support.cc
@@ -0,0 +1,41 @@
+/*
+ Provide aliases for several symbols, to support drop-in replacement for
+ MariaDB on Fedora and several derives distributions.
+
+ These distributions redefine several symbols (in a way that is no compatible
+ with either MySQL or MariaDB) and export it from the client library ( as seen
+ e.g from this patch)
+http://lists.fedoraproject.org/pipermail/scm-commits/2010-December/537257.html
+
+ MariaDB handles compatibility distribution by providing the same symbols from
+ the client library if it is built with -DRPM
+
+*/
+#include <errmsg.h>
+#include <my_sys.h>
+#include <mysql.h>
+extern "C" {
+
+CHARSET_INFO *mysql_default_charset_info = default_charset_info;
+
+CHARSET_INFO *mysql_get_charset(uint cs_number, myf flags)
+{
+ return get_charset(cs_number, flags);
+}
+
+CHARSET_INFO *mysql_get_charset_by_csname(const char *cs_name,
+ uint cs_flags, myf my_flags)
+{
+ return get_charset_by_csname(cs_name, cs_flags, my_flags);
+}
+
+
+my_bool mysql_net_realloc(NET *net, size_t length)
+{
+ return net_realloc(net,length);
+}
+
+const char **mysql_client_errors = client_errors;
+
+} /*extern "C" */
+
diff --git a/libmysqld/CMakeLists.txt b/libmysqld/CMakeLists.txt
index c40beb5f9a1..c071356715f 100644
--- a/libmysqld/CMakeLists.txt
+++ b/libmysqld/CMakeLists.txt
@@ -146,8 +146,19 @@ IF(UNIX)
${CMAKE_STATIC_LIBRARY_PREFIX}mysqld-debug)
ENDIF()
+# List of exported functions in embedded (client api except client plugin or
+# async (*_start/*_cont functions)
+
+SET(EMBEDDED_API)
+FOREACH(f ${CLIENT_API})
+ IF(NOT(f MATCHES "plugin|_start$|_cont$"))
+ SET(EMBEDDED_API ${EMBEDDED_API) ${f})
+ ENDIF()
+ENDFOREACH()
+MESSAGE("embedded api=${EMBEDDED_API}")
+
IF(NOT DISABLE_SHARED)
- MERGE_LIBRARIES(libmysqld SHARED mysqlserver EXPORTS ${CLIENT_API_FUNCTIONS}
+ MERGE_LIBRARIES(libmysqld SHARED mysqlserver EXPORTS ${EMBEDDED_API}
COMPONENT Server)
IF(UNIX)
# Name the shared library, handle versioning (provides same api as client