diff options
author | Vladislav Vaintroub <vvaintroub@mysql.com> | 2009-06-10 10:59:49 +0200 |
---|---|---|
committer | Vladislav Vaintroub <vvaintroub@mysql.com> | 2009-06-10 10:59:49 +0200 |
commit | 768bbae90eb116349940821a1fb48920291ddd97 (patch) | |
tree | 41fa2696a71a46f4885a21cf7c58dc438a600d7a | |
parent | b6312995f1eb1478c8af30452c99e9b94b5f8185 (diff) | |
download | mariadb-git-768bbae90eb116349940821a1fb48920291ddd97.tar.gz |
Backport WL#3653 to 5.1 to enable bundled innodb plugin.
Remove custom DLL loader code from innodb plugin code, use
symbols exported from mysqld.
storage/innodb_plugin/handler/ha_innodb.cc:
Remove a Win32 workaround for current_thd.
The original problem that innodb plugin used
value of TLS variable across DLL boundaries is
solved in MySQL server (current_thd is a function
not TLS variable now)
storage/innodb_plugin/handler/handler0alter.cc:
Remove custom delay loader
storage/innodb_plugin/handler/handler0vars.h:
Remove custom delay loader
storage/innodb_plugin/handler/i_s.cc:
Remove custom delay loader
storage/innodb_plugin/handler/win_delay_loader.cc:
Remove custom delay loader
storage/innodb_plugin/plug.in:
Remove commented out MYSQL_PLUGIN_STATIC,
CMake would not parse that correctly
40 files changed, 777 insertions, 1499 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index e4dc16040a7..181b35f3d4e 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,7 +13,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -CMAKE_MINIMUM_REQUIRED(VERSION 2.4.7 FATAL_ERROR) +CMAKE_MINIMUM_REQUIRED(VERSION 2.6.0 FATAL_ERROR) PROJECT(MySql) @@ -32,56 +32,6 @@ ADD_DEFINITIONS(-DHAVE_YASSL) # Set debug options SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DFORCE_INIT_OF_VARS") -# Note that some engines are always compiled in, MyISAM, MyISAMMRG and HEAP, -# these three plugin defintions are dummys for symmetry - -SET(WITH_HEAP_STORAGE_ENGINE TRUE) -ADD_DEFINITIONS(-DWITH_HEAP_STORAGE_ENGINE) -SET (mysql_plugin_defs "${mysql_plugin_defs},builtin_heap_plugin") - -SET(WITH_MYISAM_STORAGE_ENGINE TRUE) -ADD_DEFINITIONS(-DWITH_MYISAM_STORAGE_ENGINE) -SET (mysql_plugin_defs "${mysql_plugin_defs},builtin_myisam_plugin") - -SET(WITH_MYISAMMRG_STORAGE_ENGINE TRUE) -ADD_DEFINITIONS(-DWITH_MYISAMMRG_STORAGE_ENGINE) -SET (mysql_plugin_defs "${mysql_plugin_defs},builtin_myisammrg_plugin") - -IF(WITH_COMMUNITY_FEATURES) - ADD_DEFINITIONS(-DENABLED_PROFILING -DCOMMUNITY_SERVER) -ENDIF(WITH_COMMUNITY_FEATURES) - -IF(WITH_ARCHIVE_STORAGE_ENGINE) - ADD_DEFINITIONS(-DWITH_ARCHIVE_STORAGE_ENGINE) - SET (mysql_plugin_defs "${mysql_plugin_defs},builtin_archive_plugin") -ENDIF(WITH_ARCHIVE_STORAGE_ENGINE) -IF(WITH_BLACKHOLE_STORAGE_ENGINE) - ADD_DEFINITIONS(-DWITH_BLACKHOLE_STORAGE_ENGINE) - SET (mysql_plugin_defs "${mysql_plugin_defs},builtin_blackhole_plugin") -ENDIF(WITH_BLACKHOLE_STORAGE_ENGINE) -IF(WITH_CSV_STORAGE_ENGINE) - ADD_DEFINITIONS(-DWITH_CSV_STORAGE_ENGINE) - SET (mysql_plugin_defs "${mysql_plugin_defs},builtin_csv_plugin") -ENDIF(WITH_CSV_STORAGE_ENGINE) -IF(WITH_EXAMPLE_STORAGE_ENGINE) - ADD_DEFINITIONS(-DWITH_EXAMPLE_STORAGE_ENGINE) - SET (mysql_plugin_defs "${mysql_plugin_defs},builtin_example_plugin") -ENDIF(WITH_EXAMPLE_STORAGE_ENGINE) -IF(WITH_INNOBASE_STORAGE_ENGINE) - ADD_DEFINITIONS(-DWITH_INNOBASE_STORAGE_ENGINE) - SET (mysql_plugin_defs "${mysql_plugin_defs},builtin_innobase_plugin") -ENDIF(WITH_INNOBASE_STORAGE_ENGINE) -IF(WITH_PARTITION_STORAGE_ENGINE) - ADD_DEFINITIONS(-DWITH_PARTITION_STORAGE_ENGINE) - SET (mysql_plugin_defs "${mysql_plugin_defs},builtin_partition_plugin") -ENDIF(WITH_PARTITION_STORAGE_ENGINE) -IF(WITH_FEDERATED_STORAGE_ENGINE) - ADD_DEFINITIONS(-DWITH_FEDERATED_STORAGE_ENGINE) - SET (mysql_plugin_defs "${mysql_plugin_defs},builtin_federated_plugin") -ENDIF(WITH_FEDERATED_STORAGE_ENGINE) - -CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/sql/sql_builtin.cc.in - ${CMAKE_SOURCE_DIR}/sql/sql_builtin.cc @ONLY) SET(localstatedir "C:\\mysql\\data") CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/support-files/my-huge.cnf.sh @@ -126,6 +76,16 @@ IF(MSVC AND NOT CMAKE_GENERATOR MATCHES "Visual Studio 7") SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /wd4996") ENDIF(MSVC AND NOT CMAKE_GENERATOR MATCHES "Visual Studio 7") +IF(CMAKE_GENERATOR MATCHES "Visual Studio 7") + # VS2003 has a bug that prevents linking mysqld with module definition file + # (/DEF option for linker). Linker would incorrectly complain about multiply + # defined symbols. Workaround is to disable dynamic plugins, so /DEF is not + # used. + MESSAGE("Warning: Building MySQL with Visual Studio 2003.NET is no more supported.") + MESSAGE("Please use a newer version of Visual Studio.") + SET(WITHOUT_DYNAMIC_PLUGINS TRUE) +ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 7") + # Settings for Visual Studio 7 and above. IF(MSVC) # replace /MDd with /MTd @@ -169,12 +129,16 @@ IF(WIN32) ADD_DEFINITIONS("-D_WINDOWS -D__WIN__ -D_CRT_SECURE_NO_DEPRECATE") ENDIF(WIN32) +# default to x86 platform. We'll check for X64 in a bit +SET (PLATFORM X86) + # This definition is necessary to work around a bug with Intellisense described # here: http://tinyurl.com/2cb428. Syntax highlighting is important for proper # debugger functionality. IF(CMAKE_SIZEOF_VOID_P MATCHES 8) MESSAGE(STATUS "Detected 64-bit platform.") ADD_DEFINITIONS("-D_WIN64") + SET (PLATFORM X64) ENDIF(CMAKE_SIZEOF_VOID_P MATCHES 8) IF(EMBED_MANIFESTS) @@ -227,6 +191,81 @@ IF(EMBED_MANIFESTS) ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 8 2005 Win64") ENDIF(EMBED_MANIFESTS) +# Figure out what engines to build and how (statically or dynamically), +# add preprocessor defines for storage engines. +IF(WITHOUT_DYNAMIC_PLUGINS) + MESSAGE("Dynamic plugins are disabled.") +ENDIF(WITHOUT_DYNAMIC_PLUGINS) + +FILE(GLOB STORAGE_SUBDIRS storage/*) +FOREACH(SUBDIR ${STORAGE_SUBDIRS}) + FILE(RELATIVE_PATH DIRNAME ${PROJECT_SOURCE_DIR}/storage ${SUBDIR}) + STRING(TOUPPER ${DIRNAME} ENGINE) + STRING(TOLOWER ${DIRNAME} ENGINE_LOWER) + IF (EXISTS ${SUBDIR}/CMakeLists.txt) + # Check MYSQL_STORAGE_ENGINE macro is present + FILE(STRINGS ${SUBDIR}/CMakeLists.txt HAVE_STORAGE_ENGINE REGEX MYSQL_STORAGE_ENGINE) + IF(HAVE_STORAGE_ENGINE) + SET(ENGINE_BUILD_TYPE "DYNAMIC") + # Read plug.in to find out if a plugin is mandatory and whether it supports + # build as shared library (dynamic). + IF(EXISTS ${SUBDIR}/plug.in) + FILE(READ ${SUBDIR}/plug.in PLUGIN_FILE_CONTENT) + STRING (REGEX MATCH "MYSQL_PLUGIN_DYNAMIC" MYSQL_PLUGIN_DYNAMIC ${PLUGIN_FILE_CONTENT}) + STRING (REGEX MATCH "MYSQL_PLUGIN_MANDATORY" MYSQL_PLUGIN_MANDATORY ${PLUGIN_FILE_CONTENT}) + STRING (REGEX MATCH "MYSQL_PLUGIN_STATIC" MYSQL_PLUGIN_STATIC ${PLUGIN_FILE_CONTENT}) + + IF(MYSQL_PLUGIN_MANDATORY) + SET(WITH_${ENGINE}_STORAGE_ENGINE TRUE) + ENDIF(MYSQL_PLUGIN_MANDATORY) + + IF (WITH_${ENGINE}_STORAGE_ENGINE AND MYSQL_PLUGIN_STATIC) + SET(ENGINE_BUILD_TYPE "STATIC") + ELSEIF(NOT WITHOUT_${ENGINE}_STORAGE_ENGINE AND MYSQL_PLUGIN_DYNAMIC AND NOT WITHOUT_DYNAMIC_PLUGINS) + SET(ENGINE_BUILD_TYPE "DYNAMIC") + ELSE(WITH_${ENGINE}_STORAGE_ENGINE AND MYSQL_PLUGIN_STATIC) + SET(ENGINE_BUILD_TYPE "NONE") + ENDIF(WITH_${ENGINE}_STORAGE_ENGINE AND MYSQL_PLUGIN_STATIC) + IF (ENGINE_BUILD_TYPE STREQUAL "STATIC") + SET (mysql_plugin_defs "${mysql_plugin_defs},builtin_${ENGINE_LOWER}_plugin") + SET (MYSQLD_STATIC_ENGINE_LIBS ${MYSQLD_STATIC_ENGINE_LIBS} ${ENGINE_LOWER}) + SET (STORAGE_ENGINE_DEFS "${STORAGE_ENGINE_DEFS} -DWITH_${ENGINE}_STORAGE_ENGINE") + SET (WITH_${ENGINE}_STORAGE_ENGINE TRUE) + ENDIF (ENGINE_BUILD_TYPE STREQUAL "STATIC") + ENDIF(EXISTS ${SUBDIR}/plug.in) + + IF(NOT ENGINE_BUILD_TYPE STREQUAL "NONE") + LIST(APPEND ${ENGINE_BUILD_TYPE}_ENGINE_DIRECTORIES ${SUBDIR}) + ENDIF(NOT ENGINE_BUILD_TYPE STREQUAL "NONE") + + ENDIF(HAVE_STORAGE_ENGINE) + ENDIF(EXISTS ${SUBDIR}/CMakeLists.txt) +ENDFOREACH(SUBDIR ${STORAGE_SUBDIRS}) + +# Special handling for partition(not really pluggable) +IF(NOT WITHOUT_PARTITION_STORAGE_ENGINE) + SET (STORAGE_ENGINE_DEFS "${STORAGE_ENGINE_DEFS} -DWITH_PARTITION_STORAGE_ENGINE") + SET (mysql_plugin_defs "${mysql_plugin_defs},builtin_partition_plugin") +ENDIF(NOT WITHOUT_PARTITION_STORAGE_ENGINE) + +ADD_DEFINITIONS(${STORAGE_ENGINE_DEFS}) + +# Now write out our mysql_plugin_defs struct +CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/sql/sql_builtin.cc.in + ${CMAKE_SOURCE_DIR}/sql/sql_builtin.cc @ONLY) + +# Add subdirectories for storage engines +SET (ENGINE_BUILD_TYPE "STATIC") +FOREACH(DIR ${STATIC_ENGINE_DIRECTORIES}) + ADD_SUBDIRECTORY(${DIR}) +ENDFOREACH(DIR ${STATIC_ENGINE_DIRECTORIES}) + +SET (ENGINE_BUILD_TYPE "DYNAMIC") +FOREACH(DIR ${DYNAMIC_ENGINE_DIRECTORIES}) + ADD_SUBDIRECTORY(${DIR}) +ENDFOREACH(DIR ${DYNAMIC_ENGINE_DIRECTORIES}) + + # FIXME "debug" only needed if build type is "Debug", but # CMAKE_BUILD_TYPE is not set during configure time. ADD_SUBDIRECTORY(vio) @@ -239,28 +278,7 @@ ADD_SUBDIRECTORY(zlib) ADD_SUBDIRECTORY(extra/yassl) ADD_SUBDIRECTORY(extra/yassl/taocrypt) ADD_SUBDIRECTORY(extra) -ADD_SUBDIRECTORY(storage/heap) -ADD_SUBDIRECTORY(storage/myisam) -ADD_SUBDIRECTORY(storage/myisammrg) ADD_SUBDIRECTORY(client) -IF(WITH_ARCHIVE_STORAGE_ENGINE) - ADD_SUBDIRECTORY(storage/archive) -ENDIF(WITH_ARCHIVE_STORAGE_ENGINE) -IF(WITH_BLACKHOLE_STORAGE_ENGINE) - ADD_SUBDIRECTORY(storage/blackhole) -ENDIF(WITH_BLACKHOLE_STORAGE_ENGINE) -IF(WITH_CSV_STORAGE_ENGINE) - ADD_SUBDIRECTORY(storage/csv) -ENDIF(WITH_CSV_STORAGE_ENGINE) -IF(WITH_EXAMPLE_STORAGE_ENGINE) - ADD_SUBDIRECTORY(storage/example) -ENDIF(WITH_EXAMPLE_STORAGE_ENGINE) -IF(WITH_FEDERATED_STORAGE_ENGINE) - ADD_SUBDIRECTORY(storage/federated) -ENDIF(WITH_FEDERATED_STORAGE_ENGINE) -IF(WITH_INNOBASE_STORAGE_ENGINE) - ADD_SUBDIRECTORY(storage/innobase) -ENDIF(WITH_INNOBASE_STORAGE_ENGINE) ADD_SUBDIRECTORY(sql) ADD_SUBDIRECTORY(server-tools/instance-manager) ADD_SUBDIRECTORY(libmysql) diff --git a/include/m_ctype.h b/include/m_ctype.h index 04cf921dfee..451c8db549b 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -285,7 +285,7 @@ typedef struct charset_info_st #define ILLEGAL_CHARSET_INFO_NUMBER (~0U) -extern CHARSET_INFO my_charset_bin; +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO my_charset_bin; extern CHARSET_INFO my_charset_big5_chinese_ci; extern CHARSET_INFO my_charset_big5_bin; extern CHARSET_INFO my_charset_cp932_japanese_ci; @@ -298,7 +298,7 @@ extern CHARSET_INFO my_charset_gb2312_chinese_ci; extern CHARSET_INFO my_charset_gb2312_bin; extern CHARSET_INFO my_charset_gbk_chinese_ci; extern CHARSET_INFO my_charset_gbk_bin; -extern CHARSET_INFO my_charset_latin1; +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO my_charset_latin1; extern CHARSET_INFO my_charset_latin1_german2_ci; extern CHARSET_INFO my_charset_latin1_bin; extern CHARSET_INFO my_charset_latin2_czech_ci; @@ -315,7 +315,7 @@ extern CHARSET_INFO my_charset_utf8_general_ci; extern CHARSET_INFO my_charset_utf8_unicode_ci; extern CHARSET_INFO my_charset_utf8_bin; extern CHARSET_INFO my_charset_cp1250_czech_ci; -extern CHARSET_INFO my_charset_filename; +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO my_charset_filename; /* declarations for simple charsets */ extern size_t my_strnxfrm_simple(CHARSET_INFO *, uchar *, size_t, diff --git a/include/my_global.h b/include/my_global.h index 9e8c9bdfc70..996972c1411 100644 --- a/include/my_global.h +++ b/include/my_global.h @@ -1573,4 +1573,17 @@ static inline double rint(double x) } #endif /* HAVE_RINT */ +/* + MYSQL_PLUGIN_IMPORT macro is used to export mysqld data + (i.e variables) for usage in storage engine loadable plugins. + Outside of Windows, it is dummy. +*/ +#ifndef MYSQL_PLUGIN_IMPORT +#if (defined(_WIN32) && defined(MYSQL_DYNAMIC_PLUGIN)) +#define MYSQL_PLUGIN_IMPORT __declspec(dllimport) +#else +#define MYSQL_PLUGIN_IMPORT +#endif +#endif + #endif /* my_global_h */ diff --git a/include/my_sys.h b/include/my_sys.h index 01804cd089f..a5ebe2bb909 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -221,8 +221,8 @@ extern uint my_large_page_size; #endif /* charsets */ -extern CHARSET_INFO *default_charset_info; -extern CHARSET_INFO *all_charsets[256]; +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *default_charset_info; +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *all_charsets[256]; extern CHARSET_INFO compiled_charsets[]; /* statistics */ @@ -237,8 +237,8 @@ extern void (*my_sigtstp_cleanup)(void), (*my_sigtstp_restart)(void), (*my_abort_hook)(int); /* Executed when comming from shell */ -extern int NEAR my_umask, /* Default creation mask */ - NEAR my_umask_dir, +extern MYSQL_PLUGIN_IMPORT int NEAR my_umask; /* Default creation mask */ +extern int NEAR my_umask_dir, NEAR my_recived_signals, /* Signals we have got */ NEAR my_safe_to_handle_signal, /* Set when allowed to SIGTSTP */ NEAR my_dont_interrupt; /* call remember_intr when set */ diff --git a/include/mysql/plugin.h b/include/mysql/plugin.h index a978d44b918..2e59262d061 100644 --- a/include/mysql/plugin.h +++ b/include/mysql/plugin.h @@ -16,6 +16,16 @@ #ifndef _my_plugin_h #define _my_plugin_h + +/* + On Windows, exports from DLL need to be declared +*/ +#if (defined(_WIN32) && defined(MYSQL_DYNAMIC_PLUGIN)) +#define MYSQL_PLUGIN_EXPORT extern "C" __declspec(dllexport) +#else +#define MYSQL_PLUGIN_EXPORT +#endif + #ifdef __cplusplus class THD; class Item; @@ -90,9 +100,9 @@ int PSIZE= sizeof(struct st_mysql_plugin); \ struct st_mysql_plugin DECLS[]= { #else #define __MYSQL_DECLARE_PLUGIN(NAME, VERSION, PSIZE, DECLS) \ -int _mysql_plugin_interface_version_= MYSQL_PLUGIN_INTERFACE_VERSION; \ -int _mysql_sizeof_struct_st_plugin_= sizeof(struct st_mysql_plugin); \ -struct st_mysql_plugin _mysql_plugin_declarations_[]= { +MYSQL_PLUGIN_EXPORT int _mysql_plugin_interface_version_= MYSQL_PLUGIN_INTERFACE_VERSION; \ +MYSQL_PLUGIN_EXPORT int _mysql_sizeof_struct_st_plugin_= sizeof(struct st_mysql_plugin); \ +MYSQL_PLUGIN_EXPORT struct st_mysql_plugin _mysql_plugin_declarations_[]= { #endif #define mysql_declare_plugin(NAME) \ diff --git a/libmysqld/CMakeLists.txt b/libmysqld/CMakeLists.txt index 1c8f80768d4..8500d73863a 100644 --- a/libmysqld/CMakeLists.txt +++ b/libmysqld/CMakeLists.txt @@ -87,63 +87,16 @@ FOREACH(rpath ${VIO_SOURCES}) SET(LIB_SOURCES ${LIB_SOURCES} ../vio/${rpath}) ENDFOREACH(rpath) -# Engines -INCLUDE(${CMAKE_SOURCE_DIR}/storage/heap/CMakeLists.txt) -FOREACH(rpath ${HEAP_SOURCES}) - SET(LIB_SOURCES ${LIB_SOURCES} ../storage/heap/${rpath}) -ENDFOREACH(rpath) - -INCLUDE(${CMAKE_SOURCE_DIR}/storage/myisam/CMakeLists.txt) -FOREACH(rpath ${MYISAM_SOURCES}) - SET(LIB_SOURCES ${LIB_SOURCES} ../storage/myisam/${rpath}) -ENDFOREACH(rpath) -INCLUDE(${CMAKE_SOURCE_DIR}/storage/myisammrg/CMakeLists.txt) -FOREACH(rpath ${MYISAMMRG_SOURCES}) - SET(LIB_SOURCES ${LIB_SOURCES} ../storage/myisammrg/${rpath}) -ENDFOREACH(rpath) -IF(WITH_ARCHIVE_STORAGE_ENGINE) - INCLUDE(${CMAKE_SOURCE_DIR}/storage/archive/CMakeLists.txt) - FOREACH(rpath ${ARCHIVE_SOURCES}) - SET(LIB_SOURCES ${LIB_SOURCES} ../storage/archive/${rpath}) +FOREACH (ENGINE_LIB ${MYSQLD_STATIC_ENGINE_LIBS}) + INCLUDE(${CMAKE_SOURCE_DIR}/storage/${ENGINE_LIB}/CMakeLists.txt) + STRING(TOUPPER ${ENGINE_LIB} ENGINE_LIB_UPPER) + FOREACH(rpath ${${ENGINE_LIB_UPPER}_SOURCES}) + SET(LIB_SOURCES ${LIB_SOURCES} ${CMAKE_SOURCE_DIR}/storage/${ENGINE_LIB}/${rpath}) ENDFOREACH(rpath) -ENDIF(WITH_ARCHIVE_STORAGE_ENGINE) +ENDFOREACH(ENGINE_LIB) -IF(WITH_BLACKHOLE_STORAGE_ENGINE) - INCLUDE(${CMAKE_SOURCE_DIR}/storage/blackhole/CMakeLists.txt) - FOREACH(rpath ${BLACKHOLE_SOURCES}) - SET(LIB_SOURCES ${LIB_SOURCES} ../storage/blackhole/${rpath}) - ENDFOREACH(rpath) -ENDIF(WITH_BLACKHOLE_STORAGE_ENGINE) - -IF(WITH_EXAMPLE_STORAGE_ENGINE) - INCLUDE(${CMAKE_SOURCE_DIR}/storage/example/CMakeLists.txt) - FOREACH(rpath ${EXAMPLE_SOURCES}) - SET(LIB_SOURCES ${LIB_SOURCES} ../storage/example/${rpath}) - ENDFOREACH(rpath) -ENDIF(WITH_EXAMPLE_STORAGE_ENGINE) - -IF(WITH_FEDERATED_STORAGE_ENGINE) - INCLUDE(${CMAKE_SOURCE_DIR}/storage/federated/CMakeLists.txt) - FOREACH(rpath ${FEDERATED_SOURCES}) - SET(LIB_SOURCES ${LIB_SOURCES} ../storage/federated/${rpath}) - ENDFOREACH(rpath) -ENDIF(WITH_FEDERATED_STORAGE_ENGINE) - -IF(WITH_INNOBASE_STORAGE_ENGINE) - INCLUDE(${CMAKE_SOURCE_DIR}/storage/innobase/CMakeLists.txt) - FOREACH(rpath ${INNOBASE_SOURCES}) - SET(LIB_SOURCES ${LIB_SOURCES} ../storage/innobase/${rpath}) - ENDFOREACH(rpath) -ENDIF(WITH_INNOBASE_STORAGE_ENGINE) - -IF(WITH_CSV_STORAGE_ENGINE) - INCLUDE(${CMAKE_SOURCE_DIR}/storage/csv/CMakeLists.txt) - FOREACH(rpath ${CSV_SOURCES}) - SET(LIB_SOURCES ${LIB_SOURCES} ../storage/csv/${rpath}) - ENDFOREACH(rpath) -ENDIF(WITH_CSV_STORAGE_ENGINE) SET(SOURCE_SUBLIBS FALSE) diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index 2a6a069d81c..374fcb6c8ef 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -1760,15 +1760,26 @@ sub environment_setup { # -------------------------------------------------------------------------- # Add the path where mysqld will find ha_example.so # -------------------------------------------------------------------------- - if ($mysql_version_id >= 50100) { + if ($mysql_version_id >= 50100 && !(IS_WINDOWS && $opt_embedded_server)) { + my $plugin_filename; + if (IS_WINDOWS) + { + $plugin_filename = "ha_example.dll"; + } + else + { + $plugin_filename = "ha_example.so"; + } my $lib_example_plugin= - mtr_file_exists(vs_config_dirs('storage/example', 'ha_example.dll'), - "$basedir/storage/example/.libs/ha_example.so",); + mtr_file_exists(vs_config_dirs('storage/example',$plugin_filename), + "$basedir/storage/example/.libs/".$plugin_filename); $ENV{'EXAMPLE_PLUGIN'}= ($lib_example_plugin ? basename($lib_example_plugin) : ""); $ENV{'EXAMPLE_PLUGIN_OPT'}= "--plugin-dir=". ($lib_example_plugin ? dirname($lib_example_plugin) : ""); + $ENV{'HA_EXAMPLE_SO'}="'".$plugin_filename."'"; + $ENV{'EXAMPLE_PLUGIN_LOAD'}="--plugin_load=;EXAMPLE=".$plugin_filename.";"; } # ---------------------------------------------------- diff --git a/mysql-test/t/plugin.test b/mysql-test/t/plugin.test index 0635a58a4a6..7fc62b445c9 100644 --- a/mysql-test/t/plugin.test +++ b/mysql-test/t/plugin.test @@ -3,13 +3,16 @@ CREATE TABLE t1(a int) ENGINE=EXAMPLE; DROP TABLE t1; -INSTALL PLUGIN example SONAME 'ha_example.so'; +--replace_regex /\.dll/.so/ +eval INSTALL PLUGIN example SONAME $HA_EXAMPLE_SO; +--replace_regex /\.dll/.so/ --error 1125 -INSTALL PLUGIN EXAMPLE SONAME 'ha_example.so'; +eval INSTALL PLUGIN EXAMPLE SONAME $HA_EXAMPLE_SO; UNINSTALL PLUGIN example; -INSTALL PLUGIN example SONAME 'ha_example.so'; +--replace_regex /\.dll/.so/ +eval INSTALL PLUGIN example SONAME $HA_EXAMPLE_SO; CREATE TABLE t1(a int) ENGINE=EXAMPLE; @@ -30,8 +33,8 @@ UNINSTALL PLUGIN non_exist; --echo # Bug#32034: check_func_enum() does not check correct values but set it --echo # to impossible int val --echo # - -INSTALL PLUGIN example SONAME 'ha_example.so'; +--replace_regex /\.dll/.so/ +eval INSTALL PLUGIN example SONAME $HA_EXAMPLE_SO; SET GLOBAL example_enum_var= e1; SET GLOBAL example_enum_var= e2; @@ -45,7 +48,8 @@ UNINSTALL PLUGIN example; # # Bug #32757 hang with sql_mode set when setting some global variables # -INSTALL PLUGIN example SONAME 'ha_example.so'; +--replace_regex /\.dll/.so/ +eval INSTALL PLUGIN example SONAME $HA_EXAMPLE_SO; select @@session.sql_mode into @old_sql_mode; diff --git a/mysql-test/t/plugin_load-master.opt b/mysql-test/t/plugin_load-master.opt index 66637841f16..bb7831c5769 100644 --- a/mysql-test/t/plugin_load-master.opt +++ b/mysql-test/t/plugin_load-master.opt @@ -1,3 +1,3 @@ $EXAMPLE_PLUGIN_OPT -"--plugin-load=;EXAMPLE=ha_example.so;" +$EXAMPLE_PLUGIN_LOAD --loose-plugin-example-enum-var=e2 diff --git a/mysys/charset.c b/mysys/charset.c index 7a7ef0ad3ea..b23ab084e90 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -384,7 +384,7 @@ char *get_charsets_dir(char *buf) DBUG_RETURN(res); } -CHARSET_INFO *all_charsets[256]; +CHARSET_INFO *all_charsets[256]={NULL}; CHARSET_INFO *default_charset_info = &my_charset_latin1; void add_compiled_collation(CHARSET_INFO *cs) diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt index cfd049e1864..6f162f4d84d 100755 --- a/sql/CMakeLists.txt +++ b/sql/CMakeLists.txt @@ -39,7 +39,8 @@ SET_SOURCE_FILES_PROPERTIES(${CMAKE_SOURCE_DIR}/sql/sql_yacc.h ADD_DEFINITIONS(-DMYSQL_SERVER -D_CONSOLE -DHAVE_DLOPEN -DHAVE_EVENT_SCHEDULER) -ADD_EXECUTABLE(mysqld + +SET (SQL_SOURCE ../sql-common/client.c derror.cc des_key_file.cc discover.cc ../libmysql/errmsg.c field.cc field_conv.cc filesort.cc gstream.cc @@ -82,54 +83,45 @@ ADD_EXECUTABLE(mysqld ${PROJECT_SOURCE_DIR}/include/mysql_version.h ${PROJECT_SOURCE_DIR}/sql/sql_builtin.cc ${PROJECT_SOURCE_DIR}/sql/lex_hash.h) +ADD_LIBRARY(sql ${SQL_SOURCE}) -TARGET_LINK_LIBRARIES(mysqld - heap myisam myisammrg mysys yassl zlib debug dbug yassl - taocrypt strings vio regex wsock32 ws2_32) +IF (NOT EXISTS cmake_dummy.cc) + FILE (WRITE cmake_dummy.cc "") +ENDIF (NOT EXISTS cmake_dummy.cc) +ADD_EXECUTABLE(mysqld cmake_dummy.cc) SET_TARGET_PROPERTIES(mysqld PROPERTIES OUTPUT_NAME mysqld${MYSQLD_EXE_SUFFIX}) +SET_TARGET_PROPERTIES(mysqld PROPERTIES ENABLE_EXPORTS TRUE) + +SET (MYSQLD_CORE_LIBS mysys zlib dbug strings yassl taocrypt vio regex sql) +TARGET_LINK_LIBRARIES(mysqld ${MYSQLD_CORE_LIBS} ${MYSQLD_STATIC_ENGINE_LIBS}) +TARGET_LINK_LIBRARIES(mysqld ws2_32.lib) + -IF(cmake_version EQUAL 20406) -# Work around for 2.4.6 bug, OUTPUT_NAME will not set the right .PDB -# file name. Note that COMPILE_FLAGS set some temporary pdb during build, -# LINK_FLAGS sets the real one. -SET_TARGET_PROPERTIES(mysqld PROPERTIES - COMPILE_FLAGS "/Fd${CMAKE_CFG_INTDIR}/mysqld${MYSQLD_EXE_SUFFIX}.pdb" - LINK_FLAGS "/PDB:${CMAKE_CFG_INTDIR}/mysqld${MYSQLD_EXE_SUFFIX}.pdb") -ENDIF(cmake_version EQUAL 20406) - -IF(EMBED_MANIFESTS) - MYSQL_EMBED_MANIFEST("mysqld" "asInvoker") -ENDIF(EMBED_MANIFESTS) -IF(WITH_ARCHIVE_STORAGE_ENGINE) - TARGET_LINK_LIBRARIES(mysqld archive) -ENDIF(WITH_ARCHIVE_STORAGE_ENGINE) -IF(WITH_BLACKHOLE_STORAGE_ENGINE) - TARGET_LINK_LIBRARIES(mysqld blackhole) -ENDIF(WITH_BLACKHOLE_STORAGE_ENGINE) -IF(WITH_CSV_STORAGE_ENGINE) - TARGET_LINK_LIBRARIES(mysqld csv) -ENDIF(WITH_CSV_STORAGE_ENGINE) -IF(WITH_EXAMPLE_STORAGE_ENGINE) - TARGET_LINK_LIBRARIES(mysqld example) -ENDIF(WITH_EXAMPLE_STORAGE_ENGINE) -IF(WITH_FEDERATED_STORAGE_ENGINE) - TARGET_LINK_LIBRARIES(mysqld federated) -ENDIF(WITH_FEDERATED_STORAGE_ENGINE) -IF(WITH_INNOBASE_STORAGE_ENGINE) - TARGET_LINK_LIBRARIES(mysqld innobase) -ENDIF(WITH_INNOBASE_STORAGE_ENGINE) - -ADD_DEPENDENCIES(mysqld GenError) - -# NOTE CMake 2.4.6 creates strange dependencies between files in OUTPUT, -# so for now we only list one if more than one +IF(MSVC AND NOT WITHOUT_DYNAMIC_PLUGINS) + # Set module definition file. Also use non-incremental linker, + # incremental appears to crash from time to time,if used with /DEF option + SET_TARGET_PROPERTIES(mysqld PROPERTIES LINK_FLAGS "/DEF:mysqld.def /INCREMENTAL:NO") + + FOREACH (CORELIB ${MYSQLD_CORE_LIBS}) + GET_TARGET_PROPERTY(LOC ${CORELIB} LOCATION) + FILE(TO_NATIVE_PATH ${LOC} LOC) + SET (LIB_LOCATIONS ${LIB_LOCATIONS} ${LOC}) + ENDFOREACH (CORELIB ${MYSQLD_CORE_LIBS}) + + ADD_CUSTOM_COMMAND(TARGET mysqld PRE_LINK + COMMAND cscript ARGS //nologo ${PROJECT_SOURCE_DIR}/win/create_def_file.js + ${PLATFORM} ${LIB_LOCATIONS} > mysqld.def + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/sql) +ENDIF(MSVC AND NOT WITHOUT_DYNAMIC_PLUGINS) + +ADD_DEPENDENCIES(sql GenError) # Sql Parser custom command ADD_CUSTOM_COMMAND( OUTPUT ${PROJECT_SOURCE_DIR}/sql/sql_yacc.h -# ${PROJECT_SOURCE_DIR}/sql/sql_yacc.cc - COMMAND bison.exe ARGS -y -p MYSQL --defines=sql_yacc.h + ${PROJECT_SOURCE_DIR}/sql/sql_yacc.cc + COMMAND bison ARGS -y -p MYSQL --defines=sql_yacc.h --output=sql_yacc.cc sql_yacc.yy DEPENDS ${PROJECT_SOURCE_DIR}/sql/sql_yacc.yy) @@ -146,16 +138,16 @@ ADD_CUSTOM_COMMAND( ADD_CUSTOM_TARGET( GenServerSource ALL DEPENDS ${PROJECT_SOURCE_DIR}/sql/sql_yacc.h -# ${PROJECT_SOURCE_DIR}/sql/sql_yacc.cc + ${PROJECT_SOURCE_DIR}/sql/sql_yacc.cc ${PROJECT_SOURCE_DIR}/sql/message.h -# ${PROJECT_SOURCE_DIR}/sql/message.rc + ${PROJECT_SOURCE_DIR}/sql/message.rc ${PROJECT_SOURCE_DIR}/sql/lex_hash.h) ADD_DEPENDENCIES(mysqld GenServerSource) # Remove the auto-generated files as part of 'Clean Solution' SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES - "lex_hash.h;sql_yacc.h;sql_yacc.cc") + "lex_hash.h;sql_yacc.h;sql_yacc.cc;mysqld.def") ADD_LIBRARY(udf_example MODULE udf_example.c udf_example.def) ADD_DEPENDENCIES(udf_example strings GenError) diff --git a/sql/handler.h b/sql/handler.h index 5c7cfa4d58b..11d0f71fc72 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -1932,8 +1932,8 @@ private: /* Some extern variables used with handlers */ extern const char *ha_row_type[]; -extern const char *tx_isolation_names[]; -extern const char *binlog_format_names[]; +extern MYSQL_PLUGIN_IMPORT const char *tx_isolation_names[]; +extern MYSQL_PLUGIN_IMPORT const char *binlog_format_names[]; extern TYPELIB tx_isolation_typelib; extern TYPELIB myisam_stats_method_typelib; extern ulong total_ha, total_ha_2pc; diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 69a789284b0..2298926b501 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -82,9 +82,9 @@ extern query_id_t global_query_id; inline query_id_t next_query_id() { return global_query_id++; } /* useful constants */ -extern const key_map key_map_empty; -extern key_map key_map_full; /* Should be threaded as const */ -extern const char *primary_key_name; +extern MYSQL_PLUGIN_IMPORT const key_map key_map_empty; +extern MYSQL_PLUGIN_IMPORT key_map key_map_full; /* Should be threaded as const */ +extern MYSQL_PLUGIN_IMPORT const char *primary_key_name; #include "mysql_com.h" #include <violite.h> @@ -123,8 +123,10 @@ char* query_table_status(THD *thd,const char *db,const char *table_name); "in MySQL %s. Please use %s instead.", (Old), (Ver), (New)); \ } while(0) -extern CHARSET_INFO *system_charset_info, *files_charset_info ; -extern CHARSET_INFO *national_charset_info, *table_alias_charset; +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *system_charset_info; +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *files_charset_info ; +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *national_charset_info; +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *table_alias_charset; enum Derivation @@ -690,14 +692,19 @@ typedef struct st_sql_list { } } SQL_LIST; - +#if defined(MYSQL_DYNAMIC_PLUGIN) && defined(_WIN32) +extern "C" THD *_current_thd_noinline(); +#define _current_thd() _current_thd_noinline() +#else extern pthread_key(THD*, THR_THD); inline THD *_current_thd(void) { return my_pthread_getspecific_ptr(THD*,THR_THD); } +#endif #define current_thd _current_thd() + /** The meat of thd_proc_info(THD*, char*), a macro that packs the last three calling-info parameters. @@ -1882,8 +1889,12 @@ extern time_t server_start_time, flush_status_time; #endif /* MYSQL_SERVER */ #if defined MYSQL_SERVER || defined INNODB_COMPATIBILITY_HOOKS extern uint mysql_data_home_len; -extern char *mysql_data_home,server_version[SERVER_VERSION_LENGTH], - mysql_real_data_home[], mysql_unpacked_real_data_home[]; + +extern MYSQL_PLUGIN_IMPORT char *mysql_data_home; +extern char server_version[SERVER_VERSION_LENGTH]; +extern MYSQL_PLUGIN_IMPORT char mysql_real_data_home[]; +extern char mysql_unpacked_real_data_home[]; + extern CHARSET_INFO *character_set_filesystem; #endif /* MYSQL_SERVER || INNODB_COMPATIBILITY_HOOKS */ #ifdef MYSQL_SERVER @@ -1891,10 +1902,13 @@ extern char *opt_mysql_tmpdir, mysql_charsets_dir[], def_ft_boolean_syntax[sizeof(ft_boolean_syntax)]; extern int mysql_unpacked_real_data_home_len; #define mysql_tmpdir (my_tmpdir(&mysql_tmpdir_list)) -extern MY_TMPDIR mysql_tmpdir_list; +extern MYSQL_PLUGIN_IMPORT MY_TMPDIR mysql_tmpdir_list; extern const LEX_STRING command_name[]; -extern const char *first_keyword, *my_localhost, *delayed_user, *binary_keyword; -extern const char **errmesg; /* Error messages */ + +extern const char *first_keyword, *delayed_user, *binary_keyword; +extern MYSQL_PLUGIN_IMPORT const char *my_localhost; +extern MYSQL_PLUGIN_IMPORT const char **errmesg; /* Error messages */ + extern const char *myisam_recover_options_str; extern const char *in_left_expr_name, *in_additional_cond, *in_having_cond; extern const char * const TRG_EXT; @@ -1908,8 +1922,8 @@ extern Le_creator le_creator; extern char language[FN_REFLEN]; #endif /* MYSQL_SERVER */ #if defined MYSQL_SERVER || defined INNODB_COMPATIBILITY_HOOKS -extern char reg_ext[FN_EXTLEN]; -extern uint reg_ext_length; +extern MYSQL_PLUGIN_IMPORT char reg_ext[FN_EXTLEN]; +extern MYSQL_PLUGIN_IMPORT uint reg_ext_length; #endif /* MYSQL_SERVER || INNODB_COMPATIBILITY_HOOKS */ #ifdef MYSQL_SERVER extern char glob_hostname[FN_REFLEN], mysql_home[FN_REFLEN]; @@ -1929,7 +1943,8 @@ extern ulong slave_open_temp_tables; extern ulong query_cache_size, query_cache_min_res_unit; extern ulong slow_launch_threads, slow_launch_time; extern ulong table_cache_size, table_def_size; -extern ulong max_connections,max_connect_errors, connect_timeout; +extern MYSQL_PLUGIN_IMPORT ulong max_connections; +extern ulong max_connect_errors, connect_timeout; extern ulong slave_net_timeout, slave_trans_retries; extern uint max_user_connections; extern ulong what_to_log,flush_time; @@ -1942,7 +1957,7 @@ extern ulong rpl_recovery_rank, thread_cache_size, thread_pool_size; extern ulong back_log; #endif /* MYSQL_SERVER */ #if defined MYSQL_SERVER || defined INNODB_COMPATIBILITY_HOOKS -extern ulong specialflag; +extern ulong MYSQL_PLUGIN_IMPORT specialflag; #endif /* MYSQL_SERVER || INNODB_COMPATIBILITY_HOOKS */ #ifdef MYSQL_SERVER extern ulong current_pid; @@ -1955,7 +1970,7 @@ extern uint protocol_version, mysqld_port, dropping_tables; extern uint delay_key_write_options; #endif /* MYSQL_SERVER */ #if defined MYSQL_SERVER || defined INNODB_COMPATIBILITY_HOOKS -extern uint lower_case_table_names; +extern MYSQL_PLUGIN_IMPORT uint lower_case_table_names; #endif /* MYSQL_SERVER || INNODB_COMPATIBILITY_HOOKS */ #ifdef MYSQL_SERVER extern bool opt_endinfo, using_udf_functions; @@ -1963,7 +1978,7 @@ extern my_bool locked_in_memory; extern bool opt_using_transactions; #endif /* MYSQL_SERVER */ #if defined MYSQL_SERVER || defined INNODB_COMPATIBILITY_HOOKS -extern bool mysqld_embedded; +extern MYSQL_PLUGIN_IMPORT bool mysqld_embedded; #endif /* MYSQL_SERVER || INNODB_COMPATIBILITY_HOOKS */ #ifdef MYSQL_SERVER extern bool opt_large_files, server_id_supplied; @@ -2001,7 +2016,7 @@ extern uint opt_large_page_size; extern char *opt_logname, *opt_slow_logname; extern const char *log_output_str; -extern MYSQL_BIN_LOG mysql_bin_log; +extern MYSQL_PLUGIN_IMPORT MYSQL_BIN_LOG mysql_bin_log; extern LOGGER logger; extern TABLE_LIST general_log, slow_log; extern FILE *bootstrap_file; @@ -2009,13 +2024,14 @@ extern int bootstrap_error; extern FILE *stderror_file; extern pthread_key(MEM_ROOT**,THR_MALLOC); extern pthread_mutex_t LOCK_mysql_create_db,LOCK_Acl,LOCK_open, LOCK_lock_db, - LOCK_thread_count,LOCK_mapped_file,LOCK_user_locks, LOCK_status, + LOCK_mapped_file,LOCK_user_locks, LOCK_status, LOCK_error_log, LOCK_delayed_insert, LOCK_uuid_generator, LOCK_delayed_status, LOCK_delayed_create, LOCK_crypt, LOCK_timezone, LOCK_slave_list, LOCK_active_mi, LOCK_manager, LOCK_global_read_lock, LOCK_global_system_variables, LOCK_user_conn, LOCK_prepared_stmt_count, LOCK_bytes_sent, LOCK_bytes_received, LOCK_connection_count; +extern MYSQL_PLUGIN_IMPORT pthread_mutex_t LOCK_thread_count; #ifdef HAVE_OPENSSL extern pthread_mutex_t LOCK_des_key_file; #endif @@ -2035,7 +2051,7 @@ extern const String my_null_string; extern SHOW_VAR status_vars[]; #endif /* MYSQL_SERVER */ #if defined MYSQL_SERVER || defined INNODB_COMPATIBILITY_HOOKS -extern struct system_variables global_system_variables; +extern MYSQL_PLUGIN_IMPORT struct system_variables global_system_variables; #endif /* MYSQL_SERVER || INNODB_COMPATIBILITY_HOOKS */ #ifdef MYSQL_SERVER extern struct system_variables max_system_variables; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 080f78993a1..61680ad3921 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -6765,7 +6765,7 @@ The minimum value for this variable is 4096.", (uchar**) &opt_plugin_dir_ptr, (uchar**) &opt_plugin_dir_ptr, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"plugin-load", OPT_PLUGIN_LOAD, - "Optional colon-separated list of plugins to load, where each plugin is " + "Optional semicolon-separated list of plugins to load, where each plugin is " "identified as name=library, where name is the plugin name and library " "is the plugin library in plugin_dir.", (uchar**) &opt_plugin_load, (uchar**) &opt_plugin_load, 0, diff --git a/sql/sql_class.cc b/sql/sql_class.cc index cf5fdcf27a7..f003a9c502b 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -746,6 +746,12 @@ void thd_get_xid(const MYSQL_THD thd, MYSQL_XID *xid) *xid = *(MYSQL_XID *) &thd->transaction.xid_state.xid; } +#ifdef _WIN32 +extern "C" THD *_current_thd_noinline(void) +{ + return my_pthread_getspecific_ptr(THD*,THR_THD); +} +#endif /* Init common variables that has to be reset on start and on change_user */ diff --git a/sql/sql_class.h b/sql/sql_class.h index ce4524fb982..02f82f626b2 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -91,7 +91,7 @@ enum enum_mark_columns extern char internal_table_name[2]; extern char empty_c_string[1]; -extern const char **errmesg; +extern MYSQL_PLUGIN_IMPORT const char **errmesg; #define TC_LOG_PAGE_SIZE 8192 #define TC_LOG_MIN_SIZE (3*TC_LOG_PAGE_SIZE) diff --git a/sql/sql_list.h b/sql/sql_list.h index 0d267111dad..22df77afeb3 100644 --- a/sql/sql_list.h +++ b/sql/sql_list.h @@ -86,7 +86,7 @@ struct list_node :public Sql_alloc }; -extern list_node end_of_list; +extern MYSQL_PLUGIN_IMPORT list_node end_of_list; class base_list :public Sql_alloc { diff --git a/sql/sql_profile.h b/sql/sql_profile.h index b5537487d26..245959e0953 100644 --- a/sql/sql_profile.h +++ b/sql/sql_profile.h @@ -16,25 +16,12 @@ #ifndef _SQL_PROFILE_H #define _SQL_PROFILE_H -#if __STDC_VERSION__ < 199901L -# if __GNUC__ >= 2 -# define __func__ __FUNCTION__ -# else -# define __func__ _unknown_func_ -extern const char * const _unknown_func_; -# endif -#elif defined(_MSC_VER) -# if _MSC_VER < 1300 -# define __func__ _unknown_func_ -extern const char * const _unknown_func_; -# else -# define __func__ __FUNCTION__ -# endif -#elif defined(__BORLANDC__) -# define __func__ __FUNC__ +#ifndef __func__ +#ifdef __FUNCTION__ +#define __func__ __FUNCTION__ #else -# define __func__ _unknown_func_ -extern const char * const _unknown_func_; +#define __func__ "unknown function" +#endif #endif extern ST_FIELD_INFO query_profile_statistics_info[]; diff --git a/storage/Makefile.am b/storage/Makefile.am index 4f19be3a361..8aa1e4f7dc6 100644 --- a/storage/Makefile.am +++ b/storage/Makefile.am @@ -18,7 +18,7 @@ AUTOMAKE_OPTIONS = foreign # These are built from source in the Docs directory -EXTRA_DIST = +EXTRA_DIST = mysql_storage_engine.cmake SUBDIRS = @mysql_se_dirs@ DIST_SUBDIRS = @mysql_se_distdirs@ diff --git a/storage/archive/CMakeLists.txt b/storage/archive/CMakeLists.txt index 1c53ad15c07..ce4d92d3f99 100644 --- a/storage/archive/CMakeLists.txt +++ b/storage/archive/CMakeLists.txt @@ -13,17 +13,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") -SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") - -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/zlib - ${CMAKE_SOURCE_DIR}/sql - ${CMAKE_SOURCE_DIR}/regex - ${CMAKE_SOURCE_DIR}/extra/yassl/include) - +INCLUDE("${PROJECT_SOURCE_DIR}/storage/mysql_storage_engine.cmake") SET(ARCHIVE_SOURCES azio.c ha_archive.cc ha_archive.h) - -IF(NOT SOURCE_SUBLIBS) - ADD_LIBRARY(archive ${ARCHIVE_SOURCES}) - ADD_DEPENDENCIES(archive GenError) -ENDIF(NOT SOURCE_SUBLIBS) +MYSQL_STORAGE_ENGINE(ARCHIVE) diff --git a/storage/blackhole/CMakeLists.txt b/storage/blackhole/CMakeLists.txt index b11330db255..b762228d7fd 100644 --- a/storage/blackhole/CMakeLists.txt +++ b/storage/blackhole/CMakeLists.txt @@ -16,13 +16,7 @@ SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/sql - ${CMAKE_SOURCE_DIR}/regex - ${CMAKE_SOURCE_DIR}/extra/yassl/include) - +INCLUDE("${PROJECT_SOURCE_DIR}/storage/mysql_storage_engine.cmake") SET(BLACKHOLE_SOURCES ha_blackhole.cc ha_blackhole.h) -IF(NOT SOURCE_SUBLIBS) - ADD_LIBRARY(blackhole ${BLACKHOLE_SOURCES}) - ADD_DEPENDENCIES(blackhole GenError) -ENDIF(NOT SOURCE_SUBLIBS) +MYSQL_STORAGE_ENGINE(BLACKHOLE) diff --git a/storage/csv/CMakeLists.txt b/storage/csv/CMakeLists.txt index 528b9928c76..eb21a9b048c 100644 --- a/storage/csv/CMakeLists.txt +++ b/storage/csv/CMakeLists.txt @@ -16,13 +16,6 @@ SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/sql - ${CMAKE_SOURCE_DIR}/regex - ${CMAKE_SOURCE_DIR}/extra/yassl/include) - +INCLUDE("${PROJECT_SOURCE_DIR}/storage/mysql_storage_engine.cmake") SET(CSV_SOURCES ha_tina.cc ha_tina.h transparent_file.cc transparent_file.h) - -IF(NOT SOURCE_SUBLIBS) - ADD_LIBRARY(csv ${CSV_SOURCES}) - ADD_DEPENDENCIES(csv GenError) -ENDIF(NOT SOURCE_SUBLIBS) +MYSQL_STORAGE_ENGINE(CSV)
\ No newline at end of file diff --git a/storage/example/CMakeLists.txt b/storage/example/CMakeLists.txt index 0af60e1df83..a328da107bd 100644 --- a/storage/example/CMakeLists.txt +++ b/storage/example/CMakeLists.txt @@ -15,14 +15,6 @@ SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") - -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/sql - ${CMAKE_SOURCE_DIR}/regex - ${CMAKE_SOURCE_DIR}/extra/yassl/include) - +INCLUDE("${PROJECT_SOURCE_DIR}/storage/mysql_storage_engine.cmake") SET(EXAMPLE_SOURCES ha_example.cc) - -IF(NOT SOURCE_SUBLIBS) - ADD_LIBRARY(example ${EXAMPLE_SOURCES}) - ADD_DEPENDENCIES(example GenError) -ENDIF(NOT SOURCE_SUBLIBS) +MYSQL_STORAGE_ENGINE(EXAMPLE) diff --git a/storage/federated/CMakeLists.txt b/storage/federated/CMakeLists.txt index b96f68a3c37..fa54d36481a 100644 --- a/storage/federated/CMakeLists.txt +++ b/storage/federated/CMakeLists.txt @@ -13,16 +13,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") -SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") - -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/sql - ${CMAKE_SOURCE_DIR}/regex - ${CMAKE_SOURCE_DIR}/extra/yassl/include) - +INCLUDE("${PROJECT_SOURCE_DIR}/storage/mysql_storage_engine.cmake") SET(FEDERATED_SOURCES ha_federated.cc) - -IF(NOT SOURCE_SUBLIBS) - ADD_LIBRARY(federated ${FEDERATED_SOURCES}) - ADD_DEPENDENCIES(federated GenError) -ENDIF(NOT SOURCE_SUBLIBS) +MYSQL_STORAGE_ENGINE(FEDERATED) diff --git a/storage/heap/CMakeLists.txt b/storage/heap/CMakeLists.txt index f8f0aa91464..c2d2cd1290f 100755 --- a/storage/heap/CMakeLists.txt +++ b/storage/heap/CMakeLists.txt @@ -16,18 +16,10 @@ SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/zlib - ${CMAKE_SOURCE_DIR}/sql - ${CMAKE_SOURCE_DIR}/regex - ${CMAKE_SOURCE_DIR}/extra/yassl/include) - +INCLUDE("${PROJECT_SOURCE_DIR}/storage/mysql_storage_engine.cmake") SET(HEAP_SOURCES _check.c _rectest.c hp_block.c hp_clear.c hp_close.c hp_create.c ha_heap.cc hp_delete.c hp_extra.c hp_hash.c hp_info.c hp_open.c hp_panic.c hp_rename.c hp_rfirst.c hp_rkey.c hp_rlast.c hp_rnext.c hp_rprev.c hp_rrnd.c hp_rsame.c hp_scan.c hp_static.c hp_update.c hp_write.c) - -IF(NOT SOURCE_SUBLIBS) - ADD_LIBRARY(heap ${HEAP_SOURCES}) - ADD_DEPENDENCIES(heap GenError) -ENDIF(NOT SOURCE_SUBLIBS) +MYSQL_STORAGE_ENGINE(HEAP) diff --git a/storage/innobase/CMakeLists.txt b/storage/innobase/CMakeLists.txt index 021a47f0398..5918db7ab11 100755 --- a/storage/innobase/CMakeLists.txt +++ b/storage/innobase/CMakeLists.txt @@ -15,6 +15,7 @@ SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") +INCLUDE("${PROJECT_SOURCE_DIR}/storage/mysql_storage_engine.cmake") ADD_DEFINITIONS(-DMYSQL_SERVER -D_WIN32 -D_LIB) # Bug 19424 - InnoDB: Possibly a memory overrun of the buffer being freed (64-bit Visual C) @@ -25,12 +26,10 @@ IF(CMAKE_GENERATOR MATCHES "Visual Studio" AND CMAKE_SIZEOF_VOID_P MATCHES 8) PROPERTIES COMPILE_FLAGS -Od) ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio" AND CMAKE_SIZEOF_VOID_P MATCHES 8) -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/zlib - ${CMAKE_SOURCE_DIR}/storage/innobase/include - ${CMAKE_SOURCE_DIR}/storage/innobase/handler - ${CMAKE_SOURCE_DIR}/sql - ${CMAKE_SOURCE_DIR}/regex - ${CMAKE_SOURCE_DIR}/extra/yassl/include) +INCLUDE_DIRECTORIES( + ${CMAKE_SOURCE_DIR}/storage/innobase/include + ${CMAKE_SOURCE_DIR}/storage/innobase/handler + ) SET(INNOBASE_SOURCES btr/btr0btr.c btr/btr0cur.c btr/btr0pcur.c btr/btr0sea.c buf/buf0buf.c buf/buf0flu.c buf/buf0lru.c buf/buf0rea.c @@ -64,7 +63,5 @@ SET(INNOBASE_SOURCES btr/btr0btr.c btr/btr0cur.c btr/btr0pcur.c btr/btr0sea.c usr/usr0sess.c ut/ut0byte.c ut/ut0dbg.c ut/ut0mem.c ut/ut0rnd.c ut/ut0ut.c ut/ut0vec.c ut/ut0list.c ut/ut0wqueue.c) -IF(NOT SOURCE_SUBLIBS) - ADD_LIBRARY(innobase ${INNOBASE_SOURCES}) - ADD_DEPENDENCIES(innobase GenError) -ENDIF(NOT SOURCE_SUBLIBS) +MYSQL_STORAGE_ENGINE(INNOBASE) + diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 56e28cf5f14..f06b42cc654 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -902,6 +902,100 @@ innobase_get_charset( return(thd_charset((THD*) mysql_thd)); } +#if defined (__WIN__) && defined (MYSQL_DYNAMIC_PLUGIN) +extern MYSQL_PLUGIN_IMPORT MY_TMPDIR mysql_tmpdir_list; +/*******************************************************************//** +Map an OS error to an errno value. The OS error number is stored in +_doserrno and the mapped value is stored in errno) */ +extern "C" +void __cdecl +_dosmaperr( + unsigned long); /*!< in: OS error value */ + +/*********************************************************************//** +Creates a temporary file. +@return temporary file descriptor, or < 0 on error */ +extern "C" +int +innobase_mysql_tmpfile(void) +/*========================*/ +{ + int fd; /* handle of opened file */ + HANDLE osfh; /* OS handle of opened file */ + char* tmpdir; /* point to the directory + where to create file */ + TCHAR path_buf[MAX_PATH - 14]; /* buffer for tmp file path. + The length cannot be longer + than MAX_PATH - 14, or + GetTempFileName will fail. */ + char filename[MAX_PATH]; /* name of the tmpfile */ + DWORD fileaccess = GENERIC_READ /* OS file access */ + | GENERIC_WRITE + | DELETE; + DWORD fileshare = FILE_SHARE_READ /* OS file sharing mode */ + | FILE_SHARE_WRITE + | FILE_SHARE_DELETE; + DWORD filecreate = CREATE_ALWAYS; /* OS method of open/create */ + DWORD fileattrib = /* OS file attribute flags */ + FILE_ATTRIBUTE_NORMAL + | FILE_FLAG_DELETE_ON_CLOSE + | FILE_ATTRIBUTE_TEMPORARY + | FILE_FLAG_SEQUENTIAL_SCAN; + + DBUG_ENTER("innobase_mysql_tmpfile"); + + tmpdir = my_tmpdir(&mysql_tmpdir_list); + + /* The tmpdir parameter can not be NULL for GetTempFileName. */ + if (!tmpdir) { + uint ret; + + /* Use GetTempPath to determine path for temporary files. */ + ret = GetTempPath(sizeof(path_buf), path_buf); + if (ret > sizeof(path_buf) || (ret == 0)) { + + _dosmaperr(GetLastError()); /* map error */ + DBUG_RETURN(-1); + } + + tmpdir = path_buf; + } + + /* Use GetTempFileName to generate a unique filename. */ + if (!GetTempFileName(tmpdir, "ib", 0, filename)) { + + _dosmaperr(GetLastError()); /* map error */ + DBUG_RETURN(-1); + } + + DBUG_PRINT("info", ("filename: %s", filename)); + + /* Open/Create the file. */ + osfh = CreateFile(filename, fileaccess, fileshare, NULL, + filecreate, fileattrib, NULL); + if (osfh == INVALID_HANDLE_VALUE) { + + /* open/create file failed! */ + _dosmaperr(GetLastError()); /* map error */ + DBUG_RETURN(-1); + } + + do { + /* Associates a CRT file descriptor with the OS file handle. */ + fd = _open_osfhandle((intptr_t) osfh, 0); + } while (fd == -1 && errno == EINTR); + + if (fd == -1) { + /* Open failed, close the file handle. */ + + _dosmaperr(GetLastError()); /* map error */ + CloseHandle(osfh); /* no need to check if + CloseHandle fails */ + } + + DBUG_RETURN(fd); +} +#else /************************************************************************* Creates a temporary file. */ extern "C" @@ -933,6 +1027,7 @@ innobase_mysql_tmpfile(void) } return(fd2); } +#endif /************************************************************************* Wrapper around MySQL's copy_and_convert function, see it for diff --git a/storage/innodb_plugin/CMakeLists.txt b/storage/innodb_plugin/CMakeLists.txt index b5fb26880a3..6da3785990a 100644 --- a/storage/innodb_plugin/CMakeLists.txt +++ b/storage/innodb_plugin/CMakeLists.txt @@ -15,44 +15,17 @@ # This is the CMakeLists for InnoDB Plugin -# The dynamic plugin requires CMake 2.6.0 or later. Otherwise, the /DELAYLOAD -# property will not be set -CMAKE_MINIMUM_REQUIRED(VERSION 2.6 FATAL_ERROR) - -# When PROJECT is defined, a separate .sln file will be generated. -# PROJECT (INNODB_PLUGIN) - -MESSAGE(STATUS "Enter InnoDB ...") -MESSAGE(STATUS "INNODB_DYNAMIC_PLUGIN: " ${INNODB_DYNAMIC_PLUGIN}) - -# Print out CMake info -MESSAGE(STATUS "CMAKE_GENERATOR: " ${CMAKE_GENERATOR}) -MESSAGE(STATUS "CMAKE_SOURCE_DIR: " ${CMAKE_SOURCE_DIR}) - -# Print out system information -MESSAGE(STATUS "CMAKE_SYSTEM: " ${CMAKE_SYSTEM}) -MESSAGE(STATUS "CMAKE_SYSTEM_PROCESSOR: " ${CMAKE_SYSTEM_PROCESSOR}) -MESSAGE(STATUS "UNIX: " ${UNIX}) -MESSAGE(STATUS "WIN32: " ${WIN32}) +SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") +SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") +INCLUDE("${PROJECT_SOURCE_DIR}/storage/mysql_storage_engine.cmake") IF (CMAKE_SIZEOF_VOID_P MATCHES 8) SET(WIN64 TRUE) ENDIF (CMAKE_SIZEOF_VOID_P MATCHES 8) -MESSAGE(STATUS "WIN64: " ${WIN64}) -MESSAGE(STATUS "MSVC: " ${MSVC}) - -# Check type sizes -include(CheckTypeSize) - -# Currently, the checked results are not used. -CHECK_TYPE_SIZE(int SIZEOF_INT) -CHECK_TYPE_SIZE(long SIZEOF_LONG) -CHECK_TYPE_SIZE(void* SIZEOF_VOID_P) - -# Include directories under innobase -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/storage/innobase/include - ${CMAKE_SOURCE_DIR}/storage/innobase/handler) +# Include directories under innodb_plugin +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/storage/innodb_plugin/include + ${CMAKE_SOURCE_DIR}/storage/innodfb_plugin/handler) # Include directories under mysql INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include @@ -68,7 +41,7 @@ IF(MSVC AND $(WIN64)) PROPERTIES COMPILE_FLAGS -Od) ENDIF(MSVC AND $(WIN64)) -SET(INNODB_SOURCES btr/btr0btr.c btr/btr0cur.c btr/btr0pcur.c btr/btr0sea.c +SET(INNODB_PLUGIN_SOURCES btr/btr0btr.c btr/btr0cur.c btr/btr0pcur.c btr/btr0sea.c buf/buf0buddy.c buf/buf0buf.c buf/buf0flu.c buf/buf0lru.c buf/buf0rea.c data/data0data.c data/data0type.c dict/dict0boot.c dict/dict0crea.c dict/dict0dict.c dict/dict0load.c dict/dict0mem.c @@ -101,31 +74,5 @@ SET(INNODB_SOURCES btr/btr0btr.c btr/btr0cur.c btr/btr0pcur.c btr/btr0sea.c usr/usr0sess.c ut/ut0byte.c ut/ut0dbg.c ut/ut0mem.c ut/ut0rnd.c ut/ut0ut.c ut/ut0vec.c ut/ut0list.c ut/ut0wqueue.c) - -IF(NOT SOURCE_SUBLIBS) - # INNODB_RW_LOCKS_USE_ATOMICS may be defined only if HAVE_WINDOWS_ATOMICS is defined. - # Windows Interlocked functions require Windows 2000 or newer operating system - ADD_DEFINITIONS(-D_WIN32 -DHAVE_WINDOWS_ATOMICS -DINNODB_RW_LOCKS_USE_ATOMICS) - ADD_LIBRARY(innobase STATIC ${INNODB_SOURCES}) - # Require mysqld_error.h, which is built as part of the GenError - ADD_DEPENDENCIES(innobase GenError) - # only set MYSQL_SERVER for the builtin engine, not the plugin - SET_TARGET_PROPERTIES(innobase PROPERTIES COMPILE_FLAGS "-DMYSQL_SERVER") - - # Dynamic plugin ha_innodb.dll - IF(INNODB_DYNAMIC_PLUGIN) - ADD_LIBRARY(ha_innodb SHARED ${INNODB_SOURCES} ha_innodb.def handler/win_delay_loader.cc) - # Require mysqld_error.h, which is built as part of the GenError - # Also require mysqld.lib, which is built as part of the mysqld - ADD_DEPENDENCIES(ha_innodb GenError mysqld) - - TARGET_LINK_LIBRARIES(ha_innodb ${CMAKE_SOURCE_DIR}/sql/\$\(OutDir\)/mysqld.lib) - SET_TARGET_PROPERTIES(ha_innodb PROPERTIES OUTPUT_NAME ha_innodb) - SET_TARGET_PROPERTIES(ha_innodb PROPERTIES LINK_FLAGS "/MAP /MAPINFO:EXPORTS") - SET_TARGET_PROPERTIES(ha_innodb PROPERTIES LINK_FLAGS "/ENTRY:\"_DllMainCRTStartup@12\"") - SET_TARGET_PROPERTIES(ha_innodb PROPERTIES COMPILE_FLAGS "-DMYSQL_DYNAMIC_PLUGIN") - SET_TARGET_PROPERTIES(ha_innodb PROPERTIES LINK_FLAGS "/DELAYLOAD:mysqld.exe") - ENDIF(INNODB_DYNAMIC_PLUGIN) -ENDIF(NOT SOURCE_SUBLIBS) - -MESSAGE(STATUS "Exit InnoDB ...") +ADD_DEFINITIONS(-DHAVE_WINDOWS_ATOMICS -DINNODB_RW_LOCKS_USE_ATOMICS) +MYSQL_STORAGE_ENGINE(INNODB_PLUGIN)
\ No newline at end of file diff --git a/storage/innodb_plugin/handler/ha_innodb.cc b/storage/innodb_plugin/handler/ha_innodb.cc index 779acd0d873..1f033b4141a 100644 --- a/storage/innodb_plugin/handler/ha_innodb.cc +++ b/storage/innodb_plugin/handler/ha_innodb.cc @@ -76,12 +76,11 @@ extern "C" { #include "ha_innodb.h" #include "i_s.h" -#include "handler0vars.h" #ifndef MYSQL_SERVER /* This is needed because of Bug #3596. Let us hope that pthread_mutex_t is defined the same in both builds: the MySQL server and the InnoDB plugin. */ -extern pthread_mutex_t LOCK_thread_count; +extern MYSQL_PLUGIN_IMPORT pthread_mutex_t LOCK_thread_count; #if MYSQL_VERSION_ID < 50124 /* this is defined in mysql_priv.h inside #ifdef MYSQL_SERVER @@ -104,13 +103,9 @@ static bool innodb_inited = 0; /* In the Windows plugin, the return value of current_thd is undefined. Map it to NULL. */ -#if defined MYSQL_DYNAMIC_PLUGIN && defined __WIN__ -# undef current_thd -# define current_thd NULL -# define EQ_CURRENT_THD(thd) TRUE -#else /* MYSQL_DYNAMIC_PLUGIN && __WIN__ */ -# define EQ_CURRENT_THD(thd) ((thd) == current_thd) -#endif /* MYSQL_DYNAMIC_PLUGIN && __WIN__ */ + +#define EQ_CURRENT_THD(thd) ((thd) == current_thd) + static struct handlerton* innodb_hton_ptr; @@ -985,6 +980,7 @@ innobase_get_charset( } #if defined (__WIN__) && defined (MYSQL_DYNAMIC_PLUGIN) +extern MYSQL_PLUGIN_IMPORT MY_TMPDIR mysql_tmpdir_list; /*******************************************************************//** Map an OS error to an errno value. The OS error number is stored in _doserrno and the mapped value is stored in errno) */ diff --git a/storage/innodb_plugin/handler/handler0alter.cc b/storage/innodb_plugin/handler/handler0alter.cc index a5b6d9e41f1..3bac42b7e9e 100644 --- a/storage/innodb_plugin/handler/handler0alter.cc +++ b/storage/innodb_plugin/handler/handler0alter.cc @@ -35,7 +35,6 @@ extern "C" { } #include "ha_innodb.h" -#include "handler0vars.h" /*************************************************************//** Copies an InnoDB column to a MySQL field. This function is diff --git a/storage/innodb_plugin/handler/handler0vars.h b/storage/innodb_plugin/handler/handler0vars.h deleted file mode 100644 index e0f8f75e34d..00000000000 --- a/storage/innodb_plugin/handler/handler0vars.h +++ /dev/null @@ -1,69 +0,0 @@ -/***************************************************************************** - -Copyright (c) 2008, 2009, Innobase Oy. All Rights Reserved. - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; version 2 of the License. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -/*******************************************************************//** -@file handler/handler0vars.h -This file contains accessor functions for dynamic plugin on Windows. -***********************************************************************/ - -#if defined __WIN__ && defined MYSQL_DYNAMIC_PLUGIN -/*******************************************************************//** -This is a list of externals that can not be resolved by delay loading. -They have to be resolved indirectly via their addresses in the .map file. -All of them are external variables. */ -extern CHARSET_INFO* wdl_my_charset_bin; -extern CHARSET_INFO* wdl_my_charset_latin1; -extern CHARSET_INFO* wdl_my_charset_filename; -extern CHARSET_INFO** wdl_system_charset_info; -extern CHARSET_INFO** wdl_default_charset_info; -extern CHARSET_INFO** wdl_all_charsets; -extern system_variables* wdl_global_system_variables; -extern char* wdl_mysql_real_data_home; -extern char** wdl_mysql_data_home; -extern char** wdl_tx_isolation_names; -extern char** wdl_binlog_format_names; -extern char* wdl_reg_ext; -extern pthread_mutex_t* wdl_LOCK_thread_count; -extern key_map* wdl_key_map_full; -extern MY_TMPDIR* wdl_mysql_tmpdir_list; -extern bool* wdl_mysqld_embedded; -extern uint* wdl_lower_case_table_names; -extern ulong* wdl_specialflag; -extern int* wdl_my_umask; - -#define my_charset_bin (*wdl_my_charset_bin) -#define my_charset_latin1 (*wdl_my_charset_latin1) -#define my_charset_filename (*wdl_my_charset_filename) -#define system_charset_info (*wdl_system_charset_info) -#define default_charset_info (*wdl_default_charset_info) -#define all_charsets (wdl_all_charsets) -#define global_system_variables (*wdl_global_system_variables) -#define mysql_real_data_home (wdl_mysql_real_data_home) -#define mysql_data_home (*wdl_mysql_data_home) -#define tx_isolation_names (wdl_tx_isolation_names) -#define binlog_format_names (wdl_binlog_format_names) -#define reg_ext (wdl_reg_ext) -#define LOCK_thread_count (*wdl_LOCK_thread_count) -#define key_map_full (*wdl_key_map_full) -#define mysql_tmpdir_list (*wdl_mysql_tmpdir_list) -#define mysqld_embedded (*wdl_mysqld_embedded) -#define lower_case_table_names (*wdl_lower_case_table_names) -#define specialflag (*wdl_specialflag) -#define my_umask (*wdl_my_umask) - -#endif diff --git a/storage/innodb_plugin/handler/i_s.cc b/storage/innodb_plugin/handler/i_s.cc index 3c6959d9b8f..c0d488d1c49 100644 --- a/storage/innodb_plugin/handler/i_s.cc +++ b/storage/innodb_plugin/handler/i_s.cc @@ -42,7 +42,6 @@ extern "C" { #include "ha_prototypes.h" /* for innobase_convert_name() */ #include "srv0start.h" /* for srv_was_started */ } -#include "handler0vars.h" static const char plugin_author[] = "Innobase Oy"; diff --git a/storage/innodb_plugin/handler/win_delay_loader.cc b/storage/innodb_plugin/handler/win_delay_loader.cc deleted file mode 100644 index 9b92f6a9cf2..00000000000 --- a/storage/innodb_plugin/handler/win_delay_loader.cc +++ /dev/null @@ -1,1024 +0,0 @@ -/***************************************************************************** - -Copyright (c) 2008, 2009, Innobase Oy. All Rights Reserved. - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; version 2 of the License. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA - -*****************************************************************************/ - -/*******************************************************************//** -@file handler/win_delay_loader.cc -This file contains functions that implement the delay loader on Windows. - -This is a customized version of delay loader with limited functionalities. -It does not support: - -* (manual) unloading -* multiple delay loaded DLLs -* multiple loading of the same DLL - -This delay loader is used only by the InnoDB plugin. Other components (DLLs) -can still use the default delay loader, provided by MSVC. - -Several acronyms used by Microsoft: - * IAT: import address table - * INT: import name table - * RVA: Relative Virtual Address - -See http://msdn.microsoft.com/en-us/magazine/bb985992.aspx for details of -PE format. -***********************************************************************/ -#if defined (__WIN__) && defined (MYSQL_DYNAMIC_PLUGIN) -# define WIN32_LEAN_AND_MEAN -# include <windows.h> -# include <delayimp.h> -# include <mysql_priv.h> - -extern "C" { -# include "univ.i" -# include "hash0hash.h" -} - -/*******************************************************************//** -This following contains a list of externals that can not be resolved by -delay loading. They have to be resolved indirectly via their addresses -in the .map file. All of them are external variables. */ -CHARSET_INFO* wdl_my_charset_bin; -CHARSET_INFO* wdl_my_charset_latin1; -CHARSET_INFO* wdl_my_charset_filename; -CHARSET_INFO** wdl_system_charset_info; -CHARSET_INFO** wdl_default_charset_info; -CHARSET_INFO** wdl_all_charsets; -system_variables* wdl_global_system_variables; -char* wdl_mysql_real_data_home; -char** wdl_mysql_data_home; -char** wdl_tx_isolation_names; -char** wdl_binlog_format_names; -char* wdl_reg_ext; -pthread_mutex_t* wdl_LOCK_thread_count; -key_map* wdl_key_map_full; -MY_TMPDIR* wdl_mysql_tmpdir_list; -bool* wdl_mysqld_embedded; -uint* wdl_lower_case_table_names; -ulong* wdl_specialflag; -int* wdl_my_umask; - -/*******************************************************************//** -The preferred load-address defined in PE (portable executable format). */ -#if defined(_M_IA64) -#pragma section(".base", long, read) -extern "C" -__declspec(allocate(".base")) -const IMAGE_DOS_HEADER __ImageBase; -#else -extern "C" -const IMAGE_DOS_HEADER __ImageBase; -#endif - -/*******************************************************************//** -A template function for converting a relative address (RVA) to an -absolute address (VA). This is due to the pointers in the delay -descriptor (ImgDelayDescr in delayimp.h) have been changed from -VAs to RVAs to work on both 32- and 64-bit platforms. -@return absolute virtual address */ -template <class X> -X PFromRva( -/*=======*/ - RVA rva) /*!< in: relative virtual address */ -{ - return X(PBYTE(&__ImageBase) + rva); -} - -/*******************************************************************//** -Convert to the old format for convenience. The structure as well as its -element names follow the definition of ImgDelayDescr in delayimp.h. */ -struct InternalImgDelayDescr -{ - DWORD grAttrs; /*!< attributes */ - LPCSTR szName; /*!< pointer to dll name */ - HMODULE* phmod; /*!< address of module handle */ - PImgThunkData pIAT; /*!< address of the IAT */ - PCImgThunkData pINT; /*!< address of the INT */ - PCImgThunkData pBoundIAT; /*!< address of the optional bound IAT */ - PCImgThunkData pUnloadIAT; /*!< address of optional copy of - original IAT */ - DWORD dwTimeStamp; /*!< 0 if not bound, - otherwise date/time stamp of DLL - bound to (Old BIND) */ -}; - -typedef struct map_hash_chain_struct map_hash_chain_t; - -struct map_hash_chain_struct { - char* symbol; /*!< pointer to a symbol */ - ulint value; /*!< address of the symbol */ - map_hash_chain_t* next; /*!< pointer to the next cell - in the same folder. */ - map_hash_chain_t* chain; /*!< a linear chain used for - cleanup. */ -}; - -static HMODULE my_hmod = 0; -static struct hash_table_struct* m_htbl = NULL ; -static map_hash_chain_t* chain_header = NULL; -static ibool wdl_init = FALSE; -const ulint MAP_HASH_CELLS_NUM = 10000; - -#ifndef DBUG_OFF -/*******************************************************************//** -In the dynamic plugin, it is required to call the following dbug functions -in the server: - _db_pargs_ - _db_doprnt_ - _db_enter_ - _db_return_ - _db_dump_ - -The plugin will get those function pointers during the initialization. */ -typedef void (__cdecl* pfn_db_enter_)( - const char* _func_, - const char* _file_, - uint _line_, - const char** _sfunc_, - const char** _sfile_, - uint* _slevel_, - char***); - -typedef void (__cdecl* pfn_db_return_)( - uint _line_, - const char** _sfunc_, - const char** _sfile_, - uint* _slevel_); - -typedef void (__cdecl* pfn_db_pargs_)( - uint _line_, - const char* keyword); - -typedef void (__cdecl* pfn_db_doprnt_)( - const char* format, - ...); - -typedef void (__cdecl* pfn_db_dump_)( - uint _line_, - const char* keyword, - const unsigned char* memory, - size_t length); - -static pfn_db_enter_ wdl_db_enter_; -static pfn_db_return_ wdl_db_return_; -static pfn_db_pargs_ wdl_db_pargs_; -static pfn_db_doprnt_ wdl_db_doprnt_; -static pfn_db_dump_ wdl_db_dump_; -#endif /* !DBUG_OFF */ - -/*************************************************************//** -Creates a hash table with >= n array cells. The actual number of cells is -chosen to be a prime number slightly bigger than n. - -This is the same function as hash_create in hash0hash.c, except the -memory allocation. This function is invoked before the engine is -initialized, and buffer pools are not ready yet. -@return own: created hash table */ -static -hash_table_t* -wdl_hash_create( -/*============*/ - ulint n) /*!< in: number of array cells */ -{ - hash_cell_t* array; - ulint prime; - hash_table_t* table; - - prime = ut_find_prime(n); - - table = (hash_table_t*) malloc(sizeof(hash_table_t)); - if (table == NULL) { - return(NULL); - } - - array = (hash_cell_t*) malloc(sizeof(hash_cell_t) * prime); - if (array == NULL) { - free(table); - return(NULL); - } - - table->array = array; - table->n_cells = prime; - table->n_mutexes = 0; - table->mutexes = NULL; - table->heaps = NULL; - table->heap = NULL; - table->magic_n = HASH_TABLE_MAGIC_N; - - /* Initialize the cell array */ - hash_table_clear(table); - - return(table); -} - -/*************************************************************//** -Frees a hash table. */ -static -void -wdl_hash_table_free( -/*================*/ - hash_table_t* table) /*!< in, own: hash table */ -{ - ut_a(table != NULL); - ut_a(table->mutexes == NULL); - - free(table->array); - free(table); -} - -/*******************************************************************//** -Function for calculating the count of imports given the base of the IAT. -@return number of imports */ -static -ulint -wdl_import_count( -/*=============*/ - PCImgThunkData pitd_base) /*!< in: base of the IAT */ -{ - ulint ret = 0; - PCImgThunkData pitd = pitd_base; - - while (pitd->u1.Function) { - pitd++; - ret++; - } - - return(ret); -} - -/*******************************************************************//** -Read Mapfile to a hashtable for faster access -@return TRUE if the mapfile is loaded successfully. */ -static -ibool -wdl_load_mapfile( -/*=============*/ - const char* filename) /*!< in: name of the mapfile. */ -{ - FILE* fp; - const size_t nSize = 256; - char tmp_buf[nSize]; - char* func_name; - char* func_addr; - ulint load_addr = 0; - ibool valid_load_addr = FALSE; -#ifdef _WIN64 - const char* tmp_string = " Preferred load address is %16llx"; -#else - const char* tmp_string = " Preferred load address is %08x"; -#endif - - fp = fopen(filename, "r"); - if (fp == NULL) { - - return(FALSE); - } - - /* Check whether to create the hashtable */ - if (m_htbl == NULL) { - - m_htbl = wdl_hash_create(MAP_HASH_CELLS_NUM); - - if (m_htbl == NULL) { - - fclose(fp); - return(FALSE); - } - } - - /* Search start of symbol list and get the preferred load address */ - while (fgets(tmp_buf, sizeof(tmp_buf), fp)) { - - if (sscanf(tmp_buf, tmp_string, &load_addr) == 1) { - - valid_load_addr = TRUE; - } - - if (strstr(tmp_buf, "Rva+Base") != NULL) { - - break; - } - } - - if (valid_load_addr == FALSE) { - - /* No "Preferred load address", the map file is wrong. */ - fclose(fp); - return(FALSE); - } - - /* Read symbol list */ - while (fgets(tmp_buf, sizeof(tmp_buf), fp)) - { - map_hash_chain_t* map_cell; - ulint map_fold; - - if (*tmp_buf == 0) { - - continue; - } - - func_name = strtok(tmp_buf, " "); - func_name = strtok(NULL, " "); - func_addr = strtok(NULL, " "); - - if (func_name && func_addr) { - - ut_snprintf(tmp_buf, nSize, "0x%s", func_addr); - if (*func_name == '_') { - - func_name++; - } - - map_cell = (map_hash_chain_t*) - malloc(sizeof(map_hash_chain_t)); - if (map_cell == NULL) { - return(FALSE); - } - - /* Chain all cells together */ - map_cell->chain = chain_header; - chain_header = map_cell; - - map_cell->symbol = strdup(func_name); - map_cell->value = (ulint) _strtoui64(tmp_buf, NULL, 0) - - load_addr; - map_fold = ut_fold_string(map_cell->symbol); - - HASH_INSERT(map_hash_chain_t, - next, - m_htbl, - map_fold, - map_cell); - } - } - - fclose(fp); - - return(TRUE); -} - -/*************************************************************//** -Cleanup.during DLL unload */ -static -void -wdl_cleanup(void) -/*=============*/ -{ - while (chain_header != NULL) { - map_hash_chain_t* tmp; - - tmp = chain_header->chain; - free(chain_header->symbol); - free(chain_header); - chain_header = tmp; - } - - if (m_htbl != NULL) { - - wdl_hash_table_free(m_htbl); - } -} - -/*******************************************************************//** -Load the mapfile mysqld.map. -@return the module handle */ -static -HMODULE -wdl_get_mysqld_mapfile(void) -/*========================*/ -{ - char file_name[MAX_PATH]; - char* ext; - ulint err; - - if (my_hmod == 0) { - - size_t nSize = MAX_PATH - strlen(".map") -1; - - /* First find out the name of current executable */ - my_hmod = GetModuleHandle(NULL); - if (my_hmod == 0) { - - return(my_hmod); - } - - err = GetModuleFileName(my_hmod, file_name, nSize); - if (err == 0) { - - my_hmod = 0; - return(my_hmod); - } - - ext = strrchr(file_name, '.'); - if (ext != NULL) { - - *ext = 0; - strcat(file_name, ".map"); - - err = wdl_load_mapfile(file_name); - if (err == 0) { - - my_hmod = 0; - } - } else { - - my_hmod = 0; - } - } - - return(my_hmod); -} - -/*******************************************************************//** -Retrieves the address of an exported function. It follows the convention -of GetProcAddress(). -@return address of exported function. */ -static -FARPROC -wdl_get_procaddr_from_map( -/*======================*/ - HANDLE m_handle, /*!< in: module handle */ - const char* import_proc) /*!< in: procedure name */ -{ - map_hash_chain_t* hash_chain; - ulint map_fold; - - map_fold = ut_fold_string(import_proc); - HASH_SEARCH( - next, - m_htbl, - map_fold, - map_hash_chain_t*, - hash_chain, - , - (ut_strcmp(hash_chain->symbol, import_proc) == 0)); - - if (hash_chain == NULL) { - -#ifdef _WIN64 - /* On Win64, the leading '_' may not be taken out. In this - case, search again without the leading '_'. */ - if (*import_proc == '_') { - - import_proc++; - } - - map_fold = ut_fold_string(import_proc); - HASH_SEARCH( - next, - m_htbl, - map_fold, - map_hash_chain_t*, - hash_chain, - , - (ut_strcmp(hash_chain->symbol, import_proc) == 0)); - - if (hash_chain == NULL) { -#endif - if (wdl_init == TRUE) { - - sql_print_error( - "InnoDB: the procedure pointer of %s" - " is not found.", - import_proc); - } - - return(0); -#ifdef _WIN64 - } -#endif - } - - return((FARPROC) ((ulint) m_handle + hash_chain->value)); -} - -/*******************************************************************//** -Retrieves the address of an exported variable. -Note: It does not follow the Windows call convention FARPROC. -@return address of exported variable. */ -static -void* -wdl_get_varaddr_from_map( -/*=====================*/ - HANDLE m_handle, /*!< in: module handle */ - const char* import_variable) /*!< in: variable name */ -{ - map_hash_chain_t* hash_chain; - ulint map_fold; - - map_fold = ut_fold_string(import_variable); - HASH_SEARCH( - next, - m_htbl, - map_fold, - map_hash_chain_t*, - hash_chain, - , - (ut_strcmp(hash_chain->symbol, import_variable) == 0)); - - if (hash_chain == NULL) { - -#ifdef _WIN64 - /* On Win64, the leading '_' may not be taken out. In this - case, search again without the leading '_'. */ - if (*import_variable == '_') { - - import_variable++; - } - - map_fold = ut_fold_string(import_variable); - HASH_SEARCH( - next, - m_htbl, - map_fold, - map_hash_chain_t*, - hash_chain, - , - (ut_strcmp(hash_chain->symbol, import_variable) == 0)); - - if (hash_chain == NULL) { -#endif - if (wdl_init == TRUE) { - - sql_print_error( - "InnoDB: the variable address of %s" - " is not found.", - import_variable); - } - - return(0); -#ifdef _WIN64 - } -#endif - } - - return((void*) ((ulint) m_handle + hash_chain->value)); -} - -/*******************************************************************//** -Bind all unresolved external variables from the MySQL executable. -@return TRUE if successful */ -static -bool -wdl_get_external_variables(void) -/*============================*/ -{ - HMODULE hmod = wdl_get_mysqld_mapfile(); - - if (hmod == 0) { - - return(FALSE); - } - -#define GET_SYM(sym, var, type) \ - var = (type*) wdl_get_varaddr_from_map(hmod, sym); \ - if (var == NULL) return(FALSE) -#ifdef _WIN64 -#define GET_SYM2(sym1, sym2, var, type) \ - var = (type*) wdl_get_varaddr_from_map(hmod, sym1); \ - if (var == NULL) return(FALSE) -#else -#define GET_SYM2(sym1, sym2, var, type) \ - var = (type*) wdl_get_varaddr_from_map(hmod, sym2); \ - if (var == NULL) return(FALSE) -#endif // (_WIN64) -#define GET_C_SYM(sym, type) GET_SYM(#sym, wdl_##sym, type) -#define GET_PROC_ADDR(sym) \ - wdl##sym = (pfn##sym) wdl_get_procaddr_from_map(hmod, #sym) - - GET_C_SYM(my_charset_bin, CHARSET_INFO); - GET_C_SYM(my_charset_latin1, CHARSET_INFO); - GET_C_SYM(my_charset_filename, CHARSET_INFO); - GET_C_SYM(default_charset_info, CHARSET_INFO*); - GET_C_SYM(all_charsets, CHARSET_INFO*); - GET_C_SYM(my_umask, int); - - GET_SYM("?global_system_variables@@3Usystem_variables@@A", - wdl_global_system_variables, struct system_variables); - GET_SYM("?mysql_real_data_home@@3PADA", - wdl_mysql_real_data_home, char); - GET_SYM("?reg_ext@@3PADA", wdl_reg_ext, char); - GET_SYM("?LOCK_thread_count@@3U_RTL_CRITICAL_SECTION@@A", - wdl_LOCK_thread_count, pthread_mutex_t); - GET_SYM("?key_map_full@@3V?$Bitmap@$0EA@@@A", - wdl_key_map_full, key_map); - GET_SYM("?mysql_tmpdir_list@@3Ust_my_tmpdir@@A", - wdl_mysql_tmpdir_list, MY_TMPDIR); - GET_SYM("?mysqld_embedded@@3_NA", - wdl_mysqld_embedded, bool); - GET_SYM("?lower_case_table_names@@3IA", - wdl_lower_case_table_names, uint); - GET_SYM("?specialflag@@3KA", wdl_specialflag, ulong); - - GET_SYM2("?system_charset_info@@3PEAUcharset_info_st@@EA", - "?system_charset_info@@3PAUcharset_info_st@@A", - wdl_system_charset_info, CHARSET_INFO*); - GET_SYM2("?mysql_data_home@@3PEADEA", - "?mysql_data_home@@3PADA", - wdl_mysql_data_home, char*); - GET_SYM2("?tx_isolation_names@@3PAPEBDA", - "?tx_isolation_names@@3PAPBDA", - wdl_tx_isolation_names, char*); - GET_SYM2("?binlog_format_names@@3PAPEBDA", - "?binlog_format_names@@3PAPBDA", - wdl_binlog_format_names, char*); - -#ifndef DBUG_OFF - GET_PROC_ADDR(_db_enter_); - GET_PROC_ADDR(_db_return_); - GET_PROC_ADDR(_db_pargs_); - GET_PROC_ADDR(_db_doprnt_); - GET_PROC_ADDR(_db_dump_); - - /* If any of the dbug functions is not available, just make them - all invalid. This is the case when working with a non-debug - version of the server. */ - if (wdl_db_enter_ == NULL || wdl_db_return_ == NULL - || wdl_db_pargs_ == NULL || wdl_db_doprnt_ == NULL - || wdl_db_dump_ == NULL) { - - wdl_db_enter_ = NULL; - wdl_db_return_ = NULL; - wdl_db_pargs_ = NULL; - wdl_db_doprnt_ = NULL; - wdl_db_dump_ = NULL; - } -#endif /* !DBUG_OFF */ - - wdl_init = TRUE; - return(TRUE); - -#undef GET_SYM -#undef GET_SYM2 -#undef GET_C_SYM -#undef GET_PROC_ADDR -} - -/*******************************************************************//** -The DLL Delayed Loading Helper Function for resolving externals. - -The function may fail due to one of the three reasons: - -* Invalid parameter, which happens if the attributes in pidd aren't - specified correctly. -* Failed to load the map file mysqld.map. -* Failed to find an external name in the map file mysqld.map. - -Note: this function is called by run-time as well as __HrLoadAllImportsForDll. -So, it has to follow Windows call convention. -@return the address of the imported function */ -extern "C" -FARPROC WINAPI -__delayLoadHelper2( -/*===============*/ - PCImgDelayDescr pidd, /*!< in: a const pointer to a - ImgDelayDescr, see delayimp.h. */ - FARPROC* iat_entry) /*!< in/out: A pointer to the slot in - the delay load import address table - to be updated with the address of the - imported function. */ -{ - ulint iIAT, iINT; - HMODULE hmod; - PCImgThunkData pitd; - FARPROC fun = NULL; - - /* Set up data used for the hook procs */ - InternalImgDelayDescr idd = { - pidd->grAttrs, - PFromRva<LPCSTR>(pidd->rvaDLLName), - PFromRva<HMODULE*>(pidd->rvaHmod), - PFromRva<PImgThunkData>(pidd->rvaIAT), - PFromRva<PCImgThunkData>(pidd->rvaINT), - PFromRva<PCImgThunkData>(pidd->rvaBoundIAT), - PFromRva<PCImgThunkData>(pidd->rvaUnloadIAT), - pidd->dwTimeStamp - }; - - DelayLoadInfo dli = { - sizeof(DelayLoadInfo), - pidd, - iat_entry, - idd.szName, - {0}, - 0, - 0, - 0 - }; - - /* Check the Delay Load Attributes, log an error of invalid - parameter, which happens if the attributes in pidd are not - specified correctly. */ - if ((idd.grAttrs & dlattrRva) == 0) { - - sql_print_error("InnoDB: invalid parameter for delay loader."); - return(0); - } - - hmod = *idd.phmod; - - /* Calculate the index for the IAT entry in the import address table. - The INT entries are ordered the same as the IAT entries so the - calculation can be done on the IAT side. */ - iIAT = (PCImgThunkData) iat_entry - idd.pIAT; - iINT = iIAT; - - pitd = &(idd.pINT[iINT]); - - dli.dlp.fImportByName = !IMAGE_SNAP_BY_ORDINAL(pitd->u1.Ordinal); - - if (dli.dlp.fImportByName) { - - dli.dlp.szProcName = (LPCSTR) (PFromRva<PIMAGE_IMPORT_BY_NAME> - ((RVA) ((UINT_PTR) pitd->u1.AddressOfData))->Name); - } else { - - dli.dlp.dwOrdinal = (ulint) IMAGE_ORDINAL(pitd->u1.Ordinal); - } - - /* Now, load the mapfile, if it has not been done yet */ - if (hmod == 0) { - - hmod = wdl_get_mysqld_mapfile(); - } - - if (hmod == 0) { - /* LoadLibrary failed. */ - PDelayLoadInfo rgpdli[1] = {&dli}; - - dli.dwLastError = ::GetLastError(); - - sql_print_error( - "InnoDB: failed to load mysqld.map with error %d.", - dli.dwLastError); - - return(0); - } - - /* Store the library handle. */ - idd.phmod = &hmod; - - /* Go for the procedure now. */ - dli.hmodCur = hmod; - - if (pidd->rvaBoundIAT && pidd->dwTimeStamp) { - - /* Bound imports exist, check the timestamp from the target - image */ - PIMAGE_NT_HEADERS pinh; - - pinh = (PIMAGE_NT_HEADERS) ((byte*) hmod - + ((PIMAGE_DOS_HEADER) hmod)->e_lfanew); - - if (pinh->Signature == IMAGE_NT_SIGNATURE - && pinh->FileHeader.TimeDateStamp == idd.dwTimeStamp - && (DWORD) hmod == pinh->OptionalHeader.ImageBase) { - - /* We have a decent address in the bound IAT. */ - fun = (FARPROC) (UINT_PTR) - idd.pBoundIAT[iIAT].u1.Function; - - if (fun) { - - *iat_entry = fun; - return(fun); - } - } - } - - fun = wdl_get_procaddr_from_map(hmod, dli.dlp.szProcName); - - if (fun == 0) { - - return(0); - } - - *iat_entry = fun; - return(fun); -} - -/*******************************************************************//** -Unload a DLL that was delay loaded. This function is called by run-time. -@return TRUE is returned if the DLL is found and the IAT matches the -original one. */ -extern "C" -BOOL WINAPI -__FUnloadDelayLoadedDLL2( -/*=====================*/ - LPCSTR module_name) /*!< in: DLL name */ -{ - return(TRUE); -} - -/**************************************************************//** -Load all imports from a DLL that was specified with the /delayload linker -option. -Note: this function is called by run-time. So, it has to follow Windows call -convention. -@return S_OK if the DLL matches, otherwise ERROR_MOD_NOT_FOUND is returned. */ -extern "C" -HRESULT WINAPI -__HrLoadAllImportsForDll( -/*=====================*/ - LPCSTR module_name) /*!< in: DLL name */ -{ - PIMAGE_NT_HEADERS img; - PCImgDelayDescr pidd; - IMAGE_DATA_DIRECTORY* image_data; - LPCSTR current_module; - HRESULT ret = ERROR_MOD_NOT_FOUND; - HMODULE hmod = (HMODULE) &__ImageBase; - - img = (PIMAGE_NT_HEADERS) ((byte*) hmod - + ((PIMAGE_DOS_HEADER) hmod)->e_lfanew); - image_data = - &img->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT]; - - /* Scan the delay load IAT/INT for the DLL */ - if (image_data->Size) { - - pidd = PFromRva<PCImgDelayDescr>(image_data->VirtualAddress); - - /* Check all of the listed DLLs we want to load. */ - while (pidd->rvaDLLName) { - - current_module = PFromRva<LPCSTR>(pidd->rvaDLLName); - - if (stricmp(module_name, current_module) == 0) { - - /* Found it, break out with pidd and - current_module set appropriately */ - break; - } - - /* To the next delay import descriptor */ - pidd++; - } - - if (pidd->rvaDLLName) { - - /* Found a matching DLL, now process it. */ - FARPROC* iat_entry; - size_t count; - - iat_entry = PFromRva<FARPROC*>(pidd->rvaIAT); - count = wdl_import_count((PCImgThunkData) iat_entry); - - /* now load all the imports from the DLL */ - while (count > 0) { - - /* No need to check the return value */ - __delayLoadHelper2(pidd, iat_entry); - iat_entry++; - count--; - } - - ret = S_OK; - } - } - - return ret; -} - -/**************************************************************//** -The main function of a DLL -@return TRUE if the call succeeds */ -BOOL -WINAPI -DllMain( -/*====*/ - HINSTANCE hinstDLL, /*!< in: handle to the DLL module */ - DWORD fdwReason, /*!< Reason code that indicates why the - DLL entry-point function is being - called.*/ - LPVOID lpvReserved) /*!< in: additional parameter based on - fdwReason */ -{ - BOOL success = TRUE; - - switch (fdwReason) { - - case DLL_PROCESS_ATTACH: - success = wdl_get_external_variables(); - break; - - case DLL_PROCESS_DETACH: - wdl_cleanup(); - break; - } - - return(success); -} - -#ifndef DBUG_OFF -/**************************************************************//** -Process entry point to user function. It makes the call to _db_enter_ -in mysqld.exe. The DBUG functions are defined in my_dbug.h. */ -extern "C" UNIV_INTERN -void -_db_enter_( - const char* _func_, /*!< in: current function name */ - const char* _file_, /*!< in: current file name */ - uint _line_, /*!< in: current source line number */ - const char** _sfunc_, /*!< out: previous _func_ */ - const char** _sfile_, /*!< out: previous _file_ */ - uint* _slevel_, /*!< out: previous nesting level */ - char*** _sframep_) /*!< out: previous frame pointer */ -{ - if (wdl_db_enter_ != NULL) { - - wdl_db_enter_(_func_, _file_, _line_, _sfunc_, _sfile_, - _slevel_, _sframep_); - } -} - -/**************************************************************//** -Process exit from user function. It makes the call to _db_return_() -in the server. */ -extern "C" UNIV_INTERN -void -_db_return_( - uint _line_, /*!< in: current source line number */ - const char** _sfunc_, /*!< out: previous _func_ */ - const char** _sfile_, /*!< out: previous _file_ */ - uint* _slevel_) /*!< out: previous level */ -{ - if (wdl_db_return_ != NULL) { - - wdl_db_return_(_line_, _sfunc_, _sfile_, _slevel_); - } -} - -/**************************************************************//** -Log arguments for subsequent use. It makes the call to _db_pargs_() -in the server. */ -extern "C" UNIV_INTERN -void -_db_pargs_( - uint _line_, /*!< in: current source line number */ - const char* keyword) /*!< in: keyword for current macro */ -{ - if (wdl_db_pargs_ != NULL) { - - wdl_db_pargs_(_line_, keyword); - } -} - -/**************************************************************//** -Handle print of debug lines. It saves the text into a buffer first, -then makes the call to _db_doprnt_() in the server. The text is -truncated to the size of buffer. */ -extern "C" UNIV_INTERN -void -_db_doprnt_( - const char* format, /*!< in: the format string */ - ...) /*!< in: list of arguments */ -{ - va_list argp; - char buffer[512]; - - if (wdl_db_doprnt_ != NULL) { - - va_start(argp, format); - /* it is ok to ignore the trunction. */ - _vsnprintf(buffer, sizeof(buffer), format, argp); - wdl_db_doprnt_(buffer); - va_end(argp); - } -} - -/**************************************************************//** -Dump a string in hex. It makes the call to _db_dump_() in the server. */ -extern "C" UNIV_INTERN -void -_db_dump_( - uint _line_, /*!< in: current source line - number */ - const char* keyword, /*!< in: keyword list */ - const unsigned char* memory, /*!< in: memory to dump */ - size_t length) /*!< in: bytes to dump */ -{ - if (wdl_db_dump_ != NULL) { - - wdl_db_dump_(_line_, keyword, memory, length); - } -} - -#endif /* !DBUG_OFF */ -#endif /* defined (__WIN__) && defined (MYSQL_DYNAMIC_PLUGIN) */ diff --git a/storage/innodb_plugin/plug.in b/storage/innodb_plugin/plug.in index b1f5b92c010..64783ba2989 100644 --- a/storage/innodb_plugin/plug.in +++ b/storage/innodb_plugin/plug.in @@ -17,7 +17,6 @@ MYSQL_STORAGE_ENGINE(innodb_plugin, innodb, [InnoDB Storage Engine], [Transactional Tables using InnoDB], [max,max-no-ndb]) MYSQL_PLUGIN_DIRECTORY(innodb_plugin, [storage/innodb_plugin]) -#MYSQL_PLUGIN_STATIC(innobase, [libinnobase.a]) MYSQL_PLUGIN_DYNAMIC(innodb_plugin, [ha_innodb_plugin.la]) MYSQL_PLUGIN_ACTIONS(innodb_plugin, [ AC_CHECK_HEADERS(sched.h) diff --git a/storage/myisam/CMakeLists.txt b/storage/myisam/CMakeLists.txt index fdc0b64f86a..c05e0046e64 100755 --- a/storage/myisam/CMakeLists.txt +++ b/storage/myisam/CMakeLists.txt @@ -12,16 +12,12 @@ # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +INCLUDE("${PROJECT_SOURCE_DIR}/storage/mysql_storage_engine.cmake") INCLUDE("${PROJECT_SOURCE_DIR}/win/mysql_manifest.cmake") SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/zlib - ${CMAKE_SOURCE_DIR}/sql - ${CMAKE_SOURCE_DIR}/regex - ${CMAKE_SOURCE_DIR}/extra/yassl/include) - SET(MYISAM_SOURCES ft_boolean_search.c ft_nlq_search.c ft_parser.c ft_static.c ft_stem.c ha_myisam.cc ft_stopwords.c ft_update.c mi_cache.c mi_changed.c mi_check.c @@ -34,11 +30,9 @@ SET(MYISAM_SOURCES ft_boolean_search.c ft_nlq_search.c ft_parser.c ft_static.c mi_unique.c mi_update.c mi_write.c rt_index.c rt_key.c rt_mbr.c rt_split.c sort.c sp_key.c ft_eval.h myisamdef.h rt_index.h mi_rkey.c) -IF(NOT SOURCE_SUBLIBS) - - ADD_LIBRARY(myisam ${MYISAM_SOURCES}) - ADD_DEPENDENCIES(myisam GenError) +MYSQL_STORAGE_ENGINE(MYISAM) +IF(NOT SOURCE_SUBLIBS) ADD_EXECUTABLE(myisam_ftdump myisam_ftdump.c) TARGET_LINK_LIBRARIES(myisam_ftdump myisam mysys debug dbug strings zlib wsock32) diff --git a/storage/myisammrg/CMakeLists.txt b/storage/myisammrg/CMakeLists.txt index 1c94e2bd50c..60cfffc67ff 100755 --- a/storage/myisammrg/CMakeLists.txt +++ b/storage/myisammrg/CMakeLists.txt @@ -12,14 +12,10 @@ # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX") -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/zlib - ${CMAKE_SOURCE_DIR}/sql - ${CMAKE_SOURCE_DIR}/regex - ${CMAKE_SOURCE_DIR}/extra/yassl/include) +INCLUDE("${PROJECT_SOURCE_DIR}/storage/mysql_storage_engine.cmake") SET(MYISAMMRG_SOURCES myrg_close.c myrg_create.c myrg_delete.c myrg_extra.c myrg_info.c ha_myisammrg.cc @@ -28,7 +24,4 @@ SET(MYISAMMRG_SOURCES myrg_close.c myrg_create.c myrg_delete.c myrg_extra.c myr myrg_rprev.c myrg_rrnd.c myrg_rsame.c myrg_static.c myrg_update.c myrg_write.c myrg_records.c) -IF(NOT SOURCE_SUBLIBS) - ADD_LIBRARY(myisammrg ${MYISAMMRG_SOURCES}) - ADD_DEPENDENCIES(myisammrg GenError) -ENDIF(NOT SOURCE_SUBLIBS) +MYSQL_STORAGE_ENGINE(MYISAMMRG) diff --git a/storage/mysql_storage_engine.cmake b/storage/mysql_storage_engine.cmake new file mode 100644 index 00000000000..bb368494898 --- /dev/null +++ b/storage/mysql_storage_engine.cmake @@ -0,0 +1,36 @@ +# MYSQL_STORAGE_ENGINE Macro creates a project to build storage engine +# library. +# +# Parameters: +# engine - storage engine name. +# variable ENGINE_BUILD_TYPE should be set to "STATIC" or "DYNAMIC" +# Remarks: +# ${engine}_SOURCES variable containing source files to produce the library must set before +# calling this macro + +MACRO(MYSQL_STORAGE_ENGINE engine) +IF(NOT SOURCE_SUBLIBS) + # Add common include directories + INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/zlib + ${CMAKE_SOURCE_DIR}/sql + ${CMAKE_SOURCE_DIR}/regex + ${CMAKE_SOURCE_DIR}/extra/yassl/include) + STRING(TOUPPER ${engine} engine) + STRING(TOLOWER ${engine} libname) + IF(${ENGINE_BUILD_TYPE} STREQUAL "STATIC") + ADD_DEFINITIONS(-DWITH_${engine}_STORAGE_ENGINE -DMYSQL_SERVER) + #Create static library. The name of the library is <storage_engine>.lib + ADD_LIBRARY(${libname} ${${engine}_SOURCES}) + ADD_DEPENDENCIES(${libname} GenError) + MESSAGE("build ${engine} as static library") + ELSEIF(${ENGINE_BUILD_TYPE} STREQUAL "DYNAMIC") + ADD_DEFINITIONS(-DMYSQL_DYNAMIC_PLUGIN) + #Create a DLL.The name of the dll is ha_<storage_engine>.dll + #The dll is linked to the mysqld executable + SET(dyn_libname ha_${libname}) + ADD_LIBRARY(${dyn_libname} SHARED ${${engine}_SOURCES}) + TARGET_LINK_LIBRARIES (${dyn_libname} mysqld) + MESSAGE("build ${engine} as DLL") + ENDIF(${ENGINE_BUILD_TYPE} STREQUAL "STATIC") +ENDIF(NOT SOURCE_SUBLIBS) +ENDMACRO(MYSQL_STORAGE_ENGINE) diff --git a/win/Makefile.am b/win/Makefile.am index 5dc637ae8a3..b7721264025 100644 --- a/win/Makefile.am +++ b/win/Makefile.am @@ -20,3 +20,4 @@ EXTRA_DIST = build-vs71.bat build-vs8.bat build-vs8_x64.bat build-vs9.bat \ # Don't update the files from bitkeeper %::SCCS/s.% + mysql_manifest.cmake create_manifest.js create_def_file.js diff --git a/win/configure.js b/win/configure.js index ac51b15b9f0..fc5c548c983 100644 --- a/win/configure.js +++ b/win/configure.js @@ -39,17 +39,11 @@ try var parts = args.Item(i).split('='); switch (parts[0]) { - case "WITH_ARCHIVE_STORAGE_ENGINE": - case "WITH_BLACKHOLE_STORAGE_ENGINE": - case "WITH_EXAMPLE_STORAGE_ENGINE": - case "WITH_FEDERATED_STORAGE_ENGINE": - case "WITH_INNOBASE_STORAGE_ENGINE": - case "WITH_PARTITION_STORAGE_ENGINE": - case "__NT__": case "CYBOZU": case "EMBED_MANIFESTS": case "EXTRA_DEBUG": case "WITH_EMBEDDED_SERVER": + case "WITHOUT_MARIA_TEMP_TABLES": configfile.WriteLine("SET (" + args.Item(i) + " TRUE)"); break; case "MYSQL_SERVER_SUFFIX": @@ -65,6 +59,7 @@ try break; } } + if (actual_port == 0) { // if we actually defaulted (as opposed to the pathological case of @@ -114,7 +109,11 @@ try GetBaseVersion(version) + "\")"); configfile.WriteLine("SET (MYSQL_VERSION_ID \"" + GetVersionId(version) + "\")"); - + var engineOptions = ParsePlugins(); + for (option in engineOptions) + { + configfile.WriteLine("SET(" + engineOptions[option] + " TRUE)"); + } configfile.Close(); fso = null; @@ -184,3 +183,139 @@ function GetVersionId(version) id += build; return id; } + +function PluginConfig(isGroup, include) +{ + this.isGroup = isGroup; + this.include = include; +} + + +// Parse command line arguments specific to plugins (aka storage engines). +// +// --with-plugin-PLUGIN, --with-plugins=group, --with-plugins=PLUGIN[,PLUGIN...] +// --without-plugin-PLUGIN is supported. +// +// Legacy option WITH_<PLUGIN>_STORAGE_ENGINE is supported as well. +// The function returns string array with elements like WITH_SOME_STORAGE_ENGINE +// or WITHOUT_SOME_STORAGE_ENGINE. +// +// This function handles groups, for example effect of specifying --with-plugins=max +// is the same as --with-plugins==archive,federated,falcon,innobase... + +function ParsePlugins() +{ + + var config = new Array(); + + config["DEFAULT"] = new PluginConfig(true,true); + + // Parse command line parameters + for (i=0; i< WScript.Arguments.length;i++) + { + var option = WScript.Arguments.Item(i); + var match = /WITH_(\w+)_STORAGE_ENGINE/.exec(option); + if (match == null) + match = /--with-plugin-(\w+)/.exec(option); + if (match != null) + { + config[match[1].toUpperCase()] = new PluginConfig(false,true); + continue; + } + + match = /WITHOUT_(\w+)_STORAGE_ENGINE/.exec(option); + if (match == null) + match = /--without-plugin-(\w+)/.exec(option); + + if (match != null) + { + config[match[1].toUpperCase()] = + new PluginConfig(false,false); + continue; + } + + match = /--with-plugins=([\w,\-_]+)/.exec(option); + if(match != null) + { + + var plugins = match[1].split(","); + for(var key in plugins) + { + config[plugins[key].toUpperCase()] = + new PluginConfig(null,true); + } + continue; + } + match = /--without-plugins=([\w,\-_]+)/.exec(option); + if(match != null) + { + var plugins = match[1].split(","); + for(var key in plugins) + config[plugins[key].toUpperCase()] = + new PluginConfig(null, false); + continue; + } + } + + // Read plugin definitions, find out groups plugins belong to. + var fc = new Enumerator(fso.GetFolder("storage").SubFolders); + for (;!fc.atEnd(); fc.moveNext()) + { + var subfolder = fc.item(); + var name = subfolder.name.toUpperCase(); + + // Handle case where storage engine was already specified by name in + // --with-plugins or --without-plugins. + if (config[name] != undefined) + { + config[name].isGroup = false; + continue; + } + config[name] = new PluginConfig(false,null); + + // Handle groups. For each plugin, find out which group it belongs to + // If this group was specified on command line for inclusion/exclusion, + // then include/exclude the plugin. + filename = subfolder +"\\plug.in"; + if (fso.FileExists(filename)) + { + var content = fso.OpenTextFile(filename, ForReading).ReadAll(); + var match = + /MYSQL_STORAGE_ENGINE([ ]*)[\(]([^\)]+)[\)]/.exec(content); + if (match== null) + continue; + match = /\[[\w,\-_]+\][\s]?\)/.exec(match[0]); + if (match == null) + continue; + groups = match[0].split(/[\,\(\)\[\] ]/); + for (var key in groups) + { + var group = groups[key].toUpperCase(); + if (config[group] != undefined) + { + config[group].isGroup = true; + if (config[group].include != null) + { + config[name].include = config[group].include; + break; + } + } + } + } + } + + var arr = new Array(); + for(key in config) + { + var eng = config[key]; + if(eng.isGroup != undefined && !eng.isGroup && eng.include != undefined) + { + if (fso.FolderExists("storage\\"+key) || key=="PARTITION") + { + arr[arr.length] = eng.include? + "WITH_"+key+"_STORAGE_ENGINE":"WITHOUT_"+key+"_STORAGE_ENGINE"; + } + } + } + return arr; +} diff --git a/win/create_def_file.js b/win/create_def_file.js new file mode 100644 index 00000000000..aaaf4659736 --- /dev/null +++ b/win/create_def_file.js @@ -0,0 +1,220 @@ +// create_def_file.js +// +// Copyright (C) 2009 Sun Microsystems +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; version 2 of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +/* + This script extracts names and types of globally defined symbols from + COFF object files, and writes this information to stdout using .DEF + file format (module definition file used by Microsoft linker) + + In MySQL this script is used to export symbols from mysqld.exe for use by + storage engine DLLs. + + Usage: + cscript create_def_file.js [x86|x64] [object|static_lib|directory ...] + + If directory is passed as a parameter, script will process all object files + and static libraries in this directory and recursively in all subdrectories. + + Note :The script does not work properly if /GL (global optimization) + compiler option was used to produce object files or libraries. This is a + limitation of the dumpbin tool that is used by the script. +*/ + +ForReading = 1; +ForWriting = 2; +ForAppending = 8; + + +var args = WScript.Arguments; + +// check that we got proper arguments +if (args.length < 2) +{ + echo("Usage: create_def_file <X86|X64> [static_library|objectfile|objectdirectory ...] "); + WScript.Quit(1); +} + + +var is64 = args.Item(0).toLowerCase() == "x64"; +var shell = new ActiveXObject("WScript.Shell"); +var fso = new ActiveXObject("Scripting.FileSystemObject"); + +OutputSymbols(CollectSymbols()); + + +// takes the array that has been built up and writes out mysqld.def +function OutputSymbols(symbols) +{ + var out = WScript.StdOut; + out.WriteLine("EXPORTS"); + for (var sym in symbols) + out.WriteLine(sym); +} + +function echo(message) +{ + WScript.StdErr.WriteLine(message); +} + +// Extract global symbol names and type from objects +function CollectSymbols() +{ + var uniqueSymbols = new Array(); + + try + { + /* + Compiler tools use VS_UNICODE_OUTPUT env. variable as indicator + that they run within IDE, so they can communicate with IDE via + pipes instead of usual stdout/stderr. Refer to + http://blogs.msdn.com/freik/archive/2006/04/05/569025.aspx + for more info. + Unset this environment variable. + */ + shell.Environment("PROCESS").Remove("VS_UNICODE_OUTPUT"); + } + catch(e){} + + var rspfilename = "dumpsymbols.rsp"; + CreateResponseFile(rspfilename); + var commandline="dumpbin @"+rspfilename; + + echo("Executing "+commandline); + var oExec = shell.Exec(commandline); + + while(!oExec.StdOut.AtEndOfStream) + { + var line = oExec.StdOut.ReadLine(); + if (line.indexOf("External") == -1) continue; + var columns = line.split(" "); + var index = 0; + if (columns.length < 3) + continue; + + /* + If the third column of dumpbin output contains SECTx, + the symbol is defined in that section of the object file. + If UNDEF appears, it is not defined in that object and must + be resolved elsewhere. BSS symbols (like uninitialized arrays) + appear to have non-zero second column. + */ + if (columns[2].substring(0,4)!="SECT") + { + if (columns[2] == "UNDEF" && parseInt(columns[1])==0 ) + continue; + } + + /* + Extract undecorated symbol names + between "|" and next whitespace after it. + */ + for (; index < columns.length; index++) + if (columns[index] == "|") + break; + + var symbol = columns[index + 1]; + var firstSpace = symbol.indexOf(" "); + if (firstSpace != -1) + symbol = symbol.substring(0, firstSpace-1); + + // Don't export compiler defined stuff + if (IsCompilerDefinedSymbol(symbol)) + continue; + + // Correct symbol name for cdecl calling convention on x86 + symbol = ScrubSymbol(symbol); + + // Check if we have function or data + if (line.indexOf("notype () ") == -1) + symbol = symbol + " DATA"; + + uniqueSymbols[symbol] = 1; + } + fso.DeleteFile(rspfilename); + return uniqueSymbols; +} + +// performs necessary cleanup on the symbol name +function ScrubSymbol(symbol) +{ + if (is64) return symbol; + if (symbol.charAt(0) != "_") + return symbol; + + var atSign = symbol.indexOf("@"); + if (atSign != -1) + { + var paramSize = symbol.substring(atSign+1, symbol.Length); + if (paramSize.match("[0-9]+$")) return symbol; + } + return symbol.substring(1, symbol.length); +} + +// returns true if the symbol is compiler defined +function IsCompilerDefinedSymbol(symbol) +{ + return ((symbol.indexOf("__real@") != -1) || + (symbol.indexOf("_RTC_") != -1) || + (symbol.indexOf("??_C@_") != -1) || + (symbol.indexOf("??_R") != -1) || + (symbol.indexOf("??_7") != -1) || + (symbol.indexOf("?_G") != -1) || // scalar deleting destructor + (symbol.indexOf("?_E") != -1)); // vector deleting destructor +} + +// Creates response file for dumpbin +function CreateResponseFile(filename) +{ + var responseFile = fso.CreateTextFile(filename,true); + responseFile.WriteLine("/SYMBOLS"); + + var index = 1; + for (; index < args.length; index++) + { + addToResponseFile(args.Item(index),responseFile); + } + responseFile.Close(); +} + +// Add object file/library to the dumpbin response file. +// If filename parameter is directory, all objects and libs under +// this directory or subdirectories are added. +function addToResponseFile(filename, responseFile) +{ + if (fso.FolderExists(filename)) + { + var folder = fso.getFolder(filename); + var enumerator = new Enumerator(folder.files); + for (; !enumerator.atEnd(); enumerator.moveNext()) + { + addToResponseFile(enumerator.item().Path, responseFile); + } + enumerator = new Enumerator(folder.subFolders); + for (; !enumerator.atEnd(); enumerator.moveNext()) + { + addToResponseFile(enumerator.item().Path, responseFile); + } + } + else if (fso.FileExists(filename)) + { + var extension = filename.substr(filename.length -3).toLowerCase(); + if(extension == "lib" || extension == "obj") + { + responseFile.WriteLine("\""+fso.GetFile(filename).Path+"\""); + } + } +} |