diff --git a/cmake/macros/FindMySQL.cmake b/cmake/macros/FindMySQL.cmake
index bc4edaf1c2..120fe19ae8 100644
--- a/cmake/macros/FindMySQL.cmake
+++ b/cmake/macros/FindMySQL.cmake
@@ -62,30 +62,34 @@ if( UNIX )
endif( MYSQL_CONFIG )
endif( UNIX )
-find_path(MYSQL_INCLUDE_DIR
- NAMES
- mysql.h
- PATHS
- ${MYSQL_ADD_INCLUDE_PATH}
- /usr/include
- /usr/include/mysql
- /usr/local/include
- /usr/local/include/mysql
- /usr/local/mysql/include
- "C:/Program Files/MySQL/include"
- "C:/Program Files/MySQL/MySQL Server 5.0/include"
- "C:/Program Files/MySQL/MySQL Server 5.1/include"
- "C:/MySQL/include"
- "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/include"
- "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/include"
- "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.0;Location]/include"
- "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.1;Location]/include"
- "$ENV{ProgramFiles}/MySQL/*/include"
- "$ENV{SystemDrive}/MySQL/*/include"
- "c:/msys/local/include"
- DOC
- "Specify the directory containing mysql.h."
-)
+if( EXTERNAL_MYSQL )
+ find_path(MYSQL_INCLUDE_DIR
+ NAMES
+ mysql.h
+ PATHS
+ ${MYSQL_ADD_INCLUDE_PATH}
+ /usr/include
+ /usr/include/mysql
+ /usr/local/include
+ /usr/local/include/mysql
+ /usr/local/mysql/include
+ "C:/Program Files/MySQL/include"
+ "C:/Program Files/MySQL/MySQL Server 5.0/include"
+ "C:/Program Files/MySQL/MySQL Server 5.1/include"
+ "C:/MySQL/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.0;Location]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.1;Location]/include"
+ "$ENV{ProgramFiles}/MySQL/*/include"
+ "$ENV{SystemDrive}/MySQL/*/include"
+ "c:/msys/local/include"
+ DOC
+ "Specify the directory containing mysql.h."
+ )
+else( EXTERNAL_MYSQL )
+ set(MYSQL_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/dep/mysqllite/include)
+endif( EXTERNAL_MYSQL )
if( UNIX )
foreach(LIB ${MYSQL_ADD_LIBRARIES})
@@ -105,24 +109,28 @@ endforeach(LIB ${MYSQL_ADD_LIBRARY})
endif( UNIX )
if( WIN32 )
- find_library( MYSQL_LIBRARY
- NAMES
- libmysql
- PATHS
- ${MYSQL_ADD_LIBRARIES_PATH}
- "C:/Program Files/MySQL/lib"
- "C:/Program Files/MySQL/MySQL Server 5.0/lib/opt"
- "C:/Program Files/MySQL/MySQL Server 5.1/lib/opt"
- "C:/MySQL/lib/debug"
- "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/lib/opt"
- "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/lib/opt"
- "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.0;Location]/lib/opt"
- "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.1;Location]/lib/opt"
- "$ENV{ProgramFiles}/MySQL/*/lib/opt"
- "$ENV{SystemDrive}/MySQL/*/lib/opt"
- "c:/msys/local/include"
- DOC "Specify the location of the mysql library here."
- )
+ if( EXTERNAL_MYSQL )
+ find_library( MYSQL_LIBRARY
+ NAMES
+ libmysql
+ PATHS
+ ${MYSQL_ADD_LIBRARIES_PATH}
+ "C:/Program Files/MySQL/lib"
+ "C:/Program Files/MySQL/MySQL Server 5.0/lib/opt"
+ "C:/Program Files/MySQL/MySQL Server 5.1/lib/opt"
+ "C:/MySQL/lib/debug"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/lib/opt"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/lib/opt"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.0;Location]/lib/opt"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.1;Location]/lib/opt"
+ "$ENV{ProgramFiles}/MySQL/*/lib/opt"
+ "$ENV{SystemDrive}/MySQL/*/lib/opt"
+ "c:/msys/local/include"
+ DOC "Specify the location of the mysql library here."
+ )
+ else( EXTERNAL_MYSQL )
+ set(MYSQL_LIBRARY libmysql)
+ endif( EXTERNAL_MYSQL )
endif( WIN32 )
# On Windows you typically don't need to include any extra libraries
@@ -142,15 +150,20 @@ else( NOT WIN32 )
set( MYSQL_EXTRA_LIBRARIES "" )
endif( NOT WIN32 )
-if( MYSQL_LIBRARY )
- if( MYSQL_INCLUDE_DIR )
- set( MYSQL_FOUND 1 )
- message(STATUS "Found MySQL library: ${MYSQL_LIBRARY}")
- message(STATUS "Found MySQL headers: ${MYSQL_INCLUDE_DIR}")
- else( MYSQL_INCLUDE_DIR )
- message(FATAL_ERROR "Could not find MySQL headers! Please install the development-libraries and headers.")
- endif( MYSQL_INCLUDE_DIR )
- mark_as_advanced( MYSQL_FOUND MYSQL_LIBRARY MYSQL_EXTRA_LIBRARIES MYSQL_INCLUDE_DIR )
-else( MYSQL_LIBRARY )
- message(FATAL_ERROR "Could not find the MySQL libraries! Please install the development-libraries and headers.")
-endif( MYSQL_LIBRARY )
+if( EXTERNAL_MYSQL )
+ if( MYSQL_LIBRARY )
+ if( MYSQL_INCLUDE_DIR )
+ set( MYSQL_FOUND 1 )
+ message(STATUS "Found MySQL library: ${MYSQL_LIBRARY}")
+ message(STATUS "Found MySQL headers: ${MYSQL_INCLUDE_DIR}")
+ else( MYSQL_INCLUDE_DIR )
+ message(FATAL_ERROR "Could not find MySQL headers! Please install the development libraries and headers or use internal MySQL.")
+ endif( MYSQL_INCLUDE_DIR )
+ mark_as_advanced( MYSQL_FOUND MYSQL_LIBRARY MYSQL_EXTRA_LIBRARIES MYSQL_INCLUDE_DIR )
+ else( MYSQL_LIBRARY )
+ message(FATAL_ERROR "Could not find the MySQL libraries! Please install the development libraries and headers or use internal MySQL.")
+ endif( MYSQL_LIBRARY )
+else( EXTERNAL_MYSQL )
+ set( MYSQL_FOUND 1 )
+ message(STATUS "Using internal MySQL.")
+endif( EXTERNAL_MYSQL )
diff --git a/cmake/options.cmake b/cmake/options.cmake
index 5a580eff29..1e7374d128 100644
--- a/cmake/options.cmake
+++ b/cmake/options.cmake
@@ -8,12 +8,17 @@
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-option(SERVERS "Build worldserver and authserver" 1)
-option(SCRIPTS "Build core with scripts included" 1)
-option(TOOLS "Build map/vmap extraction/assembler tools" 0)
-option(USE_SCRIPTPCH "Use precompiled headers when compiling scripts" 1)
-option(USE_COREPCH "Use precompiled headers when compiling servers" 1)
-option(USE_SFMT "Use SFMT as random numbergenerator" 0)
-option(WITH_WARNINGS "Show all warnings during compile" 1)
-option(WITH_COREDEBUG "Include additional debug-code in core" 0)
-option(WITH_SQL "Copy SQL files during installation" 0)
+option(SERVERS "Build worldserver and authserver" 1)
+option(SCRIPTS "Build core with scripts included" 1)
+option(TOOLS "Build map/vmap extraction/assembler tools" 0)
+option(USE_SCRIPTPCH "Use precompiled headers when compiling scripts" 1)
+option(USE_COREPCH "Use precompiled headers when compiling servers" 1)
+option(USE_SFMT "Use SFMT as random numbergenerator" 0)
+if(WIN32)
+ option(EXTERNAL_MYSQL "Use your own installed MySQL instead of the internal one" 0)
+else(WIN32)
+ set(EXTERNAL_MYSQL 0)
+endif(WIN32)
+option(WITH_WARNINGS "Show all warnings during compile" 1)
+option(WITH_COREDEBUG "Include additional debug-code in core" 0)
+option(WITH_SQL "Copy SQL files during installation" 0)
diff --git a/cmake/showoptions.cmake b/cmake/showoptions.cmake
index 00b1921cc3..41fecc052f 100644
--- a/cmake/showoptions.cmake
+++ b/cmake/showoptions.cmake
@@ -63,6 +63,15 @@ else()
message("* Use SFMT for RNG : No (default)")
endif()
+if( WIN32 )
+ if( EXTERNAL_MYSQL )
+ message("* Use external MySQL : Yes")
+ add_definitions(-DUSE_SFMT_FOR_RNG)
+ else()
+ message("* Use external MySQL : No (default)")
+ endif()
+endif( WIN32 )
+
if( WITH_WARNINGS )
message("* Show all warnings : Yes")
else()
diff --git a/dep/CMakeLists.txt b/dep/CMakeLists.txt
index d7a4737d77..763cf9b41a 100644
--- a/dep/CMakeLists.txt
+++ b/dep/CMakeLists.txt
@@ -17,6 +17,9 @@ if(CMAKE_SYSTEM_NAME MATCHES "Windows")
add_subdirectory(acelite)
add_subdirectory(zlib)
add_subdirectory(bzip2)
+ if(NOT EXTERNAL_MYSQL)
+ add_subdirectory(mysqllite)
+ endif(NOT EXTERNAL_MYSQL)
endif()
add_subdirectory(g3dlite)
diff --git a/dep/PackageList.txt b/dep/PackageList.txt
index d59381d4cc..80924edf36 100644
--- a/dep/PackageList.txt
+++ b/dep/PackageList.txt
@@ -21,8 +21,12 @@ libMPQ (a library for reading MPQ files)
Version: 1.0.4
MersenneTwister (a very fast random number generator)
- http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
- Version: 0.4.2
+ http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
+ Version: 0.4.2
+
+MySQL (the world's most popular open source database software)
+ http://www.mysql.com/
+ Version: 5.1.50 (GA)
SFMT (SIMD-oriented Fast Mersenne Twister)
Based on http://agner.org/random/
diff --git a/dep/mysqllite/CMakeLists.txt b/dep/mysqllite/CMakeLists.txt
new file mode 100644
index 0000000000..150ec2f3f1
--- /dev/null
+++ b/dep/mysqllite/CMakeLists.txt
@@ -0,0 +1,324 @@
+# Copyright (C) 2006 MySQL AB
+# Copyright (C) 2008-2010 Trinity
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+
+cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
+if(COMMAND cmake_policy)
+ cmake_policy(SET CMP0005 NEW)
+endif(COMMAND cmake_policy)
+
+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.")
+endif(CMAKE_GENERATOR MATCHES "Visual Studio 7")
+
+set(COMPILATION_COMMENT "Source distribution lite for Trinity Core")
+set(PROTOCOL_VERSION "10")
+set(DOT_FRM_VERSION "6")
+set(MYSQL_TCP_PORT_DEFAULT "0")
+set(MYSQL_TCP_PORT "3306")
+set(MYSQL_UNIX_ADDR "/tmp/mysql.sock")
+set(VERSION "5.1.50")
+set(MYSQL_BASE_VERSION "5.1")
+set(MYSQL_VERSION_ID "50150")
+
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/mysql_version.h.in
+ ${CMAKE_CURRENT_SOURCE_DIR}/include/mysql_version.h @ONLY)
+
+set(localstatedir "C:\\mysql\\data")
+
+# Set standard options
+add_definitions(-DHAVE_YASSL)
+add_definitions(-DYASSL_THREAD_SAFE)
+add_definitions(-DYASSL_PREFIX)
+add_definitions(-D_LIB)
+add_definitions(-DCMAKE_CONFIGD)
+add_definitions(-DDEFAULT_MYSQL_HOME="c:/Program Files/MySQL/MySQL Server ${MYSQL_BASE_VERSION}/")
+add_definitions(-DDEFAULT_BASEDIR="c:/Program Files/MySQL/")
+add_definitions(-DMYSQL_DATADIR="c:/Program Files/MySQL/MySQL Server ${MYSQL_BASE_VERSION}/data")
+add_definitions(-DDEFAULT_CHARSET_HOME="c:/Program Files/MySQL/MySQL Server ${MYSQL_BASE_VERSION}/")
+add_definitions(-DPACKAGE=mysql)
+add_definitions(-DSHAREDIR="share")
+
+add_definitions(-D__NT__)
+
+if(WIN32)
+ add_definitions("-D_WINDOWS -D__WIN__ -D_CRT_SECURE_NO_DEPRECATE")
+ add_definitions("-D_WIN32_WINNT=0x0501")
+endif(WIN32)
+
+# Set debug options
+set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DFORCE_INIT_OF_VARS -DSAFEMALLOC -DSAFE_MUTEX")
+set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX -D_DEBUG")
+
+if(EXTRA_DEBUG)
+ add_definitions(-D EXTRA_DEBUG)
+endif(EXTRA_DEBUG)
+
+if(ENABLED_DEBUG_SYNC)
+ add_definitions(-D ENABLED_DEBUG_SYNC)
+endif(ENABLED_DEBUG_SYNC)
+set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DENABLED_DEBUG_SYNC")
+set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DENABLED_DEBUG_SYNC")
+
+# in some places we use DBUG_OFF
+set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DDBUG_OFF")
+set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -DDBUG_OFF")
+set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DDBUG_OFF")
+set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -DDBUG_OFF")
+
+#TODO: update the code and remove the disabled warnings
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4800 /wd4805")
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4800 /wd4805")
+
+# Settings for Visual Studio 7 and above.
+if(MSVC)
+ # generate map files, set stack size (see bug#20815)
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MAP /MAPINFO:EXPORTS")
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:1048576")
+
+ # remove support for Exception handling
+ string(REPLACE "/GX" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
+ string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
+ string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS_INIT ${CMAKE_CXX_FLAGS_INIT})
+ string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS_DEBUG_INIT ${CMAKE_CXX_FLAGS_DEBUG_INIT})
+
+ # Disable automatic manifest generation.
+ string(REPLACE "/MANIFEST" "/MANIFEST:NO" CMAKE_EXE_LINKER_FLAGS
+ ${CMAKE_EXE_LINKER_FLAGS})
+ # Explicitly disable it since it is the default for newer versions of VS
+ string(REGEX MATCH "MANIFEST:NO" tmp_manifest ${CMAKE_EXE_LINKER_FLAGS})
+ if(NOT tmp_manifest)
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO")
+ endif(NOT tmp_manifest)
+endif(MSVC)
+
+# -------------------------------------------------------------- #
+
+include("${CMAKE_CURRENT_SOURCE_DIR}/win/mysql_manifest.cmake")
+
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include
+ ${CMAKE_CURRENT_SOURCE_DIR}/libmysql
+ ${CMAKE_CURRENT_SOURCE_DIR}/sql
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings
+ ${CMAKE_CURRENT_SOURCE_DIR}/zlib
+ ${CMAKE_CURRENT_SOURCE_DIR}/dbug
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/mySTL
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/include)
+
+file(GLOB ZLIB_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/zlib/*.c ${CMAKE_CURRENT_SOURCE_DIR}/zlib/*.h)
+
+# FIXME only needed if build type is "Debug", but CMAKE_BUILD_TYPE is not set during configure time.
+set(DBUG_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/dbug/dbug.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/dbug/factorial.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/dbug/sanity.c)
+
+set(TAOCRYPT_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/aes.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/aestables.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/algebra.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/arc4.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/asn.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/coding.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/des.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/dh.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/dsa.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/file.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/hash.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/integer.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/md2.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/md4.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/md5.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/misc.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/random.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/ripemd.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/rsa.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/src/sha.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/aes.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/algebra.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/arc4.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/asn.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/block.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/coding.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/des.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/dh.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/dsa.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/dsa.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/error.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/file.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/hash.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/hmac.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/integer.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/md2.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/md5.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/misc.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/modarith.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/modes.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/random.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/ripemd.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/rsa.hpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/taocrypt/include/sha.hpp)
+
+set(YASSL_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/src/buffer.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/src/cert_wrapper.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/src/crypto_wrapper.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/src/handshake.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/src/lock.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/src/log.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/src/socket_wrapper.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/src/ssl.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/src/timer.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/src/yassl_error.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/src/yassl_imp.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/extra/yassl/src/yassl_int.cpp)
+
+set(LIB_SOURCES ${ZLIB_SOURCES} ${DBUG_SOURCES} ${TAOCRYPT_SOURCES} ${YASSL_SOURCES})
+
+set(CLIENT_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/libmysql/errmsg.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/libmysql/get_password.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/libmysql/libmysql.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/libmysql/manager.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/array.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/default.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/errors.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/hash.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_sleep.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/default_modify.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/charset-def.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/charset.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/list.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/mf_arr_appstr.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/mf_cache.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/mf_dirname.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/mf_fn_ext.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/mf_format.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/mf_iocache.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/mf_iocache2.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/mf_loadpath.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/mf_pack.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/mf_path.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/mf_tempfile.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/mf_unixpath.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/mf_wcomp.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/mulalloc.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_access.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_alloc.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_chsize.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_compress.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_create.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_delete.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_div.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_error.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_file.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_fopen.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_fstream.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_gethostbyname.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_getopt.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_getwd.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_init.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_lib.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_malloc.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_messnc.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_net.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_once.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_open.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_pread.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_pthread.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_read.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_realloc.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_rename.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_seek.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_static.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_symlink.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_symlink2.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_thr_init.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_wincond.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_winthread.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_write.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/safemalloc.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/sha1.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/string.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/thr_mutex.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/typelib.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/mf_qsort.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_getsystime.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mysys/my_sync.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/sql-common/client.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/sql-common/my_time.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/sql-common/pack.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/sql/net_serv.cc
+ ${CMAKE_CURRENT_SOURCE_DIR}/sql/password.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/bchange.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/bmove.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/bmove_upp.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype-big5.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype-bin.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype-cp932.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype-czech.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype-euc_kr.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype-eucjpms.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype-extra.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype-gb2312.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype-gbk.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype-latin1.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype-mb.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype-simple.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype-sjis.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype-tis620.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype-uca.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype-ucs2.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype-ujis.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype-utf8.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype-win1250ch.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/ctype.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/int2str.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/is_prefix.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/llstr.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/longlong2str.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/strinstr.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/strmake.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/strmov.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/strnlen.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/strnmov.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/strtod.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/strtoll.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/strtoull.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/strxmov.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/strxnmov.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/my_strtoll10.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/my_vsnprintf.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/str2int.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/str_alloc.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/strcend.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/strcont.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/strend.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/strfill.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/strings/xml.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/vio/vio.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/vio/viosocket.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/vio/viossl.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/vio/viosslfactories.c
+ ${LIB_SOURCES})
+
+# Need to set USE_TLS for building the DLL, since __declspec(thread)
+# approach to thread local storage does not work properly in DLLs.
+
+add_library(libmysql SHARED ${CLIENT_SOURCES} libmysql/dll.c libmysql/libmysql.def)
+if(WIN32)
+ set_TARGET_PROPERTIES(libmysql PROPERTIES COMPILE_FLAGS "-DUSE_TLS")
+endif(WIN32)
+target_link_libraries(libmysql wsock32)
+
+install(TARGETS libmysql RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}")
\ No newline at end of file
diff --git a/dep/mysqllite/COPYING b/dep/mysqllite/COPYING
new file mode 100644
index 0000000000..d511905c16
--- /dev/null
+++ b/dep/mysqllite/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ 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; either version 2 of the License, or
+ (at your option) any later version.
+
+ 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 Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ , 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/dep/mysqllite/ChangeLog b/dep/mysqllite/ChangeLog
new file mode 100644
index 0000000000..569b38133e
--- /dev/null
+++ b/dep/mysqllite/ChangeLog
@@ -0,0 +1,1641 @@
+------------------------------------------------------------
+revno: 3472 [merge]
+tags: clone-5.1.50-build
+committer: Alfranio Correia
+branch nick: mysql-5.1-security
+timestamp: Tue 2010-08-03 12:52:02 +0100
+message:
+ auto-merge mysql-5.1-security (local) --> mysql-5.1-security
+ ------------------------------------------------------------
+ revno: 3452.3.1
+ committer: Alfranio Correia
+ branch nick: mysql-5.1-bugteam
+ timestamp: Mon 2010-08-02 20:48:56 +0100
+ message:
+ BUG#55625 RBR breaks on failing 'CREATE TABLE'
+
+ A CREATE...SELECT that fails is written to the binary log if a non-transactional
+ statement is updated. If the logging format is ROW, the CREATE statement and the
+ changes are written to the binary log as distinct events and by consequence the
+ created table is not rolled back in the slave.
+
+ In this patch, we opted to let the slave goes out of sync by not writting to the
+ binary log the CREATE statement. We do this by simply reseting the binary log's
+ cache.
+------------------------------------------------------------
+revno: 3471 [merge]
+committer: Georgi Kodinov
+branch nick: merge-5.1-security
+timestamp: Mon 2010-08-02 11:03:41 +0300
+message:
+ merge
+ ------------------------------------------------------------
+ revno: 1810.3987.35 [merge]
+ committer: Georgi Kodinov
+ branch nick: merge-5.0-security
+ timestamp: Mon 2010-08-02 10:45:43 +0300
+ message:
+ merge
+------------------------------------------------------------
+revno: 3470 [merge]
+committer: Georgi Kodinov
+branch nick: merge-5.1-security
+timestamp: Mon 2010-08-02 10:50:15 +0300
+message:
+ merge mysql-5.1-bugteam into mysql-5.1-security
+ ------------------------------------------------------------
+ revno: 3452.1.17
+ committer: Davi Arnaut
+ branch nick: 42733-5.1
+ timestamp: Fri 2010-07-30 17:33:10 -0300
+ message:
+ Bug#45288: pb2 returns a lot of compilation warnings on linux
+
+ Fix compiler warnings.
+ ------------------------------------------------------------
+ revno: 3452.1.16 [merge]
+ committer: Luis Soares
+ branch nick: mysql-5.1-bugteam-push
+ timestamp: Fri 2010-07-30 15:32:28 +0100
+ message:
+ Automerge mysql-5.1-bugteam into mysql-5.1-bugteam latest.
+ ------------------------------------------------------------
+ revno: 3452.2.1
+ committer: Luis Soares
+ branch nick: mysql-5.1-bugteam
+ timestamp: Fri 2010-07-30 14:44:39 +0100
+ message:
+ Revert patch for BUG#34283. Causing lots of test failures in PB2,
+ mostly because existing test result files were not updated.
+ ------------------------------------------------------------
+ revno: 3452.1.15
+ committer: Georgi Kodinov
+ branch nick: B55188-5.1-bugteam
+ timestamp: Fri 2010-07-30 17:09:24 +0300
+ message:
+ Disable the tests failing under valgrind because of bug #55503
+ ------------------------------------------------------------
+ revno: 3452.1.14
+ committer: Georgi Kodinov
+ branch nick: B55188-5.1-bugteam
+ timestamp: Fri 2010-07-30 16:35:06 +0300
+ message:
+ Bug #55188: GROUP BY, GROUP_CONCAT and TEXT - inconsistent results
+
+ In order to be able to check if the set of the grouping fields in a
+ GROUP BY has changed (and thus to start a new group) the optimizer
+ caches the current values of these fields in a set of Cached_item
+ derived objects.
+ The Cached_item_str, used for caching varchar and TEXT columns,
+ is limited in length by the max_sort_length variable.
+ A String buffer to store the value with an alloced length of either
+ the max length of the string or the value of max_sort_length
+ (whichever is smaller) in Cached_item_str's constructor.
+ Then, at compare time the value of the string to compare to was
+ truncated to the alloced length of the string buffer inside
+ Cached_item_str.
+ This is all fine and valid, but only if you're not assigning
+ values near or equal to the alloced length of this buffer.
+ Because when assigning values like this the alloced length is
+ rounded up and as a result the next set of data will not match the
+ group buffer, thus leading to wrong results because of the changed
+ alloced_length.
+ Fixed by preserving the original maximum length in the
+ Cached_item_str's constructor and using this instead of the
+ alloced_length to limit the string to compare to.
+ Test case added.
+ ------------------------------------------------------------
+ revno: 3452.1.13 [merge]
+ committer: Davi Arnaut
+ branch nick: mysql-5.1-bugteam
+ timestamp: Fri 2010-07-30 09:38:18 -0300
+ message:
+ Merge of mysql-5.0-bugteam into mysql-5.1-bugteam.
+ ------------------------------------------------------------
+ revno: 1810.3995.4
+ committer: Davi Arnaut
+ branch nick: mysql-5.0-bugteam
+ timestamp: Fri 2010-07-30 09:34:40 -0300
+ message:
+ Bug#54041: MySQL 5.0.92 fails when tests from Connector/C suite run
+
+ Fix a regression (due to a typo) which caused spurious incorrect
+ argument errors for long data stream parameters if all forms of
+ logging were disabled (binary, general and slow logs).
+ ------------------------------------------------------------
+ revno: 3452.1.12
+ committer: Davi Arnaut
+ branch nick: mysql-5.1-bugteam
+ timestamp: Fri 2010-07-30 09:17:10 -0300
+ message:
+ Bug#54041: MySQL 5.0.92 fails when tests from Connector/C suite run
+
+ Fix a regression (due to a typo) which caused spurious incorrect
+ argument errors for long data stream parameters if all forms of
+ logging were disabled (binary, general and slow logs).
+ ------------------------------------------------------------
+ revno: 3452.1.11
+ committer:
+ branch nick: mysql-5.1-bugteam
+ timestamp: Fri 2010-07-30 11:59:34 +0800
+ message:
+ Bug #34283 mysqlbinlog leaves tmpfile after termination if binlog contains load data infile
+
+ With statement- or mixed-mode logging, "LOAD DATA INFILE" queries
+ are written to the binlog using special types of log events.
+ When mysqlbinlog reads such events, it re-creates the file in a
+ temporary directory with a generated filename and outputs a
+ "LOAD DATA INFILE" query where the filename is replaced by the
+ generated file. The temporary file is not deleted by mysqlbinlog
+ after termination.
+
+ To fix the problem, in mixed mode we go to row-based. In SBR, we
+ document it to remind user the tmpfile is left in a temporary
+ directory.
+ ------------------------------------------------------------
+ revno: 3452.1.10
+ committer: Davi Arnaut
+ branch nick: 53463-5.1
+ timestamp: Wed 2010-07-28 12:59:19 -0300
+ message:
+ Bug#53463: YaSSL patch appears to be reverted
+
+ The problem is that the fix Bug#29784 was mistakenly
+ reverted when updating YaSSL to a newer version.
+
+ The solution is to re-apply the fix and this time
+ actually add a meaningful test case so that possible
+ regressions are caught.
+ ------------------------------------------------------------
+ revno: 3452.1.9 [merge]
+ committer: Vasil Dimov
+ branch nick: mysql-5.1-bugteam
+ timestamp: Thu 2010-07-29 11:57:33 +0300
+ message:
+ Merge mysql-5.1-innodb -> mysql-5.1-bugteam
+ ------------------------------------------------------------
+ revno: 3351.14.179 [merge]
+ committer: Vasil Dimov
+ branch nick: mysql-5.1-innodb
+ timestamp: Thu 2010-07-29 11:51:00 +0300
+ message:
+ Merge mysql-5.1-bugteam -> mysql-5.1-innodb
+ ------------------------------------------------------------
+ revno: 3351.14.178
+ committer: Jimmy Yang
+ branch nick: mysql-5.1-innodb
+ timestamp: Wed 2010-07-28 03:20:44 -0700
+ message:
+ Fix bug #55581 by backporting fix of #52546 from mysql-trunk-innodb
+ to mysql-5.1-innodb plugin.
+ ------------------------------------------------------------
+ revno: 3351.14.177
+ committer: Vasil Dimov
+ branch nick: mysql-5.1-innodb
+ timestamp: Fri 2010-07-23 19:32:38 +0300
+ message:
+ Increment InnoDB Plugin version to 1.0.11.
+ InnoDB Plugin 1.0.10 has been released with MySQL 5.1.49.
+ ------------------------------------------------------------
+ revno: 3351.14.176 [merge]
+ committer: Vasil Dimov
+ branch nick: mysql-5.1-innodb
+ timestamp: Fri 2010-07-23 12:51:14 +0300
+ message:
+ Merge mysql-5.1 -> mysql-5.1-innodb
+ ------------------------------------------------------------
+ revno: 3351.14.175 [merge]
+ committer: Vasil Dimov
+ branch nick: mysql-5.1-innodb
+ timestamp: Fri 2010-07-09 15:15:09 +0300
+ message:
+ Merge mysql-5.1 -> mysql-5.1-innodb
+ (no changes introduced by this merge)
+ ------------------------------------------------------------
+ revno: 3351.14.174
+ committer: Vasil Dimov
+ branch nick: mysql-5.1-innodb
+ timestamp: Wed 2010-07-07 20:51:30 +0300
+ message:
+ Add the innodb_plugin tests to "make dist".
+ ------------------------------------------------------------
+ revno: 3351.14.173
+ committer: Jimmy Yang
+ branch nick: mysql-5.1-innodb
+ timestamp: Mon 2010-07-05 19:26:38 -0700
+ message:
+ Add innodb_bug53756-master.opt for innodb_bug53756 test.
+ ------------------------------------------------------------
+ revno: 3351.14.172
+ committer: Jimmy Yang
+ branch nick: mysql-5.1-innodb
+ timestamp: Wed 2010-06-30 22:06:01 -0700
+ message:
+ Port fix for bug #54311 from mysql-trunk-innodb to mysql-5.1-innodb codeline.
+ Bug #54311: Crash on CHECK PARTITION after concurrent LOAD DATA
+ and adaptive_hash_index=OFF
+ ------------------------------------------------------------
+ revno: 3351.14.171
+ committer: Marko Mäkelä
+ branch nick: 5.1-innodb
+ timestamp: Wed 2010-06-30 12:38:47 +0300
+ message:
+ Bug#54358 follow-up: Correct some error handling.
+ ------------------------------------------------------------
+ revno: 3351.14.170
+ committer: Marko Mäkelä
+ branch nick: 5.1-innodb
+ timestamp: Wed 2010-06-30 12:31:49 +0300
+ message:
+ Correct some comments that were added in the fix of Bug #54358
+ (READ UNCOMMITTED access failure of off-page DYNAMIC or COMPRESSED columns).
+
+ Records that lack incompletely written externally stored columns may
+ be accessed by READ UNCOMMITTED transaction even without involving a
+ crash during an INSERT or UPDATE operation. I verified this as follows.
+
+ (1) added a delay after the mini-transaction for writing the clustered
+ index 'stub' record was committed (patch attached)
+ (2) started mysqld in gdb, setting breakpoints to the where the
+ assertions about READ UNCOMMITTED were added in the bug fix
+ (3) invoked ibtest3 --create-options=key_block_size=2
+ to create BLOBs in a COMPRESSED table
+ (4) invoked the following:
+ yes 'set transaction isolation level read uncommitted;
+ checksum table blobt3;select sleep(1);'|mysql -uroot test
+ (5) noted that one of the breakpoints was triggered
+ (return(NULL) in btr_rec_copy_externally_stored_field())
+
+ === modified file 'storage/innodb_plugin/row/row0ins.c'
+ --- storage/innodb_plugin/row/row0ins.c 2010-06-30 08:17:25 +0000
+ +++ storage/innodb_plugin/row/row0ins.c 2010-06-30 08:17:25 +0000
+ @@ -2120,6 +2120,7 @@ function_exit:
+ rec_t* rec;
+ ulint* offsets;
+ mtr_start(&mtr);
+ + os_thread_sleep(5000000);
+
+ btr_cur_search_to_nth_level(index, 0, entry, PAGE_CUR_LE,
+ BTR_MODIFY_TREE, &cursor, 0,
+
+ === modified file 'storage/innodb_plugin/row/row0upd.c'
+ --- storage/innodb_plugin/row/row0upd.c 2010-06-30 08:11:55 +0000
+ +++ storage/innodb_plugin/row/row0upd.c 2010-06-30 08:11:55 +0000
+ @@ -1763,6 +1763,7 @@ row_upd_clust_rec(
+ rec_offs_init(offsets_);
+
+ mtr_start(mtr);
+ + os_thread_sleep(5000000);
+
+ ut_a(btr_pcur_restore_position(BTR_MODIFY_TREE, pcur, mtr));
+ rec = btr_cur_get_rec(btr_cur);
+ ------------------------------------------------------------
+ revno: 3351.14.169
+ committer: Marko Mäkelä
+ branch nick: 5.1-innodb
+ timestamp: Tue 2010-06-29 16:12:19 +0300
+ message:
+ ChangeLog entry for Bug #54408
+ ------------------------------------------------------------
+ revno: 3351.14.168
+ committer: Marko Mäkelä
+ branch nick: 5.1-innodb
+ timestamp: Tue 2010-06-29 16:00:58 +0300
+ message:
+ Bug#54408: txn rollback after recovery: row0umod.c:673
+ dict_table_get_format(index->table)
+
+ The REDUNDANT and COMPACT formats store a local 768-byte prefix of
+ each externally stored column. No row_ext cache is needed, but we
+ initialized one nevertheless. When the BLOB pointer was zero, we would
+ ignore the locally stored prefix as well. This triggered an assertion
+ failure in row_undo_mod_upd_exist_sec().
+
+ row_build(): Allow ext==NULL when a REDUNDANT or COMPACT table
+ contains externally stored columns.
+
+ row_undo_search_clust_to_pcur(), row_upd_store_row(): Invoke
+ row_build() with ext==NULL on REDUNDANT and COMPACT tables.
+
+ rb://382 approved by Jimmy Yang
+ ------------------------------------------------------------
+ revno: 3351.14.167
+ committer: Marko Mäkelä
+ branch nick: 5.1-innodb
+ timestamp: Tue 2010-06-29 15:56:53 +0300
+ message:
+ ChangeLog entry for Bug #54358
+ ------------------------------------------------------------
+ revno: 3351.14.166
+ committer: Marko Mäkelä
+ branch nick: 5.1-innodb
+ timestamp: Tue 2010-06-29 15:55:18 +0300
+ message:
+ Bug#54358: READ UNCOMMITTED access failure of off-page DYNAMIC or COMPRESSED
+ columns
+
+ When the server crashes after a record stub has been inserted and
+ before all its off-page columns have been written, the record will
+ contain incomplete off-page columns after crash recovery. Such records
+ may only be accessed at the READ UNCOMMITTED isolation level or when
+ rolling back a recovered transaction in recv_recovery_rollback_active().
+ Skip these records at the READ UNCOMMITTED isolation level.
+
+ TODO: Add assertions for checking the above assumptions hold when an
+ incomplete BLOB is encountered.
+
+ btr_rec_copy_externally_stored_field(): Return NULL if the field is
+ incomplete.
+
+ row_prebuilt_t::templ_contains_blob: Clarify what "BLOB" means in this
+ context. Hint: MySQL BLOBs are not the same as InnoDB BLOBs.
+
+ row_sel_store_mysql_rec(): Return FALSE if not all columns could be
+ retrieved. Previously this function always returned TRUE. Assert that
+ the record is not delete-marked.
+
+ row_sel_push_cache_row_for_mysql(): Return FALSE if not all columns
+ could be retrieved.
+
+ row_search_for_mysql(): Skip records containing incomplete off-page
+ columns. Assert that the transaction isolation level is READ
+ UNCOMMITTED.
+
+ rb://380 approved by Jimmy Yang
+ ------------------------------------------------------------
+ revno: 3351.14.165
+ committer: Jimmy Yang
+ branch nick: mysql-5.1-innodb
+ timestamp: Mon 2010-06-28 19:41:37 -0700
+ message:
+ Check in fix for bug #53756: "ALTER TABLE ADD PRIMARY KEY affects
+ crash recovery"
+
+ rb://369 approved by Marko
+ ------------------------------------------------------------
+ revno: 3452.1.8
+ committer: Alexander Barkov
+ branch nick: mysql-5.1-bugteam.b45012
+ timestamp: Thu 2010-07-29 10:12:44 +0400
+ message:
+ Postfix for BUG#45012.
+
+ Problem: The original patch didn't compile on debug_werror
+ due to wrong format in printf("%d") for size_t variables.
+
+ Fix: Adding cast to (int).
+ ------------------------------------------------------------
+ revno: 3452.1.7
+ committer:
+ branch nick: mysql-5.1-bugteam
+ timestamp: Thu 2010-07-29 11:00:57 +0800
+ message:
+ BUG#49124 Security issue with /*!-versioned */ SQL statements on Slave
+
+ /*![:version:] Query Code */, where [:version:] is a sequence of 5
+ digits representing the mysql server version(e.g /*!50200 ... */),
+ is a special comment that the query in it can be executed on those
+ servers whose versions are larger than the version appearing in the
+ comment. It leads to a security issue when slave's version is larger
+ than master's. A malicious user can improve his privileges on slaves.
+ Because slave SQL thread is running with SUPER privileges, so it can
+ execute queries that he/she does not have privileges on master.
+
+ This bug is fixed with the logic below:
+ - To replace '!' with ' ' in the magic comments which are not applied on
+ master. So they become common comments and will not be applied on slave.
+
+ - Example:
+ 'INSERT INTO t1 VALUES (1) /*!10000, (2)*/ /*!99999 ,(3)*/
+ will be binlogged as
+ 'INSERT INTO t1 VALUES (1) /*!10000, (2)*/ /* 99999 ,(3)*/
+ ------------------------------------------------------------
+ revno: 3452.1.6
+ committer: Davi Arnaut
+ branch nick: mysql-5.1-bugteam
+ timestamp: Fri 2010-07-23 21:55:03 -0300
+ message:
+ Bug#55501: Disable innodb plugin usage in the embedded server on certain OSes
+
+ Do not attempt to test the innodb plugin with the embedded server,
+ it's not supported for now.
+ ------------------------------------------------------------
+ revno: 3452.1.5 [merge]
+ committer: Sven Sandberg
+ branch nick: 5.1-bugteam
+ timestamp: Mon 2010-07-26 11:56:30 +0200
+ message:
+ merged BUG#55322 to 5.1-bugteam
+ ------------------------------------------------------------
+ revno: 3408.1.4
+ committer: Sven Sandberg
+ branch nick: 5.1
+ timestamp: Tue 2010-07-20 17:27:13 +0200
+ message:
+ BUG#55322: SHOW BINLOG EVENTS increases @@SESSION.MAX_ALLOWED_PACKET
+
+ Problem: when SHOW BINLOG EVENTS was issued, it increased the value of
+ @@session.max_allowed_packet. This allowed a non-root user to increase
+ the amount of memory used by her thread arbitrarily. Thus, it removes
+ the bound on the amount of system resources used by a client, so it
+ presents a security risk (DoS attack).
+
+ Fix: it is correct to increase the value of @@session.max_allowed_packet
+ while executing SHOW BINLOG EVENTS (see BUG 30435). However, the
+ increase should only be temporary. Thus, the fix is to restore the value
+ when SHOW BINLOG EVENTS ends.
+ The value of @@session.max_allowed_packet is also increased in
+ mysql_binlog_send (i.e., the binlog dump thread). It is not clear if this
+ can cause any trouble, since normally the client that issues
+ COM_BINLOG_DUMP will not issue any other commands that would be affected
+ by the increased value of @@session.max_allowed_packet. However, we
+ restore the value just in case.
+ ------------------------------------------------------------
+ revno: 3452.1.4
+ committer: Alexander Barkov
+ branch nick: mysql-5.1-bugteam.b45012
+ timestamp: Mon 2010-07-26 09:06:18 +0400
+ message:
+ Bug#45012 my_like_range_cp932 generates invalid string
+
+ Problem: The functions my_like_range_xxx() returned
+ badly formed maximum strings for Asian character sets,
+ which made problems for storage engines.
+
+ Fix:
+ - Removed a number my_like_range_xxx() implementations,
+ which were in fact dumplicate code pieces.
+ - Using generic my_like_range_mb() instead.
+ - Setting max_sort_char member properly for Asian character sets
+ - Adding unittest/strings/strings-t.c,
+ to test that my_like_range_xxx() return well-formed
+ min and max strings.
+
+ Notes:
+
+ - No additional tests in mysql/t/ available.
+ Old tests cover the affected code well enough.
+ ------------------------------------------------------------
+ revno: 3452.1.3 [merge]
+ committer: Dmitry Shulga
+ branch nick: 5.1-bugteam-bug42496
+ timestamp: Fri 2010-07-23 18:15:56 +0700
+ message:
+ Merge 5.1-bugteam -> 5.1-bug-42496
+ ------------------------------------------------------------
+ revno: 3457.4.2 [merge]
+ committer: kevin.lewis@oracle.com
+ branch nick: mysql-5.1-bugteam
+ timestamp: Thu 2010-07-22 11:17:26 -0500
+ message:
+ Merge
+ ------------------------------------------------------------
+ revno: 3457.4.1
+ committer: kevin.lewis@oracle.com
+ branch nick: mysql-5.1-bugteam
+ timestamp: Thu 2010-07-22 11:15:15 -0500
+ message:
+ Bug#49542 - Do as the comment suggests and downgrade directory errors from find_file() to a warning unless they happen during a SHOW command.
+ ------------------------------------------------------------
+ revno: 3452.1.2
+ committer: Dmitry Shulga
+ branch nick: 5.1-bugteam-bug42496
+ timestamp: Wed 2010-07-21 14:56:43 +0700
+ message:
+ Fixed bug #42496 - the server could crash on a debug assert after a failure
+ to write into a closed socket
+ ------------------------------------------------------------
+ revno: 3452.1.1
+ committer: Dmitry Shulga
+ branch nick: 5.1-bugteam-bug51855
+ timestamp: Tue 2010-06-29 16:32:03 +0700
+ message:
+ Fixed bug #51855. Race condition in XA START. If several threads
+ concurrently execute the statement XA START 'x', then mysqld
+ server could crash.
+------------------------------------------------------------
+revno: 3469
+committer: Gleb Shchepa
+branch nick: mysql-5.1-security
+timestamp: Sun 2010-08-01 22:12:36 +0400
+message:
+ Bug #54461: crash with longblob and union or update with subquery
+
+ Queries may crash, if
+ 1) the GREATEST or the LEAST function has a mixed list of
+ numeric and LONGBLOB arguments and
+ 2) the result of such a function goes through an intermediate
+ temporary table.
+
+ An Item that references a LONGBLOB field has max_length of
+ UINT_MAX32 == (2^32 - 1).
+
+ The current implementation of GREATEST/LEAST returns REAL
+ result for a mixed list of numeric and string arguments (that
+ contradicts with the current documentation, this contradiction
+ was discussed and it was decided to update the documentation).
+
+ The max_length of such a function call was calculated as a
+ maximum of argument max_length values (i.e. UINT_MAX32).
+
+ That max_length value of UINT_MAX32 was used as a length for
+ the intermediate temporary table Field_double to hold
+ GREATEST/LEAST function result.
+
+ The Field_double::val_str() method call on that field
+ allocates a String value.
+
+ Since an allocation of String reserves an additional byte
+ for a zero-termination, the size of String buffer was
+ set to (UINT_MAX32 + 1), that caused an integer overflow:
+ actually, an empty buffer of size 0 was allocated.
+
+ An initialization of the "first" byte of that zero-size
+ buffer with '\0' caused a crash.
+
+ The Item_func_min_max::fix_length_and_dec() has been
+ modified to calculate max_length for the REAL result like
+ we do it for arithmetical operators.
+
+
+ ******
+ Bug #54461: crash with longblob and union or update with subquery
+
+ Queries may crash, if
+ 1) the GREATEST or the LEAST function has a mixed list of
+ numeric and LONGBLOB arguments and
+ 2) the result of such a function goes through an intermediate
+ temporary table.
+
+ An Item that references a LONGBLOB field has max_length of
+ UINT_MAX32 == (2^32 - 1).
+
+ The current implementation of GREATEST/LEAST returns REAL
+ result for a mixed list of numeric and string arguments (that
+ contradicts with the current documentation, this contradiction
+ was discussed and it was decided to update the documentation).
+
+ The max_length of such a function call was calculated as a
+ maximum of argument max_length values (i.e. UINT_MAX32).
+
+ That max_length value of UINT_MAX32 was used as a length for
+ the intermediate temporary table Field_double to hold
+ GREATEST/LEAST function result.
+
+ The Field_double::val_str() method call on that field
+ allocates a String value.
+
+ Since an allocation of String reserves an additional byte
+ for a zero-termination, the size of String buffer was
+ set to (UINT_MAX32 + 1), that caused an integer overflow:
+ actually, an empty buffer of size 0 was allocated.
+
+ An initialization of the "first" byte of that zero-size
+ buffer with '\0' caused a crash.
+
+ The Item_func_min_max::fix_length_and_dec() has been
+ modified to calculate max_length for the REAL result like
+ we do it for arithmetical operators.
+------------------------------------------------------------
+revno: 3468
+committer: Alexey Kopytov
+branch nick: mysql-5.1-security
+timestamp: Fri 2010-07-23 15:52:54 +0400
+message:
+ Bug #54476: crash when group_concat and 'with rollup' in
+ prepared statements
+
+ Using GROUP_CONCAT() together with the WITH ROLLUP modifier
+ could crash the server.
+
+ The reason was a combination of several facts:
+
+ 1. The Item_func_group_concat class stores pointers to ORDER
+ objects representing the columns in the ORDER BY clause of
+ GROUP_CONCAT().
+
+ 2. find_order_in_list() called from
+ Item_func_group_concat::setup() modifies the ORDER objects so
+ that their 'item' member points to the arguments list
+ allocated in the Item_func_group_concat constructor.
+
+ 3. In some cases (e.g. in JOIN::rollup_make_fields) a copy of
+ the original Item_func_group_concat object could be created by
+ using the Item_func_group_concat::Item_func_group_concat(THD
+ *thd, Item_func_group_concat *item) copy constructor. The
+ latter essentially creates a shallow copy of the source
+ object. Memory for the arguments array is allocated on
+ thd->mem_root, but the pointers for arguments and ORDER are
+ copied verbatim.
+
+ What happens in the test case is that when executing the query
+ for the first time, after a copy of the original
+ Item_func_group_concat object has been created by
+ JOIN::rollup_make_fields(), find_order_in_list() is called for
+ this new object. It then resolves ORDER BY by modifying the
+ ORDER objects so that they point to elements of the arguments
+ array which is local to the cloned object. When thd->mem_root
+ is freed upon completing the execution, pointers in the ORDER
+ objects become invalid. Those ORDER objects, however, are also
+ shared with the original Item_func_group_concat object which is
+ preserved between executions of a prepared statement. So the
+ first call to find_order_in_list() for the original object on
+ the second execution tries to dereference an invalid pointer.
+
+ The solution is to create copies of the ORDER objects when
+ copying Item_func_group_concat to not leave any stale pointers
+ in other instances with different lifecycles.
+------------------------------------------------------------
+revno: 3467 [merge]
+committer: Georgi Kodinov
+branch nick: merge-5.1-security
+timestamp: Wed 2010-07-21 18:56:48 +0300
+message:
+ merge
+ ------------------------------------------------------------
+ revno: 1810.3987.34 [merge]
+ committer: Georgi Kodinov
+ branch nick: merge-5.0-security
+ timestamp: Wed 2010-07-21 18:49:24 +0300
+ message:
+ merge
+------------------------------------------------------------
+revno: 3466 [merge]
+committer: Georgi Kodinov
+branch nick: merge-5.1-security
+timestamp: Wed 2010-07-21 18:54:11 +0300
+message:
+ merge
+ ------------------------------------------------------------
+ revno: 3457.1.42 [merge]
+ committer: Georgi Kodinov
+ branch nick: merge-5.1-bugteam
+ timestamp: Wed 2010-07-21 18:36:10 +0300
+ message:
+ merge
+ ------------------------------------------------------------
+ revno: 1810.3995.3 [merge]
+ committer: Georgi Kodinov
+ branch nick: merge-5.0-bugteam
+ timestamp: Wed 2010-07-21 18:31:28 +0300
+ message:
+ merge
+ ------------------------------------------------------------
+ revno: 3457.1.41 [merge]
+ committer: Georgi Kodinov
+ branch nick: merge-5.1-bugteam
+ timestamp: Wed 2010-07-21 18:34:20 +0300
+ message:
+ merge
+ ------------------------------------------------------------
+ revno: 3457.1.40
+ committer: Georgi Kodinov
+ branch nick: fix-5.1-bugteam
+ timestamp: Wed 2010-07-21 18:05:57 +0300
+ message:
+ Addendum #4 to bug #53095
+
+ SHOW DATABASES LIKE ... was not converting to lowercase on comparison as the
+ documentation is suggesting.
+ Fixed it to behave similarly to SHOW TABLES LIKE ... and updated the failing
+ on MacOSX lowercase_table2 test case.
+ ------------------------------------------------------------
+ revno: 3457.1.39 [merge]
+ committer: Alexey Kopytov
+ branch nick: mysql-5.1-bugteam
+ timestamp: Wed 2010-07-21 14:14:11 +0400
+ message:
+ Automerge.
+ ------------------------------------------------------------
+ revno: 3457.3.1
+ committer: Alexey Kopytov
+ branch nick: 55061-5.1-bugteam
+ timestamp: Mon 2010-07-12 18:58:55 +0400
+ message:
+ Bug#55061: Build failing on sol 8 x86 - assembler code vs
+ compiler problem
+
+ GCC-style inline assembly is not supported by the Sun Studio
+ compilers prior to version 12.
+
+ Added a check for the Sun Studio version to avoid using
+ _FPU_GETCW() / _FPU_SETCW() when inline assembly is
+ unsupported. This can lead to some differences in floating
+ point calculations on Solaris 8/x86 which, however, is not worth
+ bothering with Sun-style assembly .il templates.
+ ------------------------------------------------------------
+ revno: 3457.1.38
+ committer: Davi Arnaut
+ branch nick: 45288-5.1
+ timestamp: Tue 2010-07-20 15:07:36 -0300
+ message:
+ Bug#45288: pb2 returns a lot of compilation warnings on linux
+
+ Fix warnings flagged by the new warning option -Wunused-but-set-variable
+ that was added to GCC 4.6 and that is enabled by -Wunused and -Wall. The
+ option causes a warning whenever a local variable is assigned to but is
+ later unused. It also warns about meaningless pointer dereferences.
+ ------------------------------------------------------------
+ revno: 3457.1.37
+ committer: Davi Arnaut
+ branch nick: 52514-5.1
+ timestamp: Tue 2010-07-20 14:44:29 -0300
+ message:
+ Bug#52514: mysql 5.1 do_abi_check does not compile w/ gcc4.5
+ due to GCC preprocessor change
+
+ The problem is that newer GCC versions treats missing headers
+ as fatal errors. The solution is to use a guard macro to prevent
+ the inclusion of system headers when checking the ABI with the
+ C Preprocessor.
+
+ Reference: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15638
+ http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44836
+ ------------------------------------------------------------
+ revno: 3457.1.36
+ committer: Davi Arnaut
+ branch nick: 54453-5.1
+ timestamp: Tue 2010-07-20 14:36:15 -0300
+ message:
+ Bug#54453: Failing assertion: trx->active_trans when renaming a
+ table with active trx
+
+ Essentially, the problem is that InnoDB does a implicit commit
+ when a cursor (table handler) is unlocked/closed, creating
+ a dissonance between the transaction state within the server
+ layer and the storage engine layer. Theoretically, a statement
+ transaction can encompass several table instances in a similar
+ manner to a multiple statement transaction, hence it does not
+ make sense to limit a statement transaction to the lifetime of
+ the table instances (cursors) used within it.
+
+ Since this particular instance of the problem is only triggerable
+ on 5.1 and is masked on 5.5 due 2PC being skipped (assertion is in
+ the prepare phase of a 2PC), the solution (which is less risky) is
+ to explicitly end the transaction before the cached table is unlock
+ on rename table.
+
+ The patch is to be null merged into trunk.
+ ------------------------------------------------------------
+ revno: 3457.1.35 [merge]
+ committer: Davi Arnaut
+ branch nick: mysql-5.1-bugteam
+ timestamp: Mon 2010-07-19 15:34:28 -0300
+ message:
+ Merge of mysql-5.1 into mysql-5.1-bugteam.
+ ------------------------------------------------------------
+ revno: 3457.1.34
+ committer: Jon Olav Hauglid
+ branch nick: mysql-5.1-bugteam-bug54734
+ timestamp: Mon 2010-07-19 11:03:52 +0200
+ message:
+ Bug #54734 assert in Diagnostics_area::set_ok_status
+
+ This assert checks that the server does not try to send OK to the
+ client if there has been some error during processing. This is done
+ to make sure that the error is in fact sent to the client.
+
+ The problem was that view errors during processing of WHERE conditions
+ in UPDATE statements where not detected by the update code. It therefore
+ tried to send OK to the client, triggering the assert.
+ The bug was only noticeable in debug builds.
+
+ This patch fixes the problem by making sure that the update code
+ checks for errors during condition processing and acts accordingly.
+ ------------------------------------------------------------
+ revno: 3457.1.33
+ committer: Davi Arnaut
+ branch nick: mysql-5.1-bugteam
+ timestamp: Fri 2010-07-16 14:33:35 -0300
+ message:
+ Bug#48327: Some crashes specific to FreeBSD ("embedded")
+ Bug#47139: Test "merge" crashes in "embedded" run
+
+ Backport patch for Bug#47139
+ ------------------------------------------------------------
+ revno: 3457.1.32
+ committer: Georgi Kodinov
+ branch nick: fix-5.1-bugteam
+ timestamp: Fri 2010-07-16 16:56:33 +0300
+ message:
+ Addendum to bug #53814 : test results updates
+ ------------------------------------------------------------
+ revno: 3457.1.31
+ committer: Ramil Kalimullin
+ branch nick: mysql-5.1-bugteam
+ timestamp: Fri 2010-07-16 11:15:22 +0400
+ message:
+ Fix for bug #50667: The InnoDB plugin prevents initialization
+ of the "embedded" server
+
+ Problem: mysqltest_embedded failed to load ha_innodb_plugin library
+ on some platforms (due to some unresolved references).
+
+ Fix: on FreeBSD use -export-dynamic flag building mysqltest_embedded.
+ That allows to use its global symbols to resolve references in the
+ dynamically loaded plugin library.
+ ------------------------------------------------------------
+ revno: 3457.1.30
+ committer: Georgi Kodinov
+ branch nick: B53814-5.1-bugteam
+ timestamp: Wed 2010-06-23 19:25:31 +0300
+ message:
+ Bug #53814: NUMERIC_PRECISION for unsigned bigint field is 19,
+ should be 20
+
+ Fixed the numeric precision of the unsigned BIGINT column to
+ be 20 instead of 19.
+ ------------------------------------------------------------
+ revno: 3457.1.29 [merge]
+ committer: Alexey Kopytov
+ branch nick: mysql-5.1-bugteam
+ timestamp: Thu 2010-07-15 17:01:44 +0400
+ message:
+ Manual merge.
+ ------------------------------------------------------------
+ revno: 1810.3995.2
+ committer: Alexey Kopytov
+ branch nick: mysql-5.0-bugteam
+ timestamp: Thu 2010-07-15 10:10:16 +0400
+ message:
+ Backport of the fix for bug#25421 to 5.0.
+
+ Calculating the estimated number of records for a range scan
+ may take a significant time, and it was impossible for a user
+ to interrupt that process by killing the connection or the
+ query.
+
+ Fixed by checking the thread's 'killed' status in
+ check_quick_keys() and interrupting the calculation process if
+ it is set to a non-zero value.
+ ------------------------------------------------------------
+ revno: 3457.1.28 [merge]
+ committer: Alexey Kopytov
+ branch nick: mysql-5.1-bugteam
+ timestamp: Thu 2010-07-15 16:39:48 +0400
+ message:
+ Null merge.
+ ------------------------------------------------------------
+ revno: 1810.3995.1
+ committer: Vasil Dimov
+ branch nick: mysql-5.0-bugteam
+ timestamp: Wed 2010-07-07 20:13:53 +0300
+ message:
+ Merge the fix for Bug#49238 from SVN
+ (without the unrelated whitespace changes):
+
+ ------------------------------------------------------------------------
+ r7009 | jyang | 2010-04-29 20:44:56 +0300 (Thu, 29 Apr 2010) | 6 lines
+
+ branches/5.0: Port fix for bug #49238 (Creating/Dropping a temporary
+ table while at 1023 transactions will cause assert) from 5.1 to
+ branches/5.1. Separate action for return value DB_TOO_MANY_CONCURRENT_TRXS
+ from that of DB_MUST_GET_MORE_FILE_SPACE in row_drop_table_for_mysql().
+
+
+ ------------------------------------------------------------------------
+ ------------------------------------------------------------
+ revno: 3457.1.27
+ committer: Davi Arnaut
+ branch nick: mysql-5.1-bugteam
+ timestamp: Wed 2010-07-14 16:39:40 -0300
+ message:
+ Bug#42733: Type-punning warnings when compiling MySQL --
+ strict aliasing violations.
+
+ Post-merge fix: include my_compiler.h before my_attribute.h
+ as the latter will undef __attribute__ if the compiler is not
+ GCC. Based on the compiler version, in my_compiler.h we know
+ for sure whether the aligned attribute is supported. Furthermore,
+ undefining attribute might cause bugs if some system header
+ uses it.
+ ------------------------------------------------------------
+ revno: 3457.1.26
+ committer: Davi Arnaut
+ branch nick: 42733-5.1
+ timestamp: Wed 2010-07-14 09:27:13 -0300
+ message:
+ Bug#42733: Type-punning warnings when compiling MySQL --
+ strict aliasing violations.
+
+ Another rather noisy violation of strict aliasing rules
+ is the spatial code which makes use of stack-based memory
+ (of type Geometry_buffer) to provide placement for Geometry
+ objects. Although a placement new is allowed to dynamically
+ change the type of a object, the object returned by the
+ new placement was being ignored and the original stack-based
+ object was being casted to the new type, thus violating strict
+ aliasing rules.
+
+ The solution is to reorganize the code so that the object
+ returned by the new placement is used instead of casting the
+ original object. Also, to ensure that the stack-based object
+ is properly aligned with respect to the objects it provides
+ placement for, a set of compiler-dependent macros and types
+ are introduced so that the alignment of objects can be inquired
+ and specified.
+ ------------------------------------------------------------
+ revno: 3457.1.25
+ committer: Davi Arnaut
+ branch nick: 48327-5.1
+ timestamp: Wed 2010-07-14 10:10:12 -0300
+ message:
+ Bug#48327: Some crashes specific to FreeBSD ("embedded")
+
+ Backport fixes from ndb: Rework the constructors of some static
+ object's to not call dbug functions since the constructors will
+ be called before main, and consequently, before the dbug library
+ is initialized.
+ ------------------------------------------------------------
+ revno: 3457.1.24
+ committer: Georgi Kodinov
+ branch nick: B51876-5.1-bugteam
+ timestamp: Wed 2010-07-14 14:54:51 +0300
+ message:
+ Bug #51876: crash/memory underrun when loading data with ucs2
+ and reverse() function
+
+ 3 problems fixed :
+ 1. The reported problem : caused by incorrect parsing of
+ the file as ucs data resulting in wrong length of the parsed
+ string. Fixed by truncating the invalid trailing bytes
+ (non-complete multibyte characters) when reading from the file
+ 2. LOAD DATA when reading from a proper UCS2 file wasn't
+ recognizing the new line characters. Fixed by first looking
+ if a byte is a new line (or any other special) character before
+ reading it as a part of a multibyte character.
+ 3. When using user variables to hold the column data in LOAD
+ DATA the character set of the user variable was set incorrectly
+ to the database charset. Fixed by setting it to the charset
+ specified by LOAD DATA (if any).
+ ------------------------------------------------------------
+ revno: 3457.1.23
+ committer: Georgi Kodinov
+ branch nick: B53493-5.1-bugteam
+ timestamp: Wed 2010-07-14 11:50:17 +0300
+ message:
+ Bug #53493 : add_to_status does not handle the longlong fields in STATUS_VAR
+
+ bytes_received/bytes_sent are ulonglong so they cannot be handled by the
+ ulong handling code in add_to_status/add_diff_to_status().
+
+ Fixed by adding code to handle these two variables in
+ add_to_status()/add_diff_to_status() and making sure they are not a subject
+ to the ulong handling code.
+ ------------------------------------------------------------
+ revno: 3457.1.22
+ committer: Georgi Kodinov
+ branch nick: B54004-5.1-bugteam
+ timestamp: Wed 2010-07-14 13:53:49 +0300
+ message:
+ Bug #54004 : mysql_secure_installation identifies "local host" incorrectly
+
+ The removal of non-local root users is overzealous in
+ mysql_secure_installation. (Bug #54004)
+ ------------------------------------------------------------
+ revno: 3457.1.21
+ committer: Georgi Kodinov
+ branch nick: B52274-5.1-bugteam
+ timestamp: Fri 2010-07-09 14:11:12 +0300
+ message:
+ Bug #52274 : Missing path to mysql in mysql_secure_installation
+
+ Added some code to try to find the mysql command line in the most
+ common places and stop if it's not there.
+ ------------------------------------------------------------
+ revno: 3457.1.20
+ committer: Davi Arnaut
+ branch nick: mysql-5.1-bugteam
+ timestamp: Fri 2010-07-09 16:37:52 -0300
+ message:
+ Use UNINIT_VAR workaround instead of LINT_INIT.
+ ------------------------------------------------------------
+ revno: 3457.1.19 [merge]
+ committer: Mattias Jonsson
+ branch nick: topush-51-bugteam
+ timestamp: Fri 2010-07-09 15:00:33 +0200
+ message:
+ merge
+ ------------------------------------------------------------
+ revno: 3392.5.1
+ committer: Mattias Jonsson
+ branch nick: b52517-51-bugteam
+ timestamp: Fri 2010-07-09 13:15:26 +0200
+ message:
+ Bug#52517: Regression in ROW level replication performance with partitions
+
+ In bug-28430 HA_PRIMARY_KEY_REQUIRED_FOR_POSITION
+ was disabled in the partitioning engine in the first patch,
+ That bug was later fixed a second time, but that flag
+ was not removed.
+
+ No need to disable this flag, as it leads to bad
+ choise in row replication.
+ ------------------------------------------------------------
+ revno: 3457.1.18 [merge]
+ committer: Mattias Jonsson
+ branch nick: topush-51-bugteam
+ timestamp: Fri 2010-07-09 14:59:40 +0200
+ message:
+ merge
+ ------------------------------------------------------------
+ revno: 3457.2.1
+ committer: Mattias Jonsson
+ branch nick: b52455-51-bt
+ timestamp: Fri 2010-07-09 01:09:31 +0200
+ message:
+ Bug#52455: Subpar INSERT ON DUPLICATE KEY UPDATE performance with many partitions
+
+ The handler function for reading one row from a specific index
+ was not optimized in the partitioning handler since it
+ used the default implementation.
+
+ No test case since it is performance only, verified by hand.
+ ------------------------------------------------------------
+ revno: 3457.1.17
+ committer: Davi Arnaut
+ branch nick: mysql-5.1-bugteam
+ timestamp: Fri 2010-07-09 09:51:21 -0300
+ message:
+ Remove AC_LANG_WERROR, it causes trouble earlier versions
+ of autoconf and is not strictly needed for now.
+ ------------------------------------------------------------
+ revno: 3457.1.16
+ committer: Georgi Kodinov
+ branch nick: fix-5.1-bugteam
+ timestamp: Fri 2010-07-09 15:17:47 +0300
+ message:
+ Addendum #2 to bug #53095 : fixed a bad testcase result.
+ ------------------------------------------------------------
+ revno: 3457.1.15
+ committer: Davi Arnaut
+ branch nick: 53445-5.1
+ timestamp: Fri 2010-07-09 09:00:17 -0300
+ message:
+ Bug#45288: pb2 returns a lot of compilation warnings on linux
+
+ Although the C standard mandates that sprintf return the number
+ of bytes written, some very ancient systems (i.e. SunOS 4)
+ returned a pointer to the buffer instead. Since these systems
+ are not supported anymore and are hopefully long dead by now,
+ simply remove the portability wrapper that dealt with this
+ discrepancy. The autoconf check was causing trouble with GCC.
+ ------------------------------------------------------------
+ revno: 3457.1.14
+ committer: Davi Arnaut
+ branch nick: 53445-5.1
+ timestamp: Fri 2010-07-09 08:37:51 -0300
+ message:
+ Bug#53445: Build with -Wall and fix warnings that it generates
+
+ Introduce a MySQL maintainer/developer mode that enables
+ a set of warning options for the C/C++ compiler. This mode
+ is intended to help improve the overall quality of the code.
+
+ The warning options are:
+
+ C_WARNINGS="-Wall -Wextra -Wunused -Wwrite-strings -Werror"
+ CXX_WARNINGS="$C_WARNINGS -Wno-unused-parameter"
+
+ Since -Wall is essentially a moving target, autoconf checks
+ are not run with warning options enabled, in particualr -Werror.
+ This decision might be revisited in the future. The patch also
+ fixes a mistake in the makefiles, where automake CXXFLAGS would
+ be set to CFLAGS.
+ ------------------------------------------------------------
+ revno: 3457.1.13
+ committer: Sergey Glukhov
+ branch nick: mysql-5.1-bugteam
+ timestamp: Fri 2010-07-09 14:39:47 +0400
+ message:
+ Bug#54416 MAX from JOIN with HAVING returning NULL with 5.1 and Empty set
+ The problem there is that HAVING condition evaluates const
+ parts of condition despite the condition has references
+ on aggregate functions. Table t1 became const tables
+ after make_join_statistics and table1.pk = 1, HAVING is
+ transformed into MAX(1) < 7 and taken away from HAVING.
+ The fix is to skip evaluation of HAVING conts parts if
+ HAVING condition has references on aggregate functions.
+ ------------------------------------------------------------
+ revno: 3457.1.12
+ committer:
+ branch nick: mysql-5.1-bugteam
+ timestamp: Thu 2010-07-08 10:44:26 +0800
+ message:
+ Postfix bug#48321
+ Fix the memory leak
+ ------------------------------------------------------------
+ revno: 3457.1.11
+ committer: Georgi Kodinov
+ branch nick: fix-5.1-bugteam
+ timestamp: Wed 2010-07-07 12:15:58 +0300
+ message:
+ Addendum to the fix for bug #53095 (failing information_schema.test on windows)
+
+ Since the original fix for this bug lowercases the search pattern it's not a
+ good idea to copy the search pattern to the output instead of the real table
+ name found (since, depending on the case mode these two names may differ in
+ case).
+ Fixed the infrmation_schema.test failure by making sure the actual table
+ name of an inoformation schema table is passed instead of the lookup pattern
+ even when the pattern doesn't contain wildcards.
+ ------------------------------------------------------------
+ revno: 3457.1.10
+ committer: Davi Arnaut
+ branch nick: mysql-5.1-bugteam
+ timestamp: Tue 2010-07-06 19:31:54 -0300
+ message:
+ Fix what is probably the result of a bad merge. No functional change.
+ ------------------------------------------------------------
+ revno: 3457.1.9
+ committer: Davi Arnaut
+ branch nick: 52514-5.1
+ timestamp: Tue 2010-07-06 15:36:31 -0300
+ message:
+ Bug#52514: mysql 5.1 do_abi_check does not compile w/ gcc4.5
+ due to GCC preprocessor change
+
+ Temporary workaround: disable abi_check if GCC >= 4.5
+ ------------------------------------------------------------
+ revno: 3457.1.8
+ committer: Davi Arnaut
+ branch nick: 22320-5.1
+ timestamp: Mon 2010-07-05 09:00:39 -0300
+ message:
+ Bug#22320: my_atomic-t unit test fails
+
+ The atomic operations implementation on 5.1 has a few problems,
+ which might cause tests to abort randomly. Since no code in 5.1
+ uses atomic operations, simply remove the code.
+ ------------------------------------------------------------
+ revno: 3457.1.7
+ committer: Georgi Kodinov
+ branch nick: B53613-5.1-bugteam
+ timestamp: Thu 2010-07-01 12:05:09 +0300
+ message:
+ Bug #53613: mysql_upgrade incorrectly revokes TRIGGER privilege on given table
+
+ Fixed an incomplete historical ALTER TABLE MODIFY trimming the trigger
+ privilege bit from mysql.tables_priv.Table_priv column.
+ Removed the duplicate ALTER TABLE MODIFY.
+ Test suite added.
+ ------------------------------------------------------------
+ revno: 3457.1.6
+ committer: Georgi Kodinov
+ branch nick: B53095-5.1-bugteam
+ timestamp: Fri 2010-06-25 15:59:44 +0300
+ message:
+ Bug #53095: SELECT column_name FROM INFORMATION_SCHEMA.STATISTICS
+ returns nothing
+
+ When looking for table or database names inside INFORMATION_SCHEMA
+ we must convert the table and database names to lowercase (just as it's
+ done in the rest of the server) when lowercase_table_names is non-zero.
+ This will allow us to find the same tables that we would find if there
+ is no condition.
+
+ Fixed by converting to lower case when extracting the database and
+ table name conditions.
+ Test case added.
+ ------------------------------------------------------------
+ revno: 3457.1.5
+ committer:
+ branch nick: mysql-5.1-bugteam
+ timestamp: Sun 2010-07-04 16:17:53 +0800
+ message:
+ Postfix for bug#48321
+ Some test cases set ANSI_QUOTES in sql_mode.
+ So we have to use single quotes to quote literal strings.
+ ------------------------------------------------------------
+ revno: 3457.1.4
+ committer:
+ branch nick: mysql-5.1-bugteam
+ timestamp: Sun 2010-07-04 12:02:49 +0800
+ message:
+ The following statements support the CURRENT_USER() where a user is needed.
+ DROP USER
+ RENAME USER CURRENT_USER() ...
+ GRANT ... TO CURRENT_USER()
+ REVOKE ... FROM CURRENT_USER()
+ ALTER DEFINER = CURRENT_USER() EVENTbut, When these statements are binlogged, CURRENT_USER() just is binlogged
+ as 'CURRENT_USER()', it is not expanded to the real user name. When slave
+ executes the log event, 'CURRENT_USER()' is expand to the user of slave
+ SQL thread, but SQL thread's user name always NULL. This breaks the replication.
+
+ After this patch, session's user will be written into query log events
+ if these statements call CURREN_USER() or 'ALTER EVENT' does not assign a definer.
+ ------------------------------------------------------------
+ revno: 3457.1.3
+ committer: Davi Arnaut
+ branch nick: mysql-5.1-bugteam
+ timestamp: Sat 2010-07-03 10:20:05 -0300
+ message:
+ Fix somewhat bogus GCC warning. Although needless as the base
+ class is mostly empty, initialize the base class explicitly in
+ the copy constructor.
+ ------------------------------------------------------------
+ revno: 3457.1.2
+ committer: Davi Arnaut
+ branch nick: mysql-5.1-bugteam
+ timestamp: Fri 2010-07-02 18:42:32 -0300
+ message:
+ Bug#53445: Build with -Wall and fix warnings that it generates
+
+ If bzero is not available, resort to memset. Also, remove dead
+ bzero.c
+ ------------------------------------------------------------
+ revno: 3457.1.1
+ committer: Davi Arnaut
+ branch nick: 53445-5.1
+ timestamp: Fri 2010-07-02 15:30:47 -0300
+ message:
+ Bug#53445: Build with -Wall and fix warnings that it generates
+
+ Apart strict-aliasing warnings, fix the remaining warnings
+ generated by GCC 4.4.4 -Wall and -Wextra flags.
+
+ One major source of warnings was the in-house function my_bcmp
+ which (unconventionally) took pointers to unsigned characters
+ as the byte sequences to be compared. Since my_bcmp and bcmp
+ are deprecated functions whose only difference with memcmp is
+ the return value, every use of the function is replaced with
+ memcmp as the special return value wasn't actually being used
+ by any caller.
+
+ There were also various other warnings, mostly due to type
+ mismatches, missing return values, missing prototypes, dead
+ code (unreachable) and ignored return values.
+------------------------------------------------------------
+revno: 3465 [merge]
+committer: Georgi Kodinov
+branch nick: merge-5.1-security
+timestamp: Wed 2010-07-21 18:51:36 +0300
+message:
+ merge
+ ------------------------------------------------------------
+ revno: 3461.1.5 [merge]
+ committer: Joerg Bruehe
+ branch nick: mysql-5.1
+ timestamp: Wed 2010-07-21 12:09:50 +0200
+ message:
+ Merge the version number increase (5.1.49 -> 5.1.50) into the main tree.
+ ------------------------------------------------------------
+ revno: 3461.1.4
+ committer: Georgi Kodinov
+ branch nick: mysql-5.1
+ timestamp: Mon 2010-07-19 17:47:17 +0300
+ message:
+ fix tree names
+ ------------------------------------------------------------
+ revno: 3461.1.3 [merge]
+ committer: MySQL Build Team
+ branch nick: mysql-5.1.49-release
+ timestamp: Mon 2010-07-19 16:30:34 +0200
+ message:
+ 5.1.49 push to mysql-5.1
+ ------------------------------------------------------------
+ revno: 3408.1.3 [merge]
+ author: karen.langford@sun.com
+ committer: sunanda
+ branch nick: mysql-5.1
+ timestamp: Thu 2010-07-08 20:46:26 +0200
+ message:
+ Null-merge from mysql-5.1.46sp1-release
+ ------------------------------------------------------------
+ revno: 3351.58.14
+ tags: mysql-5.1.46sp1
+ committer: sunanda
+ branch nick: mysql-5.1.46sp1-release
+ timestamp: Wed 2010-06-23 12:22:05 +0200
+ message:
+ Backport into build-201006221614-5.1.46sp1
+
+ > ------------------------------------------------------------
+ > revno: 3392.1.1
+ > revision-id: gshchepa@mysql.com-20100521184732-0jvpzinv0uwyvr2d
+ > parent: sven.sandberg@sun.com-20100520153801-yyhujm1qqa4eyfn0
+ > committer: Gleb Shchepa
+ > branch nick: 53804-5.1
+ > timestamp: Fri 2010-05-21 22:47:32 +0400
+ > message:
+ > Bug #53804: serious flaws in the alter database .. upgrade
+ > data directory name command
+ >
+ > The check_db_name function has been modified to validate tails of
+ > #mysql50#-prefixed database names for compliance with MySQL 5.0
+ > database name encoding rules (the check_table_name function call
+ > has been reused).
+ ------------------------------------------------------------
+ revno: 3351.58.13
+ committer: sunanda
+ branch nick: mysql-5.1.46sp1-release
+ timestamp: Wed 2010-06-23 12:14:23 +0200
+ message:
+ Backport into build-201006221614-5.1.46sp1
+
+ > ------------------------------------------------------------
+ > revno: 3386
+ > revision-id: sergey.glukhov@sun.com-20100518082821-yajhvbv1ghmlpu1n
+ > parent: aelkin@mysql.com-20100516170332-x8priwrdjwolc065
+ > committer: Sergey Glukhov
+ > branch nick: mysql-5.1-bugteam
+ > timestamp: Tue 2010-05-18 13:28:21 +0500
+ > message:
+ > Bug#48729 SELECT ... FROM INFORMATION_SCHEMA.ROUTINES causes memory to grow
+ > Analysis showed that in case of accessing I_S table
+ > ROUTINES we perform unnecessary allocations
+ > with get_field() function for every processed row that
+ > in their turn causes significant memory growth.
+ > the fix is to avoid use of get_field().
+ ------------------------------------------------------------
+ revno: 3351.58.12
+ committer: sunanda
+ branch nick: mysql-5.1.46sp1-release
+ timestamp: Wed 2010-06-23 12:03:22 +0200
+ message:
+ Backport into build-201006221614-5.1.46sp1
+
+ > ------------------------------------------------------------
+ > revno: 3367 [merge]
+ > revision-id: joro@sun.com-20100504140328-srxf3c088j2twnq6
+ > parent: kristofer.pettersson@sun.com-20100503172109-f9hracq5pqsaomb1
+ > parent: joro@sun.com-20100503151651-nakknn8amrapmdp7
+ > committer: Georgi Kodinov
+ > branch nick: B53371-5.1-bugteam
+ > timestamp: Tue 2010-05-04 17:03:28 +0300
+ > message:
+ > Bug #53371: COM_FIELD_LIST can be abused to bypass table level grants.
+ >
+ > This is the 5.1 merge and extension of the fix.
+ > The server was happily accepting paths in table name in all places a table
+ > name is accepted (e.g. a SELECT). This allowed all users that have some
+ > privilege over some database to read all tables in all databases in all
+ > mysql server instances that the server file system has access to.
+ > Fixed by :
+ > 1. making sure no path elements are allowed in quoted table name when
+ > constructing the path (note that the path symbols are still valid in table names
+ > when they're properly escaped by the server).
+ > 2. checking the #mysql50# prefixed names the same way they're checked for
+ > path elements in mysql-5.0.
+ > ------------------------------------------------------------
+ > Use --include-merges or -n0 to see merged revisions.
+ ------------------------------------------------------------
+ revno: 3351.58.11
+ committer: MySQL Build Team
+ branch nick: mysql-5.1.46sp1-release
+ timestamp: Tue 2010-06-22 22:53:01 +0200
+ message:
+ Backport into build-201006221614-5.1.46sp1
+
+ > ------------------------------------------------------------
+ > revno: 3351.41.1
+ > revision-id: alexey.kopytov@sun.com-20100430111048-jdls6ofn4kkmpt09
+ > parent: sergey.glukhov@sun.com-20100329134249-03wyhzp5k92dzhcb
+ > committer: Alexey Kopytov
+ > branch nick: my51-bug48419
+ > timestamp: Fri 2010-04-30 15:10:48 +0400
+ > message:
+ > Bug #48419: another explain crash..
+ >
+ > WHERE predicates containing references to empty tables in a
+ > subquery were handled incorrectly by the optimizer when
+ > executing EXPLAIN. As a result, the optimizer could try to
+ > evaluate such predicates rather than just stop with
+ > "Impossible WHERE noticed after reading const tables" as
+ > it would do in a non-subquery case. This led to valgrind
+ > errors and crashes.
+ >
+ > Fixed the code checking the above condition so that subqueries
+ > are not excluded and hence are handled in the same way as top
+ > level SELECTs.
+ ------------------------------------------------------------
+ revno: 3351.58.10
+ committer: MySQL Build Team
+ branch nick: mysql-5.1.46sp1-release
+ timestamp: Tue 2010-06-22 22:51:35 +0200
+ message:
+ Backport into build-201006221614-5.1.46sp1
+
+ > ------------------------------------------------------------
+ > revno: 1810.3987.14
+ > revision-id: davi.arnaut@sun.com-20100429132816-ictyul6d75itek22
+ > parent: ramil@mysql.com-20100429044232-f0pkyx8fnpszf142
+ > committer: Davi Arnaut
+ > branch nick: 50974-5.0
+ > timestamp: Thu 2010-04-29 10:28:16 -0300
+ > message:
+ > Bug#50974: Server keeps receiving big (> max_allowed_packet) packets indefinitely.
+ >
+ > The server could be tricked to read packets indefinitely if it
+ > received a packet larger than the maximum size of one packet.
+ > This problem is aggravated by the fact that it can be triggered
+ > before authentication.
+ >
+ > The solution is to no skip big packets for non-authenticated
+ > sessions. If a big packet is sent before a session is authen-
+ > ticated, a error is returned and the connection is closed.
+
+ > ------------------------------------------------------------
+ > revno: 3363 [merge]
+ > revision-id: davi.arnaut@sun.com-20100429231819-i3anwzrdasjmezvt
+ > parent: davi.arnaut@sun.com-20100401131522-895y8uzvv8ag44gs
+ > parent: davi.arnaut@sun.com-20100429132816-ictyul6d75itek22
+ > committer: Davi Arnaut
+ > branch nick: mysql-5.1-bugteam
+ > timestamp: Thu 2010-04-29 20:18:19 -0300
+ > message:
+ > Manual merge.
+ > ------------------------------------------------------------
+ > Use --include-merges or -n0 to see merged revisions.
+ ------------------------------------------------------------
+ revno: 3351.58.9
+ committer: MySQL Build Team
+ branch nick: mysql-5.1.46sp1-release
+ timestamp: Tue 2010-06-22 22:34:48 +0200
+ message:
+ Backport into build-201006221614-5.1.46sp1
+
+ > ------------------------------------------------------------
+ > revno: 1810.3987.13
+ > revision-id: ramil@mysql.com-20100429044232-f0pkyx8fnpszf142
+ > parent: alexey.kopytov@sun.com-20100426200600-op06qy98llzpzgl1
+ > committer: Ramil Kalimullin
+ > branch nick: b53237-5.0-bugteam
+ > timestamp: Thu 2010-04-29 08:42:32 +0400
+ > message:
+ > Fix for bug #53237: mysql_list_fields/COM_FIELD_LIST stack smashing
+ >
+ > Problem: "COM_FIELD_LIST is an old command of the MySQL server, before there was real move to only
+ > SQL. Seems that the data sent to COM_FIELD_LIST( mysql_list_fields() function) is not
+ > checked for sanity. By sending long data for the table a buffer is overflown, which can
+ > be used deliberately to include code that harms".
+ >
+ > Fix: check incoming data length.
+
+ The patch did not apply cleanly:
+ - Line numbers are completely off, roughly it is 2030 -> 1313
+ - What is called "pend" in the patch, is "arg_end" in the source.
+ ------------------------------------------------------------
+ revno: 3351.58.8
+ committer: MySQL Build Team
+ branch nick: mysql-5.1.46sp1-release
+ timestamp: Tue 2010-06-22 22:09:31 +0200
+ message:
+ Backport into 5.1.46sp1:
+
+ > revno: 3351.14.56
+ > committer: Marko Mdkeld
+ > branch nick: 5.1-innodb
+ > timestamp: Mon 2010-04-26 14:08:56 +0300
+ > message:
+ > Add a test case for Bug #52745.
+ ------------------------------------------------------------
+ revno: 3351.58.7
+ committer: MySQL Build Team
+ branch nick: mysql-5.1.46sp1-release
+ timestamp: Tue 2010-06-22 21:59:35 +0200
+ message:
+ Backport into build-201006221614-5.1.46sp1
+
+ > ------------------------------------------------------------
+ > revno: 3351.14.47
+ > revision-id: marko.makela@oracle.com-20100421095033-0acvzxb8um8cms0a
+ > parent: marko.makela@oracle.com-20100421094032-ir4glqk46qvg2ywn
+ > committer: Marko Mäkelä
+ > branch nick: 5.1-innodb
+ > timestamp: Wed 2010-04-21 12:50:33 +0300
+ > message:
+ > dtuple_convert_big_rec(): Store locally any fields whose maximum length
+ > is less than 256 bytes. (Bug #52745)
+ > Add related comments and debug assertions to the "offsets"
+ > functions in rem0rec.c.
+ > Approved by Sunny Bains
+ ------------------------------------------------------------
+ revno: 3351.58.6
+ committer: MySQL Build Team
+ branch nick: mysql-5.1.46sp1-release
+ timestamp: Tue 2010-06-22 21:56:18 +0200
+ message:
+ Backport into build-201006221614-5.1.46sp1
+
+ > ------------------------------------------------------------
+ > revno: 3351.47.2
+ > revision-id: marko.makela@oracle.com-20100511104910-nim8kgguawpis7zo
+ > parent: marko.makela@oracle.com-20100511104500-c6kzd0bg5s42p8e9
+ > committer: Marko Mäkelä
+ > branch nick: mysql-5.1-innodb2
+ > timestamp: Tue 2010-05-11 13:49:10 +0300
+ > message:
+ > btr_page_split_and_insert(): Add an assertion
+ > suggested by Sunny Bains when reviewing Bug #52964.
+ ------------------------------------------------------------
+ revno: 3351.58.5
+ committer: MySQL Build Team
+ branch nick: mysql-5.1.46sp1-release
+ timestamp: Tue 2010-06-22 21:54:41 +0200
+ message:
+ Backport into build-201006221614-5.1.46sp1
+
+ > ------------------------------------------------------------
+ > revno: 3351.47.1
+ > revision-id: marko.makela@oracle.com-20100511104500-c6kzd0bg5s42p8e9
+ > parent: vasil.dimov@oracle.com-20100510132852-cz457uqvj8iiy9mm
+ > committer: Marko Mäkelä
+ > branch nick: mysql-5.1-innodb2
+ > timestamp: Tue 2010-05-11 13:45:00 +0300
+ > message:
+ > Remove a stray expression. Spotted by Sunny Bains.
+ ------------------------------------------------------------
+ revno: 3351.58.4
+ committer: MySQL Build Team
+ branch nick: mysql-5.1.46sp1-release
+ timestamp: Tue 2010-06-22 21:52:43 +0200
+ message:
+ Backport into build-201006221614-5.1.46sp1
+
+ > ------------------------------------------------------------
+ > revno: 3351.14.74
+ > revision-id: marko.makela@oracle.com-20100504093128-44v6glupe1dsh0ug
+ > parent: marko.makela@oracle.com-20100503122859-k73bl51re93o0mt4
+ > committer: Marko Mäkelä
+ > branch nick: 5.1-innodb
+ > timestamp: Tue 2010-05-04 12:31:28 +0300
+ > message:
+ > btr_page_split_and_insert(): Correct the fix of Bug #52964.
+ > When split_rec==NULL, choose the correct node pointer key (first_rec).
+ ------------------------------------------------------------
+ revno: 3351.58.3
+ committer: MySQL Build Team
+ branch nick: mysql-5.1.46sp1-release
+ timestamp: Tue 2010-06-22 21:50:47 +0200
+ message:
+ Backport into build-201006221614-5.1.46sp1
+
+ > ------------------------------------------------------------
+ > revno: 3351.14.50
+ > revision-id: marko.makela@oracle.com-20100421185359-8qaxoa2yyrpzwdd7
+ > parent: marko.makela@oracle.com-20100421102723-0i80uezbyu0ekj5d
+ > committer: Marko Mäkelä
+ > branch nick: 5.1-innodb
+ > timestamp: Wed 2010-04-21 21:53:59 +0300
+ > message:
+ > btr_page_split_and_insert(): Avoid an infinite loop. (Bug #52964)
+ >
+ > btr_page_tuple_smaller(): New function, refactored from
+ > btr_page_split_and_insert().
+ >
+ > btr_page_get_split_rec(): Renamed from btr_page_get_sure_split_rec().
+ > Note that a NULL return may mean that the tuple is to be inserted into
+ > either the lower or upper page, to be determined by btr_page_tuple_smaller().
+ >
+ > btr_page_split_and_insert(): When btr_page_get_split_rec() returns NULL,
+ > invoke btr_page_tuple_smaller() to determine which half-page the tuple
+ > belongs to.
+ >
+ > Reviewed by Sunny Bains
+ ------------------------------------------------------------
+ revno: 3351.58.2
+ committer: MySQL Build Team
+ branch nick: mysql-5.1.46sp1-release
+ timestamp: Tue 2010-06-22 21:42:14 +0200
+ message:
+ Backport into build-201006221614-5.1.46sp1
+
+ > ------------------------------------------------------------
+ > revno: 3362
+ > revision-id: davi.arnaut@sun.com-20100401131522-895y8uzvv8ag44gs
+ > parent: ramil@mysql.com-20100429045409-r7r5lcyiruis15v7
+ > committer: Davi Arnaut
+ > branch nick: 50755-5.1
+ > timestamp: Thu 2010-04-01 10:15:22 -0300
+ > message:
+ > Bug#50755: Crash if stored routine def contains version comments
+ >
+ > The problem was that a syntactically invalid trigger could cause
+ > the server to crash when trying to list triggers. The crash would
+ > happen due to a mishap in the backup/restore procedure that should
+ > protect parser items which are not associated with the trigger. The
+ > backup/restore is used to isolate the parse tree (and context) of
+ > a statement from the load (and parsing) of a trigger. In this case,
+ > a error during the parsing of a trigger could cause the improper
+ > backup/restore sequence.
+ >
+ > The solution is to properly restore the original statement context
+ > before the parser is exited due to syntax errors in the trigger body.
+ ------------------------------------------------------------
+ revno: 3351.58.1
+ author: karen.langford@oracle.com
+ committer: MySQL Build Team
+ branch nick: mysql-5.1.46sp1-release
+ timestamp: Tue 2010-06-22 19:21:25 +0200
+ message:
+ Set version number for mysql-5.1.46sp1 release
+ ------------------------------------------------------------
+ revno: 3461.1.2
+ tags: mysql-5.1.49
+ author: karen.langford@oracle.com
+ committer: Karen Langford
+ branch nick: mysql-5.1.49-release
+ timestamp: Fri 2010-07-09 14:23:48 +0200
+ message:
+ Fix bug #55039 Failing assertion: space_id > 0 in fil0fil.c.
diff --git a/dep/mysqllite/EXCEPTIONS-CLIENT b/dep/mysqllite/EXCEPTIONS-CLIENT
new file mode 100644
index 0000000000..c570ff7ba2
--- /dev/null
+++ b/dep/mysqllite/EXCEPTIONS-CLIENT
@@ -0,0 +1,119 @@
+MySQL FLOSS License Exception
+
+The MySQL AB Exception for Free/Libre and Open Source
+Software-only Applications Using MySQL Client Libraries (the
+"FLOSS Exception").
+
+Version 0.6, 7 March 2007
+
+Exception Intent
+
+We want specified Free/Libre and Open Source Software (``FLOSS'')
+applications to be able to use specified GPL-licensed MySQL client
+libraries (the ``Program'') despite the fact that not all FLOSS
+licenses are compatible with version 2 of the GNU General Public
+License (the ``GPL'').
+
+Legal Terms and Conditions
+
+As a special exception to the terms and conditions of version 2.0
+of the GPL:
+
+ 1. You are free to distribute a Derivative Work that is formed
+ entirely from the Program and one or more works (each, a
+ "FLOSS Work") licensed under one or more of the licenses
+ listed below in section 1, as long as:
+ a. You obey the GPL in all respects for the Program and the
+ Derivative Work, except for identifiable sections of the
+ Derivative Work which are not derived from the Program,
+ and which can reasonably be considered independent and
+ separate works in themselves,
+ b. all identifiable sections of the Derivative Work which
+ are not derived from the Program, and which can
+ reasonably be considered independent and separate works
+ in themselves,
+ i. are distributed subject to one of the FLOSS licenses
+ listed below, and
+ ii. the object code or executable form of those sections
+ are accompanied by the complete corresponding
+ machine-readable source code for those sections on
+ the same medium and under the same FLOSS license as
+ the corresponding object code or executable forms of
+ those sections, and
+ c. any works which are aggregated with the Program or with a
+ Derivative Work on a volume of a storage or distribution
+ medium in accordance with the GPL, can reasonably be
+ considered independent and separate works in themselves
+ which are not derivatives of either the Program, a
+ Derivative Work or a FLOSS Work.
+ If the above conditions are not met, then the Program may only
+ be copied, modified, distributed or used under the terms and
+ conditions of the GPL or another valid licensing option from
+ MySQL AB.
+
+ 2. FLOSS License List
+
+License name Version(s)/Copyright Date
+Academic Free License 2.0
+Apache Software License 1.0/1.1/2.0
+Apple Public Source License 2.0
+Artistic license From Perl 5.8.0
+BSD license "July 22 1999"
+Common Development and Distribution License (CDDL) 1.0
+Common Public License 1.0
+Eclipse Public License 1.0
+GNU Library or "Lesser" General Public License (LGPL) 2.0/2.1
+Jabber Open Source License 1.0
+MIT license (As listed in file MIT-License.txt) ---
+Mozilla Public License (MPL) 1.0/1.1
+Open Software License 2.0
+OpenSSL license (with original SSLeay license) "2003" ("1998")
+PHP License 3.0
+Python license (CNRI Python License) ---
+Python Software Foundation License 2.1.1
+Sleepycat License "1999"
+University of Illinois/NCSA Open Source License ---
+W3C License "2001"
+X11 License "2001"
+Zlib/libpng License ---
+Zope Public License 2.0
+
+ Due to the many variants of some of the above licenses, we
+ require that any version follow the 2003 version of the Free
+ Software Foundation's Free Software Definition
+ (http://www.gnu.org/philosophy/free-sw.html) or version 1.9 of
+ the Open Source Definition by the Open Source Initiative
+ (http://www.opensource.org/docs/definition.php).
+
+ 3. Definitions
+
+ a. Terms used, but not defined, herein shall have the
+ meaning provided in the GPL.
+ b. Derivative Work means a derivative work under copyright
+ law.
+
+ 4. Applicability: This FLOSS Exception applies to all Programs
+ that contain a notice placed by MySQL AB saying that the
+ Program may be distributed under the terms of this FLOSS
+ Exception. If you create or distribute a work which is a
+ Derivative Work of both the Program and any other work
+ licensed under the GPL, then this FLOSS Exception is not
+ available for that work; thus, you must remove the FLOSS
+ Exception notice from that work and comply with the GPL in all
+ respects, including by retaining all GPL notices. You may
+ choose to redistribute a copy of the Program exclusively under
+ the terms of the GPL by removing the FLOSS Exception notice
+ from that copy of the Program, provided that the copy has
+ never been modified by you or any third party.
+
+Appendix A. Qualified Libraries and Packages
+
+The following is a non-exhaustive list of libraries and packages
+which are covered by the FLOSS License Exception. Please note that
+this appendix is provided merely as an additional service to
+specific FLOSS projects wishing to simplify licensing information
+for their users. Compliance with one of the licenses noted under
+the "FLOSS license list" section remains a prerequisite.
+
+Package Name Qualifying License and Version
+Apache Portable Runtime (APR) Apache Software License 2.0
diff --git a/dep/mysqllite/INSTALL-SOURCE b/dep/mysqllite/INSTALL-SOURCE
new file mode 100644
index 0000000000..bc7cd9032d
--- /dev/null
+++ b/dep/mysqllite/INSTALL-SOURCE
@@ -0,0 +1,8388 @@
+
+Chapter 2. Installing and Upgrading MySQL
+
+ This chapter describes how to obtain and install MySQL. A summary
+ of the procedure follows and later sections provide the details.
+ If you plan to upgrade an existing version of MySQL to a newer
+ version rather than install MySQL for the first time, see Section
+ 2.4.1, "Upgrading MySQL," for information about upgrade procedures
+ and about issues that you should consider before upgrading.
+
+ If you are interested in migrating to MySQL from another database
+ system, you may wish to read Section A.8, "MySQL 5.1 FAQ:
+ Migration," which contains answers to some common questions
+ concerning migration issues.
+
+ 1. Determine whether MySQL runs and is supported on your
+ platform.
+ Please note that not all platforms are equally suitable for
+ running MySQL, and that not all platforms on which MySQL is
+ known to run are officially supported by Oracle Corporation:
+
+ 2. Choose which distribution to install.
+ Several versions of MySQL are available, and most are
+ available in several distribution formats. You can choose from
+ pre-packaged distributions containing binary (precompiled)
+ programs or source code. When in doubt, use a binary
+ distribution. We also provide public access to our current
+ source tree for those who want to see our most recent
+ developments and help us test new code. To determine which
+ version and type of distribution you should use, see Section
+ 2.1.2, "Choosing Which MySQL Distribution to Install."
+
+ 3. Download the distribution that you want to install.
+ For instructions, see Section 2.1.3, "How to Get MySQL." To
+ verify the integrity of the distribution, use the instructions
+ in Section 2.1.4, "Verifying Package Integrity Using MD5
+ Checksums or GnuPG."
+
+ 4. Install the distribution.
+ To install MySQL from a binary distribution, use the
+ instructions in Section 2.2, "Installing MySQL from Generic
+ Binaries on Unix/Linux."
+ To install MySQL from a source distribution or from the
+ current development source tree, use the instructions in
+ Section 2.3, "MySQL Installation Using a Source Distribution."
+
+ 5. Perform any necessary post-installation setup.
+ After installing MySQL, read Section 2.13, "Post-Installation
+ Setup and Testing." This section contains important
+ information about making sure the MySQL server is working
+ properly. It also describes how to secure the initial MySQL
+ user accounts, which have no passwords until you assign
+ passwords. The section applies whether you install MySQL using
+ a binary or source distribution.
+
+ 6. If you want to run the MySQL benchmark scripts, Perl support
+ for MySQL must be available. See Section 2.15, "Perl
+ Installation Notes."
+
+2.1. General Installation Guidance
+
+ The immediately following sections contain the information
+ necessary to choose, download, and verify your distribution. The
+ instructions in later sections of the chapter describe how to
+ install the distribution that you choose. For binary
+ distributions, see the instructions at Section 2.2, "Installing
+ MySQL from Generic Binaries on Unix/Linux" or the corresponding
+ section for your platform if available. To build MySQL from
+ source, use the instructions in Section 2.3, "MySQL Installation
+ Using a Source Distribution."
+
+2.1.1. Operating Systems Supported by MySQL Community Server
+
+ This section lists the operating systems on which MySQL Community
+ Server is known to run.
+
+Important
+
+ Oracle Corporation does not necessarily provide official support
+ for all the platforms listed in this section. For information
+ about those platforms that are officially supported, see
+ http://www.mysql.com/support/supportedplatforms.html on the MySQL
+ Web site.
+
+ We use GNU Autoconf, so it is possible to port MySQL to all modern
+ systems that have a C++ compiler and a working implementation of
+ POSIX threads. (Thread support is needed for the server. To
+ compile only the client code, the only requirement is a C++
+ compiler.)
+
+ MySQL has been reported to compile successfully on the following
+ combinations of operating system and thread package.
+
+ * AIX 4.x, 5.x with native threads. See Section 2.12,
+ "Installing MySQL on AIX." AIX 5.3 should be upgraded to
+ technology level 7 (5300-07).
+
+ * FreeBSD 5.x and up with native threads. See Section 2.10,
+ "Installing MySQL on FreeBSD."
+
+ * HP-UX 11.x with the native threads. See Section 2.11,
+ "Installing MySQL on HP-UX."
+
+ * Linux, builds on all fairly recent Linux distributions with
+ glibc 2.3. See Section 2.6, "Installing MySQL on Linux."
+
+ * Mac OS X. See Section 2.7, "Installing MySQL on Mac OS X."
+
+ * Solaris 2.8 on SPARC and x86, including support for native
+ threads. See Section 2.8, "Installing MySQL on Solaris."
+
+ * Windows 2000, Windows XP, Windows Vista, Windows Server 2003,
+ and Windows Server 2008. See Section 2.5, "Installing MySQL on
+ Windows."
+
+ MySQL has also been known to run on other systems in the past. See
+ Section 2.1, "General Installation Guidance." Some porting effort
+ might be required for current versions of MySQL on these systems.
+
+ Not all platforms are equally well-suited for running MySQL. How
+ well a certain platform is suited for a high-load mission-critical
+ MySQL server is determined by the following factors:
+
+ * General stability of the thread library. A platform may have
+ an excellent reputation otherwise, but MySQL is only as stable
+ as the thread library it calls, even if everything else is
+ perfect.
+
+ * The capability of the kernel and the thread library to take
+ advantage of symmetric multi-processor (SMP) systems. In other
+ words, when a process creates a thread, it should be possible
+ for that thread to run on a CPU different from the original
+ process.
+
+ * The capability of the kernel and the thread library to run
+ many threads that acquire and release a mutex over a short
+ critical region frequently without excessive context switches.
+ If the implementation of pthread_mutex_lock() is too anxious
+ to yield CPU time, this hurts MySQL tremendously. If this
+ issue is not taken care of, adding extra CPUs actually makes
+ MySQL slower.
+
+ * General file system stability and performance.
+
+ * Table size. If your tables are large, performance is affected
+ by the ability of the file system to deal with large files and
+ dealing with them efficiently.
+
+ * Our level of expertise here at Oracle Corporation with the
+ platform. If we know a platform well, we enable
+ platform-specific optimizations and fixes at compile time. We
+ can also provide advice on configuring your system optimally
+ for MySQL.
+
+ * The amount of testing we have done internally for similar
+ configurations.
+
+ * The number of users that have run MySQL successfully on the
+ platform in similar configurations. If this number is high,
+ the likelihood of encountering platform-specific surprises is
+ much smaller.
+
+2.1.2. Choosing Which MySQL Distribution to Install
+
+ When preparing to install MySQL, you should decide which version
+ to use. MySQL development occurs in several release series, and
+ you can pick the one that best fits your needs. After deciding
+ which version to install, you can choose a distribution format.
+ Releases are available in binary or source format.
+
+2.1.2.1. Choosing Which Version of MySQL to Install
+
+ The first decision to make is whether you want to use a production
+ (stable) release or a development release. In the MySQL
+ development process, multiple release series co-exist, each at a
+ different stage of maturity:
+
+ * MySQL 5.5 is the current development release series.
+
+ * MySQL 5.1 is the current General Availability (Production)
+ release series. New releases are issued for bugfixes only; no
+ new features are being added that could affect stability.
+
+ * MySQL 5.0 is the previous stable (production-quality) release
+ series. MySQL 5.0 is now at the end of the product lifecycle.
+ Active development and support for this version has ended.
+ Extended support for MySQL 5.0 remains available. According to
+ the http://www.mysql.com/about/legal/lifecycle/, only Security
+ and Severity Level 1 issues are still being fixed for MySQL
+ 5.0.
+
+ * MySQL 4.1, 4.0, and 3.23 are old stable (production-quality)
+ release series. Active development and support for these
+ versions has ended.
+
+ We do not believe in a complete code freeze because this prevents
+ us from making bugfixes and other fixes that must be done. By
+ "somewhat frozen" we mean that we may add small things that should
+ not affect anything that currently works in a production release.
+ Naturally, relevant bugfixes from an earlier series propagate to
+ later series.
+
+ Normally, if you are beginning to use MySQL for the first time or
+ trying to port it to some system for which there is no binary
+ distribution, go with the General Availability release series.
+ Currently, this is MySQL 5.1. All MySQL releases, even those from
+ development series, are checked with the MySQL benchmarks and an
+ extensive test suite before being issued.
+
+ If you are running an older system and want to upgrade, but do not
+ want to take the chance of having a nonseamless upgrade, you
+ should upgrade to the latest version in the same release series
+ you are using (where only the last part of the version number is
+ newer than yours). We have tried to fix only fatal bugs and make
+ only small, relatively "safe" changes to that version.
+
+ If you want to use new features not present in the production
+ release series, you can use a version from a development series.
+ Note that development releases are not as stable as production
+ releases.
+
+ If you want to use the very latest sources containing all current
+ patches and bugfixes, you can use one of our Bazaar repositories.
+ These are not "releases" as such, but are available as previews of
+ the code on which future releases are to be based.
+
+ The MySQL naming scheme uses release names that consist of three
+ numbers and a suffix; for example, mysql-5.0.14-rc. The numbers
+ within the release name are interpreted as follows:
+
+ * The first number (5) is the major version and describes the
+ file format. All MySQL 5 releases have the same file format.
+
+ * The second number (0) is the release level. Taken together,
+ the major version and release level constitute the release
+ series number.
+
+ * The third number (14) is the version number within the release
+ series. This is incremented for each new release. Usually you
+ want the latest version for the series you have chosen.
+
+ For each minor update, the last number in the version string is
+ incremented. When there are major new features or minor
+ incompatibilities with previous versions, the second number in the
+ version string is incremented. When the file format changes, the
+ first number is increased.
+
+ Release names also include a suffix to indicates the stability
+ level of the release. Releases within a series progress through a
+ set of suffixes to indicate how the stability level improves. The
+ possible suffixes are:
+
+ * alpha indicates that the release is for preview purposes only.
+ Known bugs should be documented in the News section (see
+ Appendix C, "MySQL Change History"). Most alpha releases
+ implement new commands and extensions. Active development that
+ may involve major code changes can occur in an alpha release.
+ However, we do conduct testing before issuing a release.
+
+ * beta indicates that the release is appropriate for use with
+ new development. Within beta releases, the features and
+ compatibility should remain consistent. However, beta releases
+ may contain numerous and major unaddressed bugs.
+ All APIs, externally visible structures, and columns for SQL
+ statements will not change during future beta, release
+ candidate, or production releases.
+
+ * rc indicates a Release Candidate. Release candidates are
+ believed to be stable, having passed all of MySQL's internal
+ testing, and with all known fatal runtime bugs fixed. However,
+ the release has not been in widespread use long enough to know
+ for sure that all bugs have been identified. Only minor fixes
+ are added. (A release candidate is what formerly was known as
+ a gamma release.)
+
+ * If there is no suffix, it indicates that the release is a
+ General Availability (GA) or Production release. GA releases
+ are stable, having successfully passed through all earlier
+ release stages and are believed to be reliable, free of
+ serious bugs, and suitable for use in production systems. Only
+ critical bugfixes are applied to the release.
+
+ MySQL uses a naming scheme that is slightly different from most
+ other products. In general, it is usually safe to use any version
+ that has been out for a couple of weeks without being replaced by
+ a new version within the same release series.
+
+ All releases of MySQL are run through our standard tests and
+ benchmarks to ensure that they are relatively safe to use. Because
+ the standard tests are extended over time to check for all
+ previously found bugs, the test suite keeps getting better.
+
+ All releases have been tested at least with these tools:
+
+ * An internal test suite
+ The mysql-test directory contains an extensive set of test
+ cases. We run these tests for every server binary. See Section
+ 22.1.2, "MySQL Test Suite," for more information about this
+ test suite.
+
+ * The MySQL benchmark suite
+ This suite runs a range of common queries. It is also a test
+ to determine whether the latest batch of optimizations
+ actually made the code faster. See Section 7.1.3, "The MySQL
+ Benchmark Suite."
+
+ We also test the newest MySQL version in our internal production
+ environment, on at least one machine. We have more than 100GB of
+ data to work with.
+
+2.1.2.2. Choosing a Distribution Format
+
+ After choosing which version of MySQL to install, you should
+ decide whether to use a binary distribution or a source
+ distribution. In most cases, you should probably use a binary
+ distribution, if one exists for your platform. Binary
+ distributions are available in native format for many platforms,
+ such as RPM files for Linux or PKG package installers for Mac OS X
+ or Solaris. Distributions also are available as Zip archives or
+ compressed tar files.
+
+ Reasons to choose a binary distribution include the following:
+
+ * Binary distributions generally are easier to install than
+ source distributions.
+
+ * To satisfy different user requirements, we provide several
+ servers in binary distributions. mysqld is an optimized server
+ that is a smaller, faster binary. mysqld-debug is compiled
+ with debugging support.
+ Each of these servers is compiled from the same source
+ distribution, though with different configuration options. All
+ native MySQL clients can connect to servers from either MySQL
+ version.
+
+ Under some circumstances, you may be better off installing MySQL
+ from a source distribution:
+
+ * You want to install MySQL at some explicit location. The
+ standard binary distributions are ready to run at any
+ installation location, but you might require even more
+ flexibility to place MySQL components where you want.
+
+ * You want to configure mysqld to ensure that features are
+ available that might not be included in the standard binary
+ distributions. Here is a list of the most common extra options
+ that you may want to use to ensure feature availability:
+
+ + --with-libwrap
+
+ + --with-named-z-libs (this is done for some of the
+ binaries)
+
+ + --with-debug[=full]
+
+ * You want to configure mysqld without some features that are
+ included in the standard binary distributions. For example,
+ distributions normally are compiled with support for all
+ character sets. If you want a smaller MySQL server, you can
+ recompile it with support for only the character sets you
+ need.
+
+ * You have a special compiler (such as pgcc) or want to use
+ compiler options that are better optimized for your processor.
+ Binary distributions are compiled with options that should
+ work on a variety of processors from the same processor
+ family.
+
+ * You want to use the latest sources from one of the Bazaar
+ repositories to have access to all current bugfixes. For
+ example, if you have found a bug and reported it to the MySQL
+ development team, the bugfix is committed to the source
+ repository and you can access it there. The bugfix does not
+ appear in a release until a release actually is issued.
+
+ * You want to read (or modify) the C and C++ code that makes up
+ MySQL. For this purpose, you should get a source distribution,
+ because the source code is always the ultimate manual.
+
+ * Source distributions contain more tests and examples than
+ binary distributions.
+
+2.1.2.3. How and When Updates Are Released
+
+ MySQL is evolving quite rapidly and we want to share new
+ developments with other MySQL users. We try to produce a new
+ release whenever we have new and useful features that others also
+ seem to have a need for.
+
+ We also try to help users who request features that are easy to
+ implement. We take note of what our licensed users want, and we
+ especially take note of what our support customers want and try to
+ help them in this regard.
+
+ No one is required to download a new release. The News section
+ helps you determine whether the new release has something you
+ really want. See Appendix C, "MySQL Change History."
+
+ We use the following policy when updating MySQL:
+
+ * Enterprise Server releases are meant to appear every 18
+ months, supplemented by quarterly service packs and monthly
+ rapid updates. Community Server releases are meant to appear 2
+ to 3 times per year.
+
+ * Releases are issued within each series. For each release, the
+ last number in the version is one more than the previous
+ release within the same series.
+
+ * Binary distributions for some platforms are made by us for
+ major releases. Other people may make binary distributions for
+ other systems, but probably less frequently.
+
+ * We make fixes available as soon as we have identified and
+ corrected small or noncritical but annoying bugs. The fixes
+ are available in source form immediately from our public
+ Bazaar repositories, and are included in the next release.
+
+ * If by any chance a security vulnerability or critical bug is
+ found in a release, our policy is to fix it in a new release
+ as soon as possible. (We would like other companies to do
+ this, too!)
+
+2.1.3. How to Get MySQL
+
+ Check our downloads page at http://dev.mysql.com/downloads/ for
+ information about the current version of MySQL and for downloading
+ instructions. For a complete up-to-date list of MySQL download
+ mirror sites, see http://dev.mysql.com/downloads/mirrors.html. You
+ can also find information there about becoming a MySQL mirror site
+ and how to report a bad or out-of-date mirror.
+
+ Our main mirror is located at http://mirrors.sunsite.dk/mysql/.
+
+2.1.4. Verifying Package Integrity Using MD5 Checksums or GnuPG
+
+ After you have downloaded the MySQL package that suits your needs
+ and before you attempt to install it, you should make sure that it
+ is intact and has not been tampered with. There are three means of
+ integrity checking:
+
+ * MD5 checksums
+
+ * Cryptographic signatures using GnuPG, the GNU Privacy Guard
+
+ * For RPM packages, the built-in RPM integrity verification
+ mechanism
+
+ The following sections describe how to use these methods.
+
+ If you notice that the MD5 checksum or GPG signatures do not
+ match, first try to download the respective package one more time,
+ perhaps from another mirror site. If you repeatedly cannot
+ successfully verify the integrity of the package, please notify us
+ about such incidents, including the full package name and the
+ download site you have been using, at webmaster@mysql.com or
+ build@mysql.com. Do not report downloading problems using the
+ bug-reporting system.
+
+2.1.4.1. Verifying the MD5 Checksum
+
+ After you have downloaded a MySQL package, you should make sure
+ that its MD5 checksum matches the one provided on the MySQL
+ download pages. Each package has an individual checksum that you
+ can verify with the following command, where package_name is the
+ name of the package you downloaded:
+shell> md5sum package_name
+
+ Example:
+shell> md5sum mysql-standard-5.1.50-linux-i686.tar.gz
+aaab65abbec64d5e907dcd41b8699945 mysql-standard-5.1.50-linux-i686.ta
+r.gz
+
+ You should verify that the resulting checksum (the string of
+ hexadecimal digits) matches the one displayed on the download page
+ immediately below the respective package.
+
+Note
+
+ Make sure to verify the checksum of the archive file (for example,
+ the .zip or .tar.gz file) and not of the files that are contained
+ inside of the archive.
+
+ Note that not all operating systems support the md5sum command. On
+ some, it is simply called md5, and others do not ship it at all.
+ On Linux, it is part of the GNU Text Utilities package, which is
+ available for a wide range of platforms. You can download the
+ source code from http://www.gnu.org/software/textutils/ as well.
+ If you have OpenSSL installed, you can use the command openssl md5
+ package_name instead. A Windows implementation of the md5 command
+ line utility is available from http://www.fourmilab.ch/md5/.
+ winMd5Sum is a graphical MD5 checking tool that can be obtained
+ from http://www.nullriver.com/index/products/winmd5sum.
+
+2.1.4.2. Signature Checking Using GnuPG
+
+ Another method of verifying the integrity and authenticity of a
+ package is to use cryptographic signatures. This is more reliable
+ than using MD5 checksums, but requires more work.
+
+ We sign MySQL downloadable packages with GnuPG (GNU Privacy
+ Guard). GnuPG is an Open Source alternative to the well-known
+ Pretty Good Privacy (PGP) by Phil Zimmermann. See
+ http://www.gnupg.org/ for more information about GnuPG and how to
+ obtain and install it on your system. Most Linux distributions
+ ship with GnuPG installed by default. For more information about
+ GnuPG, see http://www.openpgp.org/.
+
+ To verify the signature for a specific package, you first need to
+ obtain a copy of our public GPG build key, which you can download
+ from http://keyserver.pgp.com/. The key that you want to obtain is
+ named build@mysql.com. Alternatively, you can cut and paste the
+ key directly from the following text:
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.5 (GNU/Linux)
+
+mQGiBD4+owwRBAC14GIfUfCyEDSIePvEW3SAFUdJBtoQHH/nJKZyQT7h9bPlUWC3
+RODjQReyCITRrdwyrKUGku2FmeVGwn2u2WmDMNABLnpprWPkBdCk96+OmSLN9brZ
+fw2vOUgCmYv2hW0hyDHuvYlQA/BThQoADgj8AW6/0Lo7V1W9/8VuHP0gQwCgvzV3
+BqOxRznNCRCRxAuAuVztHRcEAJooQK1+iSiunZMYD1WufeXfshc57S/+yeJkegNW
+hxwR9pRWVArNYJdDRT+rf2RUe3vpquKNQU/hnEIUHJRQqYHo8gTxvxXNQc7fJYLV
+K2HtkrPbP72vwsEKMYhhr0eKCbtLGfls9krjJ6sBgACyP/Vb7hiPwxh6rDZ7ITnE
+kYpXBACmWpP8NJTkamEnPCia2ZoOHODANwpUkP43I7jsDmgtobZX9qnrAXw+uNDI
+QJEXM6FSbi0LLtZciNlYsafwAPEOMDKpMqAK6IyisNtPvaLd8lH0bPAnWqcyefep
+rv0sxxqUEMcM3o7wwgfN83POkDasDbs3pjwPhxvhz6//62zQJ7Q7TXlTUUwgUGFj
+a2FnZSBzaWduaW5nIGtleSAod3d3Lm15c3FsLmNvbSkgPGJ1aWxkQG15c3FsLmNv
+bT6IXQQTEQIAHQULBwoDBAMVAwIDFgIBAheABQJLcC5lBQkQ8/JZAAoJEIxxjTtQ
+cuH1oD4AoIcOQ4EoGsZvy06D0Ei5vcsWEy8dAJ4g46i3WEcdSWxMhcBSsPz65sh5
+lohMBBMRAgAMBQI+PqPRBYMJZgC7AAoJEElQ4SqycpHyJOEAn1mxHijft00bKXvu
+cSo/pECUmppiAJ41M9MRVj5VcdH/KN/KjRtW6tHFPYhMBBMRAgAMBQI+QoIDBYMJ
+YiKJAAoJELb1zU3GuiQ/lpEAoIhpp6BozKI8p6eaabzF5MlJH58pAKCu/ROofK8J
+Eg2aLos+5zEYrB/LsrkCDQQ+PqMdEAgA7+GJfxbMdY4wslPnjH9rF4N2qfWsEN/l
+xaZoJYc3a6M02WCnHl6ahT2/tBK2w1QI4YFteR47gCvtgb6O1JHffOo2HfLmRDRi
+Rjd1DTCHqeyX7CHhcghj/dNRlW2Z0l5QFEcmV9U0Vhp3aFfWC4Ujfs3LU+hkAWzE
+7zaD5cH9J7yv/6xuZVw411x0h4UqsTcWMu0iM1BzELqX1DY7LwoPEb/O9Rkbf4fm
+Le11EzIaCa4PqARXQZc4dhSinMt6K3X4BrRsKTfozBu74F47D8Ilbf5vSYHbuE5p
+/1oIDznkg/p8kW+3FxuWrycciqFTcNz215yyX39LXFnlLzKUb/F5GwADBQf+Lwqq
+a8CGrRfsOAJxim63CHfty5mUc5rUSnTslGYEIOCR1BeQauyPZbPDsDD9MZ1ZaSaf
+anFvwFG6Llx9xkU7tzq+vKLoWkm4u5xf3vn55VjnSd1aQ9eQnUcXiL4cnBGoTbOW
+I39EcyzgslzBdC++MPjcQTcA7p6JUVsP6oAB3FQWg54tuUo0Ec8bsM8b3Ev42Lmu
+QT5NdKHGwHsXTPtl0klk4bQk4OajHsiy1BMahpT27jWjJlMiJc+IWJ0mghkKHt92
+6s/ymfdf5HkdQ1cyvsz5tryVI3Fx78XeSYfQvuuwqp2H139pXGEkg0n6KdUOetdZ
+Whe70YGNPw1yjWJT1IhMBBgRAgAMBQI+PqMdBQkJZgGAAAoJEIxxjTtQcuH17p4A
+n3r1QpVC9yhnW2cSAjq+kr72GX0eAJ4295kl6NxYEuFApmr1+0uUq/SlsQ==
+=Mski
+
+-----END PGP PUBLIC KEY BLOCK-----
+
+ To import the build key into your personal public GPG keyring, use
+ gpg --import. For example, if you have saved the key in a file
+ named mysql_pubkey.asc, the import command looks like this:
+shell> gpg --import mysql_pubkey.asc
+gpg: key 5072E1F5: public key "MySQL Package signing key (www.mysql.c
+om) " imported
+gpg: Total number processed: 1
+gpg: imported: 1
+gpg: no ultimately trusted keys found
+
+ You can also download the key from the public keyserver using the
+ public key id, 5072E1F5:
+shell> gpg --recv-keys 5072E1F5
+gpg: requesting key 5072E1F5 from hkp server subkeys.pgp.net
+gpg: key 5072E1F5: "MySQL Package signing key (www.mysql.com) " 2 new signatures
+gpg: no ultimately trusted keys found
+gpg: Total number processed: 1
+gpg: new signatures: 2
+
+ If you want to import the key into your RPM configuration to
+ validate RPM install packages, you should be able to import the
+ key directly:
+shell> rpm --import mysql_pubkey.asc
+
+ If you experience problems, try exporting the key from gpg and
+ importing:
+shell> gpg --export -a 5072e1f5 > 5072e1f5.asc
+shell> rpm --import 5072e1f5.asc
+
+ Alternatively, rpm also supports loading the key directly from a
+ URL, and you cas use this manual page:
+shell> rpm --import http://dev.mysql.com/doc/refman/5.1/en/checking-g
+pg-signature.html
+
+ After you have downloaded and imported the public build key,
+ download your desired MySQL package and the corresponding
+ signature, which also is available from the download page. The
+ signature file has the same name as the distribution file with an
+ .asc extension, as shown by the examples in the following table.
+ Distribution file mysql-standard-5.1.50-linux-i686.tar.gz
+ Signature file mysql-standard-5.1.50-linux-i686.tar.gz.asc
+
+ Make sure that both files are stored in the same directory and
+ then run the following command to verify the signature for the
+ distribution file:
+shell> gpg --verify package_name.asc
+
+ Example:
+shell> gpg --verify mysql-standard-5.1.50-linux-i686.tar.gz.asc
+gpg: Signature made Tue 12 Jul 2005 23:35:41 EST using DSA key ID 507
+2E1F5
+gpg: Good signature from "MySQL Package signing key (www.mysql.com) <
+build@mysql.com>"
+
+ The Good signature message indicates that everything is all right.
+ You can ignore any insecure memory warning you might obtain.
+
+ See the GPG documentation for more information on how to work with
+ public keys.
+
+2.1.4.3. Signature Checking Using RPM
+
+ For RPM packages, there is no separate signature. RPM packages
+ have a built-in GPG signature and MD5 checksum. You can verify a
+ package by running the following command:
+shell> rpm --checksig package_name.rpm
+
+ Example:
+shell> rpm --checksig MySQL-server-5.1.50-0.glibc23.i386.rpm
+MySQL-server-5.1.50-0.glibc23.i386.rpm: md5 gpg OK
+
+Note
+
+ If you are using RPM 4.1 and it complains about (GPG) NOT OK
+ (MISSING KEYS: GPG#5072e1f5), even though you have imported the
+ MySQL public build key into your own GPG keyring, you need to
+ import the key into the RPM keyring first. RPM 4.1 no longer uses
+ your personal GPG keyring (or GPG itself). Rather, it maintains
+ its own keyring because it is a system-wide application and a
+ user's GPG public keyring is a user-specific file. To import the
+ MySQL public key into the RPM keyring, first obtain the key as
+ described in Section 2.1.4.2, "Signature Checking Using GnuPG."
+ Then use rpm --import to import the key. For example, if you have
+ saved the public key in a file named mysql_pubkey.asc, import it
+ using this command:
+shell> rpm --import mysql_pubkey.asc
+
+ If you need to obtain the MySQL public key, see Section 2.1.4.2,
+ "Signature Checking Using GnuPG."
+
+2.1.5. Installation Layouts
+
+ This section describes the default layout of the directories
+ created by installing binary or source distributions provided by
+ Oracle Corporation. A distribution provided by another vendor
+ might use a layout different from those shown here.
+
+ Installations created from our Linux RPM distributions result in
+ files under the following system directories.
+ Directory Contents of Directory
+ /usr/bin Client programs and scripts
+ /usr/sbin The mysqld server
+ /var/lib/mysql Log files, databases
+ /usr/share/info Manual in Info format
+ /usr/share/man Unix manual pages
+ /usr/include/mysql Include (header) files
+ /usr/lib/mysql Libraries
+ /usr/share/mysql Error message and character set files
+ /usr/share/sql-bench Benchmarks
+
+ On Unix, a tar file binary distribution is installed by unpacking
+ it at the installation location you choose (typically
+ /usr/local/mysql) and creates the following directories in that
+ location.
+ Directory Contents of Directory
+ bin Client programs and the mysqld server
+ data Log files, databases
+ docs Manual in Info format
+ man Unix manual pages
+ include Include (header) files
+ lib Libraries
+ scripts mysql_install_db
+ share/mysql Error message files
+ sql-bench Benchmarks
+
+ A source distribution is installed after you configure and compile
+ it. By default, the installation step installs files under
+ /usr/local, in the following subdirectories.
+ Directory Contents of Directory
+ bin Client programs and scripts
+ include/mysql Include (header) files
+ Docs Manual in Info, CHM formats
+ man Unix manual pages
+ lib/mysql Libraries
+ libexec The mysqld server
+ share/mysql Error message files
+ sql-bench Benchmarks and crash-me test
+ var Databases and log files
+
+ Within its installation directory, the layout of a source
+ installation differs from that of a binary installation in the
+ following ways:
+
+ * The mysqld server is installed in the libexec directory rather
+ than in the bin directory.
+
+ * The data directory is var rather than data.
+
+ * mysql_install_db is installed in the bin directory rather than
+ in the scripts directory.
+
+ * The header file and library directories are include/mysql and
+ lib/mysql rather than include and lib.
+
+ You can create your own binary installation from a compiled source
+ distribution by executing the scripts/make_binary_distribution
+ script from the top directory of the source distribution.
+
+2.1.6. Compiler-Specific Build Characteristics
+
+ In some cases, the compiler used to build MySQL affects the
+ features available for use. The notes in this section apply for
+ binary distributions provided by Oracle Corporation or that you
+ compile yourself from source.
+
+ icc (Intel C++ Compiler) Builds
+
+ A server built with icc has these characteristics:
+
+ * SSL support is not included.
+
+ * InnoDB Plugin is not included.
+
+2.2. Installing MySQL from Generic Binaries on Unix/Linux
+
+ This section covers the installation of MySQL binary distributions
+ that are provided for various platforms in the form of compressed
+ tar files (files with a .tar.gz extension).
+
+ To obtain MySQL, see Section 2.1.3, "How to Get MySQL."
+
+ Oracle provides a set of binary distributions of MySQL. In
+ addition to binaries provided in platform-specific package
+ formats, we offer binary distributions for a number of platforms
+ in the form of compressed tar files (.tar.gz files). For Windows
+ distributions, see Section 2.5, "Installing MySQL on Windows."
+
+ If you want to compile a debug version of MySQL from a source
+ distribution, you should add --with-debug or --with-debug=full to
+ the configure command used to configure the distribution and
+ remove any -fomit-frame-pointer options.
+
+ MySQL tar file binary distributions have names of the form
+ mysql-VERSION-OS.tar.gz, where VERSION is a number (for example,
+ 5.1.50), and OS indicates the type of operating system for which
+ the distribution is intended (for example, pc-linux-i686).
+
+ In addition to these generic packages, we also offer binaries in
+ platform-specific package formats for selected platforms. See the
+ platform specific sections for more information, for more
+ information on how to install these.
+
+ You need the following tools to install a MySQL tar file binary
+ distribution:
+
+ * GNU gunzip to uncompress the distribution.
+
+ * A reasonable tar to unpack the distribution. GNU tar is known
+ to work. Some operating systems come with a preinstalled
+ version of tar that is known to have problems. For example,
+ the tar provided with early versions of Mac OS X, SunOS 4.x,
+ Solaris 8, Solaris 9, Solaris 10 and OpenSolaris, and HP-UX
+ are known to have problems with long file names.
+
+ + On Mac OS X, you can use the preinstalled gnutar program.
+
+ + On Solaris 10 and OpenSolaris you can use the
+ preinstalled gtar.
+
+ + On other systems with a deficient tar, you should install
+ GNU tar first.
+
+Warning
+
+ If you have previously installed a MySQL installation using your
+ operating system native package management system, such as yum or
+ apt-get, you may experience problems installing using a native
+ binary. Make sure your previous MySQL previous installation has
+ been removed entirely (using your package management system), and
+ that any additional files, such as old versions of your data
+ files, have also been removed. You should also check the existence
+ of configuration files such as /etc/my.cnf or the /etc/mysql
+ directory have been deleted.
+
+ If you run into problems and need to file a bug report, please use
+ the instructions in Section 1.7, "How to Report Bugs or Problems."
+
+ The basic commands that you must execute to install and use a
+ MySQL binary distribution are:
+
+Note
+
+ The following process assumes that you have root (administrator)
+ access to your system. Alternatively you can prefix each command
+ using the sudo (Linux) or pfexec (OpenSolaris) command.
+shell> groupadd mysql
+shell> useradd -g mysql mysql
+shell> cd /usr/local
+shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf -
+shell> ln -s full-path-to-mysql-VERSION-OS mysql
+shell> cd mysql
+shell> chown -R mysql .
+shell> chgrp -R mysql .
+shell> scripts/mysql_install_db --user=mysql
+shell> chown -R root .
+shell> chown -R mysql data
+shell> bin/mysqld_safe --user=mysql &
+
+Note
+
+ This procedure does not set up any passwords for MySQL accounts.
+ After following the procedure, proceed to Section 2.13,
+ "Post-Installation Setup and Testing."
+
+ A more detailed version of the preceding description for
+ installing a binary distribution follows:
+
+Note
+
+ The following process assumes that you have root (administrator)
+ access to your system. Alternatively you can prefix each command
+ using the sudo (Linux) or pfexec (OpenSolaris) command.
+
+ 1. If your system does not already have a user and group for
+ mysqld to run as, you may need to create one.
+shell> groupadd mysql
+shell> useradd -g mysql mysql
+
+Note
+ The above will create a user that has login permissions to
+ your server. You may wish to disable the account, as the user
+ is only required for ownership, not login, purposes.
+ These commands add the mysql group and the mysql user. The
+ syntax for useradd and groupadd may differ slightly on
+ different versions of Unix, or they may have different names
+ such as adduser and addgroup.
+ You might want to call the user and group something else
+ instead of mysql. If so, substitute the appropriate name in
+ the following steps.
+
+ 2. Pick the directory under which you want to unpack the
+ distribution and change location into it. In the following
+ example, we unpack the distribution under /usr/local. (The
+ instructions, therefore, assume that you have permission to
+ create files and directories in /usr/local. If that directory
+ is protected, you must perform the installation as root.)
+shell> cd /usr/local
+
+ 3. Obtain a distribution file using the instructions in Section
+ 2.1.3, "How to Get MySQL." For a given release, binary
+ distributions for all platforms are built from the same MySQL
+ source distribution.
+
+ 4. Unpack the distribution, which creates the installation
+ directory. Then create a symbolic link to that directory:
+shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf -
+shell> ln -s full-path-to-mysql-VERSION-OS mysql
+ The tar command creates a directory named mysql-VERSION-OS.
+ The ln command makes a symbolic link to that directory. This
+ lets you refer more easily to the installation directory as
+ /usr/local/mysql.
+ With GNU tar, no separate invocation of gunzip is necessary.
+ You can replace the first line with the following alternative
+ command to uncompress and extract the distribution:
+shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
+
+ 5. Change location into the installation directory:
+shell> cd mysql
+ You will find several files and subdirectories in the mysql
+ directory. The most important for installation purposes are
+ the bin and scripts subdirectories:
+
+ + The bin directory contains client programs and the
+ server. You should add the full path name of this
+ directory to your PATH environment variable so that your
+ shell finds the MySQL programs properly. See Section
+ 2.14, "Environment Variables."
+
+ + The scripts directory contains the mysql_install_db
+ script used to initialize the mysql database containing
+ the grant tables that store the server access
+ permissions.
+
+ 6. Ensure that the distribution contents are accessible to mysql.
+ If you unpacked the distribution as mysql, no further action
+ is required. If you unpacked the distribution as root, its
+ contents will be owned by root. Change its ownership to mysql
+ by executing the following commands as root in the
+ installation directory:
+shell> chown -R mysql .
+shell> chgrp -R mysql .
+ The first command changes the owner attribute of the files to
+ the mysql user. The second changes the group attribute to the
+ mysql group.
+
+ 7. If you have not installed MySQL before, you must create the
+ MySQL data directory and initialize the grant tables:
+shell> scripts/mysql_install_db --user=mysql
+ If you run the command as root, include the --user option as
+ shown. If you run the while logged in as that user, you can
+ omit the --user option.
+ The command should create the data directory and its contents
+ with mysql as the owner.
+ After creating or updating the grant tables, you need to
+ restart the server manually.
+
+ 8. Most of the MySQL installation can be owned by root if you
+ like. The exception is that the data directory must be owned
+ by mysql. To accomplish this, run the following commands as
+ root in the installation directory:
+shell> chown -R root .
+shell> chown -R mysql data
+
+ 9. If the plugin directory is writable by the server, it may be
+ possible for a user to write executable code to a file in the
+ directory using SELECT ... INTO DUMPFILE. This can be
+ prevented by making plugin_dir read only to the server or by
+ setting --secure-file-priv to a directory where SELECT writes
+ can be made safely.
+ 10. If you want MySQL to start automatically when you boot your
+ machine, you can copy support-files/mysql.server to the
+ location where your system has its startup files. More
+ information can be found in the support-files/mysql.server
+ script itself and in Section 2.13.1.2, "Starting and Stopping
+ MySQL Automatically."
+ 11. You can set up new accounts using the bin/mysql_setpermission
+ script if you install the DBI and DBD::mysql Perl modules. See
+ Section 4.6.14, "mysql_setpermission --- Interactively Set
+ Permissions in Grant Tables." For Perl module installation
+ instructions, see Section 2.15, "Perl Installation Notes."
+ 12. If you would like to use mysqlaccess and have the MySQL
+ distribution in some nonstandard location, you must change the
+ location where mysqlaccess expects to find the mysql client.
+ Edit the bin/mysqlaccess script at approximately line 18.
+ Search for a line that looks like this:
+$MYSQL = '/usr/local/bin/mysql'; # path to mysql executable
+ Change the path to reflect the location where mysql actually
+ is stored on your system. If you do not do this, a Broken pipe
+ error will occur when you run mysqlaccess.
+
+ After everything has been unpacked and installed, you should test
+ your distribution. To start the MySQL server, use the following
+ command:
+shell> bin/mysqld_safe --user=mysql &
+
+ If you run the command as root, you must use the --user option as
+ shown. The value of the option is the name of the login account
+ that you created in the first step to use for running the server.
+ If you run the command while logged in as mysql, you can omit the
+ --user option.
+
+ If the command fails immediately and prints mysqld ended, you can
+ find some information in the host_name.err file in the data
+ directory.
+
+ More information about mysqld_safe is given in Section 4.3.2,
+ "mysqld_safe --- MySQL Server Startup Script."
+
+Note
+
+ The accounts that are listed in the MySQL grant tables initially
+ have no passwords. After starting the server, you should set up
+ passwords for them using the instructions in Section 2.13,
+ "Post-Installation Setup and Testing."
+
+2.3. MySQL Installation Using a Source Distribution
+
+ Before you proceed with an installation from source, first check
+ whether our binary is available for your platform and whether it
+ works for you. We put a great deal of effort into ensuring that
+ our binaries are built with the best possible options.
+
+ To obtain a source distribution for MySQL, Section 2.1.3, "How to
+ Get MySQL." If you want to build MySQL from source on Windows, see
+ Section 2.5.9, "Installing MySQL from Source on Windows."
+
+ MySQL source distributions are provided as compressed tar archives
+ and have names of the form mysql-VERSION.tar.gz, where VERSION is
+ a number like 5.1.50.
+
+ You need the following tools to build and install MySQL from
+ source:
+
+ * GNU gunzip to uncompress the distribution.
+
+ * A reasonable tar to unpack the distribution. GNU tar is known
+ to work. Some operating systems come with a preinstalled
+ version of tar that is known to have problems. For example,
+ the tar provided with early versions of Mac OS X, SunOS 4.x,
+ Solaris 8, Solaris 9, Solaris 10 and OpenSolaris, and HP-UX
+ are known to have problems with long file names. On Mac OS X,
+ you can use the preinstalled gnutar program. On Solaris 10 and
+ OpenSolaris you can use the preinstalled gtar. On other
+ systems with a deficient tar, you should install GNU tar
+ first.
+
+ * A working ANSI C++ compiler. GCC 3.2 or later, Sun Studio 10
+ or later, Visual Studio 2005 or later, and many current
+ vendor-supplied compilers are known to work.
+
+ * A good make program. GNU make is always recommended and is
+ sometimes required. (BSD make fails, and vendor-provided make
+ implementations may fail as well.) If you have problems, use
+ GNU make 3.75 or newer.
+
+ * libtool 1.5.24 or later is also recommended.
+
+ If you are using a version of gcc recent enough to understand the
+ -fno-exceptions option, it is very important that you use this
+ option. Otherwise, you may compile a binary that crashes randomly.
+ Also use -felide-constructors and -fno-rtti along with
+ -fno-exceptions. When in doubt, do the following:
+CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors \
+ -fno-exceptions -fno-rtti" ./configure \
+ --prefix=/usr/local/mysql --enable-assembler \
+ --with-mysqld-ldflags=-all-static
+
+ On most systems, this gives you a fast and stable binary.
+
+ If you run into problems and need to file a bug report, please use
+ the instructions in Section 1.7, "How to Report Bugs or Problems."
+
+2.3.1. Source Installation Overview
+
+ The basic commands that you must execute to install a MySQL source
+ distribution are:
+shell> groupadd mysql
+shell> useradd -g mysql mysql
+shell> gunzip < mysql-VERSION.tar.gz | tar -xvf -
+shell> cd mysql-VERSION
+shell> ./configure --prefix=/usr/local/mysql
+shell> make
+shell> make install
+shell> cp support-files/my-medium.cnf /etc/my.cnf
+shell> cd /usr/local/mysql
+shell> chown -R mysql .
+shell> chgrp -R mysql .
+shell> bin/mysql_install_db --user=mysql
+shell> chown -R root .
+shell> chown -R mysql var
+shell> bin/mysqld_safe --user=mysql &
+
+ If you start from a source RPM, do the following:
+shell> rpmbuild --rebuild --clean MySQL-VERSION.src.rpm
+
+ This makes a binary RPM that you can install. For older versions
+ of RPM, you may have to replace the command rpmbuild with rpm
+ instead.
+
+Note
+
+ This procedure does not set up any passwords for MySQL accounts.
+ After following the procedure, proceed to Section 2.13,
+ "Post-Installation Setup and Testing," for post-installation setup
+ and testing.
+
+ A more detailed version of the preceding description for
+ installing MySQL from a source distribution follows:
+
+ 1. Add a login user and group for mysqld to run as:
+shell> groupadd mysql
+shell> useradd -g mysql mysql
+ These commands add the mysql group and the mysql user. The
+ syntax for useradd and groupadd may differ slightly on
+ different versions of Unix, or they may have different names
+ such as adduser and addgroup.
+ You might want to call the user and group something else
+ instead of mysql. If so, substitute the appropriate name in
+ the following steps.
+
+ 2. Perform the following steps as the mysql user, except as
+ noted.
+
+ 3. Pick the directory under which you want to unpack the
+ distribution and change location into it.
+
+ 4. Obtain a distribution file using the instructions in Section
+ 2.1.3, "How to Get MySQL."
+
+ 5. Unpack the distribution into the current directory:
+shell> gunzip < /path/to/mysql-VERSION.tar.gz | tar xvf -
+ This command creates a directory named mysql-VERSION.
+ With GNU tar, no separate invocation of gunzip is necessary.
+ You can use the following alternative command to uncompress
+ and extract the distribution:
+shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
+
+ 6. Change location into the top-level directory of the unpacked
+ distribution:
+shell> cd mysql-VERSION
+ Note that currently you must configure and build MySQL from
+ this top-level directory. You cannot build it in a different
+ directory.
+
+ 7. Configure the release and compile everything:
+shell> ./configure --prefix=/usr/local/mysql
+shell> make
+ When you run configure, you might want to specify other
+ options. Run ./configure --help for a list of options. Section
+ 2.3.2, "Typical configure Options," discusses some of the more
+ useful options.
+ If configure fails and you are going to send mail to a MySQL
+ mailing list to ask for assistance, please include any lines
+ from config.log that you think can help solve the problem.
+ Also include the last couple of lines of output from
+ configure. To file a bug report, please use the instructions
+ in Section 1.7, "How to Report Bugs or Problems."
+ If the compile fails, see Section 2.3.4, "Dealing with
+ Problems Compiling MySQL," for help.
+
+ 8. Install the distribution:
+shell> make install
+ You might need to run this command as root.
+ If you want to set up an option file, use one of those present
+ in the support-files directory as a template. For example:
+shell> cp support-files/my-medium.cnf /etc/my.cnf
+ You might need to run this command as root.
+ If you want to configure support for InnoDB tables, you should
+ edit the /etc/my.cnf file, remove the # character before the
+ option lines that start with innodb_..., and modify the option
+ values to be what you want. See Section 4.2.3.3, "Using Option
+ Files," and Section 13.6.2, "InnoDB Configuration."
+
+ 9. Change location into the installation directory:
+shell> cd /usr/local/mysql
+ 10. If you ran the make install command as root, the installed
+ files will be owned by root. Ensure that the installation is
+ accessible to mysql by executing the following commands as
+ root in the installation directory:
+shell> chown -R mysql .
+shell> chgrp -R mysql .
+ The first command changes the owner attribute of the files to
+ the mysql user. The second changes the group attribute to the
+ mysql group.
+ 11. If you have not installed MySQL before, you must create the
+ MySQL data directory and initialize the grant tables:
+shell> bin/mysql_install_db --user=mysql
+ If you run the command as root, include the --user option as
+ shown. If you run the command while logged in as mysql, you
+ can omit the --user option.
+ The command should create the data directory and its contents
+ with mysql as the owner.
+ After using mysql_install_db to create the grant tables for
+ MySQL, you must restart the server manually. The mysqld_safe
+ command to do this is shown in a later step.
+ 12. Most of the MySQL installation can be owned by root if you
+ like. The exception is that the data directory must be owned
+ by mysql. To accomplish this, run the following commands as
+ root in the installation directory:
+shell> chown -R root .
+shell> chown -R mysql var
+ 13. If the plugin directory is writable by the server, it may be
+ possible for a user to write executable code to a file in the
+ directory using SELECT ... INTO DUMPFILE. This can be
+ prevented by making plugin_dir read only to the server or by
+ setting --secure-file-priv to a directory where SELECT writes
+ can be made safely.
+ 14. If you want MySQL to start automatically when you boot your
+ machine, you can copy support-files/mysql.server to the
+ location where your system has its startup files. More
+ information can be found in the support-files/mysql.server
+ script itself; see also Section 2.13.1.2, "Starting and
+ Stopping MySQL Automatically."
+ 15. You can set up new accounts using the bin/mysql_setpermission
+ script if you install the DBI and DBD::mysql Perl modules. See
+ Section 4.6.14, "mysql_setpermission --- Interactively Set
+ Permissions in Grant Tables." For Perl module installation
+ instructions, see Section 2.15, "Perl Installation Notes."
+
+ After everything has been installed, you should test your
+ distribution. To start the MySQL server, use the following
+ command:
+shell> /usr/local/mysql/bin/mysqld_safe --user=mysql &
+
+ If you run the command as root, you should use the --user option
+ as shown. The value of the option is the name of the login account
+ that you created in the first step to use for running the server.
+ If you run the command while logged in as that user, you can omit
+ the --user option.
+
+ If the command fails immediately and prints mysqld ended, you can
+ find some information in the host_name.err file in the data
+ directory.
+
+ More information about mysqld_safe is given in Section 4.3.2,
+ "mysqld_safe --- MySQL Server Startup Script."
+
+Note
+
+ The accounts that are listed in the MySQL grant tables initially
+ have no passwords. After starting the server, you should set up
+ passwords for them using the instructions in Section 2.13,
+ "Post-Installation Setup and Testing."
+
+2.3.2. Typical configure Options
+
+ The configure script gives you a great deal of control over how
+ you configure a MySQL source distribution. Typically you do this
+ using options on the configure command line. You can also affect
+ configure using certain environment variables. See Section 2.14,
+ "Environment Variables." For a full list of options supported by
+ configure, run this command:
+shell> ./configure --help
+
+ A list of the available configure options is provided in the table
+ below.
+
+ Table 2.1. Build (configure) Reference
+ Formats Description Default Introduced Removed
+ --bindir=DIR User executables EPREFIX/bin
+ --build=BUILD Configure for building on BUILD guessed
+ --cache-file=FILE Cache test results in FILE disabled
+ -C Alias for `--cache-file=config.cache'
+ --config-cache
+ --datadir=DIR Read-only architecture-independent data PREFIX/share
+
+ --disable-FEATURE Do not include FEATURE
+ --disable-dependency-tracking Disable dependency tracking
+ --disable-grant-options Disable GRANT options
+ --disable-largefile Omit support for large files
+ --disable-libtool-lock Disable libtool lock
+ --disable-thread-safe-client Compile the client without threads
+ 5.1.7
+ --enable-FEATURE Enable FEATURE
+ --enable-assembler Use assembler versions of some string functions
+ if available
+ --enable-debug-sync Compile in Debug Sync facility 5.1.41
+ --enable-dependency-tracking Do not reject slow dependency
+ extractors
+ --enable-fast-install Optimize for fast installation yes
+ --enable-local-infile Enable LOAD DATA LOCAL INFILE disabled
+ --enable-shared Build shared libraries yes
+ --enable-static Build static libraries yes
+ --enable-thread-safe-client Compile the client with threads
+ --exec-prefix=EPREFIX Install architecture-dependent files in
+ EPREFIX
+ -h Display this help and exit
+ --help
+ --help=short Display options specific to this package
+ --help=recursive Display the short help of all the included
+ packages
+ --host=HOST Cross-compile to build programs to run on HOST
+ --includedir=DIR C header files PREFIX/include
+ --infodir=DIR Info documentation PREFIX/info
+ --libdir=DIR Object code libraries EPREFIX/lib
+ --libexecdir=DIR Program executables EPREFIX/libexec
+ --localstatedir=DIR Modifiable single-machine data PREFIX/var
+ --mandir=DIR man documentation PREFIX/man
+ -n Do not create output files
+ --no-create
+ --oldincludedir=DIR C header files for non-gcc /usr/include
+ --prefix=PREFIX Install architecture-independent files in PREFIX
+
+ --program-prefix=PREFIX Prepend PREFIX to installed program names
+
+ --program-suffix=SUFFIX Append SUFFIX to installed program names
+
+ --program-transform-name=PROGRAM run sed PROGRAM on installed
+ program names
+ -q Do not print `checking...' messages
+ --quiet
+ --sbindir=DIR System administrative executables EPREFIX/sbin
+ --sharedstatedir=DIR Modifiable architecture-independent data
+ PREFIX/com
+ --srcdir=DIR Find the sources in DIR configure directory or ..
+ --sysconfdir=DIR Read-only single-machine data PREFIX/etc
+ --target=TARGET Configure for building compilers for TARGET
+ -V Display version information and exit
+ --version
+ --with-PACKAGE Use PACKAGE
+ --with-archive-storage-engine Enable the Archive Storage Engine no
+
+ --with-atomic-ops Implement atomic operations using pthread
+ rwlocks or atomic CPU instructions for multi-processor 5.1.12
+ --with-berkeley-db Use BerkeleyDB located in DIR no
+ --with-berkeley-db-includes Find Berkeley DB headers in DIR
+ --with-berkeley-db-libs Find Berkeley DB libraries in DIR
+ --with-big-tables Support tables with more than 4 G rows even on
+ 32 bit platforms
+ --with-blackhole-storage-engine Enable the Blackhole Storage
+ Engine no
+ --with-charset Default character set
+ --with-client-ldflags Extra linking arguments for clients
+ --with-collation Default collation
+ --with-comment Comment about compilation environment
+ --with-csv-storage-engine Enable the CSV Storage Engine yes
+ --with-darwin-mwcc Use Metrowerks CodeWarrior wrappers on OS
+ X/Darwin
+ --with-debug Add debug code 5.1.7
+ --with-debug=full Add debug code (adds memory checker, very slow)
+
+ --with-embedded-privilege-control Build parts to check user's
+ privileges (only affects embedded library)
+ --with-embedded-server Build the embedded server
+ --with-error-inject Enable error injection in MySQL Server
+ 5.1.11
+ --with-example-storage-engine Enable the Example Storage Engine no
+
+ --with-extra-charsets Use charsets in addition to default
+ --with-fast-mutexes Compile with fast mutexes enabled 5.1.5
+ --with-federated-storage-engine Enable federated storage engine no
+ 5.1.3 5.1.9
+ --with-gnu-ld Assume the C compiler uses GNU ld no
+ --with-innodb Enable innobase storage engine no 5.1.3 5.1.9
+ --with-lib-ccflags Extra CC options for libraries
+ --with-libwrap=DIR Compile in libwrap (tcp_wrappers) support
+ --with-low-memory Try to use less memory to compile to avoid
+ memory limitations
+ --with-machine-type Set the machine type, like "powerpc"
+ --with-max-indexes=N Sets the maximum number of indexes per table
+ 64
+ --with-mysqld-ldflags Extra linking arguments for mysqld
+ --with-mysqld-libs Extra libraries to link with for mysqld
+ --with-mysqld-user What user the mysqld daemon shall be run as
+
+ --with-mysqlmanager Build the mysqlmanager binary Build if server
+ is built
+ --with-named-curses-libs Use specified curses libraries
+ --with-named-thread-libs Use specified thread libraries
+ --with-ndb-ccflags Extra CC options for ndb compile
+ --with-ndb-docs Include the NDB Cluster ndbapi and mgmapi
+ documentation
+ --with-ndb-port Port for NDB Cluster management server
+ --with-ndb-port-base Port for NDB Cluster management server
+ --with-ndb-sci=DIR Provide MySQL with a custom location of sci
+ library
+ --with-ndb-test Include the NDB Cluster ndbapi test programs
+ --with-ndbcluster Include the NDB Cluster table handler no
+ --with-openssl=DIR Include the OpenSSL support
+ --with-openssl-includes Find OpenSSL headers in DIR
+ --with-openssl-libs Find OpenSSL libraries in DIR
+ --with-other-libc=DIR Link against libc and other standard
+ libraries installed in the specified nonstandard location
+ --with-pic Try to use only PIC/non-PIC objects Use both
+ --with-plugin-PLUGIN Forces the named plugin to be linked into
+ mysqld statically 5.1.11
+ --with-plugins Plugins to include in mysqld none 5.1.11
+ --with-pstack Use the pstack backtrace library
+ --with-pthread Force use of pthread library
+ --with-row-based-replication Include row-based replication 5.1.5
+ 5.1.6
+ --with-server-suffix Append value to the version string
+ --with-ssl=DIR Include SSL support 5.1.11
+ --with-system-type Set the system type, like "sun-solaris10"
+ --with-tags Include additional configurations automatic
+ --with-tcp-port Which port to use for MySQL services 3306
+ --with-unix-socket-path Where to put the unix-domain socket
+ --with-yassl Include the yaSSL support
+ --with-zlib-dir=no|bundled|DIR Provide MySQL with a custom
+ location of compression library
+ --without-PACKAGE Do not use PACKAGE
+ --without-bench Skip building of the benchmark suite
+ --without-debug Build a production version without debugging code
+
+ --without-docs Skip building of the documentation
+ --without-extra-tools Skip building utilities in the tools
+ directory
+ --without-geometry Do not build geometry-related parts
+ --without-libedit Use system libedit instead of bundled copy
+ --without-man Skip building of the man pages
+ --without-ndb-binlog Disable ndb binlog 5.1.6
+ --without-ndb-debug Disable special ndb debug features
+ --without-plugin-PLUGIN Exclude PLUGIN 5.1.11
+ --without-query-cache Do not build query cache
+ --without-readline Use system readline instead of bundled copy
+
+ --without-row-based-replication Don't include row-based
+ replication 5.1.7 5.1.14
+ --without-server Only build the client
+ --without-uca Skip building of the national Unicode collations
+
+ Some of the configure options available are described here. For
+ options that may be of use if you have difficulties building
+ MySQL, see Section 2.3.4, "Dealing with Problems Compiling MySQL."
+
+ * To compile just the MySQL client libraries and client programs
+ and not the server, use the --without-server option:
+shell> ./configure --without-server
+ If you have no C++ compiler, some client programs such as
+ mysql cannot be compiled because they require C++.. In this
+ case, you can remove the code in configure that tests for the
+ C++ compiler and then run ./configure with the
+ --without-server option. The compile step should still try to
+ build all clients, but you can ignore any warnings about files
+ such as mysql.cc. (If make stops, try make -k to tell it to
+ continue with the rest of the build even if errors occur.)
+
+ * If you want to build the embedded MySQL library (libmysqld.a),
+ use the --with-embedded-server option.
+
+ * If you do not want your log files and database directories
+ located under /usr/local/var, use a configure command
+ something like one of these:
+shell> ./configure --prefix=/usr/local/mysql
+shell> ./configure --prefix=/usr/local \
+ --localstatedir=/usr/local/mysql/data
+ The first command changes the installation prefix so that
+ everything is installed under /usr/local/mysql rather than the
+ default of /usr/local. The second command preserves the
+ default installation prefix, but overrides the default
+ location for database directories (normally /usr/local/var)
+ and changes it to /usr/local/mysql/data.
+ You can also specify the installation directory and data
+ directory locations at server startup time by using the
+ --basedir and --datadir options. These can be given on the
+ command line or in an MySQL option file, although it is more
+ common to use an option file. See Section 4.2.3.3, "Using
+ Option Files."
+
+ * This option specifies the port number on which the server
+ listens for TCP/IP connections. The default is port 3306. To
+ listen on a different port, use a configure command like this:
+shell> ./configure --with-tcp-port=3307
+
+ * If you are using Unix and you want the MySQL socket file
+ location to be somewhere other than the default location
+ (normally in the directory /tmp or /var/run), use a configure
+ command like this:
+shell> ./configure \
+ --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock
+ The socket file name must be an absolute path name. You can
+ also change the location of mysql.sock at server startup by
+ using a MySQL option file. See Section B.5.4.5, "How to
+ Protect or Change the MySQL Unix Socket File."
+
+ * If you want to compile statically linked programs (for
+ example, to make a binary distribution, to get better
+ performance, or to work around problems with some Red Hat
+ Linux distributions), run configure like this:
+shell> ./configure --with-client-ldflags=-all-static \
+ --with-mysqld-ldflags=-all-static
+
+ * If you are using gcc and do not have libg++ or libstdc++
+ installed, you can tell configure to use gcc as your C++
+ compiler:
+shell> CC=gcc CXX=gcc ./configure
+ When you use gcc as your C++ compiler, it does not attempt to
+ link in libg++ or libstdc++. This may be a good thing to do
+ even if you have those libraries installed. Some versions of
+ them have caused strange problems for MySQL users in the past.
+ The following list indicates some compilers and environment
+ variable settings that are commonly used with each one.
+
+ + gcc 2.7.2:
+CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors"
+
+ + gcc 2.95.2:
+CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro \
+-felide-constructors -fno-exceptions -fno-rtti"
+
+ + pgcc 2.90.29 or newer:
+CFLAGS="-O3 -mpentiumpro -mstack-align-double" CXX=gcc \
+CXXFLAGS="-O3 -mpentiumpro -mstack-align-double \
+-felide-constructors -fno-exceptions -fno-rtti"
+ In most cases, you can get a reasonably optimized MySQL binary
+ by using the options from the preceding list and adding the
+ following options to the configure line:
+--prefix=/usr/local/mysql --enable-assembler \
+--with-mysqld-ldflags=-all-static
+ The full configure line would, in other words, be something
+ like the following for all recent gcc versions:
+CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro \
+-felide-constructors -fno-exceptions -fno-rtti" ./configure \
+--prefix=/usr/local/mysql --enable-assembler \
+--with-mysqld-ldflags=-all-static
+ The binaries we provide on the MySQL Web site at
+ http://dev.mysql.com/downloads/ are all compiled with full
+ optimization and should be perfect for most users. See Section
+ 2.2, "Installing MySQL from Generic Binaries on Unix/Linux."
+ There are some configuration settings you can tweak to build
+ an even faster binary, but these are only for advanced users.
+ See Section 7.9.1, "How Compiling and Linking Affects the
+ Speed of MySQL."
+ If the build fails and produces errors about your compiler or
+ linker not being able to create the shared library
+ libmysqlclient.so.N (where N is a version number), you can
+ work around this problem by giving the --disable-shared option
+ to configure. In this case, configure does not build a shared
+ libmysqlclient.so.N library.
+
+ * By default, MySQL uses the latin1 (cp1252 West European)
+ character set. To change the default set, use the
+ --with-charset option:
+shell> ./configure --with-charset=CHARSET
+ CHARSET may be one of binary, armscii8, ascii, big5, cp1250,
+ cp1251, cp1256, cp1257, cp850, cp852, cp866, cp932, dec8,
+ eucjpms, euckr, gb2312, gbk, geostd8, greek, hebrew, hp8,
+ keybcs2, koi8r, koi8u, latin1, latin2, latin5, latin7, macce,
+ macroman, sjis, swe7, tis620, ucs2, ujis, utf8. (Additional
+ character sets might be available. Check the output from
+ ./configure --help for the current list.)
+ The default collation may also be specified. MySQL uses the
+ latin1_swedish_ci collation by default. To change this, use
+ the --with-collation option:
+shell> ./configure --with-collation=COLLATION
+ To change both the character set and the collation, use both
+ the --with-charset and --with-collation options. The collation
+ must be a legal collation for the character set. (Use the SHOW
+ COLLATION statement to determine which collations are
+ available for each character set.)
+ With the configure option --with-extra-charsets=LIST, you can
+ define which additional character sets should be compiled into
+ the server. LIST is one of the following:
+
+ + A list of character set names separated by spaces
+
+ + complex to include all character sets that can't be
+ dynamically loaded
+
+ + all to include all character sets into the binaries
+ Clients that want to convert characters between the server and
+ the client should use the SET NAMES statement. See Section
+ 5.1.4, "Server System Variables," and Section 9.1.4,
+ "Connection Character Sets and Collations."
+
+ * To configure MySQL with debugging code, use the --with-debug
+ option:
+shell> ./configure --with-debug
+ This causes a safe memory allocator to be included that can
+ find some errors and that provides output about what is
+ happening. See MySQL Internals: Porting
+ (http://forge.mysql.com/wiki/MySQL_Internals_Porting).
+ As of MySQL 5.1.12, using --with-debug to configure MySQL with
+ debugging support enables you to use the
+ --debug="d,parser_debug" option when you start the server.
+ This causes the Bison parser that is used to process SQL
+ statements to dump a parser trace to the server's standard
+ error output. Typically, this output is written to the error
+ log.
+
+ * To cause the Debug Sync facility to be compiled into the
+ server, use the --enable-debug-sync option. This facility is
+ used for testing and debugging. When compiled in, Debug Sync
+ is disabled by default. To enable it, start mysqld with the
+ --debug-sync-timeout=N option, where N is a timeout value
+ greater than 0. (The default value is 0, which disables Debug
+ Sync.) N becomes the default timeout for individual
+ synchronization points.
+ Debug Sync is also compiled in if you configure with the
+ --with-debug option (which implies --enable-debug-sync),
+ unless you also use the --disable-debug-sync option.
+ For a description of the Debug Sync facility and how to use
+ synchronization points, see MySQL Internals: Test
+ Synchronization
+ (http://forge.mysql.com/wiki/MySQL_Internals_Test_Synchronizat
+ ion).
+ The --enable-debug-sync and --disable-debug-sync options were
+ added in MySQL 5.1.41.
+
+ * If your client programs are using threads, you must compile a
+ thread-safe version of the MySQL client library with the
+ --enable-thread-safe-client configure option. This creates a
+ libmysqlclient_r library with which you should link your
+ threaded applications. See Section 21.9.16.2, "How to Make a
+ Threaded Client."
+
+ * Some features require that the server be built with
+ compression library support, such as the COMPRESS() and
+ UNCOMPRESS() functions, and compression of the client/server
+ protocol. The --with-zlib-dir=no|bundled|DIR option provides
+ control over compression library support. The value no
+ explicitly disables compression support. bundled causes the
+ zlib library bundled in the MySQL sources to be used. A DIR
+ path name specifies the directory in which to find the
+ compression library sources.
+
+ * It is possible to build MySQL with large table support using
+ the --with-big-tables option.
+ This option causes the variables that store table row counts
+ to be declared as unsigned long long rather than unsigned
+ long. This enables tables to hold up to approximately
+ 1.844E+19 ((2^32)^2) rows rather than 2^32 (~4.295E+09) rows.
+ Previously it was necessary to pass -DBIG_TABLES to the
+ compiler manually in order to enable this feature.
+
+ * Run configure with the --disable-grant-options option to cause
+ the --bootstrap, --skip-grant-tables, and --init-file options
+ for mysqld to be disabled. For Windows, the configure.js
+ script recognizes the DISABLE_GRANT_OPTIONS flag, which has
+ the same effect. The capability is available as of MySQL
+ 5.1.15.
+
+ * This option allows MySQL Community Server features to be
+ enabled. Additional options may be required for individual
+ features, such as --enable-profiling to enable statement
+ profiling. This option was added in MySQL 5.1.24. It is
+ enabled by default as of MySQL 5.1.28; to disable it, use
+ --disable-community-features.
+
+ * When given with --enable-community-features, the
+ --enable-profiling option enables the statement profiling
+ capability exposed by the SHOW PROFILE and SHOW PROFILES
+ statements. (See Section 12.4.5.33, "SHOW PROFILES Syntax.")
+ This option was added in MySQL 5.1.24. It is enabled by
+ default as of MySQL 5.1.28; to disable it, use
+ --disable-profiling.
+
+ * See Section 2.1, "General Installation Guidance," for options
+ that pertain to particular operating systems.
+
+ * See Section 5.5.6.2, "Using SSL Connections," for options that
+ pertain to configuring MySQL to support secure (encrypted)
+ connections.
+
+ * Several configure options apply to plugin selection and
+ building:
+--with-plugins=PLUGIN[,PLUGIN]...
+--with-plugins=GROUP
+--with-plugin-PLUGIN
+--without-plugin-PLUGIN
+ PLUGIN is an individual plugin name such as csv or archive.
+ As shorthand, GROUP is a configuration group name such as none
+ (select no plugins) or all (select all plugins).
+ You can build a plugin as static (compiled into the server) or
+ dynamic (built as a dynamic library that must be installed
+ using the INSTALL PLUGIN statement before it can be used).
+ Some plugins might not support static or dynamic build.
+ configure --help shows the following information pertaining to
+ plugins:
+
+ + The plugin-related options
+
+ + The names of all available plugins
+
+ + For each plugin, a description of its purpose, which
+ build types it supports (static or dynamic), and which
+ plugin groups it is a part of.
+ --with-plugins can take a list of one or more plugin names
+ separated by commas, or a plugin group name. The named plugins
+ are configured to be built as static plugins.
+ --with-plugin-PLUGIN configures the given plugin to be built
+ as a static plugin.
+ --without-plugin-PLUGIN disables the given plugin from being
+ built.
+ If a plugin is named both with a --with and --without option,
+ the result is undefined.
+ For any plugin that is not explicitly selected or disabled, it
+ is selected to be built dynamically if it supports dynamic
+ build, and not built if it does not support dynamic build.
+ (Thus, in the case that no plugin options are given, all
+ plugins that support dynamic build are selected to be built as
+ dynamic plugins. Plugins that do not support dynamic build are
+ not built.)
+
+2.3.3. Installing from the Development Source Tree
+
+Caution
+
+ You should read this section only if you are interested in helping
+ us test our new code. If you just want to get MySQL up and running
+ on your system, you should use a standard release distribution
+ (either a binary or source distribution).
+
+ To obtain the most recent development source tree, you must have
+ Bazaar installed. You can obtain Bazaar from the Bazaar VCS Web
+ site (http://bazaar-vcs.org). Bazaar is supported by any platform
+ that supports Python, and is therefore compatible with any Linux,
+ Unix, Windows or Mac OS X host. Instructions for downloading and
+ installing Bazaar on the different platforms are available on the
+ Bazaar Web site.
+
+ All MySQL projects are hosted on Launchpad
+ (http://launchpad.net/). MySQL projects, including MySQL server,
+ MySQL Workbench, and others are available from the Sun/MySQL
+ Engineering (http://launchpad.net/~mysql) page. For the
+ repositories related only to MySQL server, see the MySQL Server
+ (http://launchpad.net/mysql-server) page.
+
+ To build under Unix/Linux, you must have the following tools
+ installed:
+
+ * GNU make, available from http://www.gnu.org/software/make/.
+ Although some platforms come with their own make
+ implementations, it is highly recommended that you use GNU
+ make. It may already be available on your system as gmake.
+
+ * autoconf 2.58 (or newer), available from
+ http://www.gnu.org/software/autoconf/.
+
+ * automake 1.8.1, available from
+ http://www.gnu.org/software/automake/.
+
+ * libtool 1.5, available from
+ http://www.gnu.org/software/libtool/.
+
+ * m4, available from http://www.gnu.org/software/m4/.
+
+ * bison, available from http://www.gnu.org/software/bison/. You
+ should use the latest version of bison where possible. Version
+ 1.75 and version 2.1 are known to work. There have been
+ reported problems with bison 1.875. If you experience
+ problems, upgrade to a later, rather than earlier, version.
+ Versions of bison older than 1.75 may report this error:
+sql_yacc.yy:#####: fatal error: maximum table size (32767) exceeded
+ The maximum table size is not actually exceeded; the error is
+ caused by bugs in older versions of bison.
+
+ To build under Windows you must have Microsoft Visual C++ 2005
+ Express Edition, Visual Studio .Net 2003 (7.1), or Visual Studio
+ 2005 (8.0) compiler system.
+
+ Once the necessary tools are installed, you must create a local
+ branch of the MySQL source code on your machine:
+
+ 1. To obtain a copy of the MySQL source code, you must create a
+ new Bazaar branch. If you do not already have a Bazaar
+ repository directory set up, you need to initialize a new
+ directory:
+shell> mkdir mysql-server
+shell> bzr init-repo --trees mysql-server
+
+ 2. Once you have an initialized directory, you can branch from
+ the public MySQL server repositories to create a local source
+ tree. To create a branch of a specific version:
+shell> cd mysql-server
+shell> bzr branch lp:mysql-server/5.1 mysql-5.1
+
+ 3. The initial download will take some time to complete,
+ depending on the speed of your connection. Please be patient.
+ Once you have downloaded the first tree, additional trees
+ should take significantly less time to download.
+
+ 4. When building from the Bazaar branch, you may want to create a
+ copy of your active branch so that you can make configuration
+ and other changes without affecting the original branch
+ contents. You can achieve this by branching from the original
+ branch:
+shell> bzr branch mysql-5.1 mysql-5.1-build
+
+ 5. To obtain changes made after you have set up the branch
+ initially, update it using the pull option periodically. Use
+ this command in the top-level directory of the local copy:
+shell> bzr pull
+ You can examine the changeset comments for the tree by using
+ the log option to bzr:
+shell> bzr log
+ You can also browse changesets, comments, and source code
+ online. To browse this information for MySQL 5.1, go to the
+ Launchpad MySQL Server (http://launchpad.net/mysql-server)
+ page.
+ If you see diffs (changes) or code that you have a question
+ about, do not hesitate to send email to the MySQL internals
+ mailing list. See Section 1.6.1, "MySQL Mailing Lists." Also,
+ if you think you have a better idea on how to do something,
+ send an email message to the list with a patch.
+
+ After you have the local branch, you can build MySQL server from
+ the source code. On Windows, the build process is different from
+ Unix/Linux: see Section 2.5.9, "Installing MySQL from Source on
+ Windows."
+
+ On Unix/Linux, use the autoconf system to create the configure
+ script so that you can configure the build environment before
+ building. The following example shows the typical commands
+ required to build MySQL from a source tree.
+
+ 1. Change location to the top-level directory of the source tree;
+ replace mysql-5.1 with the appropriate directory name.
+shell> cd mysql-5.1
+
+ 2. Prepare the source tree for configuration.
+ Prior to MySQL 5.1.12, you must separately configure the
+ InnoDB storage engine. Run the following command from the main
+ source directory:
+shell> (cd storage/innobase; autoreconf --force --install)
+ You can omit the previous command for MySQL 5.1.12 and later,
+ or if you do not require InnoDB support.
+ Prepare the remainder of the source tree:
+shell> autoreconf --force --install
+ As an alternative to the preceding autoreconf command, you can
+ use BUILD/autorun.sh, which acts as a shortcut for the
+ following sequence of commands:
+shell> aclocal; autoheader
+shell> libtoolize --automake --force
+shell> automake --force --add-missing; autoconf
+ If you get some strange errors during this stage, verify that
+ you have the correct version of libtool installed.
+
+ 3. Configure the source tree and compile MySQL:
+shell> ./configure # Add your favorite options here
+shell> make
+ For a description of some configure options, see Section
+ 2.3.2, "Typical configure Options."
+ A collection of our standard configuration scripts is located
+ in the BUILD/ subdirectory. For example, you may find it more
+ convenient to use the BUILD/compile-pentium-debug script than
+ the preceding set of shell commands. To compile on a different
+ architecture, modify the script by removing flags that are
+ Pentium-specific, or use another script that may be more
+ appropriate. These scripts are provided on an "as-is" basis.
+ They are not officially maintained and their contents may
+ change from release to release.
+
+ 4. When the build is done, run make install. Be careful with this
+ on a production machine; the command may overwrite your live
+ release installation. If you already have MySQL installed and
+ do not want to overwrite it, run ./configure with values for
+ the --prefix, --with-tcp-port, and --with-unix-socket-path
+ options different from those used for your production server.
+
+ 5. Play hard with your new installation and try to make the new
+ features crash. Start by running make test. See Section
+ 22.1.2, "MySQL Test Suite."
+
+ 6. If you have gotten to the make stage, but the distribution
+ does not compile, please enter the problem into our bugs
+ database using the instructions given in Section 1.7, "How to
+ Report Bugs or Problems." If you have installed the latest
+ versions of the required GNU tools, and they crash trying to
+ process our configuration files, please report that also.
+ However, if you get a command not found error or a similar
+ problem for aclocal, configure, or other required tools, do
+ not report it. Instead, make sure that all the required tools
+ are installed and that your PATH variable is set correctly so
+ that your shell can find them.
+
+2.3.4. Dealing with Problems Compiling MySQL
+
+ All MySQL programs compile cleanly for us with no warnings on
+ Solaris or Linux using gcc. On other systems, warnings may occur
+ due to differences in system include files. See Section 2.3.5,
+ "MIT-pthreads Notes," for warnings that may occur when using
+ MIT-pthreads. For other problems, check the following list.
+
+ The solution to many problems involves reconfiguring. If you do
+ need to reconfigure, take note of the following:
+
+ * If configure is run after it has previously been run, it may
+ use information that was gathered during its previous
+ invocation. This information is stored in config.cache. When
+ configure starts up, it looks for that file and reads its
+ contents if it exists, on the assumption that the information
+ is still correct. That assumption is invalid when you
+ reconfigure.
+
+ * Each time you run configure, you must run make again to
+ recompile. However, you may want to remove old object files
+ from previous builds first because they were compiled using
+ different configuration options.
+
+ To prevent old configuration information or object files from
+ being used, run these commands before re-running configure:
+shell> rm config.cache
+shell> make clean
+
+ Alternatively, you can run make distclean.
+
+ The following list describes some of the problems when compiling
+ MySQL that have been found to occur most often:
+
+ * If you get errors such as the ones shown here when compiling
+ sql_yacc.cc, you probably have run out of memory or swap
+ space:
+Internal compiler error: program cc1plus got fatal signal 11
+Out of virtual memory
+Virtual memory exhausted
+ The problem is that gcc requires a huge amount of memory to
+ compile sql_yacc.cc with inline functions. Try running
+ configure with the --with-low-memory option:
+shell> ./configure --with-low-memory
+ This option causes -fno-inline to be added to the compile line
+ if you are using gcc and -O0 if you are using something else.
+ You should try the --with-low-memory option even if you have
+ so much memory and swap space that you think you can't
+ possibly have run out. This problem has been observed to occur
+ even on systems with generous hardware configurations, and the
+ --with-low-memory option usually fixes it.
+
+ * By default, configure picks c++ as the compiler name and GNU
+ c++ links with -lg++. If you are using gcc, that behavior can
+ cause problems during configuration such as this:
+configure: error: installation or configuration problem:
+C++ compiler cannot create executables.
+ You might also observe problems during compilation related to
+ g++, libg++, or libstdc++.
+ One cause of these problems is that you may not have g++, or
+ you may have g++ but not libg++, or libstdc++. Take a look at
+ the config.log file. It should contain the exact reason why
+ your C++ compiler didn't work. To work around these problems,
+ you can use gcc as your C++ compiler. Try setting the
+ environment variable CXX to "gcc -O3". For example:
+shell> CXX="gcc -O3" ./configure
+ This works because gcc compiles C++ source files as well as
+ g++ does, but does not link in libg++ or libstdc++ by default.
+ Another way to fix these problems is to install g++, libg++,
+ and libstdc++. However, do not use libg++ or libstdc++ with
+ MySQL because this only increases the binary size of mysqld
+ without providing any benefits. Some versions of these
+ libraries have also caused strange problems for MySQL users in
+ the past.
+
+ * If your compile fails with errors such as any of the
+ following, you must upgrade your version of make to GNU make:
+making all in mit-pthreads
+make: Fatal error in reader: Makefile, line 18:
+Badly formed macro assignment
+ Or:
+make: file `Makefile' line 18: Must be a separator (:
+ Or:
+pthread.h: No such file or directory
+ Solaris and FreeBSD are known to have troublesome make
+ programs.
+ GNU make 3.75 is known to work.
+
+ * If you want to define flags to be used by your C or C++
+ compilers, do so by adding the flags to the CFLAGS and
+ CXXFLAGS environment variables. You can also specify the
+ compiler names this way using CC and CXX. For example:
+shell> CC=gcc
+shell> CFLAGS=-O3
+shell> CXX=gcc
+shell> CXXFLAGS=-O3
+shell> export CC CFLAGS CXX CXXFLAGS
+ See Section 2.2, "Installing MySQL from Generic Binaries on
+ Unix/Linux," for a list of flag definitions that have been
+ found to be useful on various systems.
+
+ * If you get errors such as those shown here when compiling
+ mysqld, configure did not correctly detect the type of the
+ last argument to accept(), getsockname(), or getpeername():
+cxx: Error: mysqld.cc, line 645: In this statement, the referenced
+ type of the pointer value ''length'' is ''unsigned long'',
+ which is not compatible with ''int''.
+new_sock = accept(sock, (struct sockaddr *)&cAddr, &length);
+ To fix this, edit the config.h file (which is generated by
+ configure). Look for these lines:
+/* Define as the base type of the last arg to accept */
+#define SOCKET_SIZE_TYPE XXX
+ Change XXX to size_t or int, depending on your operating
+ system. (You must do this each time you run configure because
+ configure regenerates config.h.)
+
+ * The sql_yacc.cc file is generated from sql_yacc.yy. Normally,
+ the build process does not need to create sql_yacc.cc because
+ MySQL comes with a pre-generated copy. However, if you do need
+ to re-create it, you might encounter this error:
+"sql_yacc.yy", line xxx fatal: default action causes potential...
+ This is a sign that your version of yacc is deficient. You
+ probably need to install bison (the GNU version of yacc) and
+ use that instead.
+
+ * On Debian Linux 3.0, you need to install gawk instead of the
+ default mawk.
+
+ * If you need to debug mysqld or a MySQL client, run configure
+ with the --with-debug option, and then recompile and link your
+ clients with the new client library. See MySQL Internals:
+ Porting (http://forge.mysql.com/wiki/MySQL_Internals_Porting).
+
+ * If you get a compilation error on Linux (for example, SuSE
+ Linux 8.1 or Red Hat Linux 7.3) similar to the following one,
+ you probably do not have g++ installed:
+libmysql.c:1329: warning: passing arg 5 of `gethostbyname_r' from
+incompatible pointer type
+libmysql.c:1329: too few arguments to function `gethostbyname_r'
+libmysql.c:1329: warning: assignment makes pointer from integer
+without a cast
+make[2]: *** [libmysql.lo] Error 1
+ By default, the configure script attempts to determine the
+ correct number of arguments by using g++ (the GNU C++
+ compiler). This test yields incorrect results if g++ is not
+ installed. There are two ways to work around this problem:
+
+ + Make sure that the GNU C++ g++ is installed. On some
+ Linux distributions, the required package is called gpp;
+ on others, it is named gcc-c++.
+
+ + Use gcc as your C++ compiler by setting the CXX
+ environment variable to gcc:
+export CXX="gcc"
+ You must run configure again after making either of those
+ changes.
+
+2.3.5. MIT-pthreads Notes
+
+ This section describes some of the issues involved in using
+ MIT-pthreads.
+
+ On Linux, you should not use MIT-pthreads. Use the installed
+ LinuxThreads implementation instead. See Section 2.6, "Installing
+ MySQL on Linux."
+
+ If your system does not provide native thread support, you should
+ build MySQL using the MIT-pthreads package. This includes older
+ FreeBSD systems, SunOS 4.x, Solaris 2.4 and earlier, and some
+ others. See Section 2.1, "General Installation Guidance."
+
+ MIT-pthreads is not part of the MySQL 5.1 source distribution. If
+ you require this package, you need to download it separately from
+ http://dev.mysql.com/Downloads/Contrib/pthreads-1_60_beta6-mysql.t
+ ar.gz
+
+ After downloading, extract this source archive into the top level
+ of the MySQL source directory. It creates a new subdirectory named
+ mit-pthreads.
+
+ * On most systems, you can force MIT-pthreads to be used by
+ running configure with the --with-mit-threads option:
+shell> ./configure --with-mit-threads
+ Building in a nonsource directory is not supported when using
+ MIT-pthreads because we want to minimize our changes to this
+ code.
+
+ * The checks that determine whether to use MIT-pthreads occur
+ only during the part of the configuration process that deals
+ with the server code. If you have configured the distribution
+ using --without-server to build only the client code, clients
+ do not know whether MIT-pthreads is being used and use Unix
+ socket file connections by default. Because Unix socket files
+ do not work under MIT-pthreads on some platforms, this means
+ you need to use -h or --host with a value other than localhost
+ when you run client programs.
+
+ * When MySQL is compiled using MIT-pthreads, system locking is
+ disabled by default for performance reasons. You can tell the
+ server to use system locking with the --external-locking
+ option. This is needed only if you want to be able to run two
+ MySQL servers against the same data files, but that is not
+ recommended, anyway.
+
+ * Sometimes the pthread bind() command fails to bind to a socket
+ without any error message (at least on Solaris). The result is
+ that all connections to the server fail. For example:
+shell> mysqladmin version
+mysqladmin: connect to server at '' failed;
+error: 'Can't connect to mysql server on localhost (146)'
+ The solution to this problem is to kill the mysqld server and
+ restart it. This has happened to us only when we have forcibly
+ stopped the server and restarted it immediately.
+
+ * With MIT-pthreads, the sleep() system call isn't interruptible
+ with SIGINT (break). This is noticeable only when you run
+ mysqladmin --sleep. You must wait for the sleep() call to
+ terminate before the interrupt is served and the process
+ stops.
+
+ * When linking, you might receive warning messages like these
+ (at least on Solaris); they can be ignored:
+ld: warning: symbol `_iob' has differing sizes:
+ (file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4;
+file /usr/lib/libc.so value=0x140);
+ /my/local/pthreads/lib/libpthread.a(findfp.o) definition taken
+ld: warning: symbol `__iob' has differing sizes:
+ (file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4;
+file /usr/lib/libc.so value=0x140);
+ /my/local/pthreads/lib/libpthread.a(findfp.o) definition taken
+
+ * Some other warnings also can be ignored:
+implicit declaration of function `int strtoll(...)'
+implicit declaration of function `int strtoul(...)'
+
+ * We have not been able to make readline work with MIT-pthreads.
+ (This is not necessary, but may be of interest to some.)
+
+2.4. Upgrading or Downgrading MySQL
+
+2.4.1. Upgrading MySQL
+
+ As a general rule, to upgrade from one release series to another,
+ you should go to the next series rather than skipping a series. To
+ upgrade from a release series previous to MySQL 5.0, upgrade to
+ each successive release series in turn until you have reached
+ MySQL 5.0, and then proceed with the upgrade to MySQL 5.1. For
+ example, if you currently are running MySQL 4.1 and wish to
+ upgrade to a newer series, upgrade to MySQL 5.0 first before
+ upgrading to 5.1, and so forth. For information on upgrading to
+ MySQL 5.0, see the MySQL 5.0 Reference Manual; for earlier
+ releases, see the MySQL 3.23, 4.0, 4.1 Reference Manual.
+
+ If you perform a binary (in-place) upgrade without dumping and
+ reloading tables, you cannot upgrade directly from MySQL 4.1 to
+ 5.1. This occurs due to an incompatible change in the MyISAM table
+ index format in MySQL 5.0. Upgrade from MySQL 4.1 to 5.0 and
+ repair all MyISAM tables (see Section 2.4.4, "Rebuilding or
+ Repairing Tables or Indexes"). Then upgrade from MySQL 5.0 to 5.1
+ and check and repair your tables.
+
+ To upgrade from MySQL 5.0 to 5.1, use the items in the following
+ checklist as a guide:
+
+ * Before any upgrade, back up your databases, including the
+ mysql database that contains the grant tables. See Section
+ 6.2, "Database Backup Methods."
+
+ * Read all the notes in Section 2.4.1.1, "Upgrading from MySQL
+ 5.0 to 5.1." These notes enable you to identify upgrade issues
+ that apply to your current MySQL installation. Some
+ incompatibilities discussed in that section require your
+ attention before upgrading. Others should be dealt with after
+ upgrading.
+
+ * Read Appendix C, "MySQL Change History" as well, which
+ provides information about features that are new in MySQL 5.1
+ or differ from those found in MySQL 5.0.
+
+ * After upgrading to a new version of MySQL, run mysql_upgrade
+ (see Section 4.4.8, "mysql_upgrade --- Check Tables for MySQL
+ Upgrade"). This program checks your tables, and attempts to
+ repair them if necessary. It also updates your grant tables to
+ make sure that they have the current structure so that you can
+ take advantage of any new capabilities. (Some releases of
+ MySQL introduce changes to the structure of the grant tables
+ to add new privileges or features.)
+ mysql_upgrade does not upgrade the contents of the help
+ tables. For upgrade instructions, see Section 5.1.8,
+ "Server-Side Help."
+
+ * If you run MySQL Server on Windows, see Section 2.5.7,
+ "Upgrading MySQL on Windows."
+
+ * If you use replication, see Section 16.4.3, "Upgrading a
+ Replication Setup," for information on upgrading your
+ replication setup.
+
+ * If you upgrade an installation originally produced by
+ installing multiple RPM packages, it is best to upgrade all
+ the packages, not just some. For example, if you previously
+ installed the server and client RPMs, do not upgrade just the
+ server RPM.
+
+ * As of MySQL 5.1.9, the mysqld-max server is included in binary
+ distributions. There is no separate MySQL-Max distribution. As
+ of MySQL 5.1.12, there is no mysqld-max server at all in
+ binary distributions. They contain a server that includes the
+ features previously included in mysqld-max.
+
+ * If you have created a user-defined function (UDF) with a given
+ name and upgrade MySQL to a version that implements a new
+ built-in function with the same name, the UDF becomes
+ inaccessible. To correct this, use DROP FUNCTION to drop the
+ UDF, and then use CREATE FUNCTION to re-create the UDF with a
+ different nonconflicting name. The same is true if the new
+ version of MySQL implements a built-in function with the same
+ name as an existing stored function. See Section 8.2.4,
+ "Function Name Parsing and Resolution," for the rules
+ describing how the server interprets references to different
+ kinds of functions.
+
+ You can always move the MySQL format files and data files between
+ different versions on systems with the same architecture as long
+ as you stay within versions for the same release series of MySQL.
+
+ If you are cautious about using new versions, you can always
+ rename your old mysqld before installing a newer one. For example,
+ if you are using MySQL 5.0.13 and want to upgrade to 5.1.10,
+ rename your current server from mysqld to mysqld-5.0.13. If your
+ new mysqld then does something unexpected, you can simply shut it
+ down and restart with your old mysqld.
+
+ If, after an upgrade, you experience problems with compiled client
+ programs, such as Commands out of sync or unexpected core dumps,
+ you probably have used old header or library files when compiling
+ your programs. In this case, you should check the date for your
+ mysql.h file and libmysqlclient.a library to verify that they are
+ from the new MySQL distribution. If not, recompile your programs
+ with the new headers and libraries. Recompilation might also be
+ necessary for programs compiled against the shared client library
+ if the library major version number has changed (for example from
+ libmysqlclient.so.15 to libmysqlclient.so.16.
+
+ If problems occur, such as that the new mysqld server does not
+ start or that you cannot connect without a password, verify that
+ you do not have an old my.cnf file from your previous
+ installation. You can check this with the --print-defaults option
+ (for example, mysqld --print-defaults). If this command displays
+ anything other than the program name, you have an active my.cnf
+ file that affects server or client operation.
+
+ If your MySQL installation contains a large amount of data that
+ might take a long time to convert after an in-place upgrade, you
+ might find it useful to create a "dummy" database instance for
+ assessing what conversions might be needed and the work involved
+ to perform them. Make a copy of your MySQL instance that contains
+ a full copy of the mysql database, plus all other databases
+ without data. Run your upgrade procedure on this dummy instance to
+ see what actions might be needed so that you can better evaluate
+ the work involved when performing actual data conversion on your
+ original database instance.
+
+ It is a good idea to rebuild and reinstall the Perl DBD::mysql
+ module whenever you install a new release of MySQL. The same
+ applies to other MySQL interfaces as well, such as PHP mysql
+ extensions and the Python MySQLdb module.
+
+2.4.1.1. Upgrading from MySQL 5.0 to 5.1
+
+ After upgrading a 5.0 installation to 5.0.10 or above, it is
+ necessary to upgrade your grant tables. Otherwise, creating stored
+ procedures and functions might not work. To perform this upgrade,
+ run mysql_upgrade.
+
+Note
+
+ It is good practice to back up your data before installing any new
+ version of software. Although MySQL works very hard to ensure a
+ high level of quality, you should protect your data by making a
+ backup.
+
+ To upgrade to 5.1 from any previous version, MySQL recommends that
+ you dump your tables with mysqldump before upgrading and reload
+ the dump file after upgrading.
+
+ If you perform a binary (in-place) upgrade without dumping and
+ reloading tables, you cannot upgrade directly from MySQL 4.1 to
+ 5.1. This occurs due to an incompatible change in the MyISAM table
+ index format in MySQL 5.0. Upgrade from MySQL 4.1 to 5.0 and
+ repair all MyISAM tables (see Section 2.4.4, "Rebuilding or
+ Repairing Tables or Indexes"). Then upgrade from MySQL 5.0 to 5.1
+ and check and repair your tables.
+
+ In general, you should do the following when upgrading from MySQL
+ 5.0 to 5.1:
+
+ * Read all the items in the following sections to see whether
+ any of them might affect your applications:
+
+ + Section 2.4.1, "Upgrading MySQL," has general update
+ information.
+
+ + The items in the change lists found later in this section
+ enable you to identify upgrade issues that apply to your
+ current MySQL installation.
+
+ + The MySQL 5.1 change history describes significant new
+ features you can use in 5.1 or that differ from those
+ found in MySQL 5.0. Some of these changes may result in
+ incompatibilities. See Section C.1, "Changes in Release
+ 5.1.x (Production)."
+ Note particularly any changes that are marked Known issue or
+ Incompatible change. These incompatibilities with earlier
+ versions of MySQL may require your attention before you
+ upgrade. Our aim is to avoid these changes, but occasionally
+ they are necessary to correct problems that would be worse
+ than an incompatibility between releases. If any upgrade issue
+ applicable to your installation involves an incompatibility
+ that requires special handling, follow the instructions given
+ in the incompatibility description. Often this will involve
+ dumping and reloading tables, or use of a statement such as
+ CHECK TABLE or REPAIR TABLE.
+ For dump and reload instructions, see Section 2.4.4,
+ "Rebuilding or Repairing Tables or Indexes." Any procedure
+ that involves REPAIR TABLE with the USE_FRM option must be
+ done before upgrading. Use of this statement with a version of
+ MySQL different from the one used to create the table (that
+ is, using it after upgrading) may damage the table. See
+ Section 12.4.2.6, "REPAIR TABLE Syntax."
+
+ * Before upgrading to a new version of MySQL, Section 2.4.3,
+ "Checking Whether Tables or Indexes Must Be Rebuilt," to see
+ whether changes to table formats or to character sets or
+ collations were made between your current version of MySQL and
+ the version to which you are upgrading. If so and these
+ changes result in an incompatibility between MySQL versions,
+ you will need to upgrade the affected tables using the
+ instructions in Section 2.4.4, "Rebuilding or Repairing Tables
+ or Indexes."
+
+ * After upgrading to a new version of MySQL, run mysql_upgrade
+ (see Section 4.4.8, "mysql_upgrade --- Check Tables for MySQL
+ Upgrade"). This program checks your tables, and attempts to
+ repair them if necessary. It also updates your grant tables to
+ make sure that they have the current structure so that you can
+ take advantage of any new capabilities. (Some releases of
+ MySQL introduce changes to the structure of the grant tables
+ to add new privileges or features.)
+ mysql_upgrade does not upgrade the contents of the help
+ tables. For upgrade instructions, see Section 5.1.8,
+ "Server-Side Help."
+
+ * If you run MySQL Server on Windows, see Section 2.5.7,
+ "Upgrading MySQL on Windows."
+
+ * If you use replication, see Section 16.4.3, "Upgrading a
+ Replication Setup," for information on upgrading your
+ replication setup.
+
+ If your MySQL installation contains a large amount of data that
+ might take a long time to convert after an in-place upgrade, you
+ might find it useful to create a "dummy" database instance for
+ assessing what conversions might be needed and the work involved
+ to perform them. Make a copy of your MySQL instance that contains
+ a full copy of the mysql database, plus all other databases
+ without data. Run your upgrade procedure on this dummy instance to
+ see what actions might be needed so that you can better evaluate
+ the work involved when performing actual data conversion on your
+ original database instance.
+
+ MySQL Enterprise MySQL Enterprise subscribers will find more
+ information about upgrading in the Knowledge Base articles found
+ at Upgrading
+ (https://kb.mysql.com/search.php?cat=search&category=41). Access
+ to the MySQL Knowledge Base collection of articles is one of the
+ advantages of subscribing to MySQL Enterprise. For more
+ information, see
+ http://www.mysql.com/products/enterprise/advisors.html.
+
+ The following lists describe changes that may affect applications
+ and that you should watch out for when upgrading from MySQL 5.0 to
+ 5.1.
+
+ Configuration Changes:
+
+ * Before MySQL 5.1.11, to build MySQL from source with SSL
+ support enabled, you would invoke configure with either the
+ --with-openssl or --with-yassl option. In MySQL 5.1.11, those
+ options both have been replaced by the --with-ssl option. By
+ default, --with-ssl causes the bundled yaSSL library to be
+ used. To select OpenSSL instead, give the option as
+ --with-ssl=path, where path is the directory where the OpenSSL
+ header files and libraries are located.
+
+ Server Changes:
+
+ * Known issue: After a binary upgrade to MySQL 5.1 from a MySQL
+ 5.0 installation that contains ARCHIVE tables, accessing those
+ tables will cause the server to crash, even if you have run
+ mysql_upgrade or CHECK TABLE ... FOR UPGRADE. To work around
+ this problem, use mysqldump to dump all ARCHIVE tables before
+ upgrading, and reload them into MySQL 5.1 after upgrading.
+
+ * Known issue: The fix for
+ Bug#23491: http://bugs.mysql.com/bug.php?id=23491 introduced a
+ problem with SHOW CREATE VIEW, which is used by mysqldump.
+ This causes an incompatibility when upgrading from versions
+ affected by that bug fix (MySQL 5.0.40 through 5.0.43, MySQL
+ 5.1.18 through 5.1.19): If you use mysqldump before upgrading
+ from an affected version and reload the data after upgrading
+ to a higher version, you must drop and recreate your views.
+
+ * Known issue: Dumps performed by using mysqldump to generate a
+ dump file before the upgrade and reloading the file after
+ upgrading are subject to the following problem:
+ Before MySQL 5.0.40, mysqldump displays SPATIAL index
+ definitions using prefix lengths for the indexed columns.
+ These prefix lengths are accepted in MySQL 5.0, but not as of
+ MySQL 5.1. If you use mysqldump from versions of MySQL older
+ than 5.0.40, any table containing SPATIAL indexes will cause
+ an error when the dump file is reloaded into MySQL 5.1 or
+ higher.
+ For example, a table definition might look like this when
+ dumped in MySQL 5.0:
+CREATE TABLE `t` (
+ `g` geometry NOT NULL,
+ SPATIAL KEY `g` (`g`(32))
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+ The SPATIAL index definition will not be accepted in MySQL
+ 5.1. To work around this, edit the dump file to remove the
+ prefix:
+CREATE TABLE `t` (
+ `g` geometry NOT NULL,
+ SPATIAL KEY `g` (`g`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+ Dump files can be large, so it may be preferable to dump table
+ definitions and data separately to make it easier to edit the
+ definitions:
+shell> mysqldump --no-data other_args > definitions.sql
+shell> mysqldump --no-create-info other_args > data.sql
+ Then edit definitions.sql before reloading definitions.sql and
+ data.sql, in that order.
+ If you upgrade to a version of MySQL 5.0 higher than 5.0.40
+ before upgrading to MySQL 5.1, this problem does not occur.
+
+ * Known issue: Before MySQL 5.1.30, the CHECK TABLE ... FOR
+ UPGRADE statement did not check for incompatible collation
+ changes made in MySQL 5.1.24. (This also affects mysqlcheck
+ and mysql_upgrade, which cause that statement to be executed.)
+ Prior to the fix made in 5.1.30, a binary upgrade (performed
+ without dumping tables with mysqldump before the upgrade and
+ reloading the dump file after the upgrade) would corrupt
+ tables. After the fix, CHECK TABLE ... FOR UPGRADE properly
+ detects the problem and warns about tables that need repair.
+ However, the fix is not backward compatible and can result in
+ a downgrading problem under these circumstances:
+
+ 1. Perform a binary upgrade to a version of MySQL that
+ includes the fix.
+
+ 2. Run CHECK TABLE ... FOR UPGRADE (or mysqlcheck or
+ mysql_upgrade) to upgrade tables.
+
+ 3. Perform a binary downgrade to a version of MySQL that
+ does not include the fix.
+ The solution is to dump tables with mysqldump before the
+ downgrade and reload the dump file after the downgrade.
+ Alternatively, drop and recreate affected indexes.
+
+ * Known issue: MySQL introduces encoding for table names that
+ have non-ASCII characters (see Section 8.2.3, "Mapping of
+ Identifiers to File Names"). After a binary upgrade from MySQL
+ 5.0 to 5.1 or higher, the server recognizes names that have
+ non-ASCII characters and adds a #mysql50# prefix to them.
+ As of MySQL 5.1.31, mysql_upgrade encodes these names by
+ executing the following command:
+mysqlcheck --all-databases --check-upgrade --fix-db-names --fix-table
+-names
+ Prior to MySQL 5.1.31, mysql_upgrade does not execute this
+ command, so you should execute it manually if you have
+ database or table names that contain nonalphanumeric
+ characters.
+ Prior to MySQL 5.1.23, the mysqlcheck command does not perform
+ the name encoding for views. To work around this problem, drop
+ each affected view and recreate it.
+ mysqlcheck cannot fix names that contain literal instances of
+ the @ character that is used for encoding special characters.
+ If you have databases or tables that contain this character,
+ use mysqldump to dump them before upgrading to MySQL 5.1, and
+ then reload the dump file after upgrading.
+
+ * Known issue: When upgrading from MySQL 5.0 to versions of 5.1
+ prior to 5.1.23, running mysqlcheck (or mysql_upgrade, which
+ runs mysqlcheck) to upgrade tables fails for names that must
+ be written as quoted identifiers. To work around this problem,
+ rename each affected table to a name that does not require
+ quoting:
+RENAME TABLE `tab``le_a` TO table_a;
+RENAME TABLE `table b` TO table_b;
+ After renaming the tables, run the mysql_upgrade program. Then
+ rename the tables back to their original names:
+RENAME TABLE table_a TO `tab``le_a`;
+RENAME TABLE table_b TO `table b`;
+
+ * Known issue: In connection with view creation, the server
+ created arc directories inside database directories and
+ maintained useless copies of .frm files there. Creation and
+ renaming procedures of those copies as well as creation of arc
+ directories has been discontinued in MySQL 5.1.29.
+ This change does cause a problem when downgrading to older
+ server versions which manifests itself under these
+ circumstances:
+
+ 1. Create a view v_orig in MySQL 5.1.29 or higher.
+
+ 2. Rename the view to v_new and then back to v_orig.
+
+ 3. Downgrade to an older 5.1.x server and run mysql_upgrade.
+
+ 4. Try to rename v_orig to v_new again. This operation
+ fails.
+ As a workaround to avoid this problem, use either of these
+ approaches:
+
+ + Dump your data using mysqldump before downgrading and
+ reload the dump file after downgrading.
+
+ + Instead of renaming a view after the downgrade, drop it
+ and recreate it.
+
+ * Incompatible change: Character set or collation changes were
+ made in MySQL 5.1.21, 5.1.23, and 5.1.24 that may require
+ table indexes to be rebuilt. For details, see Section 2.4.3,
+ "Checking Whether Tables or Indexes Must Be Rebuilt."
+
+ * Incompatible change: MySQL 5.1 implements support for a plugin
+ API that enables the loading and unloading of components at
+ runtime, without restarting the server. Section 22.2, "The
+ MySQL Plugin API." The plugin API requires the mysql.plugin
+ table. After upgrading from an older version of MySQL, you
+ should run the mysql_upgrade command to create this table. See
+ Section 4.4.8, "mysql_upgrade --- Check Tables for MySQL
+ Upgrade."
+ Plugins are installed in the directory named by the plugin_dir
+ system variable. This variable also controls the location from
+ which the server loads user-defined functions (UDFs), which is
+ a change from earlier versions of MySQL. That is, all UDF
+ library files now must be installed in the plugin directory.
+ When upgrading from an older version of MySQL, you must
+ migrate your UDF files to the plugin directory.
+
+ * Incompatible change: The table_cache system variable has been
+ renamed to table_open_cache. Any scripts that refer to
+ table_cache must be updated to use the new name.
+
+ * Incompatible change: In MySQL 5.1.36, options for loading
+ plugins such as pluggable storage engines were changed from
+ boolean to tristate format. The implementations overlap, but
+ if you previously used options of the form --plugin_name=0 or
+ --plugin_name=1, you should instead use --plugin_name=OFF or
+ --plugin_name=ON, respectively. For details, see Section
+ 5.1.3, "Server Options for Loading Plugins."
+
+ * Incompatible change: From MySQL 5.1.24 to 5.1.31, the UPDATE
+ statement was changed such that assigning NULL to a NOT NULL
+ column caused an error even when strict SQL mode was not
+ enabled. The original behavior before MySQL 5.1.24 was that
+ such assignments caused an error only in strict SQL mode, and
+ otherwise set the column to the implicit default value for the
+ column data type and generated a warning. (For information
+ about implicit default values, see Section 10.1.4, "Data Type
+ Default Values.")
+ The change caused compatibility problems for applications that
+ relied on the original behavior. It also caused replication
+ problems between servers that had the original behavior and
+ those that did not, for applications that assigned NULL to NOT
+ NULL columns in UPDATE statements without strict SQL mode
+ enabled. The change was reverted in MySQL 5.1.32 so that
+ UPDATE again had the original behavior. Problems can still
+ occur if you replicate between servers that have the modified
+ UPDATE behavior and those that do not.
+
+ * Incompatible change: As of MySQL 5.1.29, the default binary
+ logging mode has been changed from MIXED to STATEMENT for
+ compatibility with MySQL 5.0.
+
+ * Incompatible change: In MySQL 5.1.25, a change was made to the
+ way that the server handles prepared statements. This affects
+ prepared statements processed at the SQL level (using the
+ PREPARE statement) and those processed using the binary
+ client-server protocol (using the mysql_stmt_prepare() C API
+ function).
+ Previously, changes to metadata of tables or views referred to
+ in a prepared statement could cause a server crash when the
+ statement was next executed, or perhaps an error at execute
+ time with a crash occurring later. For example, this could
+ happen after dropping a table and recreating it with a
+ different definition.
+ Now metadata changes to tables or views referred to by
+ prepared statements are detected and cause automatic
+ repreparation of the statement when it is next executed.
+ Metadata changes occur for DDL statements such as those that
+ create, drop, alter, rename, or truncate tables, or that
+ analyze, optimize, or repair tables. Repreparation also occurs
+ after referenced tables or views are flushed from the table
+ definition cache, either implicitly to make room for new
+ entries in the cache, or explicitly due to FLUSH TABLES.
+ Repreparation is automatic, but to the extent that it occurs,
+ performance of prepared statements is diminished.
+ Table content changes (for example, with INSERT or UPDATE) do
+ not cause repreparation, nor do SELECT statements.
+ An incompatibility with previous versions of MySQL is that a
+ prepared statement may now return a different set of columns
+ or different column types from one execution to the next. For
+ example, if the prepared statement is SELECT * FROM t1,
+ altering t1 to contain a different number of columns causes
+ the next execution to return a number of columns different
+ from the previous execution.
+ Older versions of the client library cannot handle this change
+ in behavior. For applications that use prepared statements
+ with the new server, an upgrade to the new client library is
+ strongly recommended.
+ Along with this change to statement repreparation, the default
+ value of the table_definition_cache system variable has been
+ increased from 128 to 256. The purpose of this increase is to
+ lessen the chance that prepared statements will need
+ repreparation due to referred-to tables/views having been
+ flushed from the cache to make room for new entries.
+ A new status variable, Com_stmt_reprepare, has been introduced
+ to track the number of repreparations.
+
+ * Incompatible change: As of MySQL 5.1.23, within a stored
+ routine, it is no longer permissible to declare a cursor for a
+ SHOW or DESCRIBE statement. This happened to work in some
+ instances, but is no longer supported. In many cases, a
+ workaround for this change is to use the cursor with a SELECT
+ query to read from an INFORMATION_SCHEMA table that produces
+ the same information as the SHOW statement.
+
+ * Incompatible change: SHOW CREATE VIEW displays view
+ definitions using an AS alias_name clause for each column. If
+ a column is created from an expression, the default alias is
+ the expression text, which can be quite long. As of MySQL
+ 5.1.23, aliases for column names in CREATE VIEW statements are
+ checked against the maximum column length of 64 characters
+ (not the maximum alias length of 256 characters). As a result,
+ views created from the output of SHOW CREATE VIEW fail if any
+ column alias exceeds 64 characters. This can cause problems
+ for replication or loading dump files. For additional
+ information and workarounds, see Section D.4, "Restrictions on
+ Views."
+
+ * Incompatible change: Several issues were identified for stored
+ programs (stored procedures and functions, triggers, and
+ events) and views containing non-ASCII symbols. These issues
+ involved conversion errors due to incomplete character set
+ information when translating these objects to and from stored
+ format.
+ To address these problems, the representation for these
+ objects was changed in MySQL 5.1.21. However, the fixes affect
+ all stored programs and views. (For example, you will see
+ warnings about "no creation context.") To avoid warnings from
+ the server about the use of old definitions from any release
+ prior to 5.1.21, you should dump stored programs and views
+ with mysqldump after upgrading to 5.1.21 or higher, and then
+ reload them to recreate them with new definitions. Invoke
+ mysqldump with a --default-character-set option that names the
+ non-ASCII character set that was used for the definitions when
+ the objects were originally defined.
+
+ * Incompatible change: As of MySQL 5.1.20, mysqld_safe supports
+ error logging to syslog on systems that support the logger
+ command. The new --syslog and --skip-syslog options can be
+ used instead of the --log-error option to control logging
+ behavior, as described in Section 4.3.2, "mysqld_safe ---
+ MySQL Server Startup Script."
+ In 5.1.21 and up, the default is --skip-syslog, which is
+ compatible with the default behavior of writing an error log
+ file for releases prior to 5.1.20.
+ In 5.1.20 only, the following conditions apply: 1) The default
+ is to use syslog, which is not compatible with releases prior
+ to 5.1.20. 2) Logging to syslog may fail to operate correctly
+ in some cases. For these reasons, avoid using MySQL 5.1.20.
+
+ * Incompatible change: As of MySQL 5.1.18, the plugin interface
+ and its handling of system variables was changed. Command-line
+ options such as --skip-innodb now cause an error if InnoDB is
+ not built-in or plugin-loaded. You should use
+ --loose-skip-innodb if you do not want any error even if
+ InnoDB is not available. The --loose prefix modifier should be
+ used for all command-line options where you are uncertain
+ whether the plugin exists and when you want the operation to
+ proceed even if the option is necessarily ignored due to the
+ absence of the plugin. (For a desecription of how --loose
+ works, see Section 4.2.3.1, "Using Options on the Command
+ Line.")
+
+ * Incompatible change: As of MySQL 5.1.15, InnoDB rolls back
+ only the last statement on a transaction timeout. A new
+ option, --innodb_rollback_on_timeout, causes InnoDB to abort
+ and roll back the entire transaction if a transaction timeout
+ occurs (the same behavior as in MySQL 4.1).
+
+ * Incompatible change: As of MySQL 5.1.15, the following
+ conditions apply to enabling the read_only system variable:
+
+ + If you attempt to enable read_only while you have any
+ explicit locks (acquired with LOCK TABLES or have a
+ pending transaction, an error will occur.
+
+ + If other clients hold explicit table locks or have
+ pending transactions, the attempt to enable read_only
+ blocks until the locks are released and the transactions
+ end. While the attempt to enable read_only is pending,
+ requests by other clients for table locks or to begin
+ transactions also block until read_only has been set.
+
+ + read_only can be enabled while you hold a global read
+ lock (acquired with FLUSH TABLES WITH READ LOCK) because
+ that does not involve table locks.
+ Previously, the attempt to enable read_only would return
+ immediately even if explicit locks or transactions were
+ pending, so some data changes could occur for statements
+ executing in the server at the same time.
+
+ * Incompatible change: The number of function names affected by
+ IGNORE_SPACE was reduced significantly in MySQL 5.1.13, from
+ about 200 to about 30. (For details about IGNORE_SPACE, see
+ Section 8.2.4, "Function Name Parsing and Resolution.") This
+ change improves the consistency of parser operation. However,
+ it also introduces the possibility of incompatibility for old
+ SQL code that relies on the following conditions:
+
+ + IGNORE_SPACE is disabled.
+
+ + The presence or absence of whitespace following a
+ function name is used to distinguish between a built-in
+ function and stored function that have the same name (for
+ example, PI() versus PI ()).
+ For functions that are no longer affected by IGNORE_SPACE as
+ of MySQL 5.1.13, that strategy no longer works. Either of the
+ following approaches can be used if you have code that is
+ subject to the preceding incompatibility:
+
+ + If a stored function has a name that conflicts with a
+ built-in function, refer to the stored function with a
+ schema name qualifier, regardless of whether whitespace
+ is present. For example, write schema_name.PI() or
+ schema_name.PI ().
+
+ + Alternatively, rename the stored function to use a
+ nonconflicting name and change invocations of the
+ function to use the new name.
+
+ * Incompatible change: For utf8 columns, the full-text parser
+ incorrectly considered several nonword punctuation and
+ whitespace characters as word characters, causing some
+ searches to return incorrect results. The fix involves a
+ change to the full-text parser in MySQL 5.1.12, so as of
+ 5.1.12, any tables that have FULLTEXT indexes on utf8 columns
+ must be repaired with REPAIR TABLE:
+REPAIR TABLE tbl_name QUICK;
+
+ * Incompatible change: Storage engines can be pluggable at
+ runtime, so the distinction between disabled and invalid
+ storage engines no longer applies. As of MySQL 5.1.12, this
+ affects the NO_ENGINE_SUBSTITUTION SQL mode, as described in
+ Section 5.1.7, "Server SQL Modes."
+
+ * Incompatible change: The structure of FULLTEXT indexes has
+ been changed in MySQL 5.1.6. After upgrading to MySQL 5.1.6 or
+ greater, any tables that have FULLTEXT indexes must be
+ repaired with REPAIR TABLE:
+REPAIR TABLE tbl_name QUICK;
+
+ * Incompatible change: In MySQL 5.1.6, when log tables were
+ implemented, the default log destination for the general query
+ and slow query log was TABLE. As of MySQL 5.1.21, this default
+ has been changed to FILE, which is compatible with MySQL 5.0,
+ but incompatible with earlier releases of MySQL 5.1. If you
+ are upgrading from MySQL 5.0 to 5.1.21 or higher, no logging
+ option changes should be necessary. However, if you are
+ upgrading from 5.1.6 through 5.1.20 to 5.1.21 or higher and
+ were using TABLE logging, use the --log-output=TABLE option
+ explicitly to preserve your server's table-logging behavior.
+
+ * Incompatible change: For ENUM columns that had enumeration
+ values containing commas, the commas were mapped to 0xff
+ internally. However, this rendered the commas
+ indistinguishable from true 0xff characters in the values.
+ This no longer occurs. However, the fix requires that you dump
+ and reload any tables that have ENUM columns containing true
+ 0xff in their values: Dump the tables using mysqldump with the
+ current server before upgrading from a version of MySQL 5.1
+ older than 5.1.15 to version 5.1.15 or newer.
+
+ * As of MySQL 5.1.12, the lc_time_names system variable
+ specifies the locale that controls the language used to
+ display day and month names and abbreviations. This variable
+ affects the output from the DATE_FORMAT(), DAYNAME() and
+ MONTHNAME() functions. See Section 9.7, "MySQL Server Locale
+ Support."
+
+ * As of MySQL 5.1.9, mysqld_safe no longer implicitly invokes
+ mysqld-max if it exists. Instead, it invokes mysqld unless a
+ --mysqld or --mysqld-version option is given to specify
+ another server explicitly. If you previously relied on the
+ implicit invocation of mysqld-max, you should use an
+ appropriate option now. As of MySQL 5.1.12, there is no longer
+ any separate mysqld-max server, so no change should be
+ necessary.
+
+ SQL Changes:
+
+ * Known issue: Prior to MySQL 5.1.17, the parser accepted
+ invalid code in SQL condition handlers, leading to server
+ crashes or unexpected execution behavior in stored programs.
+ Specifically, the parser permitted a condition handler to
+ refer to labels for blocks that enclose the handler
+ declaration. This was incorrect because block label scope does
+ not include the code for handlers declared within the labeled
+ block.
+ As of 5.1.17, the parser rejects this invalid construct, but
+ if you perform a binary upgrade (without dumping and reloading
+ your databases), existing handlers that contain the construct
+ still are invalid and should be rewritten even if they appear
+ to function as you expect.
+ To find affected handlers, use mysqldump to dump all stored
+ procedures and functions, triggers, and events. Then attempt
+ to reload them into an upgraded server. Handlers that contain
+ illegal label references will be rejected.
+ For more information about condition handlers and writing them
+ to avoid invalid jumps, see Section 12.7.4.2, "DECLARE for
+ Handlers."
+
+ * Incompatible change: The parser accepted statements that
+ contained /* ... */ that were not properly closed with */,
+ such as SELECT 1 /* + 2. As of MySQL 5.1.23, statements that
+ contain unclosed /*-comments now are rejected with a syntax
+ error.
+ This fix has the potential to cause incompatibilities. Because
+ of Bug#26302: http://bugs.mysql.com/bug.php?id=26302, which
+ caused the trailing */ to be truncated from comments in views,
+ stored routines, triggers, and events, it is possible that
+ objects of those types may have been stored with definitions
+ that now will be rejected as syntactically invalid. Such
+ objects should be dropped and re-created so that their
+ definitions do not contain truncated comments.
+
+ * Incompatible change: Multiple-table DELETE statements
+ containing ambiguous aliases could have unintended side
+ effects such as deleting rows from the wrong table. Example:
+DELETE FROM t1 AS a2 USING t1 AS a1 INNER JOIN t2 AS a2;
+ As of MySQL 5.1.23, alias declarations can be declared only in
+ the table_references part. Elsewhere in the statement, alias
+ references are permitted but not alias declarations.
+ Statements containing aliases that are no longer permitted
+ must be rewritten.
+
+ * Incompatible change: As of MySQL 5.1.8, TYPE = engine_name is
+ still accepted as a synonym for the ENGINE = engine_name table
+ option but generates a warning. You should note that this
+ option is not available in MySQL 5.1.7, and is removed
+ altogether in MySQL 5.5 and produces a syntax error.
+ TYPE has been deprecated since MySQL 4.0.
+
+ * Incompatible change: The namespace for triggers changed in
+ MySQL 5.0.10. Previously, trigger names had to be unique per
+ table. Now they must be unique within the schema (database).
+ An implication of this change is that DROP TRIGGER syntax now
+ uses a schema name instead of a table name (schema name is
+ optional and, if omitted, the current schema will be used).
+ When upgrading from a version of MySQL 5 older than 5.0.10 to
+ MySQL 5.0.10 or newer, you must drop all triggers and
+ re-create them or DROP TRIGGER will not work after the
+ upgrade. Here is a suggested procedure for doing this:
+
+ 1. Upgrade to MySQL 5.0.10 or later to be able to access
+ trigger information in the INFORMATION_SCHEMA.TRIGGERS
+ table. (This should work even for pre-5.0.10 triggers.)
+
+ 2. Dump all trigger definitions using the following SELECT
+ statement:
+SELECT CONCAT('CREATE TRIGGER ', t.TRIGGER_SCHEMA, '.', t.TRIGGER_NAM
+E,
+ ' ', t.ACTION_TIMING, ' ', t.EVENT_MANIPULATION, ' ON '
+,
+ t.EVENT_OBJECT_SCHEMA, '.', t.EVENT_OBJECT_TABLE,
+ ' FOR EACH ROW ', t.ACTION_STATEMENT, '//' )
+INTO OUTFILE '/tmp/triggers.sql'
+FROM INFORMATION_SCHEMA.TRIGGERS AS t;
+ The statement uses INTO OUTFILE, so you must have the
+ FILE privilege. The file will be created on the server
+ host. Use a different file name if you like. To be 100%
+ safe, inspect the trigger definitions in the triggers.sql
+ file, and perhaps make a backup of the file.
+
+ 3. Stop the server and drop all triggers by removing all
+ .TRG files in your database directories. Change location
+ to your data directory and issue this command:
+shell> rm */*.TRG
+
+ 4. Start the server and re-create all triggers using the
+ triggers.sql file:
+mysql> delimiter // ;
+mysql> source /tmp/triggers.sql //
+
+ 5. Check that all triggers were successfully created using
+ the SHOW TRIGGERS statement.
+
+ * Incompatible change: MySQL 5.1.6 introduces the TRIGGER
+ privilege. Previously, the SUPER privilege was needed to
+ create or drop triggers. Now those operations require the
+ TRIGGER privilege. This is a security improvement because you
+ no longer need to grant users the SUPER privilege to enable
+ them to create triggers. However, the requirement that the
+ account named in a trigger's DEFINER clause must have the
+ SUPER privilege has changed to a requirement for the TRIGGER
+ privilege. When upgrading from a previous version of MySQL 5.0
+ or 5.1 to MySQL 5.1.6 or newer, be sure to update your grant
+ tables by running mysql_upgrade. This will assign the TRIGGER
+ privilege to all accounts that had the SUPER privilege. If you
+ fail to update the grant tables, triggers may fail when
+ activated. After updating the grant tables, you can revoke the
+ SUPER privilege from those accounts that no longer otherwise
+ require it.
+
+ * Some keywords may be reserved in MySQL 5.1 that were not
+ reserved in MySQL 5.0. See Section 8.3, "Reserved Words."
+
+ * The BACKUP TABLE, and RESTORE TABLE statements are deprecated.
+ mysqldump or mysqlhotcopy can be used as alternatives.
+
+ * The LOAD DATA FROM MASTER and LOAD TABLE FROM MASTER
+ statements are deprecated. See Section 12.5.2.2, "LOAD DATA
+ FROM MASTER Syntax," for recommended alternatives.
+
+ * The INSTALL PLUGIN and UNINSTALL PLUGIN statements that are
+ used for the plugin API are new. So is the WITH PARSER clause
+ for FULLTEXT index creation that associates a parser plugin
+ with a full-text index. Section 22.2, "The MySQL Plugin API."
+
+ C API Changes:
+
+ * Incompatible change: As of MySQL 5.1.7, the
+ mysql_stmt_attr_get() C API function returns a boolean rather
+ than an unsigned int for STMT_ATTR_UPDATE_MAX_LENGTH.
+ (Bug#16144: http://bugs.mysql.com/bug.php?id=16144)
+
+2.4.2. Downgrading MySQL
+
+ This section describes what you should do to downgrade to an older
+ MySQL version in the unlikely case that the previous version
+ worked better than the new one.
+
+ If you are downgrading within the same release series (for
+ example, from 5.0.13 to 5.0.12) the general rule is that you just
+ have to install the new binaries on top of the old ones. There is
+ no need to do anything with the databases. As always, however, it
+ is always a good idea to make a backup.
+
+ The following items form a checklist of things you should do
+ whenever you perform a downgrade:
+
+ * Read the upgrading section for the release series from which
+ you are downgrading to be sure that it does not have any
+ features you really need. See Section 2.4.1, "Upgrading
+ MySQL."
+
+ * If there is a downgrading section for that version, you should
+ read that as well.
+
+ * To see which new features were added between the version to
+ which you are downgrading and your current version, see the
+ change logs (Appendix C, "MySQL Change History").
+
+ * Check Section 2.4.3, "Checking Whether Tables or Indexes Must
+ Be Rebuilt," to see whether changes to table formats or to
+ character sets or collations were made between your current
+ version of MySQL and the version to which you are downgrading.
+ If so and these changes result in an incompatibility between
+ MySQL versions, you will need to downgrade the affected tables
+ using the instructions in Section 2.4.4, "Rebuilding or
+ Repairing Tables or Indexes."
+
+ In most cases, you can move the MySQL format files and data files
+ between different versions on the same architecture as long as you
+ stay within versions for the same release series of MySQL.
+
+ If you downgrade from one release series to another, there may be
+ incompatibilities in table storage formats. In this case, use
+ mysqldump to dump your tables before downgrading. After
+ downgrading, reload the dump file using mysql or mysqlimport to
+ re-create your tables. For examples, see Section 2.4.5, "Copying
+ MySQL Databases to Another Machine."
+
+ A typical symptom of a downward-incompatible table format change
+ when you downgrade is that you cannot open tables. In that case,
+ use the following procedure:
+
+ 1. Stop the older MySQL server that you are downgrading to.
+
+ 2. Restart the newer MySQL server you are downgrading from.
+
+ 3. Dump any tables that were inaccessible to the older server by
+ using mysqldump to create a dump file.
+
+ 4. Stop the newer MySQL server and restart the older one.
+
+ 5. Reload the dump file into the older server. Your tables should
+ be accessible.
+
+ It might also be the case that system tables in the mysql database
+ have changed and that downgrading introduces some loss of
+ functionality or requires some adjustments. Here are some
+ examples:
+
+ * Trigger creation requires the TRIGGER privilege as of MySQL
+ 5.1. In MySQL 5.0, there is no TRIGGER privilege and SUPER is
+ required instead. If you downgrade from MySQL 5.1 to 5.0, you
+ will need to give the SUPER privilege to those accounts that
+ had the TRIGGER privilege in 5.1.
+
+ * Triggers were added in MySQL 5.0, so if you downgrade from 5.0
+ to 4.1, you cannot use triggers at all.
+
+ * The mysql.proc.comment column definition changed between MySQL
+ 5.1 and 5.5. After a downgrade from 5.5 to 5.1, this table is
+ seen as corrupt and in need of repair. To workaround this
+ problem, execute mysql_upgrade from the version of MySQL to
+ which you downgraded.
+
+2.4.2.1. Downgrading to MySQL 5.0
+
+ When downgrading to MySQL 5.0 from MySQL 5.1, you should keep in
+ mind the following issues relating to features found in MySQL 5.1,
+ but not in MySQL 5.0:
+
+ * Partitioning. MySQL 5.0 does not support user-defined
+ partitioning. If a table was created as a partitioned table in
+ 5.1 (or if an table created in a previous version of MySQL was
+ altered to include partitions after an upgrade to 5.1), the
+ table is accessible after downgrade only if you do one of the
+ following:
+
+ + Export the table using mysqldump and then drop it in
+ MySQL 5.1; import the table again following the downgrade
+ to MySQL 5.0.
+
+ + Prior to the downgrade, remove the table's partitioning
+ using ALTER TABLE table_name REMOVE PARTITIONING.
+
+ * Event Scheduler. MySQL 5.0 does not support scheduled events.
+ If your databases contain scheduled event definitions, you
+ should prevent them from being dumped when you use mysqldump
+ by using the --skip-events option. (See Section 4.5.4,
+ "mysqldump --- A Database Backup Program.")
+
+ * Stored routines. MySQL 5.1.21 added a number of new columns
+ to the mysql.proc table in which stored routine definitions
+ are stored. If you are downgrading from MySQL 5.1.21 or later
+ to MySQL 5.0, you cannot import the MySQL 5.1 routine
+ definitions into MySQL 5.0.46 or earlier using the dump of
+ mysql.proc created by mysqldump (such as when using the
+ --all-databases option). Instead, you should run mysqldump
+ --routines prior to performing the downgrade and run the
+ stored routines DDL statements following the downgrade.
+ See Bug#11986: http://bugs.mysql.com/bug.php?id=11986,
+ Bug#30029: http://bugs.mysql.com/bug.php?id=30029, and
+ Bug#30660: http://bugs.mysql.com/bug.php?id=30660, for more
+ information.
+
+ * Triggers. Trigger creation requires the TRIGGER privilege as
+ of MySQL 5.1. In MySQL 5.0, there is no TRIGGER privilege and
+ SUPER is required instead. If you downgrade from MySQL 5.1 to
+ 5.0, you will need to give the SUPER privilege to those
+ accounts that had the TRIGGER privilege in 5.1.
+
+2.4.3. Checking Whether Tables or Indexes Must Be Rebuilt
+
+ A binary upgrade or downgrade is one that installs one version of
+ MySQL "in place" over an existing version, without dumping and
+ reloading tables:
+
+ 1. Stop the server for the existing version if it is running.
+
+ 2. Install a different version of MySQL. This is an upgrade if
+ the new version is higher than the original version, a
+ downgrade if the version is lower.
+
+ 3. Start the server for the new version.
+
+ In many cases, the tables from the previous version of MySQL can
+ be used without problem by the new version. However, sometimes
+ changes occur that require tables or table indexes to be rebuilt,
+ as described in this section. If you have tables that are affected
+ by any of the issues described here, rebuild the tables or indexes
+ as necessary using the instructions given in Section 2.4.4,
+ "Rebuilding or Repairing Tables or Indexes."
+
+ Table Incompatibilities
+
+ After a binary upgrade to MySQL 5.1 from a MySQL 5.0 installation
+ that contains ARCHIVE tables, accessing those tables causes the
+ server to crash, even if you have run mysql_upgrade or CHECK TABLE
+ ... FOR UPGRADE. To work around this problem, use mysqldump to
+ dump all ARCHIVE tables before upgrading, and reload them into
+ MySQL 5.1 after upgrading. The same problem occurs for binary
+ downgrades from MySQL 5.1 to 5.0.
+
+ Index Incompatibilities
+
+ If you perform a binary upgrade without dumping and reloading
+ tables, you cannot upgrade directly from MySQL 4.1 to 5.1 or
+ higher. This occurs due to an incompatible change in the MyISAM
+ table index format in MySQL 5.0. Upgrade from MySQL 4.1 to 5.0 and
+ repair all MyISAM tables. Then upgrade from MySQL 5.0 to 5.1 and
+ check and repair your tables.
+
+ Modifications to the handling of character sets or collations
+ might change the character sort order, which causes the ordering
+ of entries in any index that uses an affected character set or
+ collation to be incorrect. Such changes result in several possible
+ problems:
+
+ * Comparison results that differ from previous results
+
+ * Inability to find some index values due to misordered index
+ entries
+
+ * Misordered ORDER BY results
+
+ * Tables that CHECK TABLE reports as being in need of repair
+
+ The solution to these problems is to rebuild any indexes that use
+ an affected character set or collation, either by dropping and
+ re-creating the indexes, or by dumping and reloading the entire
+ table. For information about rebuilding indexes, see Section
+ 2.4.4, "Rebuilding or Repairing Tables or Indexes."
+
+ To check whether a table has indexes that must be rebuilt, consult
+ the following list. It indicates which versions of MySQL
+ introduced character set or collation changes that require indexes
+ to be rebuilt. Each entry indicates the version in which the
+ change occurred and the character sets or collations that the
+ change affects. If the change is associated with a particular bug
+ report, the bug number is given.
+
+ The list applies both for binary upgrades and downgrades. For
+ example, Bug#27877: http://bugs.mysql.com/bug.php?id=27877 was
+ fixed in MySQL 5.1.24 and 5.4.0, so it applies to upgrades from
+ versions older than 5.1.24 to 5.1.24 or newer, and to downgrades
+ from 5.1.24 or newer to versions older than 5.1.24.
+
+ In many cases, you can use CHECK TABLE ... FOR UPGRADE to identify
+ tables for which index rebuilding is required. (It will report:
+ Table upgrade required. Please do "REPAIR TABLE `tbl_name`" or
+ dump/reload to fix it!) In these cases, you can also use
+ mysqlcheck --check-upgrade or mysql_upgrade, which execute CHECK
+ TABLE. However, the use of CHECK TABLE applies only after
+ upgrades, not downgrades. Also, CHECK TABLE is not applicable to
+ all storage engines. For details about which storage engines CHECK
+ TABLE supports, see Section 12.4.2.3, "CHECK TABLE Syntax."
+
+ Changes that cause index rebuilding to be necessary:
+
+ * MySQL 5.0.48, 5.1.21
+ (Bug#29461: http://bugs.mysql.com/bug.php?id=29461)
+ Affects indexes for columns that use any of these character
+ sets: eucjpms, euc_kr, gb2312, latin7, macce, ujis
+ Affected tables can be detected by CHECK TABLE ... FOR UPGRADE
+ as of MySQL 5.1.29, 5.4.0 (see
+ Bug#39585: http://bugs.mysql.com/bug.php?id=39585).
+
+ * MySQL 5.0.48, 5.1.23
+ (Bug#27562: http://bugs.mysql.com/bug.php?id=27562)
+ Affects indexes that use the ascii_general_ci collation for
+ columns that contain any of these characters: '`' GRAVE
+ ACCENT, '[' LEFT SQUARE BRACKET, '\' REVERSE SOLIDUS, ']'
+ RIGHT SQUARE BRACKET, '~' TILDE
+ Affected tables can be detected by CHECK TABLE ... FOR UPGRADE
+ as of MySQL 5.1.29, 5.4.0 (see
+ Bug#39585: http://bugs.mysql.com/bug.php?id=39585).
+
+ * MySQL 5.1.24, 5.4.0
+ (Bug#27877: http://bugs.mysql.com/bug.php?id=27877)
+ Affects indexes that use the utf8_general_ci or
+ ucs2_general_ci collation for columns that contain 'ß' LATIN
+ SMALL LETTER SHARP S (German).
+ Affected tables can be detected by CHECK TABLE ... FOR UPGRADE
+ as of MySQL 5.1.30, 5.4.0 (see
+ Bug#40053: http://bugs.mysql.com/bug.php?id=40053).
+
+2.4.4. Rebuilding or Repairing Tables or Indexes
+
+ This section describes how to rebuild a table. This can be
+ necessitated by changes to MySQL such as how data types are
+ handled or changes to character set handling. For example, an
+ error in a collation might have been corrected, necessitating a
+ table rebuild to update the indexes for character columns that use
+ the collation. (For examples, see Section 2.4.3, "Checking Whether
+ Tables or Indexes Must Be Rebuilt.") It might also be that a table
+ repair or upgrade should be done as indicated by a table check
+ operation such as that performed by CHECK TABLE, mysqlcheck, or
+ mysql_upgrade.
+
+ Methods for rebuilding a table include dumping and reloading it,
+ or using ALTER TABLE or REPAIR TABLE.
+
+Note
+
+ If you are rebuilding tables because a different version of MySQL
+ will not handle them after a binary (in-place) upgrade or
+ downgrade, you must use the dump-and-reload method. Dump the
+ tables before upgrading or downgrading using your original version
+ of MySQL. Then reload the tables after upgrading or downgrading.
+
+ If you use the dump-and-reload method of rebuilding tables only
+ for the purpose of rebuilding indexes, you can perform the dump
+ either before or after upgrading or downgrading. Reloading still
+ must be done afterward.
+
+ To rebuild a table by dumping and reloading it, use mysqldump to
+ create a dump file and mysql to reload the file:
+shell> mysqldump db_name t1 > dump.sql
+shell> mysql db_name < dump.sql
+
+ To rebuild all the tables in a single database, specify the
+ database name without any following table name:
+shell> mysqldump db_name > dump.sql
+shell> mysql db_name < dump.sql
+
+ To rebuild all tables in all databases, use the --all-databases
+ option:
+shell> mysqldump --all-databases > dump.sql
+shell> mysql < dump.sql
+
+ To rebuild a table with ALTER TABLE, use a "null" alteration; that
+ is, an ALTER TABLE statement that "changes" the table to use the
+ storage engine that it already has. For example, if t1 is a MyISAM
+ table, use this statement:
+mysql> ALTER TABLE t1 ENGINE = MyISAM;
+
+ If you are not sure which storage engine to specify in the ALTER
+ TABLE statement, use SHOW CREATE TABLE to display the table
+ definition.
+
+ If you must rebuild a table because a table checking operation
+ indicates that the table is corrupt or needs an upgrade, you can
+ use REPAIR TABLE if that statement supports the table's storage
+ engine. For example, to repair a MyISAM table, use this statement:
+mysql> REPAIR TABLE t1;
+
+ For storage engines such as InnoDB that REPAIR TABLE does not
+ support, use mysqldump to create a dump file and mysql to reload
+ the file, as described earlier.
+
+ For specifics about which storage engines REPAIR TABLE supports,
+ see Section 12.4.2.6, "REPAIR TABLE Syntax."
+
+ mysqlcheck --repair provides command-line access to the REPAIR
+ TABLE statement. This can be a more convenient means of repairing
+ tables because you can use the --databases or --all-databases
+ option to repair all tables in specific databases or all
+ databases, respectively:
+shell> mysqlcheck --repair --databases db_name ...
+shell> mysqlcheck --repair --all-databases
+
+2.4.5. Copying MySQL Databases to Another Machine
+
+ You can copy the .frm, .MYI, and .MYD files for MyISAM tables
+ between different architectures that support the same
+ floating-point format. (MySQL takes care of any byte-swapping
+ issues.) See Section 13.5, "The MyISAM Storage Engine."
+
+ In cases where you need to transfer databases between different
+ architectures, you can use mysqldump to create a file containing
+ SQL statements. You can then transfer the file to the other
+ machine and feed it as input to the mysql client.
+
+ Use mysqldump --help to see what options are available.
+
+ The easiest (although not the fastest) way to move a database
+ between two machines is to run the following commands on the
+ machine on which the database is located:
+shell> mysqladmin -h 'other_hostname' create db_name
+shell> mysqldump db_name | mysql -h 'other_hostname' db_name
+
+ If you want to copy a database from a remote machine over a slow
+ network, you can use these commands:
+shell> mysqladmin create db_name
+shell> mysqldump -h 'other_hostname' --compress db_name | mysql db_na
+me
+
+ You can also store the dump in a file, transfer the file to the
+ target machine, and then load the file into the database there.
+ For example, you can dump a database to a compressed file on the
+ source machine like this:
+shell> mysqldump --quick db_name | gzip > db_name.gz
+
+ Transfer the file containing the database contents to the target
+ machine and run these commands there:
+shell> mysqladmin create db_name
+shell> gunzip < db_name.gz | mysql db_name
+
+ You can also use mysqldump and mysqlimport to transfer the
+ database. For large tables, this is much faster than simply using
+ mysqldump. In the following commands, DUMPDIR represents the full
+ path name of the directory you use to store the output from
+ mysqldump.
+
+ First, create the directory for the output files and dump the
+ database:
+shell> mkdir DUMPDIR
+shell> mysqldump --tab=DUMPDIR db_name
+
+ Then transfer the files in the DUMPDIR directory to some
+ corresponding directory on the target machine and load the files
+ into MySQL there:
+shell> mysqladmin create db_name # create database
+shell> cat DUMPDIR/*.sql | mysql db_name # create tables in databas
+e
+shell> mysqlimport db_name DUMPDIR/*.txt # load data into tables
+
+ Do not forget to copy the mysql database because that is where the
+ grant tables are stored. You might have to run commands as the
+ MySQL root user on the new machine until you have the mysql
+ database in place.
+
+ After you import the mysql database on the new machine, execute
+ mysqladmin flush-privileges so that the server reloads the grant
+ table information.
+
+2.5. Installing MySQL on Windows
+
+ This section describes the process for installing MySQL on
+ Windows.
+
+ To run MySQL on Windows, you need the following:
+
+ * A Windows operating system such as Windows 2000, Windows XP,
+ Windows Vista, Windows Server 2003, or Windows Server 2008.
+ Both 32-bit and 64-bit versions are supported.
+ In addition to running MySQL as a standard application, you
+ can also run the MySQL server as a Windows service. By using a
+ service you can monitor and control the operation of the
+ server through the standard Windows service management tools.
+ For more information, see Section 2.5.5.6, "Starting MySQL as
+ a Windows Service."
+ Generally, you should install MySQL on Windows using an
+ account that has administrator rights. Otherwise, you may
+ encounter problems with certain operations such as editing the
+ PATH environment variable or accessing the Service Control
+ Manager. Once installed, MySQL does not need to be executed
+ using a user with Administrator privileges.
+
+ * TCP/IP protocol support.
+
+ * Enough space on the hard drive to unpack, install, and create
+ the databases in accordance with your requirements (generally
+ a minimum of 200 megabytes is recommended.)
+
+ For a list of limitations within the Windows version of MySQL, see
+ Section D.7.3, "Windows Platform Limitations."
+
+ In addition to the MySQL Server package, you may need or want
+ additional components to use MySQL with your application or
+ development environment. These include, but are not limited to:
+
+ * If you plan to connect to the MySQL server via ODBC, you need
+ a Connector/ODBC driver. For more information, including
+ installation and configuration instructions, see Section 21.1,
+ "MySQL Connector/ODBC."
+
+ * If you plan to use MySQL server with .NET applications, you
+ need the Connector/NET driver. For more information, including
+ installation and configuration instructions, see Section 21.2,
+ "MySQL Connector/NET."
+
+ MySQL distributions for Windows can be downloaded from
+ http://dev.mysql.com/downloads/. See Section 2.1.3, "How to Get
+ MySQL."
+
+ MySQL for Windows is available in several distribution formats,
+ detailed below. Generally speaking, you should use a binary
+ distribution that includes an installer. It is simpler to use than
+ the others, and you need no additional tools to get MySQL up and
+ running. The installer for the Windows version of MySQL, combined
+ with a GUI Config Wizard, automatically installs MySQL, creates an
+ option file, starts the server, and secures the default user
+ accounts.
+
+ * Binary installer distribution. The installable distribution
+ comes packaged as a Microsoft Windows Installer (MSI) package
+ that you can install manually or automatically on your
+ systems. Two formats are available, an essentials package that
+ contains all the files you need to install and configure
+ MySQL, but no additional components, and a complete package
+ that includes MySQL, configuration tools, benchmarks and other
+ components. For more information on the specific differences,
+ see Section 2.5.2, "Choosing An Installation Package"
+ For instructions on installing MySQL using one of the MSI
+ installation packages, see Section 2.5.3, "Installing MySQL
+ with the MSI Package."
+
+ * Standard binary distribution format packaged as a Zip file
+ containing all of the necessary files that you unpack into
+ your chosen location. This package contains all of the files
+ in the full Windows MSI Installer package, but does not
+ including an installation program.
+ For instructions on installing MySQL using the Zip file, see
+ Section 2.5.5, "Installing MySQL from a noinstall Zip
+ Archive."
+
+ * The source distribution contains all the code and support
+ files for building the executables using the Visual Studio
+ compiler system.
+ For instructions on building MySQL from source on Windows, see
+ Section 2.5.9, "Installing MySQL from Source on Windows."
+
+ MySQL on Windows considerations:
+
+ * Large Table Support
+ If you need tables with a size larger than 4GB, install MySQL
+ on an NTFS or newer file system. Do not forget to use MAX_ROWS
+ and AVG_ROW_LENGTH when you create tables. See Section
+ 12.1.17, "CREATE TABLE Syntax."
+
+ * MySQL and Virus Checking Software
+ Using virus scanning software such as Norton/Symantec
+ Anti-Virus on directories containing MySQL data and temporary
+ tables can cause issues, both in terms of the performance of
+ MySQL and the virus-scanning software mis-identifying the
+ contents of the files as containing spam. This is because of
+ the fingerprinting mechanism used by the virus scanning
+ software, and the way in which MySQL rapidly updates different
+ files, which may be identified as a potential security risk.
+ After installing MySQL Server, it is recommended that you
+ disable virus scanning on the main directory (datadir) being
+ used to store your MySQL table data. There is usually a system
+ built into the virus scanning software to permit certain
+ directories to be specifically ignored during virus scanning.
+ In addition, by default, MySQL creates temporary files in the
+ standard Windows temporary directory. To prevent the temporary
+ files also being scanned, you should configure a separate
+ temporary directory for MySQL temporary files and add this to
+ the virus scanning exclusion list. To do this, add a
+ configuration option for the tmpdir parameter to your my.ini
+ configuration file. For more information, see Section 2.5.5.2,
+ "Creating an Option File."
+
+2.5.1. Windows Installation Layout
+
+ For MySQL 5.1 on Windows, the default installation directory is
+ C:\Program Files\MySQL\MySQL Server 5.1. Some Windows users prefer
+ to install in C:\mysql, the directory that formerly was used as
+ the default. However, the layout of the subdirectories remains the
+ same.
+
+ For MySQL 5.1.23 and earlier, all of the files are located within
+ this parent directory, using the following structure:
+
+ Table 2.2. Installation Layout for Windows using MySQL 5.1.23 and
+ earlier
+ Directory Contents of Directory
+ bin Client programs and the mysqld server
+ data Log files, databases
+ Docs Manual in CHM format
+ examples Example programs and scripts
+ include Include (header) files
+ lib Libraries
+ scripts Utility scripts
+ share Error message files
+
+ For MySQL 5.1.24 and later, the default location of data directory
+ was changed. The remainder of the directory structure remains the
+ same:
+
+ Table 2.3. Installation Layout for Windows using MySQL 5.1.24 and
+ later
+ Directory Contents of Directory
+ bin Client programs and the mysqld server
+ C:\Documents and Settings\All Users\Application Data\MySQL Log
+ files, databases
+ Docs Manual in CHM format
+ examples Example programs and scripts
+ include Include (header) files
+ lib Libraries
+ scripts Utility scripts
+ share Error message files
+
+2.5.2. Choosing An Installation Package
+
+ For MySQL 5.1, there are three installation packages to choose
+ from when installing MySQL on Windows:
+ Packaging
+ Feature Essentials Complete Zip (No-install)
+ Installer Yes Yes No
+ Directory-only
+ MySQL Server Instance Config Wizard Yes Yes No
+ Test Suite No Yes Yes
+ MySQL Server Yes Yes Yes
+ MySQL Client Programs Yes Yes Yes
+ C Headers/Libraries Yes Yes Yes
+ Embedded Server No Optional Yes
+ Scripts and Examples No Optional Yes
+
+ In the above table:
+
+ * Yes indiciates that the component is installed by default.
+
+ * No indicates that the component is not installed or included.
+
+ * Optional indicates that the component is included with the
+ package, but not installed unless explicitly requested using
+ the Custom installation mode.
+
+ The workflow for installing using the MSI installer is shown
+ below:
+
+ Figure 2.1. Installation Workflow for Windows using MSI
+ Installation Workflow for Windows using MSI
+
+ The workflow for installing using the MSI installer is shown
+ below:
+
+ Figure 2.2. Installation Workflow for Windows using Zip
+ Installation Workflow for Windows using Zip
+
+Note
+
+ For the Essentials and Complete packages in the MSI installer, you
+ can select individual components to be installed by using the
+ Custom mode, including disable the components confiurated for
+ installation by default.
+
+ Full details on the components are suggested uses are provided
+ below for reference:
+
+ * Windows Essentials : This package has a file name similar to
+ mysql-essential-5.1.50-win32.msi and is supplied as a
+ Microsoft Installer (MSI) package. The package includes the
+ minimum set of files needed to install MySQL on Windows,
+ including the MySQL Server Instance Config Wizard. This
+ package does not include optional components such as the
+ embedded server, developer headers and libraries or benchmark
+ suite.
+ To install using this package, see Section 2.5.3, "Installing
+ MySQL with the MSI Package."
+
+ * Windows MSI Installer (Complete): This package has a file name
+ similar to mysql-5.1.50-win32.zip and contains all files
+ needed for a complete Windows installation, including the
+ MySQL Server Instance Config Wizard. This package includes
+ optional components such as the embedded server and benchmark
+ suite.
+ To install using this package, see Section 2.5.3, "Installing
+ MySQL with the MSI Package."
+
+ * Without installer: This package has a file name similar to
+ mysql-noinstall-5.1.50-win32.zip and contains all the files
+ found in the Complete install package, with the exception of
+ the MySQL Server Instance Config Wizard. This package does not
+ include an automated installer, and must be manually installed
+ and configured.
+
+ The Essentials package is recommended for most users. Both the
+ Essentials and Complete distributions are available as an .msi
+ file for use with the Windows Installer. The Noinstall
+ distribution is packaged as Zip archives. To use Zip archives, you
+ must have a tool that can unpack .zip files.
+
+ When using the MSI installers you can automate the installation
+ process. For more information, see Section 2.5.3.2, "Installing
+ MySQL Automatically using MSI." To automate the creation of a
+ MySQL instance, see Section 2.5.4.13, "Creating an Instance from
+ the Command Line."
+
+ Your choice of install package affects the installation process
+ you must follow. If you choose to install either the Essentials or
+ Complete install packages, see Section 2.5.3, "Installing MySQL
+ with the MSI Package." If you choose to install MySQL from the
+ Noinstall archive, see Section 2.5.5, "Installing MySQL from a
+ noinstall Zip Archive."
+
+2.5.3. Installing MySQL with the MSI Package
+
+ The MSI package are designed to install and configure MySQL in
+ such a way that you can immediately get started using MySQL.
+
+ The MySQL Installation Wizard and MySQL Config Wizard are
+ available in the Essentials and Complete install packages. They
+ are recommended for most standard MySQL installations. Exceptions
+ include users who need to install multiple instances of MySQL on a
+ single server host and advanced users who want complete control of
+ server configuration.
+
+ * For information on installing using the GUI MSI installer
+ process, see Section 2.5.3, "Installing MySQL with the MSI
+ Package."
+
+ * For information on installing using the command line using the
+ MSI package, see Section 2.5.3.2, "Installing MySQL
+ Automatically using MSI."
+
+ * If you have previously installed MySQL using the MSI package
+ and want to remove MySQL, see Section 2.5.3.3, "Removing MySQL
+ Installed from the MSI Package."
+
+ The workflow sequence for using the installer is shown in the
+ figure below:
+
+ Figure 2.3. Installation Workflow for Windows using MSI Installer
+ Installation Workflow for Windows using MSI Installer
+
+Note
+
+ Microsoft Windows XP and later include a firewall which
+ specifically blocks ports. If you plan on using MySQL through a
+ network port then you should open and create an exception for this
+ port before performing the installation. To check and if necessary
+ add an exception to the firewall settings:
+
+ 1. First ensure that you are logged in as an Administrator or a
+ user with Administrator privileges.
+
+ 2. Go to the Control Panel, and double click the Windows Firewall
+ icon.
+
+ 3. Choose the Allow a program through Windows Firewall option and
+ click the Add port button.
+
+ 4. Enter MySQL into the Name text box and 3306 (or the port of
+ your choice) into the Port number text box.
+
+ 5. Also ensure that the TCP protocol radio button is selected.
+
+ 6. If you wish, you can also limit access to the MySQL server by
+ choosing the Change scope button.
+
+ 7. Confirm your choices by clicking the OK button.
+
+ Additionally, when running the MySQL Installation Wizard on
+ Windows Vista, ensure that you are logged in as a user with
+ administrative rights.
+
+Note
+
+ When using Windows Vista, you may want to disable User Account
+ Control (UAC) before performing the installation. If you do not do
+ so, then MySQL may be identified as a security risk, which will
+ mean that you need to enable MySQL. You can disable the security
+ checking by following these instructions:
+
+ 1. Open Control Panel.
+
+ 2. Under the User Accounts and Family Safety, select Add or
+ remove user accounts.
+
+ 3. Click the Got to the main User Accounts page link.
+
+ 4. Click on Turn User Account Control on or off. You may be
+ prompted to provide permission to change this setting. Click
+ Continue.
+
+ 5. Deselect or unceck the checkbox next to Use User Account
+ Control (UAC) to help protect your computer. Click OK to save
+ the setting.
+
+ You will need to restart to complete the process. Click Restart
+ Now to reboot the machine and apply the changes. You can then
+ follow the instructions below for installing Windows.
+
+2.5.3.1. Using the MySQL Installation Wizard
+
+ MySQL Installation Wizard is an installer for the MySQL server
+ that uses the latest installer technologies for Microsoft Windows.
+ The MySQL Installation Wizard, in combination with the MySQL
+ Config Wizard, enables a user to install and configure a MySQL
+ server that is ready for use immediately after installation.
+
+ The MySQL Installation Wizard uses the standard Microsoft
+ Installer Engine (MSI) system is the standard installer for all
+ MySQL server distributions, version 4.1.5 and higher. Users of
+ previous versions of MySQL need to shut down and remove their
+ existing MySQL installations manually before installing MySQL with
+ the MySQL Installation Wizard. See Section 2.5.3.1.6, "Upgrading
+ MySQL with the Installation Wizard," for more information on
+ upgrading from a previous version.
+
+ If you are upgrading an installation from MySQL 5.1.31 or earlier
+ to MySQL 5.1.32 or later, read the notes provided in Section
+ 2.5.3.1.6, "Upgrading MySQL with the Installation Wizard."
+
+ The Microsoft Windows Installer Engine was updated with the
+ release of Windows XP; those using a previous version of Windows
+ can reference this Microsoft Knowledge Base article
+ (http://support.microsoft.com/default.aspx?scid=kb;EN-US;292539)
+ for information on upgrading to the latest version of the Windows
+ Installer Engine.
+
+ In addition, Microsoft has introduced the WiX (Windows Installer
+ XML) toolkit. This is the first highly acknowledged Open Source
+ project from Microsoft. We have switched to WiX because it is an
+ Open Source project and it enables us to handle the complete
+ Windows installation process in a flexible manner using scripts.
+
+ Improving the MySQL Installation Wizard depends on the support and
+ feedback of users like you. If you find that the MySQL
+ Installation Wizard is lacking some feature important to you, or
+ if you discover a bug, please report it in our bugs database using
+ the instructions given in Section 1.7, "How to Report Bugs or
+ Problems."
+
+2.5.3.1.1. Downloading and Starting the MySQL Installation Wizard
+
+ The MySQL installation packages can be downloaded from
+ http://dev.mysql.com/downloads/. If the package you download is
+ contained within a Zip archive, you need to extract the archive
+ first.
+
+ The process for starting the wizard depends on the contents of the
+ installation package you download. If there is a setup.exe file
+ present, double-click it to start the installation process. If
+ there is an .msi file present, double-click it to start the
+ installation process.
+
+2.5.3.1.2. Choosing an Install Type
+
+ There are three installation types available: Typical, Complete,
+ and Custom.
+
+ The Typical installation type installs the MySQL server, the mysql
+ command-line client, and the command-line utilities. The
+ command-line clients and utilities include mysqldump, myisamchk,
+ and several other tools to help you manage the MySQL server.
+
+ The Complete installation type installs all components included in
+ the installation package. The full installation package includes
+ components such as the embedded server library, the benchmark
+ suite, support scripts, and documentation.
+
+ The Custom installation type gives you complete control over which
+ packages you wish to install and the installation path that is
+ used. See Section 2.5.3.1.3, "The Custom Install Dialog," for more
+ information on performing a custom install.
+
+ If you choose the Typical or Complete installation types and click
+ the Next button, you advance to the confirmation screen to verify
+ your choices and begin the installation. If you choose the Custom
+ installation type and click the Next button, you advance to the
+ custom installation dialog, described in Section 2.5.3.1.3, "The
+ Custom Install Dialog."
+
+2.5.3.1.3. The Custom Install Dialog
+
+ If you wish to change the installation path or the specific
+ components that are installed by the MySQL Installation Wizard,
+ choose the Custom installation type.
+
+ A tree view on the left side of the custom install dialog lists
+ all available components. Components that are not installed have a
+ red X icon; components that are installed have a gray icon. To
+ change whether a component is installed, click that component's
+ icon and choose a new option from the drop-down list that appears.
+
+ You can change the default installation path by clicking the
+ Change... button to the right of the displayed installation path.
+
+ After choosing your installation components and installation path,
+ click the Next button to advance to the confirmation dialog.
+
+2.5.3.1.4. The Confirmation Dialog
+
+ Once you choose an installation type and optionally choose your
+ installation components, you advance to the confirmation dialog.
+ Your installation type and installation path are displayed for you
+ to review.
+
+ To install MySQL if you are satisfied with your settings, click
+ the Install button. To change your settings, click the Back
+ button. To exit the MySQL Installation Wizard without installing
+ MySQL, click the Cancel button.
+
+ In MySQL 5.1.47 and earlier, after installation is complete, you
+ have the option of registering with the MySQL web site.
+ Registration gives you access to post in the MySQL forums at
+ forums.mysql.com (http://forums.mysql.com), along with the ability
+ to report bugs at bugs.mysql.com (http://bugs.mysql.com) and to
+ subscribe to our newsletter.
+
+ The final screen of the installer provides a summary of the
+ installation and gives you the option to launch the MySQL Config
+ Wizard, which you can use to create a configuration file, install
+ the MySQL service, and configure security settings.
+
+2.5.3.1.5. Changes Made by MySQL Installation Wizard
+
+ Once you click the Install button, the MySQL Installation Wizard
+ begins the installation process and makes certain changes to your
+ system which are described in the sections that follow.
+
+ Changes to the Registry
+
+ The MySQL Installation Wizard creates one Windows registry key in
+ a typical install situation, located in
+ HKEY_LOCAL_MACHINE\SOFTWARE\MySQL AB.
+
+ The MySQL Installation Wizard creates a key named after the major
+ version of the server that is being installed, such as MySQL
+ Server 5.1. It contains two string values, Location and Version.
+ The Location string contains the path to the installation
+ directory. In a default installation it contains C:\Program
+ Files\MySQL\MySQL Server 5.1\. The Version string contains the
+ release number. For example, for an installation of MySQL Server
+ 5.1.50, the key contains a value of 5.1.50.
+
+ These registry keys are used to help external tools identify the
+ installed location of the MySQL server, preventing a complete scan
+ of the hard-disk to determine the installation path of the MySQL
+ server. The registry keys are not required to run the server, and
+ if you install MySQL using the noinstall Zip archive, the registry
+ keys are not created.
+
+ Changes to the Start Menu
+
+ The MySQL Installation Wizard creates a new entry in the Windows
+ Start menu under a common MySQL menu heading named after the major
+ version of MySQL that you have installed. For example, if you
+ install MySQL 5.1, the MySQL Installation Wizard creates a MySQL
+ Server 5.1 section in the Start menu.
+
+ The following entries are created within the new Start menu
+ section:
+
+ * MySQL Command Line Client: This is a shortcut to the mysql
+ command-line client and is configured to connect as the root
+ user. The shortcut prompts for a root user password when you
+ connect.
+
+ * MySQL Server Instance Config Wizard: This is a shortcut to the
+ MySQL Config Wizard. Use this shortcut to configure a newly
+ installed server, or to reconfigure an existing server.
+
+ * MySQL Documentation: This is a link to the MySQL server
+ documentation that is stored locally in the MySQL server
+ installation directory. This option is not available when the
+ MySQL server is installed using the Essentials installation
+ package.
+
+ Changes to the File System
+
+ The MySQL Installation Wizard by default installs the MySQL 5.1
+ server to C:\Program Files\MySQL\MySQL Server 5.1, where Program
+ Files is the default location for applications in your system, and
+ 5.1 is the major version of your MySQL server. This is the
+ recommended location for the MySQL server, replacing the former
+ default location C:\mysql.
+
+ By default, all MySQL applications are stored in a common
+ directory at C:\Program Files\MySQL, where Program Files is the
+ default location for applications in your Windows installation. A
+ typical MySQL installation on a developer machine might look like
+ this:
+C:\Program Files\MySQL\MySQL Server 5.1
+C:\Program Files\MySQL\MySQL Workbench 5.1 OSS
+
+ This approach makes it easier to manage and maintain all MySQL
+ applications installed on a particular system.
+
+ In MySQL 5.1.23 and earlier, the default location for the data
+ files used by MySQL is located within the corresponding MySQL
+ Server installation directory. For MySQL 5.1.24 and later, the
+ default location of the data directory is the AppData directory
+ configured for the user that installed the MySQL application.
+
+2.5.3.1.6. Upgrading MySQL with the Installation Wizard
+
+ The MySQL Installation Wizard can perform server upgrades
+ automatically using the upgrade capabilities of MSI. That means
+ you do not need to remove a previous installation manually before
+ installing a new release. The installer automatically shuts down
+ and removes the previous MySQL service before installing the new
+ version.
+
+ Automatic upgrades are available only when upgrading between
+ installations that have the same major and minor version numbers.
+ For example, you can upgrade automatically from MySQL 5.1.34 to
+ MySQL 5.1.37, but not from MySQL 5.0 to MySQL 5.1.
+
+ In MySQL 5.1.32 and later, the EXE version of the MSI installer
+ packages were removed. When upgrading an existing MySQL
+ installation from the old EXE based installer to the MSI based
+ installer, please keep the following notes in mind:
+
+ * The MSI installer will not identify an existing installation
+ that was installed using the old EXE installer. This means
+ that the installer will not stop the existing server, or
+ detect that the existing password is required before
+ installing the new version. To work around this:
+
+ 1. Stop the current server manually using net stop or
+ mysqladmin shutdown.
+
+ 2. Remove the existing installation manually by using the
+ Add/Remove Programs control panel. This will keep the
+ existing configuration and data files, as these are not
+ removed automatically.
+
+ 3. Install the new version of MySQL using the MSI installer.
+ When running the installation, skip updating the security
+ by deselecting the checkbox on the security screen.
+
+ 4. Complete the installation, and then start the server
+ again. You should be able to login with your existing
+ user and password credentials.
+
+ * You can only upgrade the version and release using the MSI
+ installer. For example, you can upgrade an open source
+ installation with an open source installer. You cannot upgrade
+ an open source installation using the enterprise installer.
+
+ See Section 2.5.7, "Upgrading MySQL on Windows."
+
+2.5.3.2. Installing MySQL Automatically using MSI
+
+ The Microsoft Installer (MSI) supports a both a quiet and a
+ passive mode that can be used to install MySQL automatically
+ without requireing intervention. You can use this either in
+ scripts to automatically install MySQL or through a terminal
+ connection such as Telnet where you do not have access to the
+ standard Windows user interface. The MSI packages can also be used
+ in combination with Microsoft's Group Policy system (part of
+ Windows Server 2003 and Windows Server 2008) to install MySQL
+ across multiple machines.
+
+ To install MySQL from one of the MSI packages automatically from
+ the command line (or within a script), you need to use the
+ msiexec.exe tool. For example, to perform a quiet installation
+ (which shows no dialog boxes or progress):
+shell> msiexec /i /quiet mysql-5.1.39.msi
+
+ The /i indicates that you want to perform an installation. The
+ /quiet option indicates that you want no interactive elements.
+
+ To provide a dialog box showing the progress during installation,
+ and the dialog boxes providing information on the installation and
+ registration of MySQL, use /passive mode instead of /quiet:
+shell> msiexec /i /passive mysql-5.1.39.msi
+
+ Regardless of the mode of the installation, installing the package
+ in this manner performs a 'Typical' installation, and installs the
+ default components into the standard location.
+
+ You can also use this method to uninstall MySQL by using the
+ /uninstall or /x options:
+shell> msiexec /x /quiet mysql-5.1.39.msi
+
+ To install MySQL and configure a MySQL instance from the command
+ line, see Section 2.5.4.13, "Creating an Instance from the Command
+ Line."
+
+ For information on using MSI packages to install software
+ automatically using Group Policy, see How to use Group Policy to
+ remotely install software in Windows Server 2003
+ (http://support.microsoft.com/kb/816102).
+
+2.5.3.3. Removing MySQL Installed from the MSI Package
+
+ To uninstall a MySQL where you have used the MSI packages, you
+ must use the Add/Remove Programs tool within Control Panel. To do
+ this:
+
+ 1. Right-click the start menu and choose Control Panel.
+
+ 2. If the Control Panel is set to category mode (you will see
+ Pick a category at the top of the Control Panel window),
+ double-click Add or Remove Programs. If the Control is set to
+ classic mode, double-click the Add or Remove Programs icon.
+
+ 3. Find MySQL in the list of installed software. MySQL Server is
+ installed against major version numbers (MySQL 5.0, MySQL 5.1,
+ etc.). Select the version that you want to remove and click
+ Remove.
+
+ 4. You will be prompted to confirm the removal. Click Yes to
+ remove MySQL.
+
+ When MySQL is removed using this method, only the installed
+ components are removed. Any database information (including the
+ tables and data), import or export files, log files, and binary
+ logs produced during execution are kept in their configured
+ location.
+
+ If you try to install MySQL again the information will be retained
+ and you will be prompted to enter the password configured with the
+ original installation.
+
+ If you want to delete MySQL completely, delete the associated data
+ directory. On Windows XP and Windows Server 2003, before MySQL
+ 5.1.24, the default data directory would be located within the
+ MySQL installation directory. On MySQL 5.1.24 and later, the
+ default data directory is the configured AppData directory, which
+ is C:\Documents and Settings\All Users\Application Data\MySQL by
+ default. On Windows 7 and Windows Server 2008, the default data
+ directory location is C:\ProgramData\Mysql.
+
+2.5.4. MySQL Server Instance Config Wizard
+
+ The MySQL Server Instance Config Wizard helps automate the process
+ of configuring your server. It creates a custom MySQL
+ configuration file (my.ini or my.cnf) by asking you a series of
+ questions and then applying your responses to a template to
+ generate the configuration file that is tuned to your
+ installation.
+
+ The complete and essential MSI installation packages include the
+ MySQL Server Instance Config Wizard in the MySQL 5.1 server. The
+ MySQL Server Instance Config Wizard is only available for Windows.
+
+ The workflow sequence for using the MySQL Server Instance Config
+ Wizard is shown in the figure below:
+
+ Figure 2.4. MySQL Server Instance Config Wizard Workflow
+ MySQL Server Instance Config Wizard Workflow
+
+2.5.4.1. Starting the MySQL Server Instance Config Wizard
+
+ The MySQL Server Instance Config Wizard is normally started as
+ part of the installation process. You should only need to run the
+ MySQL Server Instance Config Wizard again when you need to change
+ the configuration parameters of your server.
+
+ If you chose not to open a port prior to installing MySQL on
+ Windows Vista, you can choose to use the MySQL Server Instance
+ Config Wizard after installation. However, you must open a port in
+ the Windows Firewall. To do this see the instructions given in
+ Section 2.5.3.1.1, "Downloading and Starting the MySQL
+ Installation Wizard." Rather than opening a port, you also have
+ the option of adding MySQL as a program that bypasses the Windows
+ Firewall. One or the other option is sufficient---you need not do
+ both. Additionally, when running the MySQL Server Config Wizard on
+ Windows Vista ensure that you are logged in as a user with
+ administrative rights.
+ MySQL Server Instance Config Wizard
+
+ You can launch the MySQL Config Wizard by clicking the MySQL
+ Server Instance Config Wizard entry in the MySQL section of the
+ Windows Start menu.
+
+ Alternatively, you can navigate to the bin directory of your MySQL
+ installation and launch the MySQLInstanceConfig.exe file directly.
+
+ The MySQL Server Instance Config Wizard places the my.ini file in
+ the installation directory for the MySQL server. This helps
+ associate configuration files with particular server instances.
+
+ To ensure that the MySQL server knows where to look for the my.ini
+ file, an argument similar to this is passed to the MySQL server as
+ part of the service installation:
+--defaults-file="C:\Program Files\MySQL\MySQL Server 5.1\my.ini"
+
+ Here, C:\Program Files\MySQL\MySQL Server 5.1 is replaced with the
+ installation path to the MySQL Server. The --defaults-file option
+ instructs the MySQL server to read the specified file for
+ configuration options when it starts.
+
+ Apart from making changes to the my.ini file by running the MySQL
+ Server Instance Config Wizard again, you can modify it by opening
+ it with a text editor and making any necessary changes. You can
+ also modify the server configuration with the
+ http://www.mysql.com/products/administrator/ utility. For more
+ information about server configuration, see Section 5.1.2, "Server
+ Command Options."
+
+ MySQL clients and utilities such as the mysql and mysqldump
+ command-line clients are not able to locate the my.ini file
+ located in the server installation directory. To configure the
+ client and utility applications, create a new my.ini file in the
+ Windows installation directory (for example, C:\WINDOWS).
+
+ Under Windows Server 2003, Windows Server 2000, Windows XP, and
+ Windows Vista MySQL Server Instance Config Wizard will configure
+ MySQL to work as a Windows service. To start and stop MySQL you
+ use the Services application that is supplied as part of the
+ Windows Administrator Tools.
+
+2.5.4.2. Choosing a Maintenance Option
+
+ If the MySQL Server Instance Config Wizard detects an existing
+ configuration file, you have the option of either reconfiguring
+ your existing server, or removing the server instance by deleting
+ the configuration file and stopping and removing the MySQL
+ service.
+
+ To reconfigure an existing server, choose the Re-configure
+ Instance option and click the Next button. Any existing
+ configuration file is not overwritten, but renamed (within the
+ same directory) using a timestamp (Windows) or sequential number
+ (Linux). To remove the existing server instance, choose the Remove
+ Instance option and click the Next button.
+
+ If you choose the Remove Instance option, you advance to a
+ confirmation window. Click the Execute button. The MySQL Server
+ Config Wizard stops and removes the MySQL service, and then
+ deletes the configuration file. The server installation and its
+ data folder are not removed.
+
+ If you choose the Re-configure Instance option, you advance to the
+ Configuration Type dialog where you can choose the type of
+ installation that you wish to configure.
+
+2.5.4.3. Choosing a Configuration Type
+
+ When you start the MySQL Server Instance Config Wizard for a new
+ MySQL installation, or choose the Re-configure Instance option for
+ an existing installation, you advance to the Configuration Type
+ dialog.
+ MySQL Server Instance Config Wizard: Configuration Type
+
+ There are two configuration types available: Detailed
+ Configuration and Standard Configuration. The Standard
+ Configuration option is intended for new users who want to get
+ started with MySQL quickly without having to make many decisions
+ about server configuration. The Detailed Configuration option is
+ intended for advanced users who want more fine-grained control
+ over server configuration.
+
+ If you are new to MySQL and need a server configured as a
+ single-user developer machine, the Standard Configuration should
+ suit your needs. Choosing the Standard Configuration option causes
+ the MySQL Config Wizard to set all configuration options
+ automatically with the exception of Service Options and Security
+ Options.
+
+ The Standard Configuration sets options that may be incompatible
+ with systems where there are existing MySQL installations. If you
+ have an existing MySQL installation on your system in addition to
+ the installation you wish to configure, the Detailed Configuration
+ option is recommended.
+
+ To complete the Standard Configuration, please refer to the
+ sections on Service Options and Security Options in Section
+ 2.5.4.10, "The Service Options Dialog," and Section 2.5.4.11, "The
+ Security Options Dialog," respectively.
+
+2.5.4.4. The Server Type Dialog
+
+ There are three different server types available to choose from.
+ The server type that you choose affects the decisions that the
+ MySQL Server Instance Config Wizard makes with regard to memory,
+ disk, and processor usage.
+ MySQL Server Instance Config Wizard: Server Type
+
+ * Developer Machine: Choose this option for a typical desktop
+ workstation where MySQL is intended only for personal use. It
+ is assumed that many other desktop applications are running.
+ The MySQL server is configured to use minimal system
+ resources.
+
+ * Server Machine: Choose this option for a server machine where
+ the MySQL server is running alongside other server
+ applications such as FTP, email, and Web servers. The MySQL
+ server is configured to use a moderate portion of the system
+ resources.
+
+ * Dedicated MySQL Server Machine: Choose this option for a
+ server machine that is intended to run only the MySQL server.
+ It is assumed that no other applications are running. The
+ MySQL server is configured to use all available system
+ resources.
+
+Note
+
+ By selecting one of the preconfigured configurations, the values
+ and settings of various options in your my.cnf or my.ini will be
+ altered accordingly. The default values and options as described
+ in the reference manual may therefore be different to the options
+ and values that were created during the execution of the Config
+ Wizard.
+
+2.5.4.5. The Database Usage Dialog
+
+ The Database Usage dialog enables you to indicate the storage
+ engines that you expect to use when creating MySQL tables. The
+ option you choose determines whether the InnoDB storage engine is
+ available and what percentage of the server resources are
+ available to InnoDB.
+ MySQL Server Instance Config Wizard: Usage Dialog
+
+ * Multifunctional Database: This option enables both the InnoDB
+ and MyISAM storage engines and divides resources evenly
+ between the two. This option is recommended for users who use
+ both storage engines on a regular basis.
+
+ * Transactional Database Only: This option enables both the
+ InnoDB and MyISAM storage engines, but dedicates most server
+ resources to the InnoDB storage engine. This option is
+ recommended for users who use InnoDB almost exclusively and
+ make only minimal use of MyISAM.
+
+ * Non-Transactional Database Only: This option disables the
+ InnoDB storage engine completely and dedicates all server
+ resources to the MyISAM storage engine. This option is
+ recommended for users who do not use InnoDB.
+
+ The Config Wizard uses a template to generate the server
+ configuration file. The Database Usage dialog sets one of the
+ following option strings:
+Multifunctional Database: MIXED
+Transactional Database Only: INNODB
+Non-Transactional Database Only: MYISAM
+
+ When these options are processed through the default template
+ (my-template.ini) the result is:
+Multifunctional Database:
+default-storage-engine=InnoDB
+_myisam_pct=50
+
+Transactional Database Only:
+default-storage-engine=InnoDB
+_myisam_pct=5
+
+Non-Transactional Database Only:
+default-storage-engine=MyISAM
+_myisam_pct=100
+skip-innodb
+
+ The _myisam_pct value is used to calculate the percentage of
+ resources dedicated to MyISAM. The remaining resources are
+ allocated to InnoDB.
+
+2.5.4.6. The InnoDB Tablespace Dialog
+
+ Some users may want to locate the InnoDB tablespace files in a
+ different location than the MySQL server data directory. Placing
+ the tablespace files in a separate location can be desirable if
+ your system has a higher capacity or higher performance storage
+ device available, such as a RAID storage system.
+ MySQL Server Instance Config Wizard: InnoDB Data Tablespace
+
+ To change the default location for the InnoDB tablespace files,
+ choose a new drive from the drop-down list of drive letters and
+ choose a new path from the drop-down list of paths. To create a
+ custom path, click the ... button.
+
+ If you are modifying the configuration of an existing server, you
+ must click the Modify button before you change the path. In this
+ situation you must move the existing tablespace files to the new
+ location manually before starting the server.
+
+2.5.4.7. The Concurrent Connections Dialog
+
+ To prevent the server from running out of resources, it is
+ important to limit the number of concurrent connections to the
+ MySQL server that can be established. The Concurrent Connections
+ dialog enables you to choose the expected usage of your server,
+ and sets the limit for concurrent connections accordingly. It is
+ also possible to set the concurrent connection limit manually.
+ MySQL Server Instance Config Wizard: Connections
+
+ * Decision Support (DSS)/OLAP: Choose this option if your server
+ does not require a large number of concurrent connections. The
+ maximum number of connections is set at 100, with an average
+ of 20 concurrent connections assumed.
+
+ * Online Transaction Processing (OLTP): Choose this option if
+ your server requires a large number of concurrent connections.
+ The maximum number of connections is set at 500.
+
+ * Manual Setting: Choose this option to set the maximum number
+ of concurrent connections to the server manually. Choose the
+ number of concurrent connections from the drop-down box
+ provided, or enter the maximum number of connections into the
+ drop-down box if the number you desire is not listed.
+
+2.5.4.8. The Networking and Strict Mode Options Dialog
+
+ Use the Networking Options dialog to enable or disable TCP/IP
+ networking and to configure the port number that is used to
+ connect to the MySQL server.
+ MySQL Server Instance Config Wizard: Network Configuration
+
+ TCP/IP networking is enabled by default. To disable TCP/IP
+ networking, uncheck the box next to the Enable TCP/IP Networking
+ option.
+
+ Port 3306 is used by default. To change the port used to access
+ MySQL, choose a new port number from the drop-down box or type a
+ new port number directly into the drop-down box. If the port
+ number you choose is in use, you are prompted to confirm your
+ choice of port number.
+
+ Set the Server SQL Mode to either enable or disable strict mode.
+ Enabling strict mode (default) makes MySQL behave more like other
+ database management systems. If you run applications that rely on
+ MySQL's old "forgiving" behavior, make sure to either adapt those
+ applications or to disable strict mode. For more information about
+ strict mode, see Section 5.1.7, "Server SQL Modes."
+
+2.5.4.9. The Character Set Dialog
+
+ The MySQL server supports multiple character sets and it is
+ possible to set a default server character set that is applied to
+ all tables, columns, and databases unless overridden. Use the
+ Character Set dialog to change the default character set of the
+ MySQL server.
+ MySQL Server Instance Config Wizard: Character Set
+
+ * Standard Character Set: Choose this option if you want to use
+ latin1 as the default server character set. latin1 is used for
+ English and many Western European languages.
+
+ * Best Support For Multilingualism: Choose this option if you
+ want to use utf8 as the default server character set. This is
+ a Unicode character set that can store characters from many
+ different languages.
+
+ * Manual Selected Default Character Set / Collation: Choose this
+ option if you want to pick the server's default character set
+ manually. Choose the desired character set from the provided
+ drop-down list.
+
+2.5.4.10. The Service Options Dialog
+
+ On Windows platforms, the MySQL server can be installed as a
+ Windows service. When installed this way, the MySQL server can be
+ started automatically during system startup, and even restarted
+ automatically by Windows in the event of a service failure.
+
+ The MySQL Server Instance Config Wizard installs the MySQL server
+ as a service by default, using the service name MySQL. If you do
+ not wish to install the service, uncheck the box next to the
+ Install As Windows Service option. You can change the service name
+ by picking a new service name from the drop-down box provided or
+ by entering a new service name into the drop-down box.
+
+Note
+
+ Service names can include any legal character except forward (/)
+ or backward (\) slashes, and must be less than 256 characters
+ long.
+
+Warning
+
+ If you are installing multiple versions of MySQL onto the same
+ machine, you must choose a different service name for each version
+ that you install. If you do not choose a different service for
+ each installed version then the service manager information will
+ be inconsistent and this will cause problems when you try to
+ uninstall a previous version.
+
+ If you have already installed multiple versions using the same
+ service name, you must manually edit the contents of the
+ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services parameters
+ within the Windows registry to update the association of the
+ service name with the correct server version.
+
+ Typically, when installing multiple versions you create a service
+ name based on the version information. For example, you might
+ install MySQL 5.x as mysql5, or specific versions such as MySQL
+ 5.1.30 as mysql50130.
+
+ To install the MySQL server as a service but not have it started
+ automatically at startup, uncheck the box next to the Launch the
+ MySQL Server Automatically option.
+
+2.5.4.11. The Security Options Dialog
+
+ The content of the security options portion of the MySQL Server
+ Instance Configuration Wizard will depend on whether this is a new
+ installation, or modifying an existing installation.
+
+ * Setting the root password for a new installation
+ It is strongly recommended that you set a root password for
+ your MySQL server, and the MySQL Server Instance Config Wizard
+ requires by default that you do so. If you do not wish to set
+ a root password, uncheck the box next to the Modify Security
+ Settings option.
+
+Note
+ If you have previously installed MySQL, but not deleted the
+ data directory associated with the previous installation, you
+ may be prompted to provide the current root password. The
+ password will be the one configured with your old data
+ directory. If you do not want to use this data, or do not know
+ the root password, you should cancel the installation, delete
+ the previous installation data, and then restart the
+ installation process. For more information on deleting MySQL
+ data on Microsoft Windows, see Section 2.5.3.3, "Removing
+ MySQL Installed from the MSI Package."
+ MySQL Server Instance Config Wizard: Security
+
+ * To set the root password, enter the desired password into both
+ the New root password and Confirm boxes.
+ Setting the root password for an existing installation
+ If you are modifying the configuration of an existing
+ configuration, or you are installing an upgrade and the MySQL
+ Server Instance Configuration Wizard has detected an existing
+ MySQL system, then you must enter the existing password for
+ root before changing the configuration information.
+ MySQL Server Instance Config Wizard: Security (Existing
+ Installation)
+ If you want to change the current root password, enter the
+ desired new password into both the New root password and
+ Confirm boxes.
+
+ To permit root logins from across the network, check the box next
+ to the Enable root access from remote machines option. This
+ decreases the security of your root account.
+
+ To create an anonymous user account, check the box next to the
+ Create An Anonymous Account option. Creating an anonymous account
+ can decrease server security and cause login and permission
+ difficulties. For this reason, it is not recommended.
+
+2.5.4.12. The Confirmation Dialog
+
+ The final dialog in the MySQL Server Instance Config Wizard is the
+ Confirmation Dialog. To start the configuration process, click the
+ Execute button. To return to a previous dialog, click the Back
+ button. To exit the MySQL Server Instance Config Wizard without
+ configuring the server, click the Cancel button.
+ MySQL Server Instance Config Wizard: Confirmation
+
+ After you click the Execute button, the MySQL Server Instance
+ Config Wizard performs a series of tasks and displays the progress
+ onscreen as the tasks are performed.
+
+ The MySQL Server Instance Config Wizard first determines
+ configuration file options based on your choices using a template
+ prepared by MySQL developers and engineers. This template is named
+ my-template.ini and is located in your server installation
+ directory.
+
+ The MySQL Config Wizard then writes these options to the
+ corresponding configuration file.
+
+ If you chose to create a service for the MySQL server, the MySQL
+ Server Instance Config Wizard creates and starts the service. If
+ you are reconfiguring an existing service, the MySQL Server
+ Instance Config Wizard restarts the service to apply your
+ configuration changes.
+
+ If you chose to set a root password, the MySQL Config Wizard
+ connects to the server, sets your new root password, and applies
+ any other security settings you may have selected.
+
+ After the MySQL Server Instance Config Wizard has completed its
+ tasks, it displays a summary. Click the Finish button to exit the
+ MySQL Server Config Wizard.
+
+2.5.4.13. Creating an Instance from the Command Line
+
+ In addition to using the GUI interface to the MySQL Server
+ Instance Config Wizard, you can also create instances
+ automatically from the command line.
+
+ To use the MySQL Server Instance Config Wizard on the command
+ line, you need to use the MySQLInstanceConfig.exe command that is
+ installed with MySQL in the bin directory within the installation
+ directory. MySQLInstanceConfig.exe takes a number of command-line
+ arguments the set the properties that would normally be selected
+ through the GUI interface, and then creates a new configuration
+ file (my.ini) by combining these selections with a template
+ configuration file to produce the working configuration file.
+
+ The main command line options are provided in the table below.
+ Some of the options are required, while some options are optional.
+
+ Table 2.4. MySQL Server Instance Config Wizard Command Line
+ Options
+ Option Description
+ Required Parameters
+ -nPRODUCTNAME The name of the instance when installed
+ -pPATH Path of the base directory for installation. This is
+ equivalent to the directory when using the basedir configuration
+ parameter
+ -vVERSION The version tag to use for this installation
+ Action to Perform
+ -i Install an instance
+ -r Remove an instance
+ -s Stop an existing instance
+ -q Perform the operation quietly
+ -lFILENAME Sae the installation progress in a logfile
+ Config File to Use
+ -tFILENAME Path to the template config file that will be used to
+ generate the installed configuration file
+ -cFILENAME Path to a config file to be generated
+
+ The -t and -c options work together to set the configuration
+ parameters for a new instance. The -t option specifies the
+ template configuration file to use as the basic configuration,
+ which are then merged with the configuration parameters generated
+ by the MySQL Server Instance Config Wizard into the configuration
+ file specified by the -c option.
+
+ A sample template file, my-template.ini is provided in the
+ toplevel MySQL installation directory. The file contains elements
+ are replaced automatically by the MySQL Server Instance Config
+ Wizard during configuration.
+
+ If you specify a configuration file that already exists, the
+ existing configuration file will be saved in the file with the
+ original, with the date and time added. For example, the mysql.ini
+ will be copied to mysql 2009-10-27 1646.ini.bak.
+
+ The parameters that you can specify on the command line are listed
+ in the table below.
+
+ Table 2.5. MySQL Server Instance Config Wizard Parameters
+ Parameter Description
+ ServiceName=$ Specify the name of the service to be created
+ AddBinToPath={yes | no} Specifies whether to add the binary
+ directory of MySQL to the standard PATH environment variable
+ ServerType={DEVELOPMENT | SERVER | DEDICATED} Specify the server
+ type. For more information, see Section 2.5.4.4, "The Server Type
+ Dialog"
+ DatabaseType={MIXED | INNODB | MYISAM} Specify the default
+ database type. For more information, see Section 2.5.4.5, "The
+ Database Usage Dialog"
+ ConnectionUsage={DSS | OLTP} Specify the type of connection
+ support, this automates the setting for the number of concurrent
+ connections (see the ConnectionCount parameter). For more
+ information, see Section 2.5.4.7, "The Concurrent Connections
+ Dialog"
+ ConnectionCount=# Specify the number of concurrent connections to
+ support. For more information, see Section 2.5.4.4, "The Server
+ Type Dialog"
+ SkipNetworking={yes | no} Specify whether network support should
+ be supported. Specifying yes disables network access altogether
+ Port=# Specify the network port number to use for network
+ connections. For more information, see Section 2.5.4.8, "The
+ Networking and Strict Mode Options Dialog"
+ StrictMode={yes | no} Specify whether to use the strict SQL mode.
+ For more information, see Section 2.5.4.8, "The Networking and
+ Strict Mode Options Dialog"
+ Charset=$ Specify the default character set. For more information,
+ see Section 2.5.4.9, "The Character Set Dialog"
+ RootPassword=$ Specify the root password
+ RootCurrentPassword=$ Specify the current root password then
+ stopping or reconfiguring an existing service
+
+Note
+
+ When specifying options on the command line, you can enclose the
+ entire command-line option and the value you are specifying using
+ double quotation marks. This enables you to use spaces in the
+ options. For example, "-cC:\mysql.ini".
+
+ The following command installs a MySQL Server 5.1 instance from
+ the directory C:\Program Files\MySQL\MySQL Server 5.1 using the
+ service name MySQL51 and setting the root password to 1234.
+shell> MySQLInstanceConfig.exe -i -q "-lC:\mysql_install_log.txt" »
+ "-nMySQL Server 5.1" "-pC:\Program Files\MySQL\MySQL Server 5.1" -
+v5.1.39 »
+ "-tmy-template.ini" "-cC:\mytest.ini" ServerType=DEVELOPMENT Datab
+aseType=MIXED »
+ ConnectionUsage=DSS Port=3311 ServiceName=MySQL51 RootPassword=123
+4
+
+ In the above example, a log file will be generated in
+ mysql_install_log.txt containing the information about the
+ instance creation process. The log file generated by the above
+ example is shown below:
+Welcome to the MySQL Server Instance Configuration Wizard 1.0.16.0
+Date: 2009-10-27 17:07:21
+
+Installing service ...
+
+Product Name: MySQL Server 5.1
+Version: 5.1.39
+Installation Path: C:\Program Files\MySQL\MySQL Server 5.1\
+
+Creating configuration file C:\mytest.ini using template my-template.
+ini.
+Options:
+DEVELOPMENT
+MIXED
+DSS
+STRICTMODE
+
+Variables:
+port: 3311
+default-character-set: latin1
+basedir: "C:/Program Files/MySQL/MySQL Server 5.1/"
+datadir: "C:/Program Files/MySQL/MySQL Server 5.1/Data/"
+
+
+Creating Windows service entry.
+Service name: "MySQL51"
+Parameters: "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld" --
+defaults-file="C:\mytest.ini" MySQL51.
+Windows service MySQL51 installed.
+
+ When using the command-line, the return values in the following
+ table indicate an error performing the specified option.
+
+ Table 2.6. Return Value from MySQL Server Instance Config Wizard
+ Value Description
+ 2 Configuration template file cannot be found
+ 3 The Windows service entry cannot be created
+ 4 Could not connect to the Service Control Manager
+ 5 The MySQL service cannot be started
+ 6 The MySQL service cannot be stopped
+ 7 The security settings cannot be applied
+ 8 The configuration file cannot be written
+ 9 The Windows service entry cannot be removed
+
+ You can perform an installation of MySQL automatically using the
+ MSI packe. For more information, see Section 2.5.3.2, "Installing
+ MySQL Automatically using MSI."
+
+2.5.5. Installing MySQL from a noinstall Zip Archive
+
+ Users who are installing from the noinstall package can use the
+ instructions in this section to manually install MySQL. The
+ process for installing MySQL from a Zip archive is as follows:
+
+ 1. Extract the archive to the desired install directory
+
+ 2. Create an option file
+
+ 3. Choose a MySQL server type
+
+ 4. Start the MySQL server
+
+ 5. Secure the default user accounts
+
+ This process is described in the sections that follow.
+
+2.5.5.1. Extracting the Install Archive
+
+ To install MySQL manually, do the following:
+
+ 1. If you are upgrading from a previous version please refer to
+ Section 2.5.7, "Upgrading MySQL on Windows," before beginning
+ the upgrade process.
+
+ 2. Make sure that you are logged in as a user with administrator
+ privileges.
+
+ 3. Choose an installation location. Traditionally, the MySQL
+ server is installed in C:\mysql. The MySQL Installation Wizard
+ installs MySQL under C:\Program Files\MySQL. If you do not
+ install MySQL at C:\mysql, you must specify the path to the
+ install directory during startup or in an option file. See
+ Section 2.5.5.2, "Creating an Option File."
+
+ 4. Extract the install archive to the chosen installation
+ location using your preferred Zip archive tool. Some tools may
+ extract the archive to a folder within your chosen
+ installation location. If this occurs, you can move the
+ contents of the subfolder into the chosen installation
+ location.
+
+2.5.5.2. Creating an Option File
+
+ If you need to specify startup options when you run the server,
+ you can indicate them on the command line or place them in an
+ option file. For options that are used every time the server
+ starts, you may find it most convenient to use an option file to
+ specify your MySQL configuration. This is particularly true under
+ the following circumstances:
+
+ * The installation or data directory locations are different
+ from the default locations (C:\Program Files\MySQL\MySQL
+ Server 5.1 and C:\Program Files\MySQL\MySQL Server 5.1\data).
+
+ * You need to tune the server settings, such as memory, cache,
+ or InnoDB configuration information.
+
+ When the MySQL server starts on Windows, it looks for option files
+ in several locations, such as the Windows directory, C:\, and the
+ MySQL installation directory (for the full list of locations, see
+ Section 4.2.3.3, "Using Option Files"). The Windows directory
+ typically is named something like C:\WINDOWS. You can determine
+ its exact location from the value of the WINDIR environment
+ variable using the following command:
+C:\> echo %WINDIR%
+
+ MySQL looks for options in each location first in the my.ini file,
+ and then in the my.cnf file. However, to avoid confusion, it is
+ best if you use only one file. If your PC uses a boot loader where
+ C: is not the boot drive, your only option is to use the my.ini
+ file. Whichever option file you use, it must be a plain text file.
+
+ You can also make use of the example option files included with
+ your MySQL distribution; see Section 4.2.3.3.2, "Preconfigured
+ Option Files."
+
+ An option file can be created and modified with any text editor,
+ such as Notepad. For example, if MySQL is installed in E:\mysql
+ and the data directory is in E:\mydata\data, you can create an
+ option file containing a [mysqld] section to specify values for
+ the basedir and datadir options:
+[mysqld]
+# set basedir to your installation path
+basedir=E:/mysql
+# set datadir to the location of your data directory
+datadir=E:/mydata/data
+
+ Note that Windows path names are specified in option files using
+ (forward) slashes rather than backslashes. If you do use
+ backslashes, double them:
+[mysqld]
+# set basedir to your installation path
+basedir=E:\\mysql
+# set datadir to the location of your data directory
+datadir=E:\\mydata\\data
+
+ The rules for use of backslash in option file values are given in
+ Section 4.2.3.3, "Using Option Files."
+
+ MySQL Enterprise For expert advice on the start-up options
+ appropriate to your circumstances, subscribe to the MySQL
+ Enterprise Monitor. For more information, see
+ http://www.mysql.com/products/enterprise/advisors.html.
+
+ In MySQL 5.1.23 and earlier, the MySQL installer places the data
+ directory directly under the directory where you install MySQL. On
+ MySQL 5.1.24 and later, the data directory is located within the
+ AppData directory for the user running MySQL.
+
+ If you would like to use a data directory in a different location,
+ you should copy the entire contents of the data directory to the
+ new location. For example, if you want to use E:\mydata as the
+ data directory instead, you must do two things:
+
+ 1. Move the entire data directory and all of its contents from
+ the default location (for example C:\Program Files\MySQL\MySQL
+ Server 5.1\data) to E:\mydata.
+
+ 2. Use a --datadir option to specify the new data directory
+ location each time you start the server.
+
+2.5.5.3. Selecting a MySQL Server Type
+
+ The following table shows the available servers for Windows in
+ MySQL 5.1.20 and earlier.
+ Binary Description
+ mysqld-nt Optimized binary with named-pipe support
+ mysqld Optimized binary without named-pipe support
+ mysqld-debug Like mysqld-nt, but compiled with full debugging and
+ automatic memory allocation checking
+
+ The following table shows the available servers for Windows in
+ MySQL 5.1.21 and later.
+ Binary Description
+ mysqld Optimized binary with named-pipe support
+ mysqld-debug Like mysqld, but compiled with full debugging and
+ automatic memory allocation checking
+
+ All of the preceding binaries are optimized for modern Intel
+ processors, but should work on any Intel i386-class or higher
+ processor.
+
+ Each of the servers in a distribution support the same set of
+ storage engines. The SHOW ENGINES statement displays which engines
+ a given server supports.
+
+ All Windows MySQL 5.1 servers have support for symbolic linking of
+ database directories.
+
+ MySQL supports TCP/IP on all Windows platforms. MySQL servers on
+ Windows support named pipes as indicated in the following list.
+ However, the default is to use TCP/IP regardless of platform.
+ (Named pipes are slower than TCP/IP in many Windows
+ configurations.)
+
+ Use of named pipes is subject to these conditions:
+
+ * Named pipes are enabled only if you start the server with the
+ --enable-named-pipe option. It is necessary to use this option
+ explicitly because some users have experienced problems with
+ shutting down the MySQL server when named pipes were used.
+
+ * For MySQL 5.1.20 and earlier, named-pipe connections are
+ permitted only by the mysqld-nt and mysqld-debug servers. For
+ MySQL 5.1.21 and later, the mysqld and mysqld-debug servers
+ both contain support for named-pipe connections.
+
+Note
+
+ Most of the examples in this manual use mysqld as the server name.
+ If you choose to use a different server, such as mysqld-nt or
+ mysqld-debug, make the appropriate substitutions in the commands
+ that are shown in the examples.
+
+2.5.5.4. Starting the Server for the First Time
+
+ This section gives a general overview of starting the MySQL
+ server. The following sections provide more specific information
+ for starting the MySQL server from the command line or as a
+ Windows service.
+
+ The information here applies primarily if you installed MySQL
+ using the Noinstall version, or if you wish to configure and test
+ MySQL manually rather than with the GUI tools.
+
+ The examples in these sections assume that MySQL is installed
+ under the default location of C:\Program Files\MySQL\MySQL Server
+ 5.1. Adjust the path names shown in the examples if you have MySQL
+ installed in a different location.
+
+ Clients have two options. They can use TCP/IP, or they can use a
+ named pipe if the server supports named-pipe connections.
+
+ MySQL for Windows also supports shared-memory connections if the
+ server is started with the --shared-memory option. Clients can
+ connect through shared memory by using the --protocol=MEMORY
+ option.
+
+ For information about which server binary to run, see Section
+ 2.5.5.3, "Selecting a MySQL Server Type."
+
+ Testing is best done from a command prompt in a console window (or
+ "DOS window"). In this way you can have the server display status
+ messages in the window where they are easy to see. If something is
+ wrong with your configuration, these messages make it easier for
+ you to identify and fix any problems.
+
+ To start the server, enter this command:
+C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld" --console
+
+ For a server that includes InnoDB support, you should see the
+ messages similar to those following as it starts (the path names
+ and sizes may differ):
+InnoDB: The first specified datafile c:\ibdata\ibdata1 did not exist:
+InnoDB: a new database to be created!
+InnoDB: Setting file c:\ibdata\ibdata1 size to 209715200
+InnoDB: Database physically writes the file full: wait...
+InnoDB: Log file c:\iblogs\ib_logfile0 did not exist: new to be creat
+ed
+InnoDB: Setting log file c:\iblogs\ib_logfile0 size to 31457280
+InnoDB: Log file c:\iblogs\ib_logfile1 did not exist: new to be creat
+ed
+InnoDB: Setting log file c:\iblogs\ib_logfile1 size to 31457280
+InnoDB: Log file c:\iblogs\ib_logfile2 did not exist: new to be creat
+ed
+InnoDB: Setting log file c:\iblogs\ib_logfile2 size to 31457280
+InnoDB: Doublewrite buffer not found: creating new
+InnoDB: Doublewrite buffer created
+InnoDB: creating foreign key constraint system tables
+InnoDB: foreign key constraint system tables created
+011024 10:58:25 InnoDB: Started
+
+ When the server finishes its startup sequence, you should see
+ something like this, which indicates that the server is ready to
+ service client connections:
+mysqld: ready for connections
+Version: '5.1.50' socket: '' port: 3306
+
+ The server continues to write to the console any further
+ diagnostic output it produces. You can open a new console window
+ in which to run client programs.
+
+ If you omit the --console option, the server writes diagnostic
+ output to the error log in the data directory (C:\Program
+ Files\MySQL\MySQL Server 5.1\data by default). The error log is
+ the file with the .err extension.
+
+Note
+
+ The accounts that are listed in the MySQL grant tables initially
+ have no passwords. After starting the server, you should set up
+ passwords for them using the instructions in Section 2.13,
+ "Post-Installation Setup and Testing."
+
+2.5.5.5. Starting MySQL from the Windows Command Line
+
+ The MySQL server can be started manually from the command line.
+ This can be done on any version of Windows.
+
+ To start the mysqld server from the command line, you should start
+ a console window (or "DOS window") and enter this command:
+C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld"
+
+ The path to mysqld may vary depending on the install location of
+ MySQL on your system.
+
+ You can stop the MySQL server by executing this command:
+C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqladmin" -u root
+ shutdown
+
+Note
+
+ If the MySQL root user account has a password, you need to invoke
+ mysqladmin with the -p option and supply the password when
+ prompted.
+
+ This command invokes the MySQL administrative utility mysqladmin
+ to connect to the server and tell it to shut down. The command
+ connects as the MySQL root user, which is the default
+ administrative account in the MySQL grant system. Note that users
+ in the MySQL grant system are wholly independent from any login
+ users under Windows.
+
+ If mysqld doesn't start, check the error log to see whether the
+ server wrote any messages there to indicate the cause of the
+ problem. The error log is located in the C:\Program
+ Files\MySQL\MySQL Server 5.1\data directory. It is the file with a
+ suffix of .err. You can also try to start the server as mysqld
+ --console; in this case, you may get some useful information on
+ the screen that may help solve the problem.
+
+ The last option is to start mysqld with the --standalone and
+ --debug options. In this case, mysqld writes a log file
+ C:\mysqld.trace that should contain the reason why mysqld doesn't
+ start. See MySQL Internals: Porting
+ (http://forge.mysql.com/wiki/MySQL_Internals_Porting).
+
+ Use mysqld --verbose --help to display all the options that mysqld
+ supports.
+
+2.5.5.6. Starting MySQL as a Windows Service
+
+ On Windows, the recommended way to run MySQL is to install it as a
+ Windows service, whereby MySQL starts and stops automatically when
+ Windows starts and stops. A MySQL server installed as a service
+ can also be controlled from the command line using NET commands,
+ or with the graphical Services utility. Generally, to install
+ MySQL as a Windows service you should be logged in using an
+ account that has administrator rights.
+
+ The Services utility (the Windows Service Control Manager) can be
+ found in the Windows Control Panel (under Administrative Tools on
+ Windows 2000, XP, Vista and Server 2003). To avoid conflicts, it
+ is advisable to close the Services utility while performing server
+ installation or removal operations from the command line.
+
+ Before installing MySQL as a Windows service, you should first
+ stop the current server if it is running by using the following
+ command:
+C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqladmin"
+ -u root shutdown
+
+Note
+
+ If the MySQL root user account has a password, you need to invoke
+ mysqladmin with the -p option and supply the password when
+ prompted.
+
+ This command invokes the MySQL administrative utility mysqladmin
+ to connect to the server and tell it to shut down. The command
+ connects as the MySQL root user, which is the default
+ administrative account in the MySQL grant system. Note that users
+ in the MySQL grant system are wholly independent from any login
+ users under Windows.
+
+ Install the server as a service using this command:
+C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld" --install
+
+ The service-installation command does not start the server.
+ Instructions for that are given later in this section.
+
+ To make it easier to invoke MySQL programs, you can add the path
+ name of the MySQL bin directory to your Windows system PATH
+ environment variable:
+
+ * On the Windows desktop, right-click the My Computer icon, and
+ select Properties.
+
+ * Next select the Advanced tab from the System Properties menu
+ that appears, and click the Environment Variables button.
+
+ * Under System Variables, select Path, and then click the Edit
+ button. The Edit System Variable dialogue should appear.
+
+ * Place your cursor at the end of the text appearing in the
+ space marked Variable Value. (Use the End key to ensure that
+ your cursor is positioned at the very end of the text in this
+ space.) Then enter the complete path name of your MySQL bin
+ directory (for example, C:\Program Files\MySQL\MySQL Server
+ 5.1\bin), Note that there should be a semicolon separating
+ this path from any values present in this field. Dismiss this
+ dialogue, and each dialogue in turn, by clicking OK until all
+ of the dialogues that were opened have been dismissed. You
+ should now be able to invoke any MySQL executable program by
+ typing its name at the DOS prompt from any directory on the
+ system, without having to supply the path. This includes the
+ servers, the mysql client, and all MySQL command-line
+ utilities such as mysqladmin and mysqldump.
+ You should not add the MySQL bin directory to your Windows
+ PATH if you are running multiple MySQL servers on the same
+ machine.
+
+Warning
+
+ You must exercise great care when editing your system PATH by
+ hand; accidental deletion or modification of any portion of the
+ existing PATH value can leave you with a malfunctioning or even
+ unusable system.
+
+ The following additional arguments can be used in MySQL 5.1 when
+ installing the service:
+
+ * You can specify a service name immediately following the
+ --install option. The default service name is MySQL.
+
+ * If a service name is given, it can be followed by a single
+ option. By convention, this should be
+ --defaults-file=file_name to specify the name of an option
+ file from which the server should read options when it starts.
+ The use of a single option other than --defaults-file is
+ possible but discouraged. --defaults-file is more flexible
+ because it enables you to specify multiple startup options for
+ the server by placing them in the named option file.
+
+ * You can also specify a --local-service option following the
+ service name. This causes the server to run using the
+ LocalService Windows account that has limited system
+ privileges. This account is available only for Windows XP or
+ newer. If both --defaults-file and --local-service are given
+ following the service name, they can be in any order.
+
+ For a MySQL server that is installed as a Windows service, the
+ following rules determine the service name and option files that
+ the server uses:
+
+ * If the service-installation command specifies no service name
+ or the default service name (MySQL) following the --install
+ option, the server uses the a service name of MySQL and reads
+ options from the [mysqld] group in the standard option files.
+
+ * If the service-installation command specifies a service name
+ other than MySQL following the --install option, the server
+ uses that service name. It reads options from the [mysqld]
+ group and the group that has the same name as the service in
+ the standard option files. This enables you to use the
+ [mysqld] group for options that should be used by all MySQL
+ services, and an option group with the service name for use by
+ the server installed with that service name.
+
+ * If the service-installation command specifies a
+ --defaults-file option after the service name, the server
+ reads options only from the [mysqld] group of the named file
+ and ignores the standard option files.
+
+ As a more complex example, consider the following command:
+C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld"
+ --install MySQL --defaults-file=C:\my-opts.cnf
+
+ Here, the default service name (MySQL) is given after the
+ --install option. If no --defaults-file option had been given,
+ this command would have the effect of causing the server to read
+ the [mysqld] group from the standard option files. However,
+ because the --defaults-file option is present, the server reads
+ options from the [mysqld] option group, and only from the named
+ file.
+
+ You can also specify options as Start parameters in the Windows
+ Services utility before you start the MySQL service.
+
+ Once a MySQL server has been installed as a service, Windows
+ starts the service automatically whenever Windows starts. The
+ service also can be started immediately from the Services utility,
+ or by using a NET START MySQL command. The NET command is not case
+ sensitive.
+
+ When run as a service, mysqld has no access to a console window,
+ so no messages can be seen there. If mysqld does not start, check
+ the error log to see whether the server wrote any messages there
+ to indicate the cause of the problem. The error log is located in
+ the MySQL data directory (for example, C:\Program
+ Files\MySQL\MySQL Server 5.1\data). It is the file with a suffix
+ of .err.
+
+ When a MySQL server has been installed as a service, and the
+ service is running, Windows stops the service automatically when
+ Windows shuts down. The server also can be stopped manually by
+ using the Services utility, the NET STOP MySQL command, or the
+ mysqladmin shutdown command.
+
+ You also have the choice of installing the server as a manual
+ service if you do not wish for the service to be started
+ automatically during the boot process. To do this, use the
+ --install-manual option rather than the --install option:
+C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld" --install-m
+anual
+
+ To remove a server that is installed as a service, first stop it
+ if it is running by executing NET STOP MySQL. Then use the
+ --remove option to remove it:
+C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld" --remove
+
+ If mysqld is not running as a service, you can start it from the
+ command line. For instructions, see Section 2.5.5.5, "Starting
+ MySQL from the Windows Command Line."
+
+ Please see Section 2.5.6, "Troubleshooting a MySQL Installation
+ Under Windows," if you encounter difficulties during installation.
+
+2.5.5.7. Testing The MySQL Installation
+
+ You can test whether the MySQL server is working by executing any
+ of the following commands:
+C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqlshow"
+C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqlshow" -u root
+mysql
+C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqladmin" version
+ status proc
+C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysql" test
+
+Note
+
+ By default, mysqlshow will try to connect using the ODBC user.
+ This user is not created by default. You should specify a valid
+ user, or root with the right password to check the operation of
+ the server.
+
+ If mysqld is slow to respond to TCP/IP connections from client
+ programs, there is probably a problem with your DNS. In this case,
+ start mysqld with the --skip-name-resolve option and use only
+ localhost and IP numbers in the Host column of the MySQL grant
+ tables.
+
+ You can force a MySQL client to use a named-pipe connection rather
+ than TCP/IP by specifying the --pipe or --protocol=PIPE option, or
+ by specifying . (period) as the host name. Use the --socket option
+ to specify the name of the pipe if you do not want to use the
+ default pipe name.
+
+ Note that if you have set a password for the root account, deleted
+ the anonymous account, or created a new user account, then you
+ must use the appropriate -u and -p options with the commands shown
+ above in order to connect with the MySQL Server. See Section
+ 4.2.2, "Connecting to the MySQL Server."
+
+ For more information about mysqlshow, see Section 4.5.6,
+ "mysqlshow --- Display Database, Table, and Column Information."
+
+2.5.6. Troubleshooting a MySQL Installation Under Windows
+
+ When installing and running MySQL for the first time, you may
+ encounter certain errors that prevent the MySQL server from
+ starting. The purpose of this section is to help you diagnose and
+ correct some of these errors.
+
+ Your first resource when troubleshooting server issues is the
+ error log. The MySQL server uses the error log to record
+ information relevant to the error that prevents the server from
+ starting. The error log is located in the data directory specified
+ in your my.ini file. The default data directory location is
+ C:\Program Files\MySQL\MySQL Server 5.1\data. See Section 5.2.2,
+ "The Error Log."
+
+ Another source of information regarding possible errors is the
+ console messages displayed when the MySQL service is starting. Use
+ the NET START MySQL command from the command line after installing
+ mysqld as a service to see any error messages regarding the
+ starting of the MySQL server as a service. See Section 2.5.5.6,
+ "Starting MySQL as a Windows Service."
+
+ The following examples show other common error messages you may
+ encounter when installing MySQL and starting the server for the
+ first time:
+
+ * If the MySQL server cannot find the mysql privileges database
+ or other critical files, you may see these messages:
+System error 1067 has occurred.
+Fatal error: Can't open privilege tables: Table 'mysql.host' doesn't
+exist
+ These messages often occur when the MySQL base or data
+ directories are installed in different locations than the
+ default locations (C:\Program Files\MySQL\MySQL Server 5.1 and
+ C:\Program Files\MySQL\MySQL Server 5.1\data, respectively).
+ This situation may occur when MySQL is upgraded and installed
+ to a new location, but the configuration file is not updated
+ to reflect the new location. In addition, there may be old and
+ new configuration files that conflict. Be sure to delete or
+ rename any old configuration files when upgrading MySQL.
+ If you have installed MySQL to a directory other than
+ C:\Program Files\MySQL\MySQL Server 5.1, you need to ensure
+ that the MySQL server is aware of this through the use of a
+ configuration (my.ini) file. The my.ini file needs to be
+ located in your Windows directory, typically C:\WINDOWS. You
+ can determine its exact location from the value of the WINDIR
+ environment variable by issuing the following command from the
+ command prompt:
+C:\> echo %WINDIR%
+ An option file can be created and modified with any text
+ editor, such as Notepad. For example, if MySQL is installed in
+ E:\mysql and the data directory is D:\MySQLdata, you can
+ create the option file and set up a [mysqld] section to
+ specify values for the basedir and datadir options:
+[mysqld]
+# set basedir to your installation path
+basedir=E:/mysql
+# set datadir to the location of your data directory
+datadir=D:/MySQLdata
+ Note that Windows path names are specified in option files
+ using (forward) slashes rather than backslashes. If you do use
+ backslashes, double them:
+[mysqld]
+# set basedir to your installation path
+basedir=C:\\Program Files\\MySQL\\MySQL Server 5.1
+# set datadir to the location of your data directory
+datadir=D:\\MySQLdata
+ The rules for use of backslash in option file values are given
+ in Section 4.2.3.3, "Using Option Files."
+ If you change the datadir value in your MySQL configuration
+ file, you must move the contents of the existing MySQL data
+ directory before restarting the MySQL server.
+ See Section 2.5.5.2, "Creating an Option File."
+
+ * If you reinstall or upgrade MySQL without first stopping and
+ removing the existing MySQL service and install MySQL using
+ the MySQL Config Wizard, you may see this error:
+Error: Cannot create Windows service for MySql. Error: 0
+ This occurs when the Config Wizard tries to install the
+ service and finds an existing service with the same name.
+ One solution to this problem is to choose a service name other
+ than mysql when using the configuration wizard. This enables
+ the new service to be installed correctly, but leaves the
+ outdated service in place. Although this is harmless, it is
+ best to remove old services that are no longer in use.
+ To permanently remove the old mysql service, execute the
+ following command as a user with administrative privileges, on
+ the command-line:
+C:\> sc delete mysql
+[SC] DeleteService SUCCESS
+ If the sc utility is not available for your version of
+ Windows, download the delsrv utility from
+ http://www.microsoft.com/windows2000/techinfo/reskit/tools/exi
+ sting/delsrv-o.asp and use the delsrv mysql syntax.
+
+2.5.7. Upgrading MySQL on Windows
+
+ This section lists some of the steps you should take when
+ upgrading MySQL on Windows.
+
+ 1. Review Section 2.4.1, "Upgrading MySQL," for additional
+ information on upgrading MySQL that is not specific to
+ Windows.
+
+ 2. You should always back up your current MySQL installation
+ before performing an upgrade. See Section 6.2, "Database
+ Backup Methods."
+
+ 3. Download the latest Windows distribution of MySQL from
+ http://dev.mysql.com/downloads/.
+
+ 4. Before upgrading MySQL, you must stop the server. If the
+ server is installed as a service, stop the service with the
+ following command from the command prompt:
+C:\> NET STOP MySQL
+ If you are not running the MySQL server as a service, use the
+ following command to stop it:
+C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqladmin" -u root
+ shutdown
+
+Note
+ If the MySQL root user account has a password, you need to
+ invoke mysqladmin with the -p option and supply the password
+ when prompted.
+
+ 5. When upgrading to MySQL 5.1 from a version previous to 4.1.5,
+ or when upgrading from a version of MySQL installed from a Zip
+ archive to a version of MySQL installed with the MySQL
+ Installation Wizard, you must manually remove the previous
+ installation and MySQL service (if the server is installed as
+ a service).
+ To remove the MySQL service, use the following command:
+C:\> C:\mysql\bin\mysqld --remove
+ If you do not remove the existing service, the MySQL
+ Installation Wizard may fail to properly install the new MySQL
+ service.
+
+ 6. When upgrading from MySQL 5.1.23 to MySQL 5.1.24, the change
+ in the default location of the data directory from a directory
+ within the MySQL installation to the AppData folder means that
+ you must manually copy the data files from your old
+ installation to the new location.
+
+ 7. If you are using the MySQL Installation Wizard, start the
+ wizard as described in Section 2.5.3.1, "Using the MySQL
+ Installation Wizard."
+
+ 8. If you are installing MySQL from a Zip archive, extract the
+ archive. You may either overwrite your existing MySQL
+ installation (usually located at C:\mysql), or install it into
+ a different directory, such as C:\mysql5. Overwriting the
+ existing installation is recommended.
+
+ 9. If you were running MySQL as a Windows service and you had to
+ remove the service earlier in this procedure, reinstall the
+ service. (See Section 2.5.5.6, "Starting MySQL as a Windows
+ Service.")
+ 10. Restart the server. For example, use NET START MySQL if you
+ run MySQL as a service, or invoke mysqld directly otherwise.
+ 11. If you encounter errors, see Section 2.5.6, "Troubleshooting a
+ MySQL Installation Under Windows."
+
+2.5.8. Windows Post-Installation Procedures
+
+ On Windows, you need not create the data directory and the grant
+ tables. MySQL Windows distributions include the grant tables with
+ a set of preinitialized accounts in the mysql database under the
+ data directory. It is unnecessary to run the mysql_install_db
+ script that is used on Unix. Regarding passwords, if you installed
+ MySQL using the Windows Installation Wizard, you may have already
+ assigned passwords to the accounts. (See Section 2.5.3.1, "Using
+ the MySQL Installation Wizard.") Otherwise, use the
+ password-assignment procedure given in Section 2.13.2, "Securing
+ the Initial MySQL Accounts."
+
+ Before setting up passwords, you might want to try running some
+ client programs to make sure that you can connect to the server
+ and that it is operating properly. Make sure that the server is
+ running (see Section 2.5.5.4, "Starting the Server for the First
+ Time"), and then issue the following commands to verify that you
+ can retrieve information from the server. You may need to specify
+ directory different from C:\mysql\bin on the command line. If you
+ used the Windows Installation Wizard, the default directory is
+ C:\Program Files\MySQL\MySQL Server 5.1, and the mysql and
+ mysqlshow client programs are in C:\Program Files\MySQL\MySQL
+ Server 5.1\bin. See Section 2.5.3.1, "Using the MySQL Installation
+ Wizard," for more information.
+
+ Use mysqlshow to see what databases exist:
+C:\> C:\mysql\bin\mysqlshow
++--------------------+
+| Databases |
++--------------------+
+| information_schema |
+| mysql |
+| test |
++--------------------+
+
+ The list of installed databases may vary, but will always include
+ the minimum of mysql and information_schema. In most cases, the
+ test database will also be installed automatically.
+
+ The preceding command (and commands for other MySQL programs such
+ as mysql) may not work if the correct MySQL account does not
+ exist. For example, the program may fail with an error, or you may
+ not be able to view all databases. If you installed using the MSI
+ packages and used the MySQL Server Instance Config Wizard, then
+ the root user will have been created automatically with the
+ password you supplied. In this case, you should use the -u root
+ and -p options. (You will also need to use the -u root and -p
+ options if you have already secured the initial MySQL accounts.)
+ With -p, you will be prompted for the root password. For example:
+C:\> C:\mysql\bin\mysqlshow -u root -p
+Enter password: (enter root password here)
++--------------------+
+| Databases |
++--------------------+
+| information_schema |
+| mysql |
+| test |
++--------------------+
+
+ If you specify a database name, mysqlshow displays a list of the
+ tables within the database:
+C:\> C:\mysql\bin\mysqlshow mysql
+Database: mysql
++---------------------------+
+| Tables |
++---------------------------+
+| columns_priv |
+| db |
+| event |
+| func |
+| help_category |
+| help_keyword |
+| help_relation |
+| help_topic |
+| host |
+| plugin |
+| proc |
+| procs_priv |
+| servers |
+| tables_priv |
+| time_zone |
+| time_zone_leap_second |
+| time_zone_name |
+| time_zone_transition |
+| time_zone_transition_type |
+| user |
++---------------------------+
+
+ Use the mysql program to select information from a table in the
+ mysql database:
+C:\> C:\mysql\bin\mysql -e "SELECT Host,Db,User FROM mysql.db"
++------+--------+------+
+| host | db | user |
++------+--------+------+
+| % | test | |
+| % | test_% | |
++------+--------+------+
+
+ For more information about mysqlshow and mysql, see Section 4.5.6,
+ "mysqlshow --- Display Database, Table, and Column Information,"
+ and Section 4.5.1, "mysql --- The MySQL Command-Line Tool."
+
+ If you are running a version of Windows that supports services,
+ you can set up the MySQL server to run automatically when Windows
+ starts. See Section 2.5.5.6, "Starting MySQL as a Windows
+ Service."
+
+2.5.9. Installing MySQL from Source on Windows
+
+ These instructions describe how to build binaries from source for
+ MySQL 5.1 on Windows. Instructions are provided for building
+ binaries from a standard source distribution or from the Bazaar
+ tree that contains the latest development source.
+
+Note
+
+ The instructions here are strictly for users who want to test
+ MySQL on Microsoft Windows from the latest source distribution or
+ from the Bazaar tree. For production use, we do not advise using a
+ MySQL server built by yourself from source. Normally, it is best
+ to use precompiled binary distributions of MySQL that are built
+ specifically for optimal performance on Windows by Oracle
+ Corporation. Instructions for installing binary distributions are
+ available in Section 2.5, "Installing MySQL on Windows."
+
+ To build MySQL on Windows from source, you must satisfy the
+ following system, compiler, and resource requirements:
+
+ * Windows 2000, Windows XP, or newer version.
+ Windows Vista is supported when using Visual Studio 2005
+ provided you have installed the following updates:
+
+ + Microsoft Visual Studio 2005 Professional Edition - ENU
+ Service Pack 1 (KB926601)
+ (http://support.microsoft.com/?kbid=926601)
+
+ + Security Update for Microsoft Visual Studio 2005
+ Professional Edition - ENU (KB937061)
+ (http://support.microsoft.com/?kbid=937061)
+
+ + Update for Microsoft Visual Studio 2005 Professional
+ Edition - ENU (KB932232)
+ (http://support.microsoft.com/?kbid=932232)
+
+ * CMake, which can be downloaded from http://www.cmake.org.
+ After installing, modify your path to include the cmake
+ binary.
+
+ * Microsoft Visual C++ 2005 Express Edition, Visual Studio .Net
+ 2003 (7.1), or Visual Studio 2005 (8.0) compiler system.
+
+ * If you are using Visual C++ 2005 Express Edition, you must
+ also install an appropriate Platform SDK. More information and
+ links to downloads for various Windows platforms is available
+ from
+ http://www.microsoft.com/downloads/details.aspx?familyid=0baf2
+ b35-c656-4969-ace8-e4c0c0716adb.
+
+ * If you are compiling from a Bazaar tree or making changes to
+ the parser, you need bison for Windows, which can be
+ downloaded from
+ http://gnuwin32.sourceforge.net/packages/bison.htm. Download
+ the package labeled "Complete package, excluding sources".
+ After installing the package, modify your path to include the
+ bison binary and ensure that this binary is accessible from
+ Visual Studio.
+
+ * Cygwin might be necessary if you want to run the test script
+ or package the compiled binaries and support files into a Zip
+ archive. (Cygwin is needed only to test or package the
+ distribution, not to build it.) Cygwin is available from
+ http://cygwin.com.
+
+ * 3GB to 5GB of disk space.
+
+ The exact system requirements for Visual Studio can be found here:
+ http://msdn.microsoft.com/vstudio/Previous/2003/sysreqs/default.as
+ px and
+ http://msdn.microsoft.com/vstudio/products/sysreqs/default.aspx
+
+ You also need a MySQL source distribution for Windows, which can
+ be obtained two ways:
+
+ * Obtain a source distribution packaged by Oracle Corporation.
+ These are available from http://dev.mysql.com/downloads/.
+
+ * Package a source distribution yourself from the latest Bazaar
+ developer source tree. For instructions on pulling the latest
+ source files, see Section 2.3.3, "Installing from the
+ Development Source Tree."
+
+ If you find something not working as expected, or you have
+ suggestions about ways to improve the current build process on
+ Windows, please send a message to the win32 mailing list. See
+ Section 1.6.1, "MySQL Mailing Lists."
+
+2.5.9.1. Building MySQL from Source Using CMake and Visual Studio
+
+ You can build MySQL on Windows by using a combination of cmake and
+ Microsoft Visual Studio .NET 2003 (7.1), Microsoft Visual Studio
+ 2005 (8.0), Microsoft Visual Studio 2008 (9.0) or Microsoft Visual
+ C++ 2005 Express Edition. You must have the appropriate Microsoft
+ Platform SDK installed.
+
+Note
+
+ To compile from the source code on Windows you must use the
+ standard source distribution (for example, mysql-5.1.50.tar.gz).
+ You build from the same distribution as used to build MySQL on
+ Unix, Linux and other platforms. Do not use the Windows Source
+ distributions as they do not contain the necessary configuration
+ script and other files.
+
+ Follow this procedure to build MySQL:
+
+ 1. If you are installing from a packaged source distribution,
+ create a work directory (for example, C:\workdir), and unpack
+ the source distribution there using WinZip or another Windows
+ tool that can read .zip files. This directory is the work
+ directory in the following instructions.
+
+Note
+ You must run the commands in the win directory from the
+ top-level source directory. Do not change into the win
+ directory, as the commands will not be executed correctly.
+
+ 2. Start a command shell. If you have not configured the PATH and
+ other environment variables for all command shells, you may be
+ able to start a command shell from the Start Menu within the
+ Windows Visual Studio menu that contains the necessary
+ environment changes.
+
+ 3. Within the command shell, navigate to the work directory and
+ run the following command:
+C:\workdir>win\configure.js options
+ If you have associated the .js file extension with an
+ application such as a text editor, then you may need to use
+ the following command to force configure.js to be executed as
+ a script:
+C:\workdir>cscript win\configure.js options
+ These options are available for configure.js:
+
+ + WITH_INNOBASE_STORAGE_ENGINE: Enable the InnoDB storage
+ engine.
+
+ + WITH_PARTITION_STORAGE_ENGINE: Enable user-defined
+ partitioning.
+
+ + WITH_ARCHIVE_STORAGE_ENGINE: Enable the ARCHIVE storage
+ engine.
+
+ + WITH_BLACKHOLE_STORAGE_ENGINE: Enable the BLACKHOLE
+ storage engine.
+
+ + WITH_EXAMPLE_STORAGE_ENGINE: Enable the EXAMPLE storage
+ engine.
+
+ + WITH_FEDERATED_STORAGE_ENGINE: Enable the FEDERATED
+ storage engine.
+
+ + WITH_NDBCLUSTER_STORAGE_ENGINE: Enable the NDBCLUSTER
+ storage engine in the MySQL server; cause binaries for
+ the MySQL Cluster management and data node, management
+ client, and other programs to be built.
+ This option is supported only in MySQL Cluster NDB 7.0
+ (NDBCLUSTER storage engine versions 6.4.0 and later)
+ using the MySQL Cluster sources. It cannot be used to
+ enable clustering support in other MySQL source trees or
+ distributions.
+
+ + MYSQL_SERVER_SUFFIX=suffix: Server suffix, default none.
+
+ + COMPILATION_COMMENT=comment: Server comment, default
+ "Source distribution".
+
+ + MYSQL_TCP_PORT=port: Server port, default 3306.
+
+ + DISABLE_GRANT_OPTIONS: Disables the --bootstrap,
+ --skip-grant-tables, and --init-file options for mysqld.
+ This option is available as of MySQL 5.1.15.
+ For example (type the command on one line):
+C:\workdir>win\configure.js WITH_INNOBASE_STORAGE_ENGINE
+ WITH_PARTITION_STORAGE_ENGINE MYSQL_SERVER_SUFFIX=-pro
+
+ 4. From the work directory, execute the win\build-vs9.bat
+ (Windows Visual Studio 2008), win\build-vs8.bat (Windows
+ Visual Studio 2005), or win\build-vs71.bat (Windows Visual
+ Stidion 2003) script, depending on the version of Visual
+ Studio you have installed. The script invokes CMake, which
+ generates the mysql.sln solution file.
+ You can also use the corresponding 64-bit file (for example
+ win\build-vs8_x64.bat or win\build-vs9_x64.bat) to build the
+ 64-bit version of MySQL. However, you cannot build the 64-bit
+ version with Visual Studio Express Edition. You must use
+ Visual Studio 2005 (8.0) or higher.
+
+ 5. From the work directory, open the generated mysql.sln file
+ with Visual Studio and select the proper configuration using
+ the Configuration menu. The menu provides Debug, Release,
+ RelwithDebInfo, MinRelInfo options. Then select Solution >
+ Build to build the solution.
+ Remember the configuration that you use in this step. It is
+ important later when you run the test script because that
+ script needs to know which configuration you used.
+
+ 6. Test the server. The server built using the preceding
+ instructions expects that the MySQL base directory and data
+ directory are C:\mysql and C:\mysql\data by default. If you
+ want to test your server using the source tree root directory
+ and its data directory as the base directory and data
+ directory, you need to tell the server their path names. You
+ can either do this on the command line with the --basedir and
+ --datadir options, or by placing appropriate options in an
+ option file. (See Section 4.2.3.3, "Using Option Files.") If
+ you have an existing data directory elsewhere that you want to
+ use, you can specify its path name instead.
+ When the server is running in standalone fashion or as a
+ service based on your configuration, try to connect to it from
+ the mysql interactive command-line utility.
+ You can also run the standard test script, mysql-test-run.pl.
+ This script is written in Perl, so you'll need either Cygwin
+ or ActiveState Perl to run it. You may also need to install
+ the modules required by the script. To run the test script,
+ change location into the mysql-test directory under the work
+ directory, set the MTR_VS_CONFIG environment variable to the
+ configuration you selected earlier (or use the --vs-config
+ option), and invoke mysql-test-run.pl. For example (using
+ Cygwin and the bash shell):
+shell> cd mysql-test
+shell> export MTR_VS_CONFIG=debug
+shell> ./mysql-test-run.pl --force --timer
+shell> ./mysql-test-run.pl --force --timer --ps-protocol
+
+ When you are satisfied that the programs you have built are
+ working correctly, stop the server. Now you can install the
+ distribution. One way to do this is to use the make_win_bin_dist
+ script in the scripts directory of the MySQL source distribution
+ (see Section 4.4.2, "make_win_bin_dist --- Package MySQL
+ Distribution as ZIP Archive"). This is a shell script, so you must
+ have Cygwin installed if you want to use it. It creates a Zip
+ archive of the built executables and support files that you can
+ unpack in the location at which you want to install MySQL.
+
+ It is also possible to install MySQL by copying directories and
+ files directly:
+
+ 1. Create the directories where you want to install MySQL. For
+ example, to install into C:\mysql, use these commands:
+C:\> mkdir C:\mysql
+C:\> mkdir C:\mysql\bin
+C:\> mkdir C:\mysql\data
+C:\> mkdir C:\mysql\share
+C:\> mkdir C:\mysql\scripts
+ If you want to compile other clients and link them to MySQL,
+ you should also create several additional directories:
+C:\> mkdir C:\mysql\include
+C:\> mkdir C:\mysql\lib
+C:\> mkdir C:\mysql\lib\debug
+C:\> mkdir C:\mysql\lib\opt
+ If you want to benchmark MySQL, create this directory:
+C:\> mkdir C:\mysql\sql-bench
+ Benchmarking requires Perl support. See Section 2.15, "Perl
+ Installation Notes."
+
+ 2. From the work directory, copy into the C:\mysql directory the
+ following files and directories:
+C:\> cd \workdir
+C:\workdir> mkdir C:\mysql
+C:\workdir> mkdir C:\mysql\bin
+C:\workdir> copy client\Release\*.exe C:\mysql\bin
+C:\workdir> copy sql\Release\mysqld.exe C:\mysql\bin\mysqld.exe
+C:\workdir> xcopy scripts\*.* C:\mysql\scripts /E
+C:\workdir> xcopy share\*.* C:\mysql\share /E
+ If you want to compile other clients and link them to MySQL,
+ you should also copy several libraries and header files:
+C:\workdir> copy lib\Release\mysqlclient.lib C:\mysql\lib\debug
+C:\workdir> copy lib\Release\libmysql.* C:\mysql\lib\debug
+C:\workdir> copy lib\Release\zlib.* C:\mysql\lib\debug
+C:\workdir> copy lib\Release\mysqlclient.lib C:\mysql\lib\opt
+C:\workdir> copy lib\Release\libmysql.* C:\mysql\lib\opt
+C:\workdir> copy lib\Release\zlib.* C:\mysql\lib\opt
+C:\workdir> copy include\*.h C:\mysql\include
+C:\workdir> copy libmysql\libmysql.def C:\mysql\include
+
+Note
+ If you have compiled a Debug, rather than Release solution,
+ you can replace Release with Debug in the source file names
+ shown above.
+ If you want to benchmark MySQL, you should also do this:
+C:\workdir> xcopy sql-bench\*.* C:\mysql\bench /E
+
+ After installation, set up and start the server in the same way as
+ for binary Windows distributions. This includes creating the
+ system tables by running mysql_install_db. For more information,
+ see Section 2.5, "Installing MySQL on Windows."
+
+2.5.10. Compiling MySQL Clients on Windows
+
+ In your source files, you should include my_global.h before
+ mysql.h:
+#include
+#include
+
+ my_global.h includes any other files needed for Windows
+ compatibility (such as windows.h) if you compile your program on
+ Windows.
+
+ You can either link your code with the dynamic libmysql.lib
+ library, which is just a wrapper to load in libmysql.dll on
+ demand, or link with the static mysqlclient.lib library.
+
+ The MySQL client libraries are compiled as threaded libraries, so
+ you should also compile your code to be multi-threaded.
+
+2.6. Installing MySQL on Linux
+
+ The following sections covers the installation of Linux using
+ RPMs. For information on using a generic binary package using tar,
+ see Section 2.2, "Installing MySQL from Generic Binaries on
+ Unix/Linux." For information on installing from source, see
+ Section 2.3, "MySQL Installation Using a Source Distribution."
+
+ mysql.server can be found in the support-files directory under the
+ MySQL installation directory or in a MySQL source tree. You can
+ install it as /etc/init.d/mysql for automatic MySQL startup and
+ shutdown. See Section 2.13.1.2, "Starting and Stopping MySQL
+ Automatically."
+
+2.6.1. Installing MySQL from RPM Packages on Linux
+
+ The recommended way to install MySQL on RPM-based Linux
+ distributions is by using the RPM packages. The RPMs that we
+ provide to the community should work on all versions of Linux that
+ support RPM packages and use glibc 2.3. To obtain RPM packages,
+ see Section 2.1.3, "How to Get MySQL."
+
+ For non-RPM Linux distributions, you can install MySQL using a
+ .tar.gz package. See Section 2.2, "Installing MySQL from Generic
+ Binaries on Unix/Linux."
+
+ We do provide some platform-specific RPMs; the difference between
+ a platform-specific RPM and a generic RPM is that a
+ platform-specific RPM is built on the targeted platform and is
+ linked dynamically whereas a generic RPM is linked statically with
+ LinuxThreads.
+
+Note
+
+ RPM distributions of MySQL often are provided by other vendors. Be
+ aware that they may differ in features and capabilities from those
+ built by us, and that the instructions in this manual do not
+ necessarily apply to installing them. The vendor's instructions
+ should be consulted instead.
+
+ In most cases, you need to install only the MySQL-server and
+ MySQL-client packages to get a functional MySQL installation. The
+ other packages are not required for a standard installation.
+
+ RPMs for MySQL Cluster. Beginning with MySQL 5.1.24, standard
+ MySQL server RPMs built by MySQL no longer provide support for the
+ NDBCLUSTER storage engine. MySQL Cluster users wanting to upgrade
+ MySQL 5.1.23 or earlier installations from RPMs built by MySQL
+ should upgrade to MySQL Cluster NDB 6.2 or MySQL Cluster NDB 6.3;
+ RPMs that should work with most Linux distributions are available
+ for both of these release series.
+
+Important
+
+ When upgrading a MySQL Cluster RPM installation, you must upgrade
+ all installed RPMs, including the Server and Client RPMs.
+
+ For more information about installing MySQL Cluster from RPMs, see
+ Section 17.2.1.1, "MySQL Cluster Multi-Computer Installation."
+
+ For upgrades, if your installation was originally produced by
+ installing multiple RPM packages, it is best to upgrade all the
+ packages, not just some. For example, if you previously installed
+ the server and client RPMs, do not upgrade just the server RPM.
+
+ The RPM packages shown in the following list are available. The
+ names shown here use a suffix of .glibc23.i386.rpm, but particular
+ packages can have different suffixes, described later.
+
+ * MySQL-server-VERSION.glibc23.i386.rpm
+ The MySQL server. You need this unless you only want to
+ connect to a MySQL server running on another machine.
+
+ * MySQL-client-VERSION.glibc23.i386.rpm
+ The standard MySQL client programs. You probably always want
+ to install this package.
+
+ * MySQL-devel-VERSION.glibc23.i386.rpm
+ The libraries and include files that are needed if you want to
+ compile other MySQL clients, such as the Perl modules.
+
+ * MySQL-debuginfo-VERSION.glibc23.i386.rpm
+ This package contains debugging information. debuginfo RPMs
+ are never needed to use MySQL software; this is true both for
+ the server and for client programs. However, they contain
+ additional information that might be needed by a debugger to
+ analyze a crash.
+
+ * MySQL-shared-VERSION.glibc23.i386.rpm
+ This package contains the shared libraries
+ (libmysqlclient.so*) that certain languages and applications
+ need to dynamically load and use MySQL. It contains
+ single-threaded and thread-safe libraries. If you install this
+ package, do not install the MySQL-shared-compat package.
+
+ * MySQL-shared-compat-VERSION.glibc23.i386.rpm
+ This package includes the shared libraries for MySQL 3.23,
+ 4.0, and so on, up to the current release. It contains
+ single-threaded and thread-safe libraries. Install this
+ package instead of MySQL-shared if you have applications
+ installed that are dynamically linked against older versions
+ of MySQL but you want to upgrade to the current version
+ without breaking the library dependencies.
+
+ * MySQL-shared-compat-advanced-gpl-VERSION.glibc23.i386.rpm,
+ MySQL-shared-compat-advanced-VERSION.glibc23.i386.rpm
+ These are like the MySQL-shared-compat package, but are for
+ the "MySQL Enterprise Server - Advanced Edition" products.
+ Install these packages rather than the normal
+ MySQL-shared-compat package if you want to included shared
+ client libraries for older MySQL versions.
+
+ * MySQL-embedded-VERSION.glibc23.i386.rpm
+ The embedded MySQL server library.
+
+ * MySQL-ndb-management-VERSION.glibc23.i386.rpm,
+ MySQL-ndb-storage-VERSION.glibc23.i386.rpm,
+ MySQL-ndb-tools-VERSION.glibc23.i386.rpm,
+ MySQL-ndb-extra-VERSION.glibc23.i386.rpm
+ Packages that contain additional files for MySQL Cluster
+ installations.
+
+Note
+ The MySQL-ndb-tools RPM requires a working installation of
+ perl. Prior to MySQL 5.1.18, the DBI and HTML::Template
+ packages were also required. See Section 2.15, "Perl
+ Installation Notes," and Section 17.4.21, "ndb_size.pl ---
+ NDBCLUSTER Size Requirement Estimator," for more information.
+
+ * MySQL-test-VERSION.glibc23.i386.rpm
+ This package includes the MySQL test suite.
+
+ * MySQL-VERSION.src.rpm
+ This contains the source code for all of the previous
+ packages. It can also be used to rebuild the RPMs on other
+ architectures (for example, Alpha or SPARC).
+
+ The suffix of RPM package names (following the VERSION value) has
+ the following syntax:
+.PLATFORM.CPU.rpm
+
+ The PLATFORM and CPU values indicate the type of system for which
+ the package is built. PLATFORM indicates the platform and CPU
+ indicates the processor type or family.
+
+ All packages are dynamically linked against glibc 2.3. The
+ PLATFORM value indicates whether the package is platform
+ independent or intended for a specific platform, as shown in the
+ following table.
+ glibc23 Platform independent, should run on any Linux distribution
+ that supports glibc 2.3
+ rhel3, rhel4 Red Hat Enterprise Linux 3 or 4
+ sles9, sles10 SuSE Linux Enterprise Server 9 or 10
+
+ In MySQL 5.1, only glibc23 packages are available currently.
+
+ The CPU value indicates the processor type or family for which the
+ package is built.
+ i386 x86 processor, 386 and up
+ i586 x86 processor, Pentium and up
+ x86_64 64-bit x86 processor
+ ia64 Itanium (IA-64) processor
+
+ To see all files in an RPM package (for example, a MySQL-server
+ RPM), run a command like this:
+shell> rpm -qpl MySQL-server-VERSION.glibc23.i386.rpm
+
+ To perform a standard minimal installation, install the server and
+ client RPMs:
+shell> rpm -i MySQL-server-VERSION.glibc23.i386.rpm
+shell> rpm -i MySQL-client-VERSION.glibc23.i386.rpm
+
+ To install only the client programs, install just the client RPM:
+shell> rpm -i MySQL-client-VERSION.glibc23.i386.rpm
+
+ RPM provides a feature to verify the integrity and authenticity of
+ packages before installing them. If you would like to learn more
+ about this feature, see Section 2.1.4, "Verifying Package
+ Integrity Using MD5 Checksums or GnuPG."
+
+ The server RPM places data under the /var/lib/mysql directory. The
+ RPM also creates a login account for a user named mysql (if one
+ does not exist) to use for running the MySQL server, and creates
+ the appropriate entries in /etc/init.d/ to start the server
+ automatically at boot time. (This means that if you have performed
+ a previous installation and have made changes to its startup
+ script, you may want to make a copy of the script so that you do
+ not lose it when you install a newer RPM.) See Section 2.13.1.2,
+ "Starting and Stopping MySQL Automatically," for more information
+ on how MySQL can be started automatically on system startup.
+
+ If you want to install the MySQL RPM on older Linux distributions
+ that do not support initialization scripts in /etc/init.d
+ (directly or via a symlink), you should create a symbolic link
+ that points to the location where your initialization scripts
+ actually are installed. For example, if that location is
+ /etc/rc.d/init.d, use these commands before installing the RPM to
+ create /etc/init.d as a symbolic link that points there:
+shell> cd /etc
+shell> ln -s rc.d/init.d .
+
+ However, all current major Linux distributions should support the
+ new directory layout that uses /etc/init.d, because it is required
+ for LSB (Linux Standard Base) compliance.
+
+ In MySQL 5.1.49 and later, during an upgrade installation using
+ the RPM packages, if the MySQL server is running when the upgrade
+ occurs, the MySQL server is stopped, the upgrade occurs, and the
+ MySQL server is restarted. If the MySQL server is not already
+ running when the RPM upgrade occurs, the MySQL server is not
+ started at the end of the installation.
+
+ If the RPM files that you install include MySQL-server, the mysqld
+ server should be up and running after installation. You should be
+ able to start using MySQL.
+
+ If something goes wrong, you can find more information in the
+ binary installation section. See Section 2.2, "Installing MySQL
+ from Generic Binaries on Unix/Linux."
+
+Note
+
+ The accounts that are listed in the MySQL grant tables initially
+ have no passwords. After starting the server, you should set up
+ passwords for them using the instructions in Section 2.13,
+ "Post-Installation Setup and Testing."
+
+ During RPM installation, a user named mysql and a group named
+ mysql are created on the system. This is done using the useradd,
+ groupadd, and usermod commands. Those commands require appropriate
+ administrative privileges, which is ensured for locally managed
+ users and groups (as listed in the /etc/passwd and /etc/group
+ files) by the RPM installation process being run by root.
+
+ If you log in as the mysql user, you may find that MySQL displays
+ "Invalid (old?) table or database name" errors that mention
+ .mysqlgui, lost+found, .mysqlgui, .bash_history, .fonts.cache-1,
+ .lesshst, .mysql_history, .profile, .viminfo, and similar files
+ created by MySQL or operating system utilities. You can safely
+ ignore these error messages or remove the files or directories
+ that cause them if you do not need them.
+
+ For nonlocal user management (LDAP, NIS, and so forth), the
+ administrative tools may require additional authentication (such
+ as a password), and will fail if the installing user does not
+ provide this authentication. Even if they fail, the RPM
+ installation will not abort but succeed, and this is intentional.
+ If they failed, some of the intended transfer of ownership may be
+ missing, and it is recommended that the system administrator then
+ manually ensures some appropriate user andgroup exists and
+ manually transfers ownership following the actions in the RPM spec
+ file.
+
+2.7. Installing MySQL on Mac OS X
+
+ MySQL for Mac OS X is available in a number of different forms:
+
+ * Native Package Installer format, which uses the native Mac OS
+ X installer to walk you through the installation of MySQL. For
+ more information, see Section 2.7.1, "Installing MySQL Using
+ the Installation Package." You can use the package installer
+ with Mac OS X 10.3 and later, and available for both PowerPC
+ and Intel architectures, and both 32-bit and 64-bit
+ architectures. There is no Universal Binary available using
+ the package installation method. The user you use to perform
+ the installation must have administrator privileges.
+
+ * Tar package format, which uses a file packaged using the Unix
+ tar and gzip commands. To use this method, you will need to
+ open a Terminal window. You do not need administrator
+ privileges using this method, as you can install the MySQL
+ server anywhere using this method. For more information on
+ using this method, you can use the generic instructions for
+ using a tarball, Section 2.2, "Installing MySQL from Generic
+ Binaries on Unix/Linux."You can use the package installer with
+ Mac OS X 10.3 and later, and available for both PowerPC and
+ Intel architectures, and both 32-bit and 64-bit architectures.
+ A Universal Binary, incorporating both Power PC and Intel
+ architectures and 32-bit and 64-bit binaries is available.
+ In addition to the core installation, the Package Installer
+ also includes Section 2.7.2, "Installing the MySQL Startup
+ Item" and Section 2.7.3, "Installing and Using the MySQL
+ Preference Pane," both of which simplify the management of
+ your installation.
+
+ * Mac OS X server includes a version of MySQL as standard. If
+ you want to use a more recent version than that supplied with
+ the Mac OS X server release, you can make use of the package
+ or tar formats. For more information on using the MySQL
+ bundled with Mac OS X, see Section 2.7.4, "Using MySQL on Mac
+ OS X Server."
+
+ For additional information on using MySQL on Mac OS X, see Section
+ 2.7.5, "MySQL Installation on Mac OS X Notes."
+
+2.7.1. Installing MySQL Using the Installation Package
+
+ You can install MySQL on Mac OS X 10.3.x ("Panther") or newer
+ using a Mac OS X binary package in PKG format instead of the
+ binary tarball distribution. Please note that older versions of
+ Mac OS X (for example, 10.1.x or 10.2.x) are not supported by this
+ package.
+
+ The package is located inside a disk image (.dmg) file that you
+ first need to mount by double-clicking its icon in the Finder. It
+ should then mount the image and display its contents.
+
+Note
+
+ Before proceeding with the installation, be sure to shut down all
+ running MySQL server instances by either using the MySQL Manager
+ Application (on Mac OS X Server) or via mysqladmin shutdown on the
+ command line.
+
+ When installing from the package version, you should also install
+ the MySQL Preference Pane, which will enable you to control the
+ startup and execution of your MySQL server from System
+ Preferences. For more information, see Section 2.7.3, "Installing
+ and Using the MySQL Preference Pane."
+
+ When installing using the package installer, the files are
+ installed into a directory within /usr/local matching the name of
+ the installation version and platform. For example, the installer
+ file mysql-5.1.39-osx10.5-x86_64.pkg installs MySQL into
+ /usr/local/mysql-5.1.39-osx10.5-x86_64 . The installation layout
+ of the directory is as shown in the following table:
+ Directory Contents of Directory
+ bin Client programs and the mysqld server
+ data Log files, databases
+ docs Manual in Info format
+ include Include (header) files
+ lib Libraries
+ man Unix manual pages
+ mysql-test MySQL test suite
+ scripts Contains the mysql_install_db script
+ share/mysql Error message files
+ sql-bench Benchmarks
+ support-files Scripts and sample configuration files
+ /tmp/mysql.sock The location of the MySQL Unix socket
+
+ During the package installer process, a symbolic link from
+ /usr/local/mysql to the version/platform specific directory
+ created during installation will be created automatically.
+
+ 1. Download and open the MySQL package installer, which is
+ provided on a disk image (.dmg). Double-click to open the disk
+ image, which includes the main MySQL installation package, the
+ MySQLStartupItem.pkg installation package, and the
+ MySQL.prefPane.
+
+ 2. Double-click the MySQL installer package. It will be named
+ according to the version of MySQL you have downloaded. For
+ example, if you have downloaded MySQL 5.1.39, double-click
+ mysql-5.1.39-osx10.5-x86.pkg.
+
+ 3. You will be presented with the opening installer dialog. Click
+ Continue to begin installation.
+ MySQL Package Installer: Step 1
+
+ 4. A copy of the installation instructions and other important
+ information relevant to this installation are displayed. Click
+ Continue .
+
+ 5. If you have downloaded the community version of MySQL, you
+ will be shown a copy of the relevent GNU General Public
+ License. Click Continue .
+
+ 6. Select the drive you want to use to install the MySQL Startup
+ Item. The drive must have a valid, bootable, Mac OS X
+ operating system installed. Click Continue.
+ MySQL Package Installer: Step 4
+
+ 7. You will be asked to confirm the details of the installation,
+ including the space required for the installation. To change
+ the drive on which the startup item is installed you can click
+ either Go Back or Change Install Location.... To install the
+ startup item, click Install.
+
+ 8. Once the installation has been completed successfully, you
+ will be shown an Install Succeeded message.
+
+ For convenience, you may also want to install the Section 2.7.2,
+ "Installing the MySQL Startup Item" and Section 2.7.3, "Installing
+ and Using the MySQL Preference Pane."
+
+2.7.2. Installing the MySQL Startup Item
+
+ The MySQL Installation Package includes a startup item that can be
+ used to automatically start up and shut down MySQL.
+
+ To install the MySQL Startup Item:
+
+ 1. Download and open the MySQL package installer, which is
+ provided on a disk image (.dmg). Double-click to open the disk
+ image, which includes the main MySQL installation package, the
+ MySQLStartupItem.pkg installation package, and the
+ MySQL.prefPane.
+
+ 2. Double-click the MySQLStartItem.pkg file to start the
+ installation process.
+
+ 3. You will be presented with the Install MySQL Startup Item
+ dialog.
+ MySQL Startup Item Installer: Step 1
+ Click Continue to continue the installation process.
+
+ 4. A copy of the installation instructions and other important
+ information relevant to this installation are displayed. Click
+ Continue .
+
+ 5. Select the drive you want to use to install the MySQL Startup
+ Item. The drive must have a valid, bootable, Mac OS X
+ operating system installed. Click Continue.
+ MySQL Startup Item Installer: Step 3
+
+ 6. You will be asked to confirm the details of the installation.
+ To change the drive on which the startup item is installed you
+ can click either Go Back or Change Install Location.... To
+ install the startup item, click Install.
+
+ 7. Once the installation has been completed successfully, you
+ will be shown an Install Succeeded message.
+ MySQL Startup Item Installer: Step 5
+
+ The Startup Item for MySQL is installed into
+ /Library/StartupItems/MySQLCOM. The Startup Item installation adds
+ a variable MYSQLCOM=-YES- to the system configuration file
+ /etc/hostconfig. If you want to disable the automatic startup of
+ MySQL, change this variable to MYSQLCOM=-NO-.
+
+ After the installation, you can start up MySQL by running the
+ following commands in a terminal window. You must have
+ administrator privileges to perform this task.
+
+ If you have installed the Startup Item, use this command to start
+ the server:
+shell> sudo /Library/StartupItems/MySQLCOM/MySQLCOM start
+
+ You may be prompted for your password to complete the startup.
+
+ If you have installed the Startup Item, use this command to stop
+ the server:
+shell> sudo /Library/StartupItems/MySQLCOM/MySQLCOM stop
+
+ You may be prompted for your password to complete the shutdown.
+
+2.7.3. Installing and Using the MySQL Preference Pane
+
+ The MySQL Package installer disk image also includes a custom
+ MySQL Preference Pane that enables you to start, stop and control
+ automated startup during boot of your MySQL installation.
+
+ To install the MySQL Preference Pane:
+
+ 1. Download and open the MySQL package installer package, which
+ is provided on a disk image (.dmg). Double-click to open the
+ disk image, which includes the main MySQL installation
+ package, the MySQLStartupItem.pkg installation package, and
+ the MySQL.prefPane.
+
+ 2. Double-click the MySQL.prefPane. The MySQL System Preferences
+ will open.
+
+ 3. If this is the first time you have installed the preference
+ pane, you will be asked to confirm installation and whether
+ you want to install the preference pane for all users, or only
+ the current user. To install the preference pane for all users
+ you will need administrator privileges. If necessary, you will
+ be prompted for the username and password for a user with
+ administrator privileges.
+
+ 4. If you already have the MySQL Preference Pane installed, you
+ will be asked to confirm whether you want to overwrite the
+ existing MySQL Preference Pane.
+
+Note
+
+ The MySQL Preference Pane only starts and stops MySQL installation
+ installed from the MySQL package installation that have been
+ installed in the default location.
+
+ Once the MySQL Preference Pane has been installed, you can control
+ your MySQL server instance using the preference pane. To use the
+ preference pane, open the System Preferences... from the Apple
+ menu. Select the MySQL preference pane by clicking the MySQL logo
+ within the Other section of the preference panes list.
+ MySQL Preference Pane
+
+ The MySQL Preference Pane shows the current status of the MySQL
+ server, showing stopped (in red) if the server is not running and
+ running (in green) if the server has already been started. The
+ preference pane will also show the current setting for whether the
+ MySQL server has been set to start up automatically.
+
+ * To start MySQL using the preference pane:
+ Click Start MySQL Server. You may be prompted for the username
+ and password of a user with administrator privileges to start
+ the MySQL server.
+
+ * To stop MySQL using the preference pane:
+ Click Stop MySQL Server. You may be prompted for the username
+ and password of a user with administrator privileges to
+ shutdown the MySQL server.
+
+ * To automatically start the MySQL server when the system boots:
+ Check the checkbox next to Automatically Start MySQL Server on
+ Startup.
+
+ * To disable the automatic starting of the MySQL server when the
+ system boots:
+ Uncheck the checkbox next to Automatically Start MySQL Server
+ on Startup.
+
+ You can close the System Preferences... once you have completed
+ your settings.
+
+2.7.4. Using MySQL on Mac OS X Server
+
+ If you are running Mac OS X Server, a version of MySQL should
+ already be installed. The following table shows the versions of
+ MySQL that ship with Mac OS X Server versions.
+ Mac OS X Server Version MySQL Version
+ 10.2-10.2.2 3.23.51
+ 10.2.3-10.2.6 3.23.53
+ 10.3 4.0.14
+ 10.3.2 4.0.16
+ 10.4.0 4.1.10a
+ 10.5.0 5.0.45
+ 10.6.0 5.0.82
+
+ The installation layout of MySQL on Mac OS X Server is as shown in
+ the table below:
+ Directory Contents of Directory
+ /usr/bin Client programs
+ /var/mysql Log files, databases
+ /usr/libexec The mysqld server
+ /usr/share/man Unix manual pages
+ /usr/share/mysql/mysql-test MySQL test suite
+ /usr/share/mysql Contains the mysql_install_db script
+ /var/mysql/mysql.sock The location of the MySQL Unix socket
+
+Note
+
+ The MySQL server bundled with Mac OS X Server does not include the
+ MySQL client libraries and header files required if you want to
+ access and use MySQL from a third-party driver, such as Perl DBI
+ or PHP. For more information on obtaining and installing MySQL
+ libraries, see Mac OS X Server version 10.5: MySQL libraries
+ available for download (http://support.apple.com/kb/TA25017).
+ Alternatively, you can ignore the bundled MySQL server and install
+ MySQL from the package or tarball installation.
+
+ For more information on managing the bundled MySQL instance in Mac
+ OS X Server 10.5, see Mac OS X Server: Web Technologies
+ Administration For Version 10.5 Leopard
+ (http://images.apple.com/server/macosx/docs/Web_Technologies_Admin
+ _v10.5.pdf). For more information on managing the bundled MySQL
+ instance in Mac OS X Server 10.6, see Mac OS X Server: Web
+ Technologies Administration Version 10.6 Snow Leopard
+ (http://manuals.info.apple.com/en_US/WebTech_v10.6.pdf).
+
+2.7.5. MySQL Installation on Mac OS X Notes
+
+ You should keep the following issues and notes in mind:
+
+ * The default location for the MySQL Unix socket is different on
+ Mac OS X and Mac OS X Server depending on the installation
+ type you chose. The default locations by installation are as
+ follows:
+
+ Package Installer from MySQL /tmp/mysql.sock
+ Tarball from MySQL /tmp/mysql.sock
+ MySQL Bundled with Mac OS X Server /var/mysql/mysql.sock
+ To prevent issues, you should either change the configuration
+ of the socket used within your application (for example,
+ changing php.ini), or you should configure the socket location
+ using a MySQL configuration file and the socket option. For
+ more information, see Section 5.1.2, "Server Command Options."
+
+ * You may need (or want) to create a specific mysql user to own
+ the MySQL directory and data. On Mac OS X 10.4 and lower you
+ can do this by using the Netinfo Manager application, located
+ within the Utilities folder within the Applications folder. On
+ Mac OS X 10.5 and later you can do this through the Directory
+ Utility. From Mac OS X 10.5 and later (including Mac OS X
+ Server 10.5) the mysql should already exist. For use in single
+ user mode, an entry for _mysql (note the underscore prefix)
+ should already exist within the system /etc/passwd file.
+
+ * Due to a bug in the Mac OS X package installer, you may see
+ this error message in the destination disk selection dialog:
+You cannot install this software on this disk. (null)
+ If this error occurs, click the Go Back button once to return
+ to the previous screen. Then click Continue to advance to the
+ destination disk selection again, and you should be able to
+ choose the destination disk correctly. We have reported this
+ bug to Apple and it is investigating this problem.
+
+ * Because the MySQL package installer installs the MySQL
+ contents into a version and platform specific directory, you
+ can use this to upgrade and migrate your database between
+ versions. You will need to either copy the data directory from
+ the old version to the new version, or alternatively specify
+ an alternative datadir value to set location of the data
+ directory.
+
+ * You might want to add aliases to your shell's resource file to
+ make it easier to access commonly used programs such as mysql
+ and mysqladmin from the command line. The syntax for bash is:
+alias mysql=/usr/local/mysql/bin/mysql
+alias mysqladmin=/usr/local/mysql/bin/mysqladmin
+ For tcsh, use:
+alias mysql /usr/local/mysql/bin/mysql
+alias mysqladmin /usr/local/mysql/bin/mysqladmin
+ Even better, add /usr/local/mysql/bin to your PATH environment
+ variable. You can do this by modifying the appropriate startup
+ file for your shell. For more information, see Section 4.2.1,
+ "Invoking MySQL Programs."
+
+ * After you have copied over the MySQL database files from the
+ previous installation and have successfully started the new
+ server, you should consider removing the old installation
+ files to save disk space. Additionally, you should also remove
+ older versions of the Package Receipt directories located in
+ /Library/Receipts/mysql-VERSION.pkg.
+
+2.8. Installing MySQL on Solaris
+
+ MySQL on Solaris and OpenSolaris is available in a number of
+ different formats.
+
+ * For information on installing using the native Solaris PKG
+ format, see Section 2.8.1, "Installing using a Solaris PKG."
+
+ * On OpenSolaris, the standard package repositories include
+ MySQL packages specially built for OpenSolaris that include
+ entries for the Service Management Framework (SMF) to enable
+ control of the installation using the SMF administration
+ commands. For more information, see Section 2.8.2, "Installing
+ MySQL on OpenSolaris using native packages."
+
+ * To use a standard tar binary installation, use the notes
+ provided in Section 2.2, "Installing MySQL from Generic
+ Binaries on Unix/Linux." Check the notes and hints at the end
+ of this section for Solaris specific notes that you may need
+ before or after installation.
+
+ * For information on installing MySQL on Solaris or OpenSolaris
+ using a source distribution, first check the Solaris advice,
+ Section 2.8.3, "Solaris Source Build Notes." For detailed
+ instructions on installing from source, see Section 2.3,
+ "MySQL Installation Using a Source Distribution."
+
+ To obtain a binary MySQL distribution for Solaris in tarball or
+ PKG format, http://dev.mysql.com/downloads/mysql/5.1.html.
+
+ Additional notes to be aware of when installing and using MySQL on
+ Solaris:
+
+ * If you want to use MySQL with the mysql user and group, use
+ the groupadd and useradd commands:
+groupadd mysql
+useradd -g mysql mysql
+
+ * If you install MySQL using a binary tarball distribution on
+ Solaris, you may run into trouble even before you get the
+ MySQL distribution unpacked, as the Solaris tar cannot handle
+ long file names. This means that you may see errors when you
+ try to unpack MySQL.
+ If this occurs, you must use GNU tar (gtar) to unpack the
+ distribution. In Solaris 10 and OpenSolaris gtar is normally
+ located in /usr/sfw/bin/gtar, but may not be included in the
+ default path definition.
+
+ * When using Solaris 10 for x86_64, you should mount any file
+ systems on which you intend to store InnoDB files with the
+ forcedirectio option. (By default mounting is done without
+ this option.) Failing to do so will cause a significant drop
+ in performance when using the InnoDB storage engine on this
+ platform.
+
+ * If you would like MySQL to start automatically, you can copy
+ support-files/mysql.server to /etc/init.d and create a
+ symbolic link to it named /etc/rc3.d/S99mysql.server.
+
+ * If too many processes try to connect very rapidly to mysqld,
+ you should see this error in the MySQL log:
+Error in accept: Protocol error
+ You might try starting the server with the --back_log=50
+ option as a workaround for this.
+
+ * To configure the generation of core files on Solaris you
+ should use the coreadm command. Because of the security
+ implications of generating a core on a setuid() application,
+ by default, Solaris does not support core files on setuid()
+ programs. However, you can modify this behavior using coreadm.
+ If you enable setuid() core files for the current user, they
+ will be generated using the mode 600 and owned by the
+ superuser.
+
+2.8.1. Installing using a Solaris PKG
+
+ You can install MySQL on Solaris and OpenSolaris using a binary
+ package using the native Solaris PKG format instead of the binary
+ tarball distribution.
+
+ To use this package, download the corresponding
+ mysql-VERSION-solaris10-PLATFORM.pkg.gz file, then decompress it.
+ For example
+shell> gunzip mysql-5.1.48-solaris10-x86_64.pkg.gz
+
+ To install a new package, use pkgadd and follow the onscreen
+ prompts. You must have root privileges to perform this operation:
+shell> pkgadd -d mysql-5.1.48-solaris10-x86_64.pkg
+
+The following packages are available:
+ 1 mysql MySQL Community Server (GPL)
+ (i86pc) 5.1.48
+
+Select package(s) you wish to process (or 'all' to process
+all packages). (default: all) [?,??,q]:
+
+ The PKG installer installs all of the files and tools needed, and
+ then initializes your database if one does not exist. To complete
+ the installation, you should set the root password for MySQL as
+ provided in the instructions at the end of the installation.
+ Alternatively, you can run the mysql_secure_installation script
+ that comes with the installation.
+
+ The default installation directory is /opt/mysql. You can only
+ change the root path of the installation when using pkgadd, which
+ can be used to install MySQL in a different Solaris zone. If you
+ need to install in a specific directory, use the binary tar file.
+
+ The pkg installer copies a suitable startup script for MySQL into
+ /etc/init.d/mysql. To enable MySQL to startup and shutdown
+ automatically, you should create a link between this file and the
+ init script directories. For example, to ensure safe startup and
+ shutdown of MySQL you could use the following commands to add the
+ right links:
+shell> ln /etc/init.d/mysql /etc/rc3.d/S91mysql
+shell> ln /etc/init.d/mysql /etc/rc0.d/K02mysql
+
+ To remove MySQL, the installed package name is mysql. You can use
+ this in combination with the pkgrm command to remove the
+ installation.
+
+2.8.2. Installing MySQL on OpenSolaris using native packages
+
+ OpenSolaris includes standard packages for MySQL in the core
+ repository. The MySQL packages are based on a specific release of
+ MySQL and updated periodically. For the latest release you must
+ either the native Solaris PKG, tar or source installations. The
+ native OpenSolris packages include SMF files so that you can
+ easily control your MySQL installation, including automatic
+ startup and recovery, using the native service management tools.
+
+ To install MySQL on OpenSolaris, use the pkg command. You will
+ need to be logged in as root, or use the pfexec tool, as shown in
+ the example below:
+shell> pfexec pkg install SUNWmysql51
+
+ The package set installs three individual packages,
+ SUNWmysql51lib, which contains the MySQL client libraries;
+ SUNWmysql51r which contains the root components, including SMF and
+ configuration files; and SUNWmysql51u which contains the scripts,
+ binary tools and other files. You can install these packages
+ individually if you only need the corresponding components.
+
+ The MySQL files are installed into /usr/mysql which symbolic links
+ for the sub directories (bin, lib, etc.) to a version specific
+ directory. For MySQL 5.1, the full installation is located in
+ /usr/mysql/5.1. The default data directory is /var/mysql/5.1/data.
+ The configuration file is installed in /etc/mysql/5.1/my.cnf. This
+ layout permits multiple versions of MySQL to be installed, without
+ overwriting the data and binaries from other versions.
+
+ Once installed, you must run mysql_install_db to initalize the
+ database, and use the mysql_secure_installation to secure your
+ installation.
+
+Using SMF to manage your MySQL installation
+
+ Once installed, you can start and stop your MySQL server using the
+ installed SMF configuration. The service name is mysql, or if you
+ have multiple versions installed, you should use the full version
+ name, for example mysql:version_51. To start and enable MySQL to
+ be started at boot time:
+shell> svcadm enable mysql
+
+ To disable MySQL from starting during boot time, and shut the
+ MySQL server down if it is running, use:
+shell> svcadm disable mysql
+
+ To restart MySQL, for example after a configuration file changes,
+ use the restart option:
+shell> svcadm restart mysql
+
+ You can also use SMF to configure the data directory and enable
+ full 64-bit mode. For example, to set the data directory used by
+ MySQL:
+shell> svccfg
+svc:> select mysql:version_51
+svc:/application/database/mysql:version_51> setprop mysql/data=/data0
+/mysql
+
+
+ By default, the 32-bit binaries are used. To enable the 64-bit
+ server on 64-bit platforms, set the enable_64bit parameter. For
+ example:
+svc:/application/database/mysql:version_51> setprop mysql/enable_64bi
+t=1
+
+ You need to refresh the SMF after settings these options:
+shell> svcadm refresh mysql
+
+2.8.3. Solaris Source Build Notes
+
+ When building MySQL on Solaris you can use either the Sun Studio
+ or GNU cc compilers. For more information on specific notes and
+ environments, use the following hints.
+
+ * When building you should ensure that your PATH variable
+ includes the necessary tools, including ar for building
+ libraries. Some tools are located in /usr/ccs/bin.
+
+ * When running configure, you should specify the C and C++
+ compiler explicitly to ensure that the right C compiler
+ combination is used:
+$ configure CC=gcc CXX=g++
+
+ * For detailed information on performance tuning your MySQL
+ installation for Solaris, you can use the information from
+ Krish Shankar
+ (http://blogs.sun.com/krishs/entry/sun_studio_compiler_options
+ _for) and the Sun Solaris MySQL Performance Tuning
+ (http://developers.sun.com/solaris/articles/mysql_perf_tune.ht
+ ml) pages.
+
+ * If you have an UltraSPARC system, you can get 4% better
+ performance by adding -mcpu=v8 -Wa,-xarch=v8plusa to the
+ CFLAGS and CXXFLAGS environment variables.
+
+ * If you have Sun's Forte 5.00 (or newer) or Sun Studio
+ compiler, you can run configure like this:
+CC=cc CFLAGS="-Xa -fast -native -xstrconst -mt" \
+CXX=CC CXXFLAGS="-noex -mt" \
+./configure --prefix=/usr/local/mysql --enable-assembler
+
+ * To create a 64-bit SPARC binary with Sun's Forte or Sun Studio
+ compiler, use the following configuration options:
+CC=cc CFLAGS="-Xa -fast -native -xstrconst -mt -xarch=v9" \
+CXX=CC CXXFLAGS="-noex -mt -xarch=v9" ASFLAGS="-xarch=v9" \
+./configure --prefix=/usr/local/mysql --enable-assembler
+ To create a 64-bit Solaris binary using gcc, add -m64 to
+ CFLAGS and CXXFLAGS and remove --enable-assembler from the
+ configure line.
+ In the MySQL benchmarks, we obtained a 4% speed increase on
+ UltraSPARC when using Forte 5.0 in 32-bit mode, as compared to
+ using gcc 3.2 with the -mcpu flag.
+ If you create a 64-bit mysqld binary, it is 4% slower than the
+ 32-bit binary, but can handle more threads and memory.
+
+ * If you get a problem with fdatasync or sched_yield, you can
+ fix this by adding LIBS=-lrt to the configure line
+
+ * Solaris does not provide static versions of all system
+ libraries (libpthreads and libdl), so you cannot compile MySQL
+ with --static. If you try to do so, you get one of the
+ following errors:
+ld: fatal: library -ldl: not found
+undefined reference to `dlopen'
+cannot find -lrt
+
+ * If you link your own MySQL client programs, you may see the
+ following error at runtime:
+ld.so.1: fatal: libmysqlclient.so.#:
+open failed: No such file or directory
+ This problem can be avoided by one of the following methods:
+
+ + Use the crle tool to add the directory containing the
+ libmysqlclient library file to the list of standard
+ library directories. You need administrator privileges to
+ do this. Make sure you update the library information,
+ rather than replace it with the new path. For example,
+ the following command adds the directory to the list of
+ standard directories searched for libraries.
+shell> crle -u -l /usr/local/mysql/lib
+ For 64-bit libraries, add the -64 option:
+shell> crle -64 -u -l /usr/local/mysql/lib
+
+ + Link clients with the
+ -Wl,r/full/path/to/libmysqlclient.so flag rather than
+ with -Lpath).
+
+ + Copy libmysqclient.so to /usr/lib.
+
+ + Add the path name of the directory where
+ libmysqlclient.so is located to the LD_RUN_PATH
+ environment variable before running your client.
+
+ * If you have problems with configure trying to link with -lz
+ when you do not have zlib installed, you have two options:
+
+ + If you want to be able to use the compressed
+ communication protocol, you need to get and install zlib
+ from ftp.gnu.org.
+
+ + Run configure with the --with-named-z-libs=no option when
+ building MySQL.
+
+ * If you are using gcc and have problems with loading
+ user-defined functions (UDFs) into MySQL, try adding -lgcc to
+ the link line for the UDF.
+
+2.9. Installing MySQL on i5/OS
+
+ The i5/OS POWER MySQL package was created in cooperation with IBM.
+ MySQL works within the Portable Application Solution Environment
+ (PASE) on the System i series of hardware and will also provide
+ database services for the Zend Core for i5/OS.
+
+ MySQL for i5/OS is provided both as a tar file and as a save file
+ (.savf) package that can be downloaded and installed directly
+ without any additional installation steps required. To install
+ MySQL using the tar file, see Section 2.2, "Installing MySQL from
+ Generic Binaries on Unix/Linux."
+
+ MySQL is only supported on i5/OS V5R4 or later releases. The i5/OS
+ PASE must be installed for MySQL to operate. You must be able to
+ login as a user in *SECOFR class.
+
+ You should the installation notes and tips for i5/OS before
+ starting installation. See i5/OS Installation Notes.
+
+ Before Installation:
+
+Note
+
+ The installation package will use an existing configuration if you
+ have previously installed MySQL (which is identified by looking
+ for the file /etc/my.cnf). The values for the data directory
+ (DATADIR) and owner of the MySQL files (USRPRF) specified during
+ the installation will be ignored, and the values determined from
+ the /etc/my.cnf will be used instead.
+
+ If you want to change these parameters during a new install, you
+ should temporarily rename /etc/my.cnf, install MySQL using the new
+ parameters you want to use, and then merge your previous
+ /etc/my.cnf configuration settings with the new /etc/my.cnf file
+ that is created during installation.
+
+ * You must have a user profile with PASE with suitable
+ privileges. The user should be within the *SECOFR class, such
+ as the QSECOFR user ID. You can use the WRKUSRPRF command to
+ check your user profile.
+
+ * For network connections to MySQL, you must have TCP/IP
+ enabled. You should also check the following:
+
+ + Ensure that a name has defined for the system. Run the
+ Configure TCP/IP (CFGTCP) command and select option 12
+ (Change TCP/IP domain information) to display this
+ setting. Make sure that a value is listed in the Host
+ name field.
+
+ + Make sure that the system has a loopback entry which
+ represents the localhost or 127.0.0.1.
+
+ + Ensure that the IP address of the IBM i machine is mapped
+ correctly to the host name.
+
+ To install MySQL on i5/OS, follow these steps:
+
+ 1. On the System i machine, create a save file that will be used
+ to receive the downloaded installation save file. The file
+ should be located within the General Purpose Library (QGPL):
+CRTSAVF FILE(QGPL/MYSQLINST) TESXT('MySQL Save file')
+
+ 2. Download the MySQL installation save file in 32-bit
+ (mysql-5.1.39-i5os-power-32bit.savf) or 64-bit
+ (mysql-5.1.39-i5os-power-64bit.savf) from MySQL Downloads
+ (http://dev.mysql.com/downloads).
+
+ 3. You need to FTP the downloaded .savf file directly into the
+ QGPL/MYSQLINST file on the System i server. You can do this
+ through FTP using the following steps after logging in to the
+ System i machine:
+ftp> bin
+ftp> cd qgpl
+ftp> put mysql-5.1.39-i5os-power.savf mysqlinst
+
+ 4. Log into the System i server using a user in the *SECOFR
+ class, such as the QSECOFR user ID.
+
+ 5. You need to restore the installation library stored in the
+ .savf save file:
+RSTLIB MYSQLINST DEV(*SAVF) SAVF(QGPL/MYSQLINST) MBROPT(*ALL) ALWOBJD
+IF(*ALL)
+
+Note
+ You can ignore the security changes-type message at the bottom
+ of the installation panel.
+
+ 6. Once you have finished restoring the MYSQLINST library, check
+ that all the necessary objects for installation are on the
+ system by using the Display Library (DSPLIB) command:
+DSPLIB LIB(MYSQLINST)
+
+ 7. You need to execute the installation command,
+ MYSQLINST/INSMYSQL. You can specify three parameter settings
+ during installation:
+
+ + DIR('/QOpenSys/usr/local/mysql') sets the installation
+ location for the MySQL files. The directory will be
+ created if it does not already exist.
+
+ + DATADIR('/QOpenSys/usr/local/mysql/data') sets the
+ location of the directory that will be used to store the
+ database files and binary logs. The default setting is
+ /QOpenSys/usr/local/mysql/data. Note that if the
+ installer detects an existing installation (due to the
+ existence of /etc/my.cnf), then the existing setting will
+ be used instead of the default.
+
+ + USRPRF(MYSQL) sets the user profile that will own the
+ files that are installed. The profile will be created if
+ it does not already exist.
+
+Note
+ You should choose an appropriate user for using the MySQL
+ server installation. The user will be used whenever you
+ need to do any administration on the MySQL server.
+ Once you have set the appropriate parameters, you can begin
+ the installation.
+ The installation copies all the necessary files into a
+ directory matching the DIR configuration value; sets the
+ ownership on those files, sets up the MySQL environment and
+ creates the MySQL configuration file (in /etc/my.cnf)
+ completing all the steps in a typical binary installation
+ process automatically. If this is a new installation of MySQL,
+ or if the installer detects that this is a new version
+ (because the /etc/my.cnf file does not exist), then the
+ initial core MySQL databases will also be created during
+ installation.
+ Once the installation has been completed, you will get a
+ notice advising you to set the password for the root user. For
+ more information, Section 2.13, "Post-Installation Setup and
+ Testing."
+
+ 8. Once the installation has completed, you can delete the
+ installation file:
+DLTLIB LIB(MYSQLINST)
+
+ Upgrading an existing MySQL instance
+
+ You need to execute the upgrade command, MYSQLINST/UPGMYSQL.
+
+Note
+
+ You cannot use MYSQLINST/UPGMYSQL to upgrade between major
+ versions of MySQL (for example from 5.0 to 5.1). For information
+ and advice on migrating between major versions you can use the
+ advice provided in Section 2.4.1.1, "Upgrading from MySQL 5.0 to
+ 5.1."
+
+ You must specify 6 parameters to perform an upgrade:
+
+ * DIR('/QOpenSys/usr/local/'): Sets the installation location
+ for the MySQL files. The directory will be created if it does
+ not already exist. This is the directory that the MySQL server
+ will be installed into, inside a directory with a name
+ matching the version and release. For example, if installing
+ MySQL 5.1.39 with the DIR set to /QOpenSys/usr/local/ would
+ result in /QOpenSys/usr/local/mysql-5.1.39-i5os-power64 and a
+ symbolic link to this directory will be created in
+ /QOpenSys/usr/local/mysql.
+
+ * DATADIR('/QOpenSys/mysql/data'): Sets the location of the
+ directory that will be upgraded.
+
+ * USRPRF('MYSQL'): Sets the user profile that will own the files
+ that are installed. The profile will be created if it does not
+ already exist; if it is created as part of the upgrade
+ process, it will be disabled initially. You may wish to enable
+ this user profile so that it can be used to start the MySQL
+ server later. It is best practice to use the one previously
+ created during the first installation.
+
+ * MYSQLUSR('root user'): Any user account in the current MySQL
+ server with SUPER privileges.
+
+ * PASSWORD('root user password'): The password for the above
+ account. This is necessary as the upgrade starts the MySQL
+ server to upgrade the tables and the password is need to be
+ able to shutdown the MySQL server.
+
+ * CURINST('path to previous install'): The full path to the
+ installation that is being upgraded. For example an
+ installation in /QOpenSys/usr/local/ will be
+ /QOpenSys/usr/local/msyql-5.1.30-i5os-power64. Failure to
+ specify this option may result in corruption of your existing
+ data files.
+
+ For example:
+MYSQLINST/UPGMYSQL DIR('/QOpenSys/usr/local/') DATADIR('/QOpenSys/mys
+ql/data') »
+ USERPRF(MYSQL) MYSQLUSR('root') PASSWORD('root') CURINST('/QOpen
+Sys/usr/local/mysql-5.1.30-i5os-power64')
+
+ You should receive a Program Message indicating UPGRADE
+ SUCCESSFUL! upon completion or an error message if there is a
+ problem.You can view the upgrade programs progression and the
+ error in the text file upgrade.log in the installation directory.
+
+ To start MySQL:
+
+ 1. Log into the System i server using the user profile create or
+ specified during installation. By default, this is MYSQL.
+
+Note
+ You should start mysqld_safe using a user that in the PASE
+ environment has the id=0 (the equivalent of the standard Unix
+ root user). If you do not use a user with this ID then the
+ system will be unable to change the user when executing mysqld
+ as set using --user option. If this happens, mysqld may be
+ unable to read the files located within the MySQL data
+ directory and the execution will fail.
+
+ 2. Enter the PASE environment using call qp2term.
+
+ 3. Start the MySQL server by changing to the installation
+ directory and running mysqld_safe, specifying the user name
+ used to install the server. The installer conveniently
+ installs a symbolic link to the installation directory
+ (mysql-5.0.42-i5os-power-32bit) as /opt/mysql/mysql:
+> cd /opt/mysql/mysql
+> bin/mysqld_safe --user=mysql &
+ You should see a message similar to the following:
+Starting mysqld daemon with databases »
+ from /opt/mysql/mysql-enterprise-5.0.42-i5os-power-32bit/data
+
+ If you are having problems starting MySQL server, see Section
+ 2.13.1.3, "Starting and Troubleshooting the MySQL Server."
+
+ To stop MySQL:
+
+ 1. Log into the System i server using the user profile create or
+ specified during installation. By default, this is MYSQL.
+
+ 2. Enter the PASE environment using call qp2term.
+
+ 3. Stop the MySQL server by changing into the installation
+ directory and running mysqladmin, specifying the user name
+ used to install the server:
+> cd /opt/mysql/mysql
+> bin/mysqladmin -u root shutdown
+ If the session that you started and stopped MySQL are the
+ same, you may get the log output from mysqld:
+ STOPPING server from pid file »
+ /opt/mysql/mysql-enterprise-5.0.42-i5os-power-32bit/data/I5DBX.R
+CHLAND.IBM.COM.pid
+ 070718 10:34:20 mysqld ended
+ If the sessions used to start and stop MySQL are different,
+ you will not receive any confirmation of the shutdown.
+
+ Note and tips
+
+ * A problem has been identified with the installation process on
+ DBCS systems. If you are having problems install MySQL on a
+ DBCS system, you need to change your job's coded character set
+ identifier (CSSID) to 37 (EBCDIC) before executing the install
+ command, INSMYSQL. To do this, determine your existing CSSID
+ (using DSPJOB and selecting option 2), execute CHGJOB
+ CSSID(37), run INSMYSQL to install MySQL and then execute
+ CHGJOB again with your original CSSID.
+
+ * If you want to use the Perl scripts that are included with
+ MySQL, you need to download the iSeries Tools for Developers
+ (5799-PTL). See
+ http://www-03.ibm.com/servers/enable/site/porting/tools/.
+
+2.10. Installing MySQL on FreeBSD
+
+ This section provides information about using MySQL on variants of
+ FreeBSD Unix.
+
+ The easiest (and preferred) way to install MySQL is to use the
+ mysql-server and mysql-client ports available at
+ http://www.freebsd.org/. Using these ports gives you the following
+ benefits:
+
+ * A working MySQL with all optimizations enabled that are known
+ to work on your version of FreeBSD.
+
+ * Automatic configuration and build.
+
+ * Startup scripts installed in /usr/local/etc/rc.d.
+
+ * The ability to use pkg_info -L to see which files are
+ installed.
+
+ * The ability to use pkg_delete to remove MySQL if you no longer
+ want it on your machine.
+
+ The MySQL build process requires GNU make (gmake) to work. If GNU
+ make is not available, you must install it first before compiling
+ MySQL.
+
+ The recommended way to compile and install MySQL on FreeBSD with
+ gcc (2.95.2 and up) is:
+CC=gcc CFLAGS="-O2 -fno-strength-reduce" \
+ CXX=gcc CXXFLAGS="-O2 -fno-rtti -fno-exceptions \
+ -felide-constructors -fno-strength-reduce" \
+ ./configure --prefix=/usr/local/mysql --enable-assembler
+gmake
+gmake install
+cd /usr/local/mysql
+bin/mysql_install_db --user=mysql
+bin/mysqld_safe &
+
+ FreeBSD is known to have a very low default file handle limit. See
+ Section B.5.2.18, "'File' Not Found and Similar Errors." Start the
+ server by using the --open-files-limit option for mysqld_safe, or
+ raise the limits for the mysqld user in /etc/login.conf and
+ rebuild it with cap_mkdb /etc/login.conf. Also be sure that you
+ set the appropriate class for this user in the password file if
+ you are not using the default (use chpass mysqld-user-name). See
+ Section 4.3.2, "mysqld_safe --- MySQL Server Startup Script."
+
+ In current versions of FreeBSD (at least 4.x and greater), you may
+ increase the limit on the amount of memory available for a process
+ by adding the following entries to the /boot/loader.conf file and
+ rebooting the machine (these are not settings that can be changed
+ at run time with the sysctl command):
+kern.maxdsiz="1073741824" # 1GB
+kern.dfldsiz="1073741824" # 1GB
+kern.maxssiz="134217728" # 128MB
+
+ For older versions of FreeBSD, you must recompile your kernel to
+ change the maximum data segment size for a process. In this case,
+ you should look at the MAXDSIZ option in the LINT config file for
+ more information.
+
+ If you get problems with the current date in MySQL, setting the TZ
+ variable should help. See Section 2.14, "Environment Variables."
+
+2.11. Installing MySQL on HP-UX
+
+ If you install MySQL using a binary tarball distribution on HP-UX,
+ you may run into trouble even before you get the MySQL
+ distribution unpacked, as the HP-UX tar cannot handle long file
+ names. This means that you may see errors when you try to unpack
+ MySQL.
+
+ If this occurs, you must use GNU tar (gtar) to unpack the
+ distribution.
+
+ Because of some critical bugs in the standard HP-UX libraries, you
+ should install the following patches before trying to run MySQL on
+ HP-UX 11.0:
+PHKL_22840 Streams cumulative
+PHNE_22397 ARPA cumulative
+
+ This solves the problem of getting EWOULDBLOCK from recv() and
+ EBADF from accept() in threaded applications.
+
+ If you are using gcc 2.95.1 on an unpatched HP-UX 11.x system, you
+ may get the following error:
+In file included from /usr/include/unistd.h:11,
+ from ../include/global.h:125,
+ from mysql_priv.h:15,
+ from item.cc:19:
+/usr/include/sys/unistd.h:184: declaration of C function ...
+/usr/include/sys/pthread.h:440: previous declaration ...
+In file included from item.h:306,
+ from mysql_priv.h:158,
+ from item.cc:19:
+
+ The problem is that HP-UX does not define pthreads_atfork()
+ consistently. It has conflicting prototypes in
+ /usr/include/sys/unistd.h:184 and /usr/include/sys/pthread.h:440.
+
+ One solution is to copy /usr/include/sys/unistd.h into
+ mysql/include and edit unistd.h and change it to match the
+ definition in pthread.h. Look for this line:
+extern int pthread_atfork(void (*prepare)(), void (*parent)(),
+ void (*child)());
+
+ Change it to look like this:
+extern int pthread_atfork(void (*prepare)(void), void (*parent)(void)
+,
+ void (*child)(void));
+
+ After making the change, the following configure line should work:
+CFLAGS="-fomit-frame-pointer -O3 -fpic" CXX=gcc \
+CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti -O3" \
+./configure --prefix=/usr/local/mysql --disable-shared
+
+ If you are using HP-UX compiler, you can use the following command
+ (which has been tested with cc B.11.11.04):
+CC=cc CXX=aCC CFLAGS=+DD64 CXXFLAGS=+DD64 ./configure \
+ --with-extra-character-set=complex
+
+ You can ignore any errors of the following type:
+aCC: warning 901: unknown option: `-3': use +help for online
+documentation
+
+ If you get the following error from configure, verify that you do
+ not have the path to the K&R compiler before the path to the HP-UX
+ C and C++ compiler:
+checking for cc option to accept ANSI C... no
+configure: error: MySQL requires an ANSI C compiler (and a C++ compil
+er).
+Try gcc. See the Installation chapter in the Reference Manual.
+
+ Another reason for not being able to compile is that you didn't
+ define the +DD64 flags as just described.
+
+ Another possibility for HP-UX 11 is to use the MySQL binaries
+ provided at http://dev.mysql.com/downloads/, which we have built
+ and tested ourselves. We have also received reports that the HP-UX
+ 10.20 binaries supplied by MySQL can be run successfully on HP-UX
+ 11. If you encounter problems, you should be sure to check your
+ HP-UX patch level.
+
+2.12. Installing MySQL on AIX
+
+ Automatic detection of xlC is missing from Autoconf, so a number
+ of variables need to be set before running configure. The
+ following example uses the IBM compiler:
+export CC="xlc_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192 "
+export CXX="xlC_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192"
+export CFLAGS="-I /usr/local/include"
+export LDFLAGS="-L /usr/local/lib"
+export CPPFLAGS=$CFLAGS
+export CXXFLAGS=$CFLAGS
+
+./configure --prefix=/usr/local \
+ --localstatedir=/var/mysql \
+ --sbindir='/usr/local/bin' \
+ --libexecdir='/usr/local/bin' \
+ --enable-thread-safe-client \
+ --enable-large-files
+
+ The preceding options are used to compile the MySQL distribution
+ that can be found at http://www-frec.bull.com/.
+
+ If you change the -O3 to -O2 in the preceding configure line, you
+ must also remove the -qstrict option. This is a limitation in the
+ IBM C compiler.
+
+ If you are using gcc to compile MySQL, you must use the
+ -fno-exceptions flag, because the exception handling in gcc is not
+ thread-safe! There are also some known problems with IBM's
+ assembler that may cause it to generate bad code when used with
+ gcc.
+
+ Use the following configure line with gcc 2.95 on AIX:
+CC="gcc -pipe -mcpu=power -Wa,-many" \
+CXX="gcc -pipe -mcpu=power -Wa,-many" \
+CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti" \
+./configure --prefix=/usr/local/mysql --with-low-memory
+
+ The -Wa,-many option is necessary for the compile to be
+ successful. IBM is aware of this problem but is in no hurry to fix
+ it because of the workaround that is available. We do not know if
+ the -fno-exceptions is required with gcc 2.95, but because MySQL
+ doesn't use exceptions and the option generates faster code, you
+ should always use it with gcc.
+
+ If you get a problem with assembler code, try changing the
+ -mcpu=xxx option to match your CPU. Typically power2, power, or
+ powerpc may need to be used. Alternatively, you might need to use
+ 604 or 604e. We are not positive but suspect that power would
+ likely be safe most of the time, even on a power2 machine.
+
+ If you do not know what your CPU is, execute a uname -m command.
+ It produces a string that looks like 000514676700, with a format
+ of xxyyyyyymmss where xx and ss are always 00, yyyyyy is a unique
+ system ID and mm is the ID of the CPU Planar. A chart of these
+ values can be found at
+ http://www16.boulder.ibm.com/pseries/en_US/cmds/aixcmds5/uname.htm
+ .
+
+ This gives you a machine type and a machine model you can use to
+ determine what type of CPU you have.
+
+ If you have problems with threads on AIX 5.3, you should upgrade
+ AIX 5.3 to technology level 7 (5300-07).
+
+ If you have problems with signals (MySQL dies unexpectedly under
+ high load), you may have found an OS bug with threads and signals.
+ In this case, you can tell MySQL not to use signals by configuring
+ as follows:
+CFLAGS=-DDONT_USE_THR_ALARM CXX=gcc \
+CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti \
+-DDONT_USE_THR_ALARM" \
+./configure --prefix=/usr/local/mysql --with-debug \
+ --with-low-memory
+
+ This doesn't affect the performance of MySQL, but has the side
+ effect that you can't kill clients that are "sleeping" on a
+ connection with mysqladmin kill or mysqladmin shutdown. Instead,
+ the client dies when it issues its next command.
+
+ On some versions of AIX, linking with libbind.a makes
+ getservbyname() dump core. This is an AIX bug and should be
+ reported to IBM.
+
+ For AIX 4.2.1 and gcc, you have to make the following changes.
+
+ After configuring, edit config.h and include/my_config.h and
+ change the line that says this:
+#define HAVE_SNPRINTF 1
+
+ to this:
+#undef HAVE_SNPRINTF
+
+ And finally, in mysqld.cc, you need to add a prototype for
+ initgroups().
+#ifdef _AIX41
+extern "C" int initgroups(const char *,int);
+#endif
+
+ For 32-bit binaries, if you need to allocate a lot of memory to
+ the mysqld process, it is not enough to just use ulimit -d
+ unlimited. You may also have to modify mysqld_safe to add a line
+ something like this:
+export LDR_CNTRL='MAXDATA=0x80000000'
+
+ You can find more information about using a lot of memory at
+ http://publib16.boulder.ibm.com/pseries/en_US/aixprggd/genprogc/lr
+ g_prg_support.htm.
+
+ Users of AIX 4.3 should use gmake instead of the make utility
+ included with AIX.
+
+ As of AIX 4.1, the C compiler has been unbundled from AIX as a
+ separate product. gcc 3.3.2 can be obtained here:
+ ftp://ftp.software.ibm.com/aix/freeSoftware/aixtoolbox/RPMS/ppc/gc
+ c/
+
+ The steps for compiling MySQL on AIX with gcc 3.3.2 are similar to
+ those for using gcc 2.95 (in particular, the need to edit config.h
+ and my_config.h after running configure). However, before running
+ configure, you should also patch the curses.h file as follows:
+/opt/freeware/lib/gcc-lib/powerpc-ibm-aix5.2.0.0/3.3.2/include/curses
+.h.ORIG
+ Mon Dec 26 02:17:28 2005
+--- /opt/freeware/lib/gcc-lib/powerpc-ibm-aix5.2.0.0/3.3.2/include/cu
+rses.h
+Mon Dec 26 02:40:13 2005
+***************
+*** 2023,2029 ****
+
+
+ #endif /* _AIX32_CURSES */
+! #if defined(__USE_FIXED_PROTOTYPES__) || defined(__cplusplus) || de
+fined
+(__STRICT_ANSI__)
+ extern int delwin (WINDOW *);
+ extern int endwin (void);
+ extern int getcurx (WINDOW *);
+--- 2023,2029 ----
+
+
+ #endif /* _AIX32_CURSES */
+! #if 0 && (defined(__USE_FIXED_PROTOTYPES__) || defined(__cplusplus)
+|| defined
+(__STRICT_ANSI__))
+ extern int delwin (WINDOW *);
+ extern int endwin (void);
+ extern int getcurx (WINDOW *);
+
+2.13. Post-Installation Setup and Testing
+
+ After installing MySQL, there are some issues that you should
+ address. For example, on Unix, you should initialize the data
+ directory and create the MySQL grant tables. On all platforms, an
+ important security concern is that the initial accounts in the
+ grant tables have no passwords. You should assign passwords to
+ prevent unauthorized access to the MySQL server. Optionally, you
+ can create time zone tables to enable recognition of named time
+ zones.
+
+ The following sections include post-installation procedures that
+ are specific to Windows systems and to Unix systems. Another
+ section, Section 2.13.1.3, "Starting and Troubleshooting the MySQL
+ Server," applies to all platforms; it describes what to do if you
+ have trouble getting the server to start. Section 2.13.2,
+ "Securing the Initial MySQL Accounts," also applies to all
+ platforms. You should follow its instructions to make sure that
+ you have properly protected your MySQL accounts by assigning
+ passwords to them.
+
+ When you are ready to create additional user accounts, you can
+ find information on the MySQL access control system and account
+ management in Section 5.4, "The MySQL Access Privilege System,"
+ and Section 5.5, "MySQL User Account Management."
+
+2.13.1. Unix Post-Installation Procedures
+
+ After installing MySQL on Unix, you must initialize the grant
+ tables, start the server, and make sure that the server works
+ satisfactorily. You may also wish to arrange for the server to be
+ started and stopped automatically when your system starts and
+ stops. You should also assign passwords to the accounts in the
+ grant tables.
+
+ On Unix, the grant tables are set up by the mysql_install_db
+ program. For some installation methods, this program is run for
+ you automatically:
+
+ * If you install MySQL on Linux using RPM distributions, the
+ server RPM runs mysql_install_db.
+
+ * If you install MySQL on Mac OS X using a PKG distribution, the
+ installer runs mysql_install_db.
+
+ Otherwise, you'll need to run mysql_install_db yourself.
+
+ The following procedure describes how to initialize the grant
+ tables (if that has not previously been done) and start the
+ server. It also suggests some commands that you can use to test
+ whether the server is accessible and working properly. For
+ information about starting and stopping the server automatically,
+ see Section 2.13.1.2, "Starting and Stopping MySQL Automatically."
+
+ After you complete the procedure and have the server running, you
+ should assign passwords to the accounts created by
+ mysql_install_db and perhaps tighten access to test databases. For
+ instructions, see Section 2.13.2, "Securing the Initial MySQL
+ Accounts."
+
+ In the examples shown here, the server runs under the user ID of
+ the mysql login account. This assumes that such an account exists.
+ Either create the account if it does not exist, or substitute the
+ name of a different existing login account that you plan to use
+ for running the server.
+
+ 1. Change location into the top-level directory of your MySQL
+ installation, represented here by BASEDIR:
+shell> cd BASEDIR
+ BASEDIR is likely to be something like /usr/local/mysql or
+ /usr/local. The following steps assume that you have changed
+ location to this directory.
+
+ 2. If necessary, run the mysql_install_db program to set up the
+ initial MySQL grant tables containing the privileges that
+ determine how users are permitted to connect to the server.
+ You'll need to do this if you used a distribution type for
+ which the installation procedure doesn't run the program for
+ you.
+ Typically, mysql_install_db needs to be run only the first
+ time you install MySQL, so you can skip this step if you are
+ upgrading an existing installation, However, mysql_install_db
+ does not overwrite any existing privilege tables, so it should
+ be safe to run in any circumstances.
+ To initialize the grant tables, use one of the following
+ commands, depending on whether mysql_install_db is located in
+ the bin or scripts directory:
+shell> bin/mysql_install_db --user=mysql
+shell> scripts/mysql_install_db --user=mysql
+ It might be necessary to specify other options such as
+ --basedir or --datadir if mysql_install_db does not use the
+ correct locations for the installation directory or data
+ directory. For example:
+shell> bin/mysql_install_db --user=mysql \
+ --basedir=/opt/mysql/mysql \
+ --datadir=/opt/mysql/mysql/data
+ The mysql_install_db script creates the server's data
+ directory. Under the data directory, it creates directories
+ for the mysql database that holds the grant tables and the
+ test database that you can use to test MySQL. The script also
+ creates privilege table entries for root and anonymous-user
+ accounts. The accounts have no passwords initially. Section
+ 2.13.2, "Securing the Initial MySQL Accounts," describes the
+ initial privileges. Briefly, these privileges permit the MySQL
+ root user to do anything, and permit anybody to create or use
+ databases with a name of test or starting with test_.
+ It is important to make sure that the database directories and
+ files are owned by the mysql login account so that the server
+ has read and write access to them when you run it later. To
+ ensure this, the --user option should be used as shown if you
+ run mysql_install_db as root. Otherwise, you should execute
+ the script while logged in as mysql, in which case you can
+ omit the --user option from the command.
+ mysql_install_db creates several tables in the mysql database,
+ including user, db, host, tables_priv, columns_priv, func, and
+ others. See Section 5.4, "The MySQL Access Privilege System,"
+ for a complete listing and description of these tables.
+ If you do not want to have the test database, you can remove
+ it after starting the server, using the instructions in
+ Section 2.13.2, "Securing the Initial MySQL Accounts."
+ If you have trouble with mysql_install_db at this point, see
+ Section 2.13.1.1, "Problems Running mysql_install_db."
+
+ 3. Start the MySQL server:
+shell> bin/mysqld_safe --user=mysql &
+ It is important that the MySQL server be run using an
+ unprivileged (non-root) login account. To ensure this, the
+ --user option should be used as shown if you run mysqld_safe
+ as system root. Otherwise, you should execute the script while
+ logged in to the system as mysql, in which case you can omit
+ the --user option from the command.
+ Further instructions for running MySQL as an unprivileged user
+ are given in Section 5.3.6, "How to Run MySQL as a Normal
+ User."
+ If you neglected to create the grant tables by running
+ mysql_install_db before proceeding to this step, the following
+ message appears in the error log file when you start the
+ server:
+mysqld: Can't find file: 'host.frm'
+ This error also occurs if you run mysql_install_db as root
+ without the --user option. Remove the data directory and run
+ mysql_install_db with the --user option as described
+ previously.
+ If you have other problems starting the server, see Section
+ 2.13.1.3, "Starting and Troubleshooting the MySQL Server."
+
+ 4. Use mysqladmin to verify that the server is running. The
+ following commands provide simple tests to check whether the
+ server is up and responding to connections:
+shell> bin/mysqladmin version
+shell> bin/mysqladmin variables
+ The output from mysqladmin version varies slightly depending
+ on your platform and version of MySQL, but should be similar
+ to that shown here:
+shell> bin/mysqladmin version
+mysqladmin Ver 14.12 Distrib 5.1.50, for pc-linux-gnu on i686
+...
+
+Server version 5.1.50
+Protocol version 10
+Connection Localhost via UNIX socket
+UNIX socket /var/lib/mysql/mysql.sock
+Uptime: 14 days 5 hours 5 min 21 sec
+
+Threads: 1 Questions: 366 Slow queries: 0
+Opens: 0 Flush tables: 1 Open tables: 19
+Queries per second avg: 0.000
+ To see what else you can do with mysqladmin, invoke it with
+ the --help option.
+
+ 5. Verify that you can shut down the server:
+shell> bin/mysqladmin -u root shutdown
+
+ 6. Verify that you can start the server again. Do this by using
+ mysqld_safe or by invoking mysqld directly. For example:
+shell> bin/mysqld_safe --user=mysql --log &
+ If mysqld_safe fails, see Section 2.13.1.3, "Starting and
+ Troubleshooting the MySQL Server."
+
+ 7. Run some simple tests to verify that you can retrieve
+ information from the server. The output should be similar to
+ what is shown here:
+shell> bin/mysqlshow
++--------------------+
+| Databases |
++--------------------+
+| information_schema |
+| mysql |
+| test |
++--------------------+
+
+shell> bin/mysqlshow mysql
+Database: mysql
++---------------------------+
+| Tables |
++---------------------------+
+| columns_priv |
+| db |
+| event |
+| func |
+| help_category |
+| help_keyword |
+| help_relation |
+| help_topic |
+| host |
+| plugin |
+| proc |
+| procs_priv |
+| servers |
+| tables_priv |
+| time_zone |
+| time_zone_leap_second |
+| time_zone_name |
+| time_zone_transition |
+| time_zone_transition_type |
+| user |
++---------------------------+
+
+shell> bin/mysql -e "SELECT Host,Db,User FROM db" mysql
++------+--------+------+
+| host | db | user |
++------+--------+------+
+| % | test | |
+| % | test_% | |
++------+--------+------+
+
+ 8. There is a benchmark suite in the sql-bench directory (under
+ the MySQL installation directory) that you can use to compare
+ how MySQL performs on different platforms. The benchmark suite
+ is written in Perl. It requires the Perl DBI module that
+ provides a database-independent interface to the various
+ databases, and some other additional Perl modules:
+DBI
+DBD::mysql
+Data::Dumper
+Data::ShowTable
+ These modules can be obtained from CPAN
+ (http://www.cpan.org/). See also Section 2.15.1, "Installing
+ Perl on Unix."
+ The sql-bench/Results directory contains the results from many
+ runs against different databases and platforms. To run all
+ tests, execute these commands:
+shell> cd sql-bench
+shell> perl run-all-tests
+ If you do not have the sql-bench directory, you probably
+ installed MySQL using RPM files other than the source RPM.
+ (The source RPM includes the sql-bench benchmark directory.)
+ In this case, you must first install the benchmark suite
+ before you can use it. There are separate benchmark RPM files
+ named mysql-bench-VERSION.i386.rpm that contain benchmark code
+ and data.
+ If you have a source distribution, there are also tests in its
+ tests subdirectory that you can run. For example, to run
+ auto_increment.tst, execute this command from the top-level
+ directory of your source distribution:
+shell> mysql -vvf test < ./tests/auto_increment.tst
+ The expected result of the test can be found in the
+ ./tests/auto_increment.res file.
+
+ 9. At this point, you should have the server running. However,
+ none of the initial MySQL accounts have a password, and the
+ server permits permissive access to test databases. To tighten
+ security, follow the instructions in Section 2.13.2, "Securing
+ the Initial MySQL Accounts."
+
+ The MySQL 5.1 installation procedure creates time zone tables in
+ the mysql database. However, you must populate the tables manually
+ using the instructions in Section 9.6, "MySQL Server Time Zone
+ Support."
+
+2.13.1.1. Problems Running mysql_install_db
+
+ The purpose of the mysql_install_db script is to generate new
+ MySQL privilege tables. It does not overwrite existing MySQL
+ privilege tables, and it does not affect any other data.
+
+ If you want to re-create your privilege tables, first stop the
+ mysqld server if it is running. Then rename the mysql directory
+ under the data directory to save it, and then run
+ mysql_install_db. Suppose that your current directory is the MySQL
+ installation directory and that mysql_install_db is located in the
+ bin directory and the data directory is named data. To rename the
+ mysql database and re-run mysql_install_db, use these commands.
+shell> mv data/mysql data/mysql.old
+shell> bin/mysql_install_db --user=mysql
+
+ When you run mysql_install_db, you might encounter the following
+ problems:
+
+ * mysql_install_db fails to install the grant tables
+ You may find that mysql_install_db fails to install the grant
+ tables and terminates after displaying the following messages:
+Starting mysqld daemon with databases from XXXXXX
+mysqld ended
+ In this case, you should examine the error log file very
+ carefully. The log should be located in the directory XXXXXX
+ named by the error message and should indicate why mysqld
+ didn't start. If you do not understand what happened, include
+ the log when you post a bug report. See Section 1.7, "How to
+ Report Bugs or Problems."
+
+ * There is a mysqld process running
+ This indicates that the server is running, in which case the
+ grant tables have probably been created already. If so, there
+ is no need to run mysql_install_db at all because it needs to
+ be run only once (when you install MySQL the first time).
+
+ * Installing a second mysqld server does not work when one
+ server is running
+ This can happen when you have an existing MySQL installation,
+ but want to put a new installation in a different location.
+ For example, you might have a production installation, but you
+ want to create a second installation for testing purposes.
+ Generally the problem that occurs when you try to run a second
+ server is that it tries to use a network interface that is in
+ use by the first server. In this case, you should see one of
+ the following error messages:
+Can't start server: Bind on TCP/IP port:
+Address already in use
+Can't start server: Bind on unix socket...
+ For instructions on setting up multiple servers, see Section
+ 5.6, "Running Multiple MySQL Servers on the Same Machine."
+
+ * You do not have write access to the /tmp directory
+ If you do not have write access to create temporary files or a
+ Unix socket file in the default location (the /tmp directory),
+ an error occurs when you run mysql_install_db or the mysqld
+ server.
+ You can specify different locations for the temporary
+ directory and Unix socket file by executing these commands
+ prior to starting mysql_install_db or mysqld, where
+ some_tmp_dir is the full path name to some directory for which
+ you have write permission:
+shell> TMPDIR=/some_tmp_dir/
+shell> MYSQL_UNIX_PORT=/some_tmp_dir/mysql.sock
+shell> export TMPDIR MYSQL_UNIX_PORT
+ Then you should be able to run mysql_install_db and start the
+ server with these commands:
+shell> bin/mysql_install_db --user=mysql
+shell> bin/mysqld_safe --user=mysql &
+ If mysql_install_db is located in the scripts directory,
+ modify the first command to scripts/mysql_install_db.
+ See Section B.5.4.5, "How to Protect or Change the MySQL Unix
+ Socket File," and Section 2.14, "Environment Variables."
+
+ There are some alternatives to running the mysql_install_db script
+ provided in the MySQL distribution:
+
+ * If you want the initial privileges to be different from the
+ standard defaults, you can modify mysql_install_db before you
+ run it. However, it is preferable to use GRANT and REVOKE to
+ change the privileges after the grant tables have been set up.
+ In other words, you can run mysql_install_db, and then use
+ mysql -u root mysql to connect to the server as the MySQL root
+ user so that you can issue the necessary GRANT and REVOKE
+ statements.
+ If you want to install MySQL on several machines with the same
+ privileges, you can put the GRANT and REVOKE statements in a
+ file and execute the file as a script using mysql after
+ running mysql_install_db. For example:
+shell> bin/mysql_install_db --user=mysql
+shell> bin/mysql -u root < your_script_file
+ By doing this, you can avoid having to issue the statements
+ manually on each machine.
+
+ * It is possible to re-create the grant tables completely after
+ they have previously been created. You might want to do this
+ if you're just learning how to use GRANT and REVOKE and have
+ made so many modifications after running mysql_install_db that
+ you want to wipe out the tables and start over.
+ To re-create the grant tables, remove all the .frm, .MYI, and
+ .MYD files in the mysql database directory. Then run the
+ mysql_install_db script again.
+
+ * You can start mysqld manually using the --skip-grant-tables
+ option and add the privilege information yourself using mysql:
+shell> bin/mysqld_safe --user=mysql --skip-grant-tables &
+shell> bin/mysql mysql
+ From mysql, manually execute the SQL commands contained in
+ mysql_install_db. Make sure that you run mysqladmin
+ flush-privileges or mysqladmin reload afterward to tell the
+ server to reload the grant tables.
+ Note that by not using mysql_install_db, you not only have to
+ populate the grant tables manually, you also have to create
+ them first.
+
+2.13.1.2. Starting and Stopping MySQL Automatically
+
+ Generally, you start the mysqld server in one of these ways:
+
+ * Invoke mysqld directly. This works on any platform.
+
+ * Run the MySQL server as a Windows service. The service can be
+ set to start the server automatically when Windows starts, or
+ as a manual service that you start on request. For
+ instructions, see Section 2.5.5.6, "Starting MySQL as a
+ Windows Service."
+
+ * Invoke mysqld_safe, which tries to determine the proper
+ options for mysqld and then runs it with those options. This
+ script is used on Unix and Unix-like systems. See Section
+ 4.3.2, "mysqld_safe --- MySQL Server Startup Script."
+
+ * Invoke mysql.server. This script is used primarily at system
+ startup and shutdown on systems that use System V-style run
+ directories, where it usually is installed under the name
+ mysql. The mysql.server script starts the server by invoking
+ mysqld_safe. See Section 4.3.3, "mysql.server --- MySQL Server
+ Startup Script."
+
+ * On Mac OS X, install a separate MySQL Startup Item package to
+ enable the automatic startup of MySQL on system startup. The
+ Startup Item starts the server by invoking mysql.server. See
+ Section 2.7, "Installing MySQL on Mac OS X," for details.
+
+ The mysqld_safe and mysql.server scripts and the Mac OS X Startup
+ Item can be used to start the server manually, or automatically at
+ system startup time. mysql.server and the Startup Item also can be
+ used to stop the server.
+
+ To start or stop the server manually using the mysql.server
+ script, invoke it with start or stop arguments:
+shell> mysql.server start
+shell> mysql.server stop
+
+ Before mysql.server starts the server, it changes location to the
+ MySQL installation directory, and then invokes mysqld_safe. If you
+ want the server to run as some specific user, add an appropriate
+ user option to the [mysqld] group of the /etc/my.cnf option file,
+ as shown later in this section. (It is possible that you will need
+ to edit mysql.server if you've installed a binary distribution of
+ MySQL in a nonstandard location. Modify it to change location into
+ the proper directory before it runs mysqld_safe. If you do this,
+ your modified version of mysql.server may be overwritten if you
+ upgrade MySQL in the future, so you should make a copy of your
+ edited version that you can reinstall.)
+
+ mysql.server stop stops the server by sending a signal to it. You
+ can also stop the server manually by executing mysqladmin
+ shutdown.
+
+ To start and stop MySQL automatically on your server, you need to
+ add start and stop commands to the appropriate places in your
+ /etc/rc* files.
+
+ If you use the Linux server RPM package
+ (MySQL-server-VERSION.rpm), the mysql.server script is installed
+ in the /etc/init.d directory with the name mysql. You need not
+ install it manually. See Section 2.6.1, "Installing MySQL from RPM
+ Packages on Linux," for more information on the Linux RPM
+ packages.
+
+ Some vendors provide RPM packages that install a startup script
+ under a different name such as mysqld.
+
+ If you install MySQL from a source distribution or using a binary
+ distribution format that does not install mysql.server
+ automatically, you can install it manually. The script can be
+ found in the support-files directory under the MySQL installation
+ directory or in a MySQL source tree.
+
+ To install mysql.server manually, copy it to the /etc/init.d
+ directory with the name mysql, and then make it executable. Do
+ this by changing location into the appropriate directory where
+ mysql.server is located and executing these commands:
+shell> cp mysql.server /etc/init.d/mysql
+shell> chmod +x /etc/init.d/mysql
+
+ Older Red Hat systems use the /etc/rc.d/init.d directory rather
+ than /etc/init.d. Adjust the preceding commands accordingly.
+ Alternatively, first create /etc/init.d as a symbolic link that
+ points to /etc/rc.d/init.d:
+shell> cd /etc
+shell> ln -s rc.d/init.d .
+
+ After installing the script, the commands needed to activate it to
+ run at system startup depend on your operating system. On Linux,
+ you can use chkconfig:
+shell> chkconfig --add mysql
+
+ On some Linux systems, the following command also seems to be
+ necessary to fully enable the mysql script:
+shell> chkconfig --level 345 mysql on
+
+ On FreeBSD, startup scripts generally should go in
+ /usr/local/etc/rc.d/. The rc(8) manual page states that scripts in
+ this directory are executed only if their basename matches the
+ *.sh shell file name pattern. Any other files or directories
+ present within the directory are silently ignored. In other words,
+ on FreeBSD, you should install the mysql.server script as
+ /usr/local/etc/rc.d/mysql.server.sh to enable automatic startup.
+
+ As an alternative to the preceding setup, some operating systems
+ also use /etc/rc.local or /etc/init.d/boot.local to start
+ additional services on startup. To start up MySQL using this
+ method, you could append a command like the one following to the
+ appropriate startup file:
+/bin/sh -c 'cd /usr/local/mysql; ./bin/mysqld_safe --user=mysql &'
+
+ For other systems, consult your operating system documentation to
+ see how to install startup scripts.
+
+ You can add options for mysql.server in a global /etc/my.cnf file.
+ A typical /etc/my.cnf file might look like this:
+[mysqld]
+datadir=/usr/local/mysql/var
+socket=/var/tmp/mysql.sock
+port=3306
+user=mysql
+
+[mysql.server]
+basedir=/usr/local/mysql
+
+ The mysql.server script supports the following options: basedir,
+ datadir, and pid-file. If specified, they must be placed in an
+ option file, not on the command line. mysql.server supports only
+ start and stop as command-line arguments.
+
+ The following table shows which option groups the server and each
+ startup script read from option files.
+ Script Option Groups
+ mysqld [mysqld], [server], [mysqld-major_version]
+ mysqld_safe [mysqld], [server], [mysqld_safe]
+ mysql.server [mysqld], [mysql.server], [server]
+
+ [mysqld-major_version] means that groups with names like
+ [mysqld-5.0] and [mysqld-5.1] are read by servers having versions
+ 5.0.x, 5.1.x, and so forth. This feature can be used to specify
+ options that can be read only by servers within a given release
+ series.
+
+ For backward compatibility, mysql.server also reads the
+ [mysql_server] group and mysqld_safe also reads the [safe_mysqld]
+ group. However, you should update your option files to use the
+ [mysql.server] and [mysqld_safe] groups instead when using MySQL
+ 5.1.
+
+ See Section 4.2.3.3, "Using Option Files."
+
+2.13.1.3. Starting and Troubleshooting the MySQL Server
+
+ This section provides troubleshooting suggestions for problems
+ starting the server on Unix. If you are using Windows, see Section
+ 2.5.6, "Troubleshooting a MySQL Installation Under Windows."
+
+ If you have problems starting the server, here are some things to
+ try:
+
+ * Check the error log to see why the server does not start.
+
+ * Specify any special options needed by the storage engines you
+ are using.
+
+ * Make sure that the server knows where to find the data
+ directory.
+
+ * Make sure that the server can access the data directory. The
+ ownership and permissions of the data directory and its
+ contents must be set such that the server can read and modify
+ them.
+
+ * Verify that the network interfaces the server wants to use are
+ available.
+
+ Some storage engines have options that control their behavior. You
+ can create a my.cnf file and specify startup options for the
+ engines that you plan to use. If you are going to use storage
+ engines that support transactional tables (InnoDB, NDB), be sure
+ that you have them configured the way you want before starting the
+ server:
+
+ * If you are using InnoDB tables, see Section 13.6.2, "InnoDB
+ Configuration."
+
+ * If you are using MySQL Cluster, see Section 17.3, "MySQL
+ Cluster Configuration."
+
+ MySQL Enterprise For expert advice on start-up options appropriate
+ to your circumstances, subscribe to The MySQL Enterprise Monitor.
+ For more information, see
+ http://www.mysql.com/products/enterprise/advisors.html.
+
+ Storage engines will use default option values if you specify
+ none, but it is recommended that you review the available options
+ and specify explicit values for those for which the defaults are
+ not appropriate for your installation.
+
+ When the mysqld server starts, it changes location to the data
+ directory. This is where it expects to find databases and where it
+ expects to write log files. The server also writes the pid
+ (process ID) file in the data directory.
+
+ The data directory location is hardwired in when the server is
+ compiled. This is where the server looks for the data directory by
+ default. If the data directory is located somewhere else on your
+ system, the server will not work properly. You can determine what
+ the default path settings are by invoking mysqld with the
+ --verbose and --help options.
+
+ If the default locations do not match the MySQL installation
+ layout on your system, you can override them by specifying options
+ to mysqld or mysqld_safe on the command line or in an option file.
+
+ To specify the location of the data directory explicitly, use the
+ --datadir option. However, normally you can tell mysqld the
+ location of the base directory under which MySQL is installed and
+ it looks for the data directory there. You can do this with the
+ --basedir option.
+
+ To check the effect of specifying path options, invoke mysqld with
+ those options followed by the --verbose and --help options. For
+ example, if you change location into the directory where mysqld is
+ installed and then run the following command, it shows the effect
+ of starting the server with a base directory of /usr/local:
+shell> ./mysqld --basedir=/usr/local --verbose --help
+
+ You can specify other options such as --datadir as well, but
+ --verbose and --help must be the last options.
+
+ Once you determine the path settings you want, start the server
+ without --verbose and --help.
+
+ If mysqld is currently running, you can find out what path
+ settings it is using by executing this command:
+shell> mysqladmin variables
+
+ Or:
+shell> mysqladmin -h host_name variables
+
+ host_name is the name of the MySQL server host.
+
+ If you get Errcode 13 (which means Permission denied) when
+ starting mysqld, this means that the privileges of the data
+ directory or its contents do not permit server access. In this
+ case, you change the permissions for the involved files and
+ directories so that the server has the right to use them. You can
+ also start the server as root, but this raises security issues and
+ should be avoided.
+
+ On Unix, change location into the data directory and check the
+ ownership of the data directory and its contents to make sure the
+ server has access. For example, if the data directory is
+ /usr/local/mysql/var, use this command:
+shell> ls -la /usr/local/mysql/var
+
+ If the data directory or its files or subdirectories are not owned
+ by the login account that you use for running the server, change
+ their ownership to that account. If the account is named mysql,
+ use these commands:
+shell> chown -R mysql /usr/local/mysql/var
+shell> chgrp -R mysql /usr/local/mysql/var
+
+ If it possible that even with correct ownership, MySQL may fail to
+ start up if there is other security software running on your
+ system that manages application access to various parts of the
+ file system. In this case, you may need to reconfigure that
+ software to enable mysqld to access the directories it uses during
+ normal operation.
+
+ If the server fails to start up correctly, check the error log.
+ Log files are located in the data directory (typically C:\Program
+ Files\MySQL\MySQL Server 5.1\data on Windows,
+ /usr/local/mysql/data for a Unix binary distribution, and
+ /usr/local/var for a Unix source distribution). Look in the data
+ directory for files with names of the form host_name.err and
+ host_name.log, where host_name is the name of your server host.
+ Then examine the last few lines of these files. On Unix, you can
+ use tail to display them:
+shell> tail host_name.err
+shell> tail host_name.log
+
+ The error log should contain information that indicates why the
+ server couldn't start.
+
+ If either of the following errors occur, it means that some other
+ program (perhaps another mysqld server) is using the TCP/IP port
+ or Unix socket file that mysqld is trying to use:
+Can't start server: Bind on TCP/IP port: Address already in use
+Can't start server: Bind on unix socket...
+
+ Use ps to determine whether you have another mysqld server
+ running. If so, shut down the server before starting mysqld again.
+ (If another server is running, and you really want to run multiple
+ servers, you can find information about how to do so in Section
+ 5.6, "Running Multiple MySQL Servers on the Same Machine.")
+
+ If no other server is running, try to execute the command telnet
+ your_host_name tcp_ip_port_number. (The default MySQL port number
+ is 3306.) Then press Enter a couple of times. If you do not get an
+ error message like telnet: Unable to connect to remote host:
+ Connection refused, some other program is using the TCP/IP port
+ that mysqld is trying to use. You'll need to track down what
+ program this is and disable it, or else tell mysqld to listen to a
+ different port with the --port option. In this case, you'll also
+ need to specify the port number for client programs when
+ connecting to the server via TCP/IP.
+
+ Another reason the port might be inaccessible is that you have a
+ firewall running that blocks connections to it. If so, modify the
+ firewall settings to permit access to the port.
+
+ If the server starts but you can't connect to it, you should make
+ sure that you have an entry in /etc/hosts that looks like this:
+127.0.0.1 localhost
+
+ This problem occurs only on systems that do not have a working
+ thread library and for which MySQL must be configured to use
+ MIT-pthreads.
+
+ If you cannot get mysqld to start, you can try to make a trace
+ file to find the problem by using the --debug option. See MySQL
+ Internals: Porting
+ (http://forge.mysql.com/wiki/MySQL_Internals_Porting).
+
+2.13.2. Securing the Initial MySQL Accounts
+
+ Part of the MySQL installation process is to set up the mysql
+ database that contains the grant tables:
+
+ * Windows distributions contain preinitialized grant tables.
+
+ * On Unix, the mysql_install_db program populates the grant
+ tables. Some installation methods run this program for you.
+ Others require that you execute it manually. For details, see
+ Section 2.13.1, "Unix Post-Installation Procedures."
+
+ The mysql.user grant table defines the initial MySQL user accounts
+ and their access privileges:
+
+ * Some accounts have the user name root. These are superuser
+ accounts that have all privileges and can do anything. The
+ initial root account passwords are empty, so anyone can
+ connect to the MySQL server as root without a password and be
+ granted all privileges.
+
+ + On Windows, root accounts are created that permit
+ connections from the local host only. Connections can be
+ made by specifying a host name of localhost or 127.0.0.1.
+ If the user selects the Enable root access from remote
+ machines option during installation, the Windows
+ installer creates another root account that permits
+ connections from any host.
+
+ + On Unix, each root account permits connections from the
+ local host. Connections can be made by specifying a host
+ name of localhost, 127.0.0.1, or the actual host name or
+ IP number.
+ An attempt to connect to the host 127.0.0.1 normally resolves
+ to the localhost account. However, this fails if the server is
+ run with the --skip-name-resolve option, so the 127.0.0.1
+ account is useful in that case.
+
+ * Some accounts are for anonymous users. These have an empty
+ user name. The anonymous accounts have no password, so anyone
+ can use them to connect to the MySQL server.
+
+ + On Windows, there is one anonymous account that permits
+ connections from the local host. Connections can be made
+ by specifying a host name of localhost. The account has
+ no global privileges. (Before MySQL 5.1.16, it has all
+ global privileges, just like the root accounts.)
+
+ + On Unix, each anonymous account permits connections from
+ the local host. Connections can be made by specifying a
+ host name of localhost for one of the accounts, or the
+ actual host name or IP number for the other.
+
+ To display which accounts exist in the mysql.user table and check
+ whether their passwords are empty, use the following statement:
+mysql> SELECT User, Host, Password FROM mysql.user;
++------+--------------------+----------+
+| User | Host | Password |
++------+--------------------+----------+
+| root | localhost | |
+| root | myhost.example.com | |
+| root | 127.0.0.1 | |
+| | localhost | |
+| | myhost.example.com | |
++------+--------------------+----------+
+
+ This output indicates that there are several root and
+ anonymous-user accounts, none of which have passwords. The output
+ might differ on your system, but the presence of accounts with
+ empty passwords means that your MySQL installation is unprotected
+ until you do something about it:
+
+ * You should assign a password to each MySQL root account.
+
+ * If you want to prevent clients from connecting as anonymous
+ users without a password, you should either assign a password
+ to each anonymous account or else remove the accounts.
+
+ In addition, the mysql.db table contains rows that permits all
+ accounts to access the test database and other databases with
+ names that start with test_. This is true even for accounts that
+ otherwise have no special privileges such as the default anonymous
+ accounts. This is convenient for testing but inadvisable on
+ production servers. Administrators who want database access
+ restricted only to accounts that have permissions granted
+ explicitly for that purpose should remove these mysql.db table
+ rows.
+
+ The following instructions describe how to set up passwords for
+ the initial MySQL accounts, first for for the root accounts, then
+ for the anonymous accounts. The instructions also cover how to
+ remove the anonymous accounts, should you prefer not to permit
+ anonymous access at all, and describe how to remove permissive
+ access to test databases. Replace newpwd in the examples with the
+ password that you want to use. Replace host_name with the name of
+ the server host. You can determine this name from the output of
+ the preceding SELECT statement. For the output shown, host_name is
+ myhost.example.com.
+
+Note
+
+ If you forget your root password after setting it, see Section
+ B.5.4.1, "How to Reset the Root Password."
+
+ You might want to defer setting the passwords until later, to
+ avoid the need to specify them while you perform additional setup
+ or testing. However, be sure to set them before using your
+ installation for production purposes.
+
+ To set up additional accounts, see Section 5.5.2, "Adding User
+ Accounts."
+
+Assigning root Account Passwords
+
+ The root account passwords can be set several ways. The following
+ discussion demonstrates three methods:
+
+ * Use the SET PASSWORD statement
+
+ * Use the UPDATE statement
+
+ * Use the mysqladmin command-line client program
+
+ To assign passwords using SET PASSWORD, connect to the server as
+ root and issue a SET PASSWORD statement for each root account
+ listed in the mysql.user table. Be sure to encrypt the password
+ using the PASSWORD() function.
+
+ For Windows, do this:
+shell> mysql -u root
+mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpwd');
+mysql> SET PASSWORD FOR 'root'@'127.0.0.1' = PASSWORD('newpwd');
+mysql> SET PASSWORD FOR 'root'@'%' = PASSWORD('newpwd');
+
+ The last statement is unnecessary if the mysql.user table has no
+ root account with a host value of %.
+
+ For Unix, do this:
+shell> mysql -u root
+mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpwd');
+mysql> SET PASSWORD FOR 'root'@'127.0.0.1' = PASSWORD('newpwd');
+mysql> SET PASSWORD FOR 'root'@'host_name' = PASSWORD('newpwd');
+
+ You can also use a single statement that assigns a password to all
+ root accounts by using UPDATE to modify the mysql.user table
+ directly. This method works on any platform:
+shell> mysql -u root
+mysql> UPDATE mysql.user SET Password = PASSWORD('newpwd')
+ -> WHERE User = 'root';
+mysql> FLUSH PRIVILEGES;
+
+ The FLUSH statement causes the server to reread the grant tables.
+ Without it, the password change remains unnoticed by the server
+ until you restart it.
+
+ To assign passwords to the root accounts using mysqladmin, execute
+ the following commands:
+shell> mysqladmin -u root password "newpwd"
+shell> mysqladmin -u root -h host_name password "newpwd"
+
+ Those commands apply both to Windows and to Unix. The double
+ quotation marks around the password are not always necessary, but
+ you should use them if the password contains spaces or other
+ characters that are special to your command interpreter.
+
+ The mysqladmin method of setting the root account passwords does
+ not work for the 'root'@'127.0.0.1' account. Use the SET PASSWORD
+ method shown earlier.
+
+ After the root passwords have been set, you must supply the
+ appropriate password whenever you connect as root to the server.
+ For example, to shut down the server with mysqladmin, use this
+ command:
+shell> mysqladmin -u root -p shutdown
+Enter password: (enter root password here)
+
+Assigning Anonymous Account Passwords
+
+ The mysql commands in the following instructions include a -p
+ option based on the assumption that you have set the root account
+ passwords using the preceding instructions and must specify that
+ password when connecting to the server.
+
+ To assign passwords to the anonymous accounts, connect to the
+ server as root, then use either SET PASSWORD or UPDATE. Be sure to
+ encrypt the password using the PASSWORD() function.
+
+ To use SET PASSWORD on Windows, do this:
+shell> mysql -u root -p
+Enter password: (enter root password here)
+mysql> SET PASSWORD FOR ''@'localhost' = PASSWORD('newpwd');
+
+ To use SET PASSWORD on Unix, do this:
+shell> mysql -u root -p
+Enter password: (enter root password here)
+mysql> SET PASSWORD FOR ''@'localhost' = PASSWORD('newpwd');
+mysql> SET PASSWORD FOR ''@'host_name' = PASSWORD('newpwd');
+
+ To set the anonymous-user account passwords with a single UPDATE
+ statement, do this (on any platform):
+shell> mysql -u root -p
+Enter password: (enter root password here)
+mysql> UPDATE mysql.user SET Password = PASSWORD('newpwd')
+ -> WHERE User = '';
+mysql> FLUSH PRIVILEGES;
+
+ The FLUSH statement causes the server to reread the grant tables.
+ Without it, the password change remains unnoticed by the server
+ until you restart it.
+
+Removing Anonymous Accounts
+
+ If you prefer to remove any anonymous accounts rather than
+ assigning them passwords, do so as follows on Windows:
+shell> mysql -u root -p
+Enter password: (enter root password here)
+mysql> DROP USER ''@'localhost';
+
+ On Unix, remove the anonymous accounts like this:
+shell> mysql -u root -p
+Enter password: (enter root password here)
+mysql> DROP USER ''@'localhost';
+mysql> DROP USER ''@'host_name';
+
+Securing Test Databases
+
+ By default, the mysql.db table contains rows that permit access by
+ any user to the test database and other databases with names that
+ start with test_. (These rows have an empty User column value,
+ which for access-checking purposes matches any user name.) This
+ means that such databases can be used even by accounts that
+ otherwise possess no privileges. If you want to remove any-user
+ access to test databases, do so as follows:
+shell> mysql -u root -p
+Enter password: (enter root password here)
+mysql> DELETE FROM mysql.db WHERE Db LIKE 'test%';
+mysql> FLUSH PRIVILEGES;
+
+ The FLUSH statement causes the server to reread the grant tables.
+ Without it, the privilege change remains unnoticed by the server
+ until you restart it.
+
+ With the preceding change, only users who have global database
+ privileges or privileges granted explicitly for the test database
+ can use it. However, if you do not want the database to exist at
+ all, drop it:
+mysql> DROP DATABASE test;
+
+2.14. Environment Variables
+
+ This section lists all the environment variables that are used
+ directly or indirectly by MySQL. Most of these can also be found
+ in other places in this manual.
+
+ Note that any options on the command line take precedence over
+ values specified in option files and environment variables, and
+ values in option files take precedence over values in environment
+ variables.
+
+ In many cases, it is preferable to use an option file instead of
+ environment variables to modify the behavior of MySQL. See Section
+ 4.2.3.3, "Using Option Files."
+ Variable Description
+ CXX The name of your C++ compiler (for running configure).
+ CC The name of your C compiler (for running configure).
+ CFLAGS Flags for your C compiler (for running configure).
+ CXXFLAGS Flags for your C++ compiler (for running configure).
+ DBI_USER The default user name for Perl DBI.
+ DBI_TRACE Trace options for Perl DBI.
+ HOME The default path for the mysql history file is
+ $HOME/.mysql_history.
+ LD_RUN_PATH Used to specify the location of libmysqlclient.so.
+ MYSQL_DEBUG Debug trace options when debugging.
+ MYSQL_GROUP_SUFFIX Option group suffix value (like specifying
+ --defaults-group-suffix).
+ MYSQL_HISTFILE The path to the mysql history file. If this
+ variable is set, its value overrides the default for
+ $HOME/.mysql_history.
+ MYSQL_HOME The path to the directory in which the server-specific
+ my.cnf file resides (as of MySQL 5.0.3).
+ MYSQL_HOST The default host name used by the mysql command-line
+ client.
+ MYSQL_PS1 The command prompt to use in the mysql command-line
+ client.
+ MYSQL_PWD The default password when connecting to mysqld. Note
+ that using this is insecure. See Section 5.3.2.2, "End-User
+ Guidelines for Password Security."
+ MYSQL_TCP_PORT The default TCP/IP port number.
+ MYSQL_UNIX_PORT The default Unix socket file name; used for
+ connections to localhost.
+ PATH Used by the shell to find MySQL programs.
+ TMPDIR The directory where temporary files are created.
+ TZ This should be set to your local time zone. See Section
+ B.5.4.6, "Time Zone Problems."
+ UMASK The user-file creation mode when creating files. See note
+ following table.
+ UMASK_DIR The user-directory creation mode when creating
+ directories. See note following table.
+ USER The default user name on Windows and NetWare used when
+ connecting to mysqld.
+
+ The UMASK and UMASK_DIR variables, despite their names, are used
+ as modes, not masks:
+
+ * If UMASK is set, mysqld uses ($UMASK | 0600) as the mode for
+ file creation, so that newly created files have a mode in the
+ range from 0600 to 0666 (all values octal).
+
+ * If UMASK_DIR is set, mysqld uses ($UMASK_DIR | 0700) as the
+ base mode for directory creation, which then is AND-ed with
+ ~(~$UMASK & 0666), so that newly created directories have a
+ mode in the range from 0700 to 0777 (all values octal). The
+ AND operation may remove read and write permissions from the
+ directory mode, but not execute permissions.
+
+ MySQL assumes that the value for UMASK or UMASK_DIR is in octal if
+ it starts with a zero.
+
+2.15. Perl Installation Notes
+
+ Perl support for MySQL is provided by means of the DBI/DBD client
+ interface. The interface requires Perl 5.6.0, and 5.6.1 or later
+ is preferred. DBI does not work if you have an older version of
+ Perl.
+
+ To use transactions with Perl DBI, you must use DBD::mysql 2.0900
+ or newer. To use the MySQL 4.1 or newer client library, you must
+ use DBD::mysql 2.9003 or newer. Support for server-side prepared
+ statements requires DBD::mysql 3.0009 or newer. Current versions
+ of DBD::mysql on CPAN are 4.xxxx or higher and support all these
+ capabilities.
+
+ Perl support is not included with MySQL distributions. You can
+ obtain the necessary modules from http://search.cpan.org for Unix,
+ or by using the ActiveState ppm program on Windows. The following
+ sections describe how to do this.
+
+ Perl support for MySQL must be installed if you want to run the
+ MySQL benchmark scripts; see Section 7.1.3, "The MySQL Benchmark
+ Suite." It is also required for the MySQL Cluster ndb_size.pl
+ utility; see Section 17.4.21, "ndb_size.pl --- NDBCLUSTER Size
+ Requirement Estimator."
+
+2.15.1. Installing Perl on Unix
+
+ MySQL Perl support requires that you have installed MySQL client
+ programming support (libraries and header files). Most
+ installation methods install the necessary files. However, if you
+ installed MySQL from RPM files on Linux, be sure that you've
+ installed the developer RPM. The client programs are in the client
+ RPM, but client programming support is in the developer RPM.
+
+ If you want to install Perl support, the files you need can be
+ obtained from the CPAN (Comprehensive Perl Archive Network) at
+ http://search.cpan.org.
+
+ The easiest way to install Perl modules on Unix is to use the CPAN
+ module. For example:
+shell> perl -MCPAN -e shell
+cpan> install DBI
+cpan> install DBD::mysql
+
+ The DBD::mysql installation runs a number of tests. These tests
+ attempt to connect to the local MySQL server using the default
+ user name and password. (The default user name is your login name
+ on Unix, and ODBC on Windows. The default password is "no
+ password.") If you cannot connect to the server with those values
+ (for example, if your account has a password), the tests fail. You
+ can use force install DBD::mysql to ignore the failed tests.
+
+ DBI requires the Data::Dumper module. It may be installed; if not,
+ you should install it before installing DBI.
+
+ It is also possible to download the module distributions in the
+ form of compressed tar archives and build the modules manually.
+ For example, to unpack and build a DBI distribution, use a
+ procedure such as this:
+
+ 1. Unpack the distribution into the current directory:
+shell> gunzip < DBI-VERSION.tar.gz | tar xvf -
+ This command creates a directory named DBI-VERSION.
+
+ 2. Change location into the top-level directory of the unpacked
+ distribution:
+shell> cd DBI-VERSION
+
+ 3. Build the distribution and compile everything:
+shell> perl Makefile.PL
+shell> make
+shell> make test
+shell> make install
+
+ The make test command is important because it verifies that the
+ module is working. Note that when you run that command during the
+ DBD::mysql installation to exercise the interface code, the MySQL
+ server must be running or the test fails.
+
+ It is a good idea to rebuild and reinstall the DBD::mysql
+ distribution whenever you install a new release of MySQL,
+ particularly if you notice symptoms such as that all your DBI
+ scripts fail after you upgrade MySQL.
+
+ If you do not have access rights to install Perl modules in the
+ system directory or if you want to install local Perl modules, the
+ following reference may be useful:
+ http://servers.digitaldaze.com/extensions/perl/modules.html#module
+ s
+
+ Look under the heading "Installing New Modules that Require
+ Locally Installed Modules."
+
+2.15.2. Installing ActiveState Perl on Windows
+
+ On Windows, you should do the following to install the MySQL DBD
+ module with ActiveState Perl:
+
+ 1. Get ActiveState Perl from
+ http://www.activestate.com/Products/ActivePerl/ and install
+ it.
+
+ 2. Open a console window (a "DOS window").
+
+ 3. If necessary, set the HTTP_proxy variable. For example, you
+ might try a setting like this:
+set HTTP_proxy=my.proxy.com:3128
+
+ 4. Start the PPM program:
+C:\> C:\perl\bin\ppm.pl
+
+ 5. If you have not previously done so, install DBI:
+ppm> install DBI
+
+ 6. If this succeeds, run the following command:
+ppm> install DBD-mysql
+
+ This procedure should work with ActiveState Perl 5.6 or newer.
+
+ If you cannot get the procedure to work, you should install the
+ MyODBC driver instead and connect to the MySQL server through
+ ODBC:
+use DBI;
+$dbh= DBI->connect("DBI:ODBC:$dsn",$user,$password) ||
+ die "Got error $DBI::errstr when connecting to $dsn\n";
+
+2.15.3. Problems Using the Perl DBI/DBD Interface
+
+ If Perl reports that it cannot find the ../mysql/mysql.so module,
+ the problem is probably that Perl cannot locate the
+ libmysqlclient.so shared library. You should be able to fix this
+ problem by one of the following methods:
+
+ * Compile the DBD::mysql distribution with perl Makefile.PL
+ -static -config rather than perl Makefile.PL.
+
+ * Copy libmysqlclient.so to the directory where your other
+ shared libraries are located (probably /usr/lib or /lib).
+
+ * Modify the -L options used to compile DBD::mysql to reflect
+ the actual location of libmysqlclient.so.
+
+ * On Linux, you can add the path name of the directory where
+ libmysqlclient.so is located to the /etc/ld.so.conf file.
+
+ * Add the path name of the directory where libmysqlclient.so is
+ located to the LD_RUN_PATH environment variable. Some systems
+ use LD_LIBRARY_PATH instead.
+
+ Note that you may also need to modify the -L options if there are
+ other libraries that the linker fails to find. For example, if the
+ linker cannot find libc because it is in /lib and the link command
+ specifies -L/usr/lib, change the -L option to -L/lib or add -L/lib
+ to the existing link command.
+
+ If you get the following errors from DBD::mysql, you are probably
+ using gcc (or using an old binary compiled with gcc):
+/usr/bin/perl: can't resolve symbol '__moddi3'
+/usr/bin/perl: can't resolve symbol '__divdi3'
+
+ Add -L/usr/lib/gcc-lib/... -lgcc to the link command when the
+ mysql.so library gets built (check the output from make for
+ mysql.so when you compile the Perl client). The -L option should
+ specify the path name of the directory where libgcc.a is located
+ on your system.
+
+ Another cause of this problem may be that Perl and MySQL are not
+ both compiled with gcc. In this case, you can solve the mismatch
+ by compiling both with gcc.
+
+ You may see the following error from DBD::mysql when you run the
+ tests:
+t/00base............install_driver(mysql) failed:
+Can't load '../blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mys
+ql:
+../blib/arch/auto/DBD/mysql/mysql.so: undefined symbol:
+uncompress at /usr/lib/perl5/5.00503/i586-linux/DynaLoader.pm line 16
+9.
+
+ This means that you need to include the -lz compression library on
+ the link line. That can be done by changing the following line in
+ the file lib/DBD/mysql/Install.pm:
+$sysliblist .= " -lm";
+
+ Change that line to:
+$sysliblist .= " -lm -lz";
+
+ After this, you must run make realclean and then proceed with the
+ installation from the beginning.
+
+ If you want to install DBI on SCO, you have to edit the Makefile
+ in DBI-xxx and each subdirectory. Note that the following assumes
+ gcc 2.95.2 or newer:
+OLD: NEW:
+CC = cc CC = gcc
+CCCDLFLAGS = -KPIC -W1,-Bexport CCCDLFLAGS = -fpic
+CCDLFLAGS = -wl,-Bexport CCDLFLAGS =
+
+LD = ld LD = gcc -G -fpic
+LDDLFLAGS = -G -L/usr/local/lib LDDLFLAGS = -L/usr/local/lib
+LDFLAGS = -belf -L/usr/local/lib LDFLAGS = -L/usr/local/lib
+
+LD = ld LD = gcc -G -fpic
+OPTIMISE = -Od OPTIMISE = -O1
+
+OLD:
+CCCFLAGS = -belf -dy -w0 -U M_XENIX -DPERL_SCO5 -I/usr/local/include
+
+NEW:
+CCFLAGS = -U M_XENIX -DPERL_SCO5 -I/usr/local/include
+
+ These changes are necessary because the Perl dynaloader does not
+ load the DBI modules if they were compiled with icc or cc.
+
+ If you want to use the Perl module on a system that does not
+ support dynamic linking (such as SCO), you can generate a static
+ version of Perl that includes DBI and DBD::mysql. The way this
+ works is that you generate a version of Perl with the DBI code
+ linked in and install it on top of your current Perl. Then you use
+ that to build a version of Perl that additionally has the DBD code
+ linked in, and install that.
+
+ On SCO, you must have the following environment variables set:
+LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/usr/progressive/lib
+
+ Or:
+LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\
+ /usr/progressive/lib:/usr/skunk/lib
+LIBPATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:\
+ /usr/progressive/lib:/usr/skunk/lib
+MANPATH=scohelp:/usr/man:/usr/local1/man:/usr/local/man:\
+ /usr/skunk/man:
+
+ First, create a Perl that includes a statically linked DBI module
+ by running these commands in the directory where your DBI
+ distribution is located:
+shell> perl Makefile.PL -static -config
+shell> make
+shell> make install
+shell> make perl
+
+ Then, you must install the new Perl. The output of make perl
+ indicates the exact make command you need to execute to perform
+ the installation. On SCO, this is make -f Makefile.aperl inst_perl
+ MAP_TARGET=perl.
+
+ Next, use the just-created Perl to create another Perl that also
+ includes a statically linked DBD::mysql by running these commands
+ in the directory where your DBD::mysql distribution is located:
+shell> perl Makefile.PL -static -config
+shell> make
+shell> make install
+shell> make perl
+
+ Finally, you should install this new Perl. Again, the output of
+ make perl indicates the command to use.
diff --git a/dep/mysqllite/INSTALL-WIN-SOURCE b/dep/mysqllite/INSTALL-WIN-SOURCE
new file mode 100644
index 0000000000..0954800edb
--- /dev/null
+++ b/dep/mysqllite/INSTALL-WIN-SOURCE
@@ -0,0 +1,289 @@
+
+2.5.9. Installing MySQL from Source on Windows
+
+ These instructions describe how to build binaries from source for
+ MySQL 5.1 on Windows. Instructions are provided for building
+ binaries from a standard source distribution or from the Bazaar
+ tree that contains the latest development source.
+
+Note
+
+ The instructions here are strictly for users who want to test
+ MySQL on Microsoft Windows from the latest source distribution or
+ from the Bazaar tree. For production use, we do not advise using a
+ MySQL server built by yourself from source. Normally, it is best
+ to use precompiled binary distributions of MySQL that are built
+ specifically for optimal performance on Windows by Oracle
+ Corporation. Instructions for installing binary distributions are
+ available in Section 2.5, "Installing MySQL on Windows."
+
+ To build MySQL on Windows from source, you must satisfy the
+ following system, compiler, and resource requirements:
+
+ * Windows 2000, Windows XP, or newer version.
+ Windows Vista is supported when using Visual Studio 2005
+ provided you have installed the following updates:
+
+ + Microsoft Visual Studio 2005 Professional Edition - ENU
+ Service Pack 1 (KB926601)
+ (http://support.microsoft.com/?kbid=926601)
+
+ + Security Update for Microsoft Visual Studio 2005
+ Professional Edition - ENU (KB937061)
+ (http://support.microsoft.com/?kbid=937061)
+
+ + Update for Microsoft Visual Studio 2005 Professional
+ Edition - ENU (KB932232)
+ (http://support.microsoft.com/?kbid=932232)
+
+ * CMake, which can be downloaded from http://www.cmake.org.
+ After installing, modify your path to include the cmake
+ binary.
+
+ * Microsoft Visual C++ 2005 Express Edition, Visual Studio .Net
+ 2003 (7.1), or Visual Studio 2005 (8.0) compiler system.
+
+ * If you are using Visual C++ 2005 Express Edition, you must
+ also install an appropriate Platform SDK. More information and
+ links to downloads for various Windows platforms is available
+ from
+ http://www.microsoft.com/downloads/details.aspx?familyid=0baf2
+ b35-c656-4969-ace8-e4c0c0716adb.
+
+ * If you are compiling from a Bazaar tree or making changes to
+ the parser, you need bison for Windows, which can be
+ downloaded from
+ http://gnuwin32.sourceforge.net/packages/bison.htm. Download
+ the package labeled "Complete package, excluding sources".
+ After installing the package, modify your path to include the
+ bison binary and ensure that this binary is accessible from
+ Visual Studio.
+
+ * Cygwin might be necessary if you want to run the test script
+ or package the compiled binaries and support files into a Zip
+ archive. (Cygwin is needed only to test or package the
+ distribution, not to build it.) Cygwin is available from
+ http://cygwin.com.
+
+ * 3GB to 5GB of disk space.
+
+ The exact system requirements for Visual Studio can be found here:
+ http://msdn.microsoft.com/vstudio/Previous/2003/sysreqs/default.as
+ px and
+ http://msdn.microsoft.com/vstudio/products/sysreqs/default.aspx
+
+ You also need a MySQL source distribution for Windows, which can
+ be obtained two ways:
+
+ * Obtain a source distribution packaged by Oracle Corporation.
+ These are available from http://dev.mysql.com/downloads/.
+
+ * Package a source distribution yourself from the latest Bazaar
+ developer source tree. For instructions on pulling the latest
+ source files, see Section 2.3.3, "Installing from the
+ Development Source Tree."
+
+ If you find something not working as expected, or you have
+ suggestions about ways to improve the current build process on
+ Windows, please send a message to the win32 mailing list. See
+ Section 1.6.1, "MySQL Mailing Lists."
+
+2.5.9.1. Building MySQL from Source Using CMake and Visual Studio
+
+ You can build MySQL on Windows by using a combination of cmake and
+ Microsoft Visual Studio .NET 2003 (7.1), Microsoft Visual Studio
+ 2005 (8.0), Microsoft Visual Studio 2008 (9.0) or Microsoft Visual
+ C++ 2005 Express Edition. You must have the appropriate Microsoft
+ Platform SDK installed.
+
+Note
+
+ To compile from the source code on Windows you must use the
+ standard source distribution (for example, mysql-5.1.50.tar.gz).
+ You build from the same distribution as used to build MySQL on
+ Unix, Linux and other platforms. Do not use the Windows Source
+ distributions as they do not contain the necessary configuration
+ script and other files.
+
+ Follow this procedure to build MySQL:
+
+ 1. If you are installing from a packaged source distribution,
+ create a work directory (for example, C:\workdir), and unpack
+ the source distribution there using WinZip or another Windows
+ tool that can read .zip files. This directory is the work
+ directory in the following instructions.
+
+Note
+ You must run the commands in the win directory from the
+ top-level source directory. Do not change into the win
+ directory, as the commands will not be executed correctly.
+
+ 2. Start a command shell. If you have not configured the PATH and
+ other environment variables for all command shells, you may be
+ able to start a command shell from the Start Menu within the
+ Windows Visual Studio menu that contains the necessary
+ environment changes.
+
+ 3. Within the command shell, navigate to the work directory and
+ run the following command:
+C:\workdir>win\configure.js options
+ If you have associated the .js file extension with an
+ application such as a text editor, then you may need to use
+ the following command to force configure.js to be executed as
+ a script:
+C:\workdir>cscript win\configure.js options
+ These options are available for configure.js:
+
+ + WITH_INNOBASE_STORAGE_ENGINE: Enable the InnoDB storage
+ engine.
+
+ + WITH_PARTITION_STORAGE_ENGINE: Enable user-defined
+ partitioning.
+
+ + WITH_ARCHIVE_STORAGE_ENGINE: Enable the ARCHIVE storage
+ engine.
+
+ + WITH_BLACKHOLE_STORAGE_ENGINE: Enable the BLACKHOLE
+ storage engine.
+
+ + WITH_EXAMPLE_STORAGE_ENGINE: Enable the EXAMPLE storage
+ engine.
+
+ + WITH_FEDERATED_STORAGE_ENGINE: Enable the FEDERATED
+ storage engine.
+
+ + WITH_NDBCLUSTER_STORAGE_ENGINE: Enable the NDBCLUSTER
+ storage engine in the MySQL server; cause binaries for
+ the MySQL Cluster management and data node, management
+ client, and other programs to be built.
+ This option is supported only in MySQL Cluster NDB 7.0
+ (NDBCLUSTER storage engine versions 6.4.0 and later)
+ using the MySQL Cluster sources. It cannot be used to
+ enable clustering support in other MySQL source trees or
+ distributions.
+
+ + MYSQL_SERVER_SUFFIX=suffix: Server suffix, default none.
+
+ + COMPILATION_COMMENT=comment: Server comment, default
+ "Source distribution".
+
+ + MYSQL_TCP_PORT=port: Server port, default 3306.
+
+ + DISABLE_GRANT_OPTIONS: Disables the --bootstrap,
+ --skip-grant-tables, and --init-file options for mysqld.
+ This option is available as of MySQL 5.1.15.
+ For example (type the command on one line):
+C:\workdir>win\configure.js WITH_INNOBASE_STORAGE_ENGINE
+ WITH_PARTITION_STORAGE_ENGINE MYSQL_SERVER_SUFFIX=-pro
+
+ 4. From the work directory, execute the win\build-vs9.bat
+ (Windows Visual Studio 2008), win\build-vs8.bat (Windows
+ Visual Studio 2005), or win\build-vs71.bat (Windows Visual
+ Stidion 2003) script, depending on the version of Visual
+ Studio you have installed. The script invokes CMake, which
+ generates the mysql.sln solution file.
+ You can also use the corresponding 64-bit file (for example
+ win\build-vs8_x64.bat or win\build-vs9_x64.bat) to build the
+ 64-bit version of MySQL. However, you cannot build the 64-bit
+ version with Visual Studio Express Edition. You must use
+ Visual Studio 2005 (8.0) or higher.
+
+ 5. From the work directory, open the generated mysql.sln file
+ with Visual Studio and select the proper configuration using
+ the Configuration menu. The menu provides Debug, Release,
+ RelwithDebInfo, MinRelInfo options. Then select Solution >
+ Build to build the solution.
+ Remember the configuration that you use in this step. It is
+ important later when you run the test script because that
+ script needs to know which configuration you used.
+
+ 6. Test the server. The server built using the preceding
+ instructions expects that the MySQL base directory and data
+ directory are C:\mysql and C:\mysql\data by default. If you
+ want to test your server using the source tree root directory
+ and its data directory as the base directory and data
+ directory, you need to tell the server their path names. You
+ can either do this on the command line with the --basedir and
+ --datadir options, or by placing appropriate options in an
+ option file. (See Section 4.2.3.3, "Using Option Files.") If
+ you have an existing data directory elsewhere that you want to
+ use, you can specify its path name instead.
+ When the server is running in standalone fashion or as a
+ service based on your configuration, try to connect to it from
+ the mysql interactive command-line utility.
+ You can also run the standard test script, mysql-test-run.pl.
+ This script is written in Perl, so you'll need either Cygwin
+ or ActiveState Perl to run it. You may also need to install
+ the modules required by the script. To run the test script,
+ change location into the mysql-test directory under the work
+ directory, set the MTR_VS_CONFIG environment variable to the
+ configuration you selected earlier (or use the --vs-config
+ option), and invoke mysql-test-run.pl. For example (using
+ Cygwin and the bash shell):
+shell> cd mysql-test
+shell> export MTR_VS_CONFIG=debug
+shell> ./mysql-test-run.pl --force --timer
+shell> ./mysql-test-run.pl --force --timer --ps-protocol
+
+ When you are satisfied that the programs you have built are
+ working correctly, stop the server. Now you can install the
+ distribution. One way to do this is to use the make_win_bin_dist
+ script in the scripts directory of the MySQL source distribution
+ (see Section 4.4.2, "make_win_bin_dist --- Package MySQL
+ Distribution as ZIP Archive"). This is a shell script, so you must
+ have Cygwin installed if you want to use it. It creates a Zip
+ archive of the built executables and support files that you can
+ unpack in the location at which you want to install MySQL.
+
+ It is also possible to install MySQL by copying directories and
+ files directly:
+
+ 1. Create the directories where you want to install MySQL. For
+ example, to install into C:\mysql, use these commands:
+C:\> mkdir C:\mysql
+C:\> mkdir C:\mysql\bin
+C:\> mkdir C:\mysql\data
+C:\> mkdir C:\mysql\share
+C:\> mkdir C:\mysql\scripts
+ If you want to compile other clients and link them to MySQL,
+ you should also create several additional directories:
+C:\> mkdir C:\mysql\include
+C:\> mkdir C:\mysql\lib
+C:\> mkdir C:\mysql\lib\debug
+C:\> mkdir C:\mysql\lib\opt
+ If you want to benchmark MySQL, create this directory:
+C:\> mkdir C:\mysql\sql-bench
+ Benchmarking requires Perl support. See Section 2.15, "Perl
+ Installation Notes."
+
+ 2. From the work directory, copy into the C:\mysql directory the
+ following files and directories:
+C:\> cd \workdir
+C:\workdir> mkdir C:\mysql
+C:\workdir> mkdir C:\mysql\bin
+C:\workdir> copy client\Release\*.exe C:\mysql\bin
+C:\workdir> copy sql\Release\mysqld.exe C:\mysql\bin\mysqld.exe
+C:\workdir> xcopy scripts\*.* C:\mysql\scripts /E
+C:\workdir> xcopy share\*.* C:\mysql\share /E
+ If you want to compile other clients and link them to MySQL,
+ you should also copy several libraries and header files:
+C:\workdir> copy lib\Release\mysqlclient.lib C:\mysql\lib\debug
+C:\workdir> copy lib\Release\libmysql.* C:\mysql\lib\debug
+C:\workdir> copy lib\Release\zlib.* C:\mysql\lib\debug
+C:\workdir> copy lib\Release\mysqlclient.lib C:\mysql\lib\opt
+C:\workdir> copy lib\Release\libmysql.* C:\mysql\lib\opt
+C:\workdir> copy lib\Release\zlib.* C:\mysql\lib\opt
+C:\workdir> copy include\*.h C:\mysql\include
+C:\workdir> copy libmysql\libmysql.def C:\mysql\include
+
+Note
+ If you have compiled a Debug, rather than Release solution,
+ you can replace Release with Debug in the source file names
+ shown above.
+ If you want to benchmark MySQL, you should also do this:
+C:\workdir> xcopy sql-bench\*.* C:\mysql\bench /E
+
+ After installation, set up and start the server in the same way as
+ for binary Windows distributions. This includes creating the
+ system tables by running mysql_install_db. For more information,
+ see Section 2.5, "Installing MySQL on Windows."
diff --git a/dep/mysqllite/README b/dep/mysqllite/README
new file mode 100644
index 0000000000..8b6ccdfe5c
--- /dev/null
+++ b/dep/mysqllite/README
@@ -0,0 +1,1288 @@
+This is a release of MySQL, a dual-license SQL database server.
+MySQL is brought to you by the MySQL team at Sun Microsystems, Inc.
+
+License information can be found in these files:
+- For GPL (free) distributions, see the COPYING file and
+ the EXCEPTIONS-CLIENT file.
+- For commercial distributions, see the LICENSE.mysql file.
+
+GPLv2 Disclaimer
+For the avoidance of doubt, except that if any license choice
+other than GPL or LGPL is available it will apply instead, Sun
+elects to use only the General Public License version 2 (GPLv2)
+at this time for any software where a choice of GPL license versions
+is made available with the language indicating that GPLv2 or any
+later version may be used, or where a choice of which version of
+the GPL is applied is otherwise unspecified.
+
+For further information about MySQL or additional documentation, see:
+- The latest information about MySQL: http://www.mysql.com
+- The current MySQL documentation: http://dev.mysql.com/doc
+
+Some manual sections of special interest:
+
+- If you are migrating from an older version of MySQL, please read the
+ "Upgrading from..." section first!
+- To see what MySQL can do, take a look at the features section.
+- For installation instructions, see the Installing and Upgrading
+chapter.
+- For the new features/bugfix history, see the Change History appendix.
+- For the currently known bugs/misfeatures (known errors) see the
+Problems
+ and Common Errors appendix.
+- For a list of developers and other contributors, see the Credits
+ appendix.
+
+A local copy of the MySQL Reference Manual can be found in the Docs
+directory in GNU Info format. You can also browse the manual online or
+download it in any of several formats at the URL given earlier in this
+file.
+
+************************************************************
+
+IMPORTANT:
+
+Bug or error reports should be sent to http://bugs.mysql.com.
+
+
+***************************************************************************
+
+%%The following software may be included in this product:
+Fred Fish's Dbug Library
+
+Use of any of this software is governed by the terms of the license below:
+
+ *
+ * N O T I C E *
+ * *
+ * Copyright Abandoned, 1987, Fred Fish *
+ * *
+ * *
+ * This previously copyrighted work has been placed into the public *
+ * domain by the author and may be freely used for any purpose, *
+ * private or commercial. *
+ * *
+ * Because of the number of inquiries I was receiving about the use *
+ * of this product in commercially developed works I have decided to *
+ * simply make it public domain to further its unrestricted use. I *
+ * specifically would be most happy to see this material become a *
+ * part of the standard Unix distributions by AT&T and the Berkeley *
+ * Computer Science Research Group, and a standard part of the GNU *
+ * system from the Free Software Foundation. *
+ * *
+ * I would appreciate it, as a courtesy, if this notice is left in *
+ * all copies and derivative works. Thank you. *
+ * *
+ * The author makes no warranty of any kind with respect to this *
+ * product and explicitly disclaims any implied warranties of mer- *
+ * chantability or fitness for any particular purpose. *
+ *
+
+***************************************************************************
+
+%%The following software may be included in this product:
+dbug_analyze.c (part of Fred Fish's Dbug Library)
+
+Use of any of this software is governed by the terms of the license below:
+
+* *
+* Copyright Abandoned, 1987, Fred Fish *
+* *
+* *
+* This previously copyrighted work has been placed into the public *
+* domain by the author and may be freely used for any purpose, *
+* private or commercial. *
+* *
+* Because of the number of inquiries I was receiving about the use *
+* of this product in commercially developed works I have decided to *
+* simply make it public domain to further its unrestricted use. I *
+* specifically would be most happy to see this material become a *
+* part of the standard Unix distributions by AT&T and the Berkeley *
+* Computer Science Research Group, and a standard part of the GNU *
+* system from the Free Software Foundation. *
+* *
+* I would appreciate it, as a courtesy, if this notice is left in *
+* all copies and derivative works. Thank you. *
+* *
+* The author makes no warranty of any kind with respect to this *
+* product and explicitly disclaims any implied warranties of mer- *
+* chantability or fitness for any particular purpose.
+
+***************************************************************************
+
+%%The following software may be included in this product:
+GNU Libtool, only ltmain.sh, libtool, auto-gen fil
+
+Use of any of this software is governed by the terms of the license below:
+
+ltmain.sh inclusion:
+# ltmain.sh - Provide generalized library-building support services.
+# NOTE: Changing this file will not affect anything until you rerun configure.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+# 2007 Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit , 1996
+#
+# 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; either version 2 of the License, or
+# (at your option) any later version.
+#
+# 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 Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+libtool inclusion:
+# libtoolT - Provide generalized library-building support services.
+# Generated automatically by (GNU mysql 5.1.30)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+# 2006, 2007 Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit , 1996
+#
+# 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; either version 2 of the License, or
+# (at your option) any later version.
+#
+# 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 Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+Auto-generated files:
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building
+# support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+# 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit , 1996
+#
+# 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; either version 2 of the License, or
+# (at your option) any later version.
+#
+# 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 Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+Additional License(s)
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+***************************************************************************
+
+%%The following software may be included in this product:
+innochecksum.c
+
+Use of any of this software is governed by the terms of the license below:
+
+GNU GENERAL PUBLIC LICENSE
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share
+and change it. By contrast, the GNU General Public License is intended to
+guarantee your freedom to share and change free software--to make sure the
+software is free for all its users. This General Public License applies to most
+of the Free Software Foundation's software and to any other program whose
+authors commit to using it. (Some other Free Software Foundation software is
+covered by the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our
+General Public Licenses are designed to make sure that you have the freedom to
+distribute copies of free software (and charge for this service if you wish),
+that you receive source code or can get it if you want it, that you can change
+the software or use pieces of it in new free programs; and that you know you can
+do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny
+you these rights or to ask you to surrender the rights. These restrictions
+translate to certain responsibilities for you if you distribute copies of the
+software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for a
+fee, you must give the recipients all the rights that you have. You must make
+sure that they, too, receive or can get the source code. And you must show them
+these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2) offer
+you this license which gives you legal permission to copy, distribute and/or
+modify the software.
+
+Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software. If the
+software is modified by someone else and passed on, we want its recipients to
+know that what they have is not the original, so that any problems introduced by
+others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents. We wish
+to avoid the danger that redistributors of a free program will individually
+obtain patent licenses, in effect making the program proprietary. To prevent
+this, we have made it clear that any patent must be licensed for everyone's free
+use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification follow.
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice
+placed by the copyright holder saying it may be distributed under the terms of
+this General Public License. The "Program", below, refers to any such program or
+work, and a "work based on the Program" means either the Program or any
+derivative work under copyright law: that is to say, a work containing the
+Program or a portion of it, either verbatim or with modifications and/or
+translated into another language. (Hereinafter, translation is included without
+limitation in the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not covered by
+this License; they are outside its scope. The act of running the Program is not
+restricted, and the output from the Program is covered only if its contents
+constitute a work based on the Program (independent of having been made by
+running the Program). Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code as
+you receive it, in any medium, provided that you conspicuously and appropriately
+publish on each copy an appropriate copyright notice and disclaimer of warranty;
+keep intact all the notices that refer to this License and to the absence of any
+warranty; and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may at
+your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it, thus
+forming a work based on the Program, and copy and distribute such modifications
+or work under the terms of Section 1 above, provided that you also meet all of
+these conditions:
+
+ a) You must cause the modified files to carry prominent notices stating that
+you changed the files and the date of any change.
+ b) You must cause any work that you distribute or publish, that in whole or
+in part contains or is derived from the Program or any part thereof, to be
+licensed as a whole at no charge to all third parties under the terms of this
+License.
+ c) If the modified program normally reads commands interactively when run,
+you must cause it, when started running for such interactive use in the most
+ordinary way, to print or display an announcement including an appropriate
+copyright notice and a notice that there is no warranty (or else, saying that
+you provide a warranty) and that users may redistribute the program under these
+conditions, and telling the user how to view a copy of this License. (Exception:
+if the Program itself is interactive but does not normally print such an
+announcement, your work based on the Program is not required to print an
+announcement.)
+
+These requirements apply to the modified work as a whole. If identifiable
+sections of that work are not derived from the Program, and can be reasonably
+considered independent and separate works in themselves, then this License, and
+its terms, do not apply to those sections when you distribute them as separate
+works. But when you distribute the same sections as part of a whole which is a
+work based on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the entire whole,
+and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your
+rights to work written entirely by you; rather, the intent is to exercise the
+right to control the distribution of derivative or collective works based on the
+Program.
+
+In addition, mere aggregation of another work not based on the Program with the
+Program (or with a work based on the Program) on a volume of a storage or
+distribution medium does not bring the other work under the scope of this License.
+
+3. You may copy and distribute the Program (or a work based on it, under Section
+2) in object code or executable form under the terms of Sections 1 and 2 above
+provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable source
+code, which must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange; or,
+ b) Accompany it with a written offer, valid for at least three years, to
+give any third party, for a charge no more than your cost of physically
+performing source distribution, a complete machine-readable copy of the
+corresponding source code, to be distributed under the terms of Sections 1 and 2
+above on a medium customarily used for software interchange; or,
+ c) Accompany it with the information you received as to the offer to
+distribute corresponding source code. (This alternative is allowed only for
+noncommercial distribution and only if you received the program in object code
+or executable form with such an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for making
+modifications to it. For an executable work, complete source code means all the
+source code for all modules it contains, plus any associated interface
+definition files, plus the scripts used to control compilation and installation
+of the executable. However, as a special exception, the source code distributed
+need not include anything that is normally distributed (in either source or
+binary form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component itself
+accompanies the executable.
+
+If distribution of executable or object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the source code
+from the same place counts as distribution of the source code, even though third
+parties are not compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as
+expressly provided under this License. Any attempt otherwise to copy, modify,
+sublicense or distribute the Program is void, and will automatically terminate
+your rights under this License. However, parties who have received copies, or
+rights, from you under this License will not have their licenses terminated so
+long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it.
+However, nothing else grants you permission to modify or distribute the Program
+or its derivative works. These actions are prohibited by law if you do not
+accept this License. Therefore, by modifying or distributing the Program (or any
+work based on the Program), you indicate your acceptance of this License to do
+so, and all its terms and conditions for copying, distributing or modifying the
+Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the Program),
+the recipient automatically receives a license from the original licensor to
+copy, distribute or modify the Program subject to these terms and conditions.
+You may not impose any further restrictions on the recipients' exercise of the
+rights granted herein. You are not responsible for enforcing compliance by third
+parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent infringement
+or for any other reason (not limited to patent issues), conditions are imposed
+on you (whether by court order, agreement or otherwise) that contradict the
+conditions of this License, they do not excuse you from the conditions of this
+License. If you cannot distribute so as to satisfy simultaneously your
+obligations under this License and any other pertinent obligations, then as a
+consequence you may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by all those
+who receive copies directly or indirectly through you, then the only way you
+could satisfy both it and this License would be to refrain entirely from
+distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply and the
+section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or
+other property right claims or to contest validity of any such claims; this
+section has the sole purpose of protecting the integrity of the free software
+distribution system, which is implemented by public license practices. Many
+people have made generous contributions to the wide range of software
+distributed through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing to
+distribute software through any other system and a licensee cannot impose that
+choice.
+
+This section is intended to make thoroughly clear what is believed to be a
+consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain
+countries either by patents or by copyrighted interfaces, the original copyright
+holder who places the Program under this License may add an explicit
+geographical distribution limitation excluding those countries, so that
+distribution is permitted only in or among countries not thus excluded. In such
+case, this License incorporates the limitation as if written in the body of this
+License.
+
+9. The Free Software Foundation may publish revised and/or new versions of the
+General Public License from time to time. Such new versions will be similar in
+spirit to the present version, but may differ in detail to address new problems
+or concerns.
+
+Each version is given a distinguishing version number. If the Program specifies
+a version number of this License which applies to it and "any later version",
+you have the option of following the terms and conditions either of that version
+or of any later version published by the Free Software Foundation. If the
+Program does not specify a version number of this License, you may choose any
+version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs
+whose distribution conditions are different, write to the author to ask for
+permission. For software which is copyrighted by the Free Software Foundation,
+write to the Free Software Foundation; we sometimes make exceptions for this.
+Our decision will be guided by the two goals of preserving the free status of
+all derivatives of our free software and of promoting the sharing and reuse of
+software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE
+PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED
+IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS
+IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
+NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
+ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE
+PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL,
+SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY
+TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF
+THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
+PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+END OF TERMS AND CONDITIONS
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible use
+to the public, the best way to achieve this is to make it free software which
+everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to attach
+them to the start of each source file to most effectively convey the exclusion
+of warranty; and each file should have at least the "copyright" line and a
+pointer to where the full notice is found.
+
+one line to give the program's name and an idea of what it does.
+Copyright (C) yyyy name of author
+
+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; either version 2
+of the License, or (at your option) any later version.
+
+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 Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it
+starts in an interactive mode:
+
+Gnomovision version 69, Copyright (C) year name of author
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+type `show w'. This is free software, and you are welcome
+to redistribute it under certain conditions; type `show c'
+for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may be
+called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school,
+if any, to sign a "copyright disclaimer" for the program, if necessary. Here is
+a sample; alter the names:
+
+Yoyodyne, Inc., hereby disclaims all copyright
+interest in the program `Gnomovision'
+(which makes passes at compilers) written
+by James Hacker.
+
+signature of Ty Coon, 1 April 1989
+Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may consider
+it more useful to permit linking proprietary applications with the library. If
+this is what you want to do, use the GNU Lesser General Public License instead
+of this License.
+
+Additional Documentation License(s)
+
+innochecksum.c is documented in the MySQL Reference
+Manual at http://dev.mysql.com/doc/refman/5.1/en/innochecksum.html
+The Reference Manual is not licensed under the GPL; rather, it
+is offered under normal copyright, but with permission to
+copy/redistribute electronically.
+
+***************************************************************************
+
+%%The following software may be included in this product:
+lib_sql.cc
+
+Use of any of this software is governed by the terms of the license below:
+
+/*
+ * Copyright (c) 2000
+ * SWsoft company
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+
+ This code was modified by the MySQL team
+*/
+
+***************************************************************************
+
+%%The following software may be included in this product:
+regex++
+
+Use of any of this software is governed by the terms of the license below:
+
+Copyright 1992, 1993, 1994 Henry Spencer. All rights reserved.
+This software is not subject to any license of the American Telephone
+and Telegraph Company or of the Regents of the University of California.
+
+Permission is granted to anyone to use this software for any purpose on
+any computer system, and to alter it and redistribute it, subject
+to the following restrictions:
+
+1. The author is not responsible for the consequences of use of this
+ software, no matter how awful, even if they arise from flaws in it.
+
+2. The origin of this software must not be misrepresented, either by
+ explicit claim or by omission. Since few users ever read sources,
+ credits must appear in the documentation.
+
+3. Altered versions must be plainly marked as such, and must not be
+ misrepresented as being the original software. Since few users
+ ever read sources, credits must appear in the documentation.
+
+4. This notice may not be removed or altered.
+
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+/*-
+ * Copyright (c) 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)COPYRIGHT 8.1 (Berkeley) 3/16/94
+ */
+
+***************************************************************************
+
+%%The following software may be included in this product:
+Richard A. O'Keefe strings package
+
+Use of any of this software is governed by the terms of the license below:
+
+These files are in the public domain. This includes getopt.c, which
+is the work of Henry Spencer, University of Toronto Zoology, who says of
+it "None of this software is derived from Bell software. I had no access
+to the source for Bell's versions at the time I wrote it. This software
+is hereby explicitly placed in the public domain. It may be used for
+any purpose on any machine by anyone." I would greatly prefer it if *my*
+material received no military use.
+
+***************************************************************************
+
+%%The following software may be included in this product:
+t_ctype.h
+
+Use of any of this software is governed by the terms of the license below:
+
+http://bioinfo.mbb.yale.edu/genome/yeast/cluster/database/mysql/include/t_ctype.h
+
+/*
+ Copyright (C) 1998, 1999 by Pruet Boonma, all rights reserved.
+ Copyright (C) 1998 by Theppitak Karoonboonyanan, all rights reserved.
+ Permission to use, copy, modify, distribute and sell this software
+ and its documentation for any purpose is hereby granted without fee,
+ provided that the above copyright notice appear in all copies.
+ Smaphan Raruenrom and Pruet Boonma makes no representations about
+ the suitability of this software for any purpose. It is provided
+ "as is" without express or implied warranty.
+*/
+
+***************************************************************************
+
+%%The following software may be included in this product:
+The tz database
+
+Use of any of this software is governed by the terms of the license below:
+
+Sources for Time Zone and Daylight Saving Time Data
+@(#)tz-link.htm 7.54
+
+Please send corrections to this web page to the time zone mailing list.
+The tz database
+
+The public-domain time zone database contains code and data that represent the
+history of local time for many representative locations around the globe. It is
+updated periodically to reflect changes made by political bodies to time zone
+boundaries, UTC offsets, and daylight-saving rules. This database (often called
+tz or zoneinfo) is used by several implementations, including the GNU C Library
+used in GNU/Linux, FreeBSD, NetBSD, OpenBSD, Cygwin, DJGPP, HP-UX, IRIX, Mac OS
+X, OpenVMS, Solaris, Tru64, and UnixWare.
+
+Each location in the database represents a national region where all clocks
+keeping local time have agreed since 1970. Locations are identified by continent
+or ocean and then by the name of the location, which is typically the largest
+city within the region. For example, America/New_York represents most of the US
+eastern time zone; America/Phoenix represents most of Arizona, which uses
+mountain time without daylight saving time (DST); America/Detroit represents
+most of Michigan, which uses eastern time but with different DST rules in 1975;
+and other entries represent smaller regions like Starke County, Indiana, which
+switched from central to eastern time in 1991 and switched back in 2006. To use
+the database on an extended POSIX implementation set the TZ environment variable
+to the location's full name, e.g., TZ="America/New_York".
+
+In the tz database's FTP distribution the code is in the file tzcodeC.tar.gz,
+where C is the code's version; similarly, the data are in tzdataD.tar.gz, where
+D is the data's version. The following shell commands download these files to a
+GNU/Linux or similar host; see the downloaded README file for what to do next.
+
+wget 'ftp://elsie.nci.nih.gov/pub/tz*.tar.gz'
+gzip -dc tzcode*.tar.gz | tar -xf -
+gzip -dc tzdata*.tar.gz | tar -xf -
+
+The code lets you compile the tz source files into machine-readable binary
+files, one for each location. It also lets you read a tz binary file and
+interpret time stamps for that location.
+
+The data are by no means authoritative. If you find errors, please send changes
+to the time zone mailing list. You can also subscribe to the mailing list,
+retrieve the archive of old messages (in gzip compressed format), or retrieve
+archived older versions of code and data; there is also a smaller HTTP mirror.
+
+***************************************************************************
+
+%%The following software may be included in this product:
+zlib
+
+Use of any of this software is governed by the terms of the license below:
+
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+ version 1.2.3, July 18th, 2005
+
+ Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly jloup@gzip.org
+ Mark Adler madler@alumni.caltech.edu
+
+*/
+
+***************************************************************************
+
+%%The following software may be included in this product:
+getarg.{c,h}
+
+Use of any of this software is governed by the terms of the license below:
+
+/* Copyright (C) 2003 MySQL AB
+
+ 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 */
+
+/*
+ * Copyright (c) 1997, 1999 Kungliga Tekniska H366gskolan
+ * (Royal Institute of Technology, Stockholm, Sweden).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the Institute nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+***************************************************************************
+
+%%The following software may be included in this product:
+MD5 message-digest algorithm (md5_hash.cpp)
+
+Use of any of this software is governed by the terms of the license below:
+
+/*
+ * This code implements the MD5 message-digest algorithm.
+ * The algorithm is due to Ron Rivest. This code was
+ * written by Colin Plumb in 1993, no copyright is claimed.
+ * This code is in the public domain; do with it what you wish.
+ *
+ * Equivalent code is available from RSA Data Security, Inc.
+ * This code has been tested against that, and is equivalent,
+ * except that you don't need to include two pages of legalese
+ * with every copy.
+ *
+ * The code has been modified by Mikael Ronstroem to handle
+ * calculating a hash value of a key that is always a multiple
+ * of 4 bytes long. Word 0 of the calculated 4-word hash value
+ * is returned as the hash value.
+ */
+
+***************************************************************************
+
+%%The following software may be included in this product:
+nt_servc.{cc,h}
+
+Use of any of this software is governed by the terms of the license below:
+
+/**
+ @file
+
+ @brief
+ Windows NT Service class library.
+
+ Copyright Abandoned 1998 Irena Pancirov - Irnet Snc
+ This file is public domain and comes with NO WARRANTY of any kind
+*/
+
+***************************************************************************
+
+%%The following software may be included in this product:
+GNU Readline
+
+Use of any of this software is governed by the terms of the license below:
+
+GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ 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; either version 2 of the License, or
+ (at your option) any later version.
+
+ 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 Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ , 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
+
+***************************************************************************
+
+%%The following software may be included in this product:
+pstack (part of GNU Binutils)
+
+Use of any of this software is governed by the terms of the license below:
+
+pstack is comprised of various .c and .h files; all begin like this:
+
+/* bucomm.h -- binutils common include file.
+ Copyright (C) 1992, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
+
+This file is part of GNU Binutils.
+
+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; either version 2 of the License, or
+(at your option) any later version.
+
+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. */
+
+***************************************************************************
+
+%%The following software may be included in this product:
+libiberty.h (part of pstack GNU Binutils)
+
+Use of any of this software is governed by the terms of the license below:
+
+See
+http://www.koders.com/c/fid99F596804BBE22C076522B848D5575F142079064.aspx
+
+/* Function declarations for libiberty.
+ Written by Cygnus Support, 1994.
+
+ The libiberty library provides a number of functions which are
+ missing on some operating systems. We do not declare those here,
+ to avoid conflicts with the system header files on operating
+ systems that do support those functions. In this file we only
+ declare those functions which are specific to libiberty. */
+
+***************************************************************************
+
+%%The following software may be included in this product:
+ieee.h (part of pstack GNU Binutils)
+
+Use of any of this software is governed by the terms of the license below:
+
+See
+http://src.opensolaris.org/source/xref//sfw/usr/src/cmd/gdb/gdb-6.3/include/ieee.h
+
+
+/* IEEE Standard 695-1980 "Universal Format for Object Modules"
+header file
+ Contributed by Cygnus Support. */
+
+***************************************************************************
+
+%%The following software may be included in this product:
+pstack.c (part of pstack GNU Binutils)
+
+Use of any of this software is governed by the terms of the license below:
+
+/*
+ pstack.c -- asynchronous stack trace of a running process
+ Copyright (c) 1999 Ross Thompson
+ Author: Ross Thompson
+ Critical bug fix: Tim Waugh
+*/
+
+/*
+ This file 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; either version 2 of the License, or
+ (at your option) any later version.
+
+ 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.
+*/
+
+***************************************************************************
diff --git a/dep/mysqllite/dbug/dbug.c b/dep/mysqllite/dbug/dbug.c
new file mode 100644
index 0000000000..8fa5ed9af6
--- /dev/null
+++ b/dep/mysqllite/dbug/dbug.c
@@ -0,0 +1,2411 @@
+/******************************************************************************
+ * *
+ * N O T I C E *
+ * *
+ * Copyright Abandoned, 1987, Fred Fish *
+ * *
+ * *
+ * This previously copyrighted work has been placed into the public *
+ * domain by the author and may be freely used for any purpose, *
+ * private or commercial. *
+ * *
+ * Because of the number of inquiries I was receiving about the use *
+ * of this product in commercially developed works I have decided to *
+ * simply make it public domain to further its unrestricted use. I *
+ * specifically would be most happy to see this material become a *
+ * part of the standard Unix distributions by AT&T and the Berkeley *
+ * Computer Science Research Group, and a standard part of the GNU *
+ * system from the Free Software Foundation. *
+ * *
+ * I would appreciate it, as a courtesy, if this notice is left in *
+ * all copies and derivative works. Thank you. *
+ * *
+ * The author makes no warranty of any kind with respect to this *
+ * product and explicitly disclaims any implied warranties of mer- *
+ * chantability or fitness for any particular purpose. *
+ * *
+ ******************************************************************************
+ */
+
+/*
+ * FILE
+ *
+ * dbug.c runtime support routines for dbug package
+ *
+ * SCCS
+ *
+ * @(#)dbug.c 1.25 7/25/89
+ *
+ * DESCRIPTION
+ *
+ * These are the runtime support routines for the dbug package.
+ * The dbug package has two main components; the user include
+ * file containing various macro definitions, and the runtime
+ * support routines which are called from the macro expansions.
+ *
+ * Externally visible functions in the runtime support module
+ * use the naming convention pattern "_db_xx...xx_", thus
+ * they are unlikely to collide with user defined function names.
+ *
+ * AUTHOR(S)
+ *
+ * Fred Fish (base code)
+ * Enhanced Software Technologies, Tempe, AZ
+ * asuvax!mcdphx!estinc!fnf
+ *
+ * Binayak Banerjee (profiling enhancements)
+ * seismo!bpa!sjuvax!bbanerje
+ *
+ * Michael Widenius:
+ * DBUG_DUMP - To dump a block of memory.
+ * PUSH_FLAG "O" - To be used insted of "o" if we
+ * want flushing after each write
+ * PUSH_FLAG "A" - as 'O', but we will append to the out file instead
+ * of creating a new one.
+ * Check of malloc on entry/exit (option "S")
+ *
+ * DBUG_EXECUTE_IF
+ * incremental mode (-#+t:-d,info ...)
+ * DBUG_SET, _db_explain_
+ * thread-local settings
+ *
+ */
+
+
+#include
+#include
+#include
+#if defined(MSDOS) || defined(__WIN__)
+#include
+#endif
+
+
+#ifndef DBUG_OFF
+
+
+/*
+ * Manifest constants which may be "tuned" if desired.
+ */
+
+#define PRINTBUF 1024 /* Print buffer size */
+#define INDENT 2 /* Indentation per trace level */
+#define MAXDEPTH 200 /* Maximum trace depth default */
+
+/*
+ * The following flags are used to determine which
+ * capabilities the user has enabled with the settings
+ * push macro.
+ */
+
+#define TRACE_ON 000001 /* Trace enabled */
+#define DEBUG_ON 000002 /* Debug enabled */
+#define FILE_ON 000004 /* File name print enabled */
+#define LINE_ON 000010 /* Line number print enabled */
+#define DEPTH_ON 000020 /* Function nest level print enabled */
+#define PROCESS_ON 000040 /* Process name print enabled */
+#define NUMBER_ON 000100 /* Number each line of output */
+#define PROFILE_ON 000200 /* Print out profiling code */
+#define PID_ON 000400 /* Identify each line with process id */
+#define TIMESTAMP_ON 001000 /* timestamp every line of output */
+#define SANITY_CHECK_ON 002000 /* Check safemalloc on DBUG_ENTER */
+#define FLUSH_ON_WRITE 004000 /* Flush on every write */
+#define OPEN_APPEND 010000 /* Open for append */
+
+#define TRACING (cs->stack->flags & TRACE_ON)
+#define DEBUGGING (cs->stack->flags & DEBUG_ON)
+#define PROFILING (cs->stack->flags & PROFILE_ON)
+
+/*
+ * Typedefs to make things more obvious.
+ */
+
+#ifndef __WIN__
+typedef int BOOLEAN;
+#else
+#define BOOLEAN BOOL
+#endif
+
+/*
+ * Make it easy to change storage classes if necessary.
+ */
+
+#define IMPORT extern /* Names defined externally */
+#define EXPORT /* Allocated here, available globally */
+#define AUTO auto /* Names to be allocated on stack */
+#define REGISTER register /* Names to be placed in registers */
+
+/*
+ * The default file for profiling. Could also add another flag
+ * (G?) which allowed the user to specify this.
+ *
+ * If the automatic variables get allocated on the stack in
+ * reverse order from their declarations, then define AUTOS_REVERSE.
+ * This is used by the code that keeps track of stack usage. For
+ * forward allocation, the difference in the dbug frame pointers
+ * represents stack used by the callee function. For reverse allocation,
+ * the difference represents stack used by the caller function.
+ *
+ */
+
+#define PROF_FILE "dbugmon.out"
+#define PROF_EFMT "E\t%ld\t%s\n"
+#define PROF_SFMT "S\t%lx\t%lx\t%s\n"
+#define PROF_XFMT "X\t%ld\t%s\n"
+
+#ifdef M_I386 /* predefined by xenix 386 compiler */
+#define AUTOS_REVERSE 1
+#endif
+
+/*
+ * Externally supplied functions.
+ */
+
+#ifndef HAVE_PERROR
+static void perror(); /* Fake system/library error print routine */
+#endif
+
+IMPORT int _sanity(const char *file,uint line); /* safemalloc sanity checker */
+
+/*
+ * The user may specify a list of functions to trace or
+ * debug. These lists are kept in a linear linked list,
+ * a very simple implementation.
+ */
+
+struct link {
+ struct link *next_link; /* Pointer to the next link */
+ char str[1]; /* Pointer to link's contents */
+};
+
+/*
+ * Debugging settings can be pushed or popped off of a
+ * stack which is implemented as a linked list. Note
+ * that the head of the list is the current settings and the
+ * stack is pushed by adding a new settings to the head of the
+ * list or popped by removing the first link.
+ *
+ * Note: if out_file is NULL, the other fields are not initialized at all!
+ */
+
+struct settings {
+ int flags; /* Current settings flags */
+ int maxdepth; /* Current maximum trace depth */
+ uint delay; /* Delay after each output line */
+ int sub_level; /* Sub this from code_state->level */
+ FILE *out_file; /* Current output stream */
+ FILE *prof_file; /* Current profiling stream */
+ char name[FN_REFLEN]; /* Name of output file */
+ struct link *functions; /* List of functions */
+ struct link *p_functions; /* List of profiled functions */
+ struct link *keywords; /* List of debug keywords */
+ struct link *processes; /* List of process names */
+ struct settings *next; /* Next settings in the list */
+};
+
+#define is_shared(S, V) ((S)->next && (S)->next->V == (S)->V)
+
+/*
+ * Local variables not seen by user.
+ */
+
+
+static BOOLEAN init_done= FALSE; /* Set to TRUE when initialization done */
+static struct settings init_settings;
+static const char *db_process= 0;/* Pointer to process name; argv[0] */
+
+typedef struct _db_code_state_ {
+ const char *process; /* Pointer to process name; usually argv[0] */
+ const char *func; /* Name of current user function */
+ const char *file; /* Name of current user file */
+ char **framep; /* Pointer to current frame */
+ struct settings *stack; /* debugging settings */
+ const char *jmpfunc; /* Remember current function for setjmp */
+ const char *jmpfile; /* Remember current file for setjmp */
+ int lineno; /* Current debugger output line number */
+ int level; /* Current function nesting level */
+ int jmplevel; /* Remember nesting level at setjmp() */
+
+/*
+ * The following variables are used to hold the state information
+ * between the call to _db_pargs_() and _db_doprnt_(), during
+ * expansion of the DBUG_PRINT macro. This is the only macro
+ * that currently uses these variables.
+ *
+ * These variables are currently used only by _db_pargs_() and
+ * _db_doprnt_().
+ */
+
+ uint u_line; /* User source code line number */
+ int locked; /* If locked with _db_lock_file_ */
+ const char *u_keyword; /* Keyword for current macro */
+} CODE_STATE;
+
+/*
+ The test below is so we could call functions with DBUG_ENTER before
+ my_thread_init().
+*/
+#define get_code_state_or_return if (!cs && !((cs=code_state()))) return
+
+ /* Handling lists */
+static struct link *ListAdd(struct link *, const char *, const char *);
+static struct link *ListDel(struct link *, const char *, const char *);
+static struct link *ListCopy(struct link *);
+static void FreeList(struct link *linkp);
+
+ /* OpenClose debug output stream */
+static void DBUGOpenFile(CODE_STATE *,const char *, const char *, int);
+static void DBUGCloseFile(CODE_STATE *cs, FILE *fp);
+ /* Push current debug settings */
+static void PushState(CODE_STATE *cs);
+ /* Free memory associated with debug state. */
+static void FreeState (CODE_STATE *cs, struct settings *state, int free_state);
+ /* Test for tracing enabled */
+static BOOLEAN DoTrace(CODE_STATE *cs);
+
+ /* Test to see if file is writable */
+#if !(!defined(HAVE_ACCESS) || defined(MSDOS))
+static BOOLEAN Writable(const char *pathname);
+ /* Change file owner and group */
+static void ChangeOwner(CODE_STATE *cs, char *pathname);
+ /* Allocate memory for runtime support */
+#endif
+
+static void DoPrefix(CODE_STATE *cs, uint line);
+
+static char *DbugMalloc(size_t size);
+static const char *BaseName(const char *pathname);
+static void Indent(CODE_STATE *cs, int indent);
+static BOOLEAN InList(struct link *linkp,const char *cp);
+static void dbug_flush(CODE_STATE *);
+static void DbugExit(const char *why);
+static const char *DbugStrTok(const char *s);
+
+#ifndef THREAD
+ /* Open profile output stream */
+static FILE *OpenProfile(CODE_STATE *cs, const char *name);
+ /* Profile if asked for it */
+static BOOLEAN DoProfile(CODE_STATE *);
+ /* Return current user time (ms) */
+static unsigned long Clock(void);
+#endif
+
+/*
+ * Miscellaneous printf format strings.
+ */
+
+#define ERR_MISSING_RETURN "%s: missing DBUG_RETURN or DBUG_VOID_RETURN macro in function \"%s\"\n"
+#define ERR_OPEN "%s: can't open debug output stream \"%s\": "
+#define ERR_CLOSE "%s: can't close debug file: "
+#define ERR_ABORT "%s: debugger aborting because %s\n"
+#define ERR_CHOWN "%s: can't change owner/group of \"%s\": "
+
+/*
+ * Macros and defines for testing file accessibility under UNIX and MSDOS.
+ */
+
+#undef EXISTS
+#if !defined(HAVE_ACCESS) || defined(MSDOS)
+#define EXISTS(pathname) (FALSE) /* Assume no existance */
+#define Writable(name) (TRUE)
+#else
+#define EXISTS(pathname) (access(pathname, F_OK) == 0)
+#define WRITABLE(pathname) (access(pathname, W_OK) == 0)
+#endif
+#ifndef MSDOS
+#define ChangeOwner(cs,name)
+#endif
+
+
+/*
+** Macros to allow dbugging with threads
+*/
+
+#ifdef THREAD
+#include
+pthread_mutex_t THR_LOCK_dbug;
+
+static CODE_STATE *code_state(void)
+{
+ CODE_STATE *cs=0;
+ struct st_my_thread_var *tmp;
+
+ if (!init_done)
+ {
+ pthread_mutex_init(&THR_LOCK_dbug,MY_MUTEX_INIT_FAST);
+ bzero(&init_settings, sizeof(init_settings));
+ init_settings.out_file=stderr;
+ init_settings.flags=OPEN_APPEND;
+ init_done=TRUE;
+ }
+
+ if ((tmp=my_thread_var))
+ {
+ if (!(cs=(CODE_STATE *) tmp->dbug))
+ {
+ cs=(CODE_STATE*) DbugMalloc(sizeof(*cs));
+ bzero((uchar*) cs,sizeof(*cs));
+ cs->process= db_process ? db_process : "dbug";
+ cs->func="?func";
+ cs->file="?file";
+ cs->stack=&init_settings;
+ tmp->dbug= (void*) cs;
+ }
+ }
+ return cs;
+}
+
+#else /* !THREAD */
+
+static CODE_STATE static_code_state=
+{
+ "dbug", "?func", "?file", NULL, &init_settings,
+ NullS, NullS, 0,0,0,0,0,NullS
+};
+
+static CODE_STATE *code_state(void)
+{
+ if (!init_done)
+ {
+ bzero(&init_settings, sizeof(init_settings));
+ init_settings.out_file=stderr;
+ init_settings.flags=OPEN_APPEND;
+ init_done=TRUE;
+ }
+ return &static_code_state;
+}
+
+#define pthread_mutex_lock(A) {}
+#define pthread_mutex_unlock(A) {}
+#endif
+
+/*
+ * Translate some calls among different systems.
+ */
+
+#ifdef HAVE_SLEEP
+/* sleep() wants seconds */
+#define Delay(A) sleep(((uint) A)/10)
+#else
+#define Delay(A) (0)
+#endif
+
+/*
+ * FUNCTION
+ *
+ * _db_process_ give the name to the current process/thread
+ *
+ * SYNOPSIS
+ *
+ * VOID _process_(name)
+ * char *name;
+ *
+ */
+
+void _db_process_(const char *name)
+{
+ CODE_STATE *cs=0;
+
+ if (!db_process)
+ db_process= name;
+
+ get_code_state_or_return;
+ cs->process= name;
+}
+
+
+/*
+ * FUNCTION
+ *
+ * DbugParse parse control string and set current debugger setting
+ *
+ * DESCRIPTION
+ *
+ * Given pointer to a debug control string in "control",
+ * parses the control string, and sets
+ * up a current debug settings.
+ *
+ * The debug control string is a sequence of colon separated fields
+ * as follows:
+ *
+ * [+]::...:
+ *
+ * Each field consists of a mandatory flag character followed by
+ * an optional "," and comma separated list of modifiers:
+ *
+ * [sign]flag[,modifier,modifier,...,modifier]
+ *
+ * See the manual for the list of supported signs, flags, and modifiers
+ *
+ * For convenience, any leading "-#" is stripped off.
+ *
+ */
+
+static void DbugParse(CODE_STATE *cs, const char *control)
+{
+ const char *end;
+ int rel=0;
+ struct settings *stack;
+
+ get_code_state_or_return;
+ stack= cs->stack;
+
+ if (control[0] == '-' && control[1] == '#')
+ control+=2;
+
+ rel= control[0] == '+' || control[0] == '-';
+ if ((!rel || (!stack->out_file && !stack->next)))
+ {
+ /*
+ We need to free what's already in init_settings, because unlike
+ the thread related stack frames there's a chance that something
+ is in these variables already.
+ */
+ if (stack == &init_settings)
+ FreeState(cs, stack, 0);
+ stack->flags= 0;
+ stack->delay= 0;
+ stack->maxdepth= 0;
+ stack->sub_level= 0;
+ stack->out_file= stderr;
+ stack->prof_file= NULL;
+ stack->functions= NULL;
+ stack->p_functions= NULL;
+ stack->keywords= NULL;
+ stack->processes= NULL;
+ }
+ else if (!stack->out_file)
+ {
+ stack->flags= stack->next->flags;
+ stack->delay= stack->next->delay;
+ stack->maxdepth= stack->next->maxdepth;
+ stack->sub_level= stack->next->sub_level;
+ strcpy(stack->name, stack->next->name);
+ stack->out_file= stack->next->out_file;
+ stack->prof_file= stack->next->prof_file;
+ if (stack->next == &init_settings)
+ {
+ /* never share with the global parent - it can change under your feet */
+ stack->functions= ListCopy(init_settings.functions);
+ stack->p_functions= ListCopy(init_settings.p_functions);
+ stack->keywords= ListCopy(init_settings.keywords);
+ stack->processes= ListCopy(init_settings.processes);
+ }
+ else
+ {
+ stack->functions= stack->next->functions;
+ stack->p_functions= stack->next->p_functions;
+ stack->keywords= stack->next->keywords;
+ stack->processes= stack->next->processes;
+ }
+ }
+
+ end= DbugStrTok(control);
+ while (control < end)
+ {
+ int c, sign= (*control == '+') ? 1 : (*control == '-') ? -1 : 0;
+ if (sign) control++;
+ if (!rel) sign=0;
+ c= *control++;
+ if (*control == ',') control++;
+ /* XXX when adding new cases here, don't forget _db_explain_ ! */
+ switch (c) {
+ case 'd':
+ if (sign < 0 && control == end)
+ {
+ if (!is_shared(stack, keywords))
+ FreeList(stack->keywords);
+ stack->keywords=NULL;
+ stack->flags &= ~DEBUG_ON;
+ break;
+ }
+ if (rel && is_shared(stack, keywords))
+ stack->keywords= ListCopy(stack->keywords);
+ if (sign < 0)
+ {
+ if (DEBUGGING)
+ stack->keywords= ListDel(stack->keywords, control, end);
+ break;
+ }
+ stack->keywords= ListAdd(stack->keywords, control, end);
+ stack->flags |= DEBUG_ON;
+ break;
+ case 'D':
+ stack->delay= atoi(control);
+ break;
+ case 'f':
+ if (sign < 0 && control == end)
+ {
+ if (!is_shared(stack,functions))
+ FreeList(stack->functions);
+ stack->functions=NULL;
+ break;
+ }
+ if (rel && is_shared(stack,functions))
+ stack->functions= ListCopy(stack->functions);
+ if (sign < 0)
+ stack->functions= ListDel(stack->functions, control, end);
+ else
+ stack->functions= ListAdd(stack->functions, control, end);
+ break;
+ case 'F':
+ if (sign < 0)
+ stack->flags &= ~FILE_ON;
+ else
+ stack->flags |= FILE_ON;
+ break;
+ case 'i':
+ if (sign < 0)
+ stack->flags &= ~PID_ON;
+ else
+ stack->flags |= PID_ON;
+ break;
+#ifndef THREAD
+ case 'g':
+ if (OpenProfile(cs, PROF_FILE))
+ {
+ stack->flags |= PROFILE_ON;
+ stack->p_functions= ListAdd(stack->p_functions, control, end);
+ }
+ break;
+#endif
+ case 'L':
+ if (sign < 0)
+ stack->flags &= ~LINE_ON;
+ else
+ stack->flags |= LINE_ON;
+ break;
+ case 'n':
+ if (sign < 0)
+ stack->flags &= ~DEPTH_ON;
+ else
+ stack->flags |= DEPTH_ON;
+ break;
+ case 'N':
+ if (sign < 0)
+ stack->flags &= ~NUMBER_ON;
+ else
+ stack->flags |= NUMBER_ON;
+ break;
+ case 'A':
+ case 'O':
+ stack->flags |= FLUSH_ON_WRITE;
+ /* fall through */
+ case 'a':
+ case 'o':
+ if (sign < 0)
+ {
+ if (!is_shared(stack, out_file))
+ DBUGCloseFile(cs, stack->out_file);
+ stack->flags &= ~FLUSH_ON_WRITE;
+ stack->out_file= stderr;
+ break;
+ }
+ if (c == 'a' || c == 'A')
+ stack->flags |= OPEN_APPEND;
+ else
+ stack->flags &= ~OPEN_APPEND;
+ if (control != end)
+ DBUGOpenFile(cs, control, end, stack->flags & OPEN_APPEND);
+ else
+ DBUGOpenFile(cs, "-",0,0);
+ break;
+ case 'p':
+ if (sign < 0 && control == end)
+ {
+ if (!is_shared(stack,processes))
+ FreeList(stack->processes);
+ stack->processes=NULL;
+ break;
+ }
+ if (rel && is_shared(stack, processes))
+ stack->processes= ListCopy(stack->processes);
+ if (sign < 0)
+ stack->processes= ListDel(stack->processes, control, end);
+ else
+ stack->processes= ListAdd(stack->processes, control, end);
+ break;
+ case 'P':
+ if (sign < 0)
+ stack->flags &= ~PROCESS_ON;
+ else
+ stack->flags |= PROCESS_ON;
+ break;
+ case 'r':
+ stack->sub_level= cs->level;
+ break;
+ case 't':
+ if (sign < 0)
+ {
+ if (control != end)
+ stack->maxdepth-= atoi(control);
+ else
+ stack->maxdepth= 0;
+ }
+ else
+ {
+ if (control != end)
+ stack->maxdepth+= atoi(control);
+ else
+ stack->maxdepth= MAXDEPTH;
+ }
+ if (stack->maxdepth > 0)
+ stack->flags |= TRACE_ON;
+ else
+ stack->flags &= ~TRACE_ON;
+ break;
+ case 'T':
+ if (sign < 0)
+ stack->flags &= ~TIMESTAMP_ON;
+ else
+ stack->flags |= TIMESTAMP_ON;
+ break;
+ case 'S':
+ if (sign < 0)
+ stack->flags &= ~SANITY_CHECK_ON;
+ else
+ stack->flags |= SANITY_CHECK_ON;
+ break;
+ }
+ if (!*end)
+ break;
+ control=end+1;
+ end= DbugStrTok(control);
+ }
+}
+
+
+/*
+ * FUNCTION
+ *
+ * _db_set_ set current debugger settings
+ *
+ * SYNOPSIS
+ *
+ * VOID _db_set_(control)
+ * char *control;
+ *
+ * DESCRIPTION
+ *
+ * Given pointer to a debug control string in "control",
+ * parses the control string, and sets up a current debug
+ * settings. Pushes a new debug settings if the current is
+ * set to the initial debugger settings.
+ */
+
+void _db_set_(CODE_STATE *cs, const char *control)
+{
+ get_code_state_or_return;
+
+ if (cs->stack == &init_settings)
+ PushState(cs);
+
+ DbugParse(cs, control);
+}
+
+
+/*
+ * FUNCTION
+ *
+ * _db_push_ push current debugger settings and set up new one
+ *
+ * SYNOPSIS
+ *
+ * VOID _db_push_(control)
+ * char *control;
+ *
+ * DESCRIPTION
+ *
+ * Given pointer to a debug control string in "control", pushes
+ * the current debug settings, parses the control string, and sets
+ * up a new debug settings with DbugParse()
+ *
+ */
+
+void _db_push_(const char *control)
+{
+ CODE_STATE *cs=0;
+ get_code_state_or_return;
+ PushState(cs);
+ DbugParse(cs, control);
+}
+
+/*
+ * FUNCTION
+ *
+ * _db_set_init_ set initial debugger settings
+ *
+ * SYNOPSIS
+ *
+ * VOID _db_set_init_(control)
+ * char *control;
+ *
+ * DESCRIPTION
+ * see _db_set_
+ *
+ */
+
+void _db_set_init_(const char *control)
+{
+ CODE_STATE tmp_cs;
+ bzero((uchar*) &tmp_cs, sizeof(tmp_cs));
+ tmp_cs.stack= &init_settings;
+ DbugParse(&tmp_cs, control);
+}
+
+/*
+ * FUNCTION
+ *
+ * _db_pop_ pop the debug stack
+ *
+ * DESCRIPTION
+ *
+ * Pops the debug stack, returning the debug settings to its
+ * condition prior to the most recent _db_push_ invocation.
+ * Note that the pop will fail if it would remove the last
+ * valid settings from the stack. This prevents user errors
+ * in the push/pop sequence from screwing up the debugger.
+ * Maybe there should be some kind of warning printed if the
+ * user tries to pop too many states.
+ *
+ */
+
+void _db_pop_()
+{
+ struct settings *discard;
+ CODE_STATE *cs=0;
+
+ get_code_state_or_return;
+
+ discard= cs->stack;
+ if (discard->next != NULL)
+ {
+ cs->stack= discard->next;
+ FreeState(cs, discard, 1);
+ }
+}
+
+/*
+ * FUNCTION
+ *
+ * _db_explain_ generates 'control' string for the current settings
+ *
+ * RETURN
+ * 0 - ok
+ * 1 - buffer too short, output truncated
+ *
+ */
+
+/* helper macros */
+#define char_to_buf(C) do { \
+ *buf++=(C); \
+ if (buf >= end) goto overflow; \
+ } while (0)
+#define str_to_buf(S) do { \
+ char_to_buf(','); \
+ buf=strnmov(buf, (S), len+1); \
+ if (buf >= end) goto overflow; \
+ } while (0)
+#define list_to_buf(l) do { \
+ struct link *listp=(l); \
+ while (listp) \
+ { \
+ str_to_buf(listp->str); \
+ listp=listp->next_link; \
+ } \
+ } while (0)
+#define int_to_buf(i) do { \
+ char b[50]; \
+ int10_to_str((i), b, 10); \
+ str_to_buf(b); \
+ } while (0)
+#define colon_to_buf do { \
+ if (buf != start) char_to_buf(':'); \
+ } while(0)
+#define op_int_to_buf(C, val, def) do { \
+ if ((val) != (def)) \
+ { \
+ colon_to_buf; \
+ char_to_buf((C)); \
+ int_to_buf(val); \
+ } \
+ } while (0)
+#define op_intf_to_buf(C, val, def, cond) do { \
+ if ((cond)) \
+ { \
+ colon_to_buf; \
+ char_to_buf((C)); \
+ if ((val) != (def)) int_to_buf(val); \
+ } \
+ } while (0)
+#define op_str_to_buf(C, val, cond) do { \
+ if ((cond)) \
+ { \
+ char *s=(val); \
+ colon_to_buf; \
+ char_to_buf((C)); \
+ if (*s) str_to_buf(s); \
+ } \
+ } while (0)
+#define op_list_to_buf(C, val, cond) do { \
+ if ((cond)) \
+ { \
+ colon_to_buf; \
+ char_to_buf((C)); \
+ list_to_buf(val); \
+ } \
+ } while (0)
+#define op_bool_to_buf(C, cond) do { \
+ if ((cond)) \
+ { \
+ colon_to_buf; \
+ char_to_buf((C)); \
+ } \
+ } while (0)
+
+int _db_explain_ (CODE_STATE *cs, char *buf, size_t len)
+{
+ char *start=buf, *end=buf+len-4;
+
+ get_code_state_or_return *buf=0;
+
+ op_list_to_buf('d', cs->stack->keywords, DEBUGGING);
+ op_int_to_buf ('D', cs->stack->delay, 0);
+ op_list_to_buf('f', cs->stack->functions, cs->stack->functions);
+ op_bool_to_buf('F', cs->stack->flags & FILE_ON);
+ op_bool_to_buf('i', cs->stack->flags & PID_ON);
+ op_list_to_buf('g', cs->stack->p_functions, PROFILING);
+ op_bool_to_buf('L', cs->stack->flags & LINE_ON);
+ op_bool_to_buf('n', cs->stack->flags & DEPTH_ON);
+ op_bool_to_buf('N', cs->stack->flags & NUMBER_ON);
+ op_str_to_buf(
+ ((cs->stack->flags & FLUSH_ON_WRITE ? 0 : 32) |
+ (cs->stack->flags & OPEN_APPEND ? 'A' : 'O')),
+ cs->stack->name, cs->stack->out_file != stderr);
+ op_list_to_buf('p', cs->stack->processes, cs->stack->processes);
+ op_bool_to_buf('P', cs->stack->flags & PROCESS_ON);
+ op_bool_to_buf('r', cs->stack->sub_level != 0);
+ op_intf_to_buf('t', cs->stack->maxdepth, MAXDEPTH, TRACING);
+ op_bool_to_buf('T', cs->stack->flags & TIMESTAMP_ON);
+ op_bool_to_buf('S', cs->stack->flags & SANITY_CHECK_ON);
+
+ *buf= '\0';
+ return 0;
+
+overflow:
+ *end++= '.';
+ *end++= '.';
+ *end++= '.';
+ *end= '\0';
+ return 1;
+}
+
+#undef char_to_buf
+#undef str_to_buf
+#undef list_to_buf
+#undef int_to_buf
+#undef colon_to_buf
+#undef op_int_to_buf
+#undef op_intf_to_buf
+#undef op_str_to_buf
+#undef op_list_to_buf
+#undef op_bool_to_buf
+
+/*
+ * FUNCTION
+ *
+ * _db_explain_init_ explain initial debugger settings
+ *
+ * DESCRIPTION
+ * see _db_explain_
+ */
+
+int _db_explain_init_(char *buf, size_t len)
+{
+ CODE_STATE cs;
+ bzero((uchar*) &cs,sizeof(cs));
+ cs.stack=&init_settings;
+ return _db_explain_(&cs, buf, len);
+}
+
+/*
+ * FUNCTION
+ *
+ * _db_enter_ process entry point to user function
+ *
+ * SYNOPSIS
+ *
+ * VOID _db_enter_(_func_, _file_, _line_,
+ * _sfunc_, _sfile_, _slevel_, _sframep_)
+ * char *_func_; points to current function name
+ * char *_file_; points to current file name
+ * int _line_; called from source line number
+ * char **_sfunc_; save previous _func_
+ * char **_sfile_; save previous _file_
+ * int *_slevel_; save previous nesting level
+ * char ***_sframep_; save previous frame pointer
+ *
+ * DESCRIPTION
+ *
+ * Called at the beginning of each user function to tell
+ * the debugger that a new function has been entered.
+ * Note that the pointers to the previous user function
+ * name and previous user file name are stored on the
+ * caller's stack (this is why the ENTER macro must be
+ * the first "executable" code in a function, since it
+ * allocates these storage locations). The previous nesting
+ * level is also stored on the callers stack for internal
+ * self consistency checks.
+ *
+ * Also prints a trace line if tracing is enabled and
+ * increments the current function nesting depth.
+ *
+ * Note that this mechanism allows the debugger to know
+ * what the current user function is at all times, without
+ * maintaining an internal stack for the function names.
+ *
+ */
+
+void _db_enter_(const char *_func_, const char *_file_,
+ uint _line_, const char **_sfunc_, const char **_sfile_,
+ uint *_slevel_, char ***_sframep_ __attribute__((unused)))
+{
+ int save_errno=errno;
+ CODE_STATE *cs=0;
+ get_code_state_or_return;
+
+ *_sfunc_= cs->func;
+ *_sfile_= cs->file;
+ cs->func= _func_;
+ cs->file= _file_;
+ *_slevel_= ++cs->level;
+#ifndef THREAD
+ *_sframep_= cs->framep;
+ cs->framep= (char **) _sframep_;
+ if (DoProfile(cs))
+ {
+ long stackused;
+ if (*cs->framep == NULL)
+ stackused= 0;
+ else
+ {
+ stackused= ((long)(*cs->framep)) - ((long)(cs->framep));
+ stackused= stackused > 0 ? stackused : -stackused;
+ }
+ (void) fprintf(cs->stack->prof_file, PROF_EFMT , Clock(), cs->func);
+#ifdef AUTOS_REVERSE
+ (void) fprintf(cs->stack->prof_file, PROF_SFMT, cs->framep, stackused, *_sfunc_);
+#else
+ (void) fprintf(cs->stack->prof_file, PROF_SFMT, (ulong) cs->framep, stackused,
+ cs->func);
+#endif
+ (void) fflush(cs->stack->prof_file);
+ }
+#endif
+ if (DoTrace(cs))
+ {
+ if (!cs->locked)
+ pthread_mutex_lock(&THR_LOCK_dbug);
+ DoPrefix(cs, _line_);
+ Indent(cs, cs->level);
+ (void) fprintf(cs->stack->out_file, ">%s\n", cs->func);
+ dbug_flush(cs); /* This does a unlock */
+ }
+#ifdef SAFEMALLOC
+ if (cs->stack->flags & SANITY_CHECK_ON)
+ if (_sanity(_file_,_line_)) /* Check of safemalloc */
+ cs->stack->flags &= ~SANITY_CHECK_ON;
+#endif
+ errno=save_errno;
+}
+
+/*
+ * FUNCTION
+ *
+ * _db_return_ process exit from user function
+ *
+ * SYNOPSIS
+ *
+ * VOID _db_return_(_line_, _sfunc_, _sfile_, _slevel_)
+ * int _line_; current source line number
+ * char **_sfunc_; where previous _func_ is to be retrieved
+ * char **_sfile_; where previous _file_ is to be retrieved
+ * int *_slevel_; where previous level was stashed
+ *
+ * DESCRIPTION
+ *
+ * Called just before user function executes an explicit or implicit
+ * return. Prints a trace line if trace is enabled, decrements
+ * the current nesting level, and restores the current function and
+ * file names from the defunct function's stack.
+ *
+ */
+
+/* helper macro */
+void _db_return_(uint _line_, const char **_sfunc_,
+ const char **_sfile_, uint *_slevel_)
+{
+ int save_errno=errno;
+ CODE_STATE *cs=0;
+ get_code_state_or_return;
+
+ if (cs->level != (int) *_slevel_)
+ {
+ if (!cs->locked)
+ pthread_mutex_lock(&THR_LOCK_dbug);
+ (void) fprintf(cs->stack->out_file, ERR_MISSING_RETURN, cs->process,
+ cs->func);
+ dbug_flush(cs);
+ }
+ else
+ {
+#ifdef SAFEMALLOC
+ if (cs->stack->flags & SANITY_CHECK_ON)
+ {
+ if (_sanity(*_sfile_,_line_))
+ cs->stack->flags &= ~SANITY_CHECK_ON;
+ }
+#endif
+#ifndef THREAD
+ if (DoProfile(cs))
+ (void) fprintf(cs->stack->prof_file, PROF_XFMT, Clock(), cs->func);
+#endif
+ if (DoTrace(cs))
+ {
+ if (!cs->locked)
+ pthread_mutex_lock(&THR_LOCK_dbug);
+ DoPrefix(cs, _line_);
+ Indent(cs, cs->level);
+ (void) fprintf(cs->stack->out_file, "<%s\n", cs->func);
+ dbug_flush(cs);
+ }
+ }
+ cs->level= *_slevel_-1;
+ cs->func= *_sfunc_;
+ cs->file= *_sfile_;
+#ifndef THREAD
+ if (cs->framep != NULL)
+ cs->framep= (char **) *cs->framep;
+#endif
+ errno=save_errno;
+}
+
+
+/*
+ * FUNCTION
+ *
+ * _db_pargs_ log arguments for subsequent use by _db_doprnt_()
+ *
+ * SYNOPSIS
+ *
+ * VOID _db_pargs_(_line_, keyword)
+ * int _line_;
+ * char *keyword;
+ *
+ * DESCRIPTION
+ *
+ * The new universal printing macro DBUG_PRINT, which replaces
+ * all forms of the DBUG_N macros, needs two calls to runtime
+ * support routines. The first, this function, remembers arguments
+ * that are used by the subsequent call to _db_doprnt_().
+ *
+ */
+
+void _db_pargs_(uint _line_, const char *keyword)
+{
+ CODE_STATE *cs=0;
+ get_code_state_or_return;
+ cs->u_line= _line_;
+ cs->u_keyword= keyword;
+}
+
+
+/*
+ * FUNCTION
+ *
+ * _db_doprnt_ handle print of debug lines
+ *
+ * SYNOPSIS
+ *
+ * VOID _db_doprnt_(format, va_alist)
+ * char *format;
+ * va_dcl;
+ *
+ * DESCRIPTION
+ *
+ * When invoked via one of the DBUG macros, tests the current keyword
+ * set by calling _db_pargs_() to see if that macro has been selected
+ * for processing via the debugger control string, and if so, handles
+ * printing of the arguments via the format string. The line number
+ * of the DBUG macro in the source is found in u_line.
+ *
+ * Note that the format string SHOULD NOT include a terminating
+ * newline, this is supplied automatically.
+ *
+ */
+
+#include
+
+void _db_doprnt_(const char *format,...)
+{
+ va_list args;
+
+ CODE_STATE *cs=0;
+ get_code_state_or_return;
+
+ va_start(args,format);
+
+ if (_db_keyword_(cs, cs->u_keyword))
+ {
+ int save_errno=errno;
+ if (!cs->locked)
+ pthread_mutex_lock(&THR_LOCK_dbug);
+ DoPrefix(cs, cs->u_line);
+ if (TRACING)
+ Indent(cs, cs->level + 1);
+ else
+ (void) fprintf(cs->stack->out_file, "%s: ", cs->func);
+ (void) fprintf(cs->stack->out_file, "%s: ", cs->u_keyword);
+ (void) vfprintf(cs->stack->out_file, format, args);
+ (void) fputc('\n',cs->stack->out_file);
+ dbug_flush(cs);
+ errno=save_errno;
+ }
+ va_end(args);
+}
+
+
+/*
+ * FUNCTION
+ *
+ * _db_dump_ dump a string in hex
+ *
+ * SYNOPSIS
+ *
+ * void _db_dump_(_line_,keyword,memory,length)
+ * int _line_; current source line number
+ * char *keyword;
+ * char *memory; Memory to print
+ * int length; Bytes to print
+ *
+ * DESCRIPTION
+ * Dump N characters in a binary array.
+ * Is used to examine corrputed memory or arrays.
+ */
+
+void _db_dump_(uint _line_, const char *keyword,
+ const unsigned char *memory, size_t length)
+{
+ int pos;
+ char dbuff[90];
+
+ CODE_STATE *cs=0;
+ get_code_state_or_return;
+
+ if (_db_keyword_(cs, keyword))
+ {
+ if (!cs->locked)
+ pthread_mutex_lock(&THR_LOCK_dbug);
+ DoPrefix(cs, _line_);
+ if (TRACING)
+ {
+ Indent(cs, cs->level + 1);
+ pos= min(max(cs->level-cs->stack->sub_level,0)*INDENT,80);
+ }
+ else
+ {
+ fprintf(cs->stack->out_file, "%s: ", cs->func);
+ }
+ sprintf(dbuff,"%s: Memory: 0x%lx Bytes: (%ld)\n",
+ keyword, (ulong) memory, (long) length);
+ (void) fputs(dbuff,cs->stack->out_file);
+
+ pos=0;
+ while (length-- > 0)
+ {
+ uint tmp= *((unsigned char*) memory++);
+ if ((pos+=3) >= 80)
+ {
+ fputc('\n',cs->stack->out_file);
+ pos=3;
+ }
+ fputc(_dig_vec_upper[((tmp >> 4) & 15)], cs->stack->out_file);
+ fputc(_dig_vec_upper[tmp & 15], cs->stack->out_file);
+ fputc(' ',cs->stack->out_file);
+ }
+ (void) fputc('\n',cs->stack->out_file);
+ dbug_flush(cs);
+ }
+}
+
+
+/*
+ * FUNCTION
+ *
+ * ListAdd add to the list modifiers from debug control string
+ *
+ * SYNOPSIS
+ *
+ * static struct link *ListAdd(listp, ctlp, end)
+ * struct link *listp;
+ * char *ctlp;
+ * char *end;
+ *
+ * DESCRIPTION
+ *
+ * Given pointer to a comma separated list of strings in "cltp",
+ * parses the list, and adds it to listp, returning a pointer
+ * to the new list
+ *
+ * Note that since each link is added at the head of the list,
+ * the final list will be in "reverse order", which is not
+ * significant for our usage here.
+ *
+ */
+
+static struct link *ListAdd(struct link *head,
+ const char *ctlp, const char *end)
+{
+ const char *start;
+ struct link *new_malloc;
+ int len;
+
+ while (ctlp < end)
+ {
+ start= ctlp;
+ while (ctlp < end && *ctlp != ',')
+ ctlp++;
+ len=ctlp-start;
+ new_malloc= (struct link *) DbugMalloc(sizeof(struct link)+len);
+ memcpy(new_malloc->str, start, len);
+ new_malloc->str[len]=0;
+ new_malloc->next_link= head;
+ head= new_malloc;
+ ctlp++;
+ }
+ return head;
+}
+
+/*
+ * FUNCTION
+ *
+ * ListDel remove from the list modifiers in debug control string
+ *
+ * SYNOPSIS
+ *
+ * static struct link *ListDel(listp, ctlp, end)
+ * struct link *listp;
+ * char *ctlp;
+ * char *end;
+ *
+ * DESCRIPTION
+ *
+ * Given pointer to a comma separated list of strings in "cltp",
+ * parses the list, and removes these strings from the listp,
+ * returning a pointer to the new list.
+ *
+ */
+
+static struct link *ListDel(struct link *head,
+ const char *ctlp, const char *end)
+{
+ const char *start;
+ struct link **cur;
+ int len;
+
+ while (ctlp < end)
+ {
+ start= ctlp;
+ while (ctlp < end && *ctlp != ',')
+ ctlp++;
+ len=ctlp-start;
+ cur=&head;
+ do
+ {
+ while (*cur && !strncmp((*cur)->str, start, len))
+ {
+ struct link *delme=*cur;
+ *cur=(*cur)->next_link;
+ free((void*) delme);
+ }
+ } while (*cur && *(cur=&((*cur)->next_link)));
+ }
+ return head;
+}
+
+/*
+ * FUNCTION
+ *
+ * ListCopy make a copy of the list
+ *
+ * SYNOPSIS
+ *
+ * static struct link *ListCopy(orig)
+ * struct link *orig;
+ *
+ * DESCRIPTION
+ *
+ * Given pointer to list, which contains a copy of every element from
+ * the original list.
+ *
+ * the orig pointer can be NULL
+ *
+ * Note that since each link is added at the head of the list,
+ * the final list will be in "reverse order", which is not
+ * significant for our usage here.
+ *
+ */
+
+static struct link *ListCopy(struct link *orig)
+{
+ struct link *new_malloc;
+ struct link *head;
+ int len;
+
+ head= NULL;
+ while (orig != NULL)
+ {
+ len= strlen(orig->str);
+ new_malloc= (struct link *) DbugMalloc(sizeof(struct link)+len);
+ memcpy(new_malloc->str, orig->str, len);
+ new_malloc->str[len]= 0;
+ new_malloc->next_link= head;
+ head= new_malloc;
+ orig= orig->next_link;
+ }
+ return head;
+}
+
+/*
+ * FUNCTION
+ *
+ * InList test a given string for member of a given list
+ *
+ * SYNOPSIS
+ *
+ * static BOOLEAN InList(linkp, cp)
+ * struct link *linkp;
+ * char *cp;
+ *
+ * DESCRIPTION
+ *
+ * Tests the string pointed to by "cp" to determine if it is in
+ * the list pointed to by "linkp". Linkp points to the first
+ * link in the list. If linkp is NULL then the string is treated
+ * as if it is in the list (I.E all strings are in the null list).
+ * This may seem rather strange at first but leads to the desired
+ * operation if no list is given. The net effect is that all
+ * strings will be accepted when there is no list, and when there
+ * is a list, only those strings in the list will be accepted.
+ *
+ */
+
+static BOOLEAN InList(struct link *linkp, const char *cp)
+{
+ REGISTER struct link *scan;
+ REGISTER BOOLEAN result;
+
+ if (linkp == NULL)
+ result= TRUE;
+ else
+ {
+ result= FALSE;
+ for (scan= linkp; scan != NULL; scan= scan->next_link)
+ {
+ if (!strcmp(scan->str, cp))
+ {
+ result= TRUE;
+ break;
+ }
+ }
+ }
+ return result;
+}
+
+
+/*
+ * FUNCTION
+ *
+ * PushState push current settings onto stack and set up new one
+ *
+ * SYNOPSIS
+ *
+ * static VOID PushState()
+ *
+ * DESCRIPTION
+ *
+ * Pushes the current settings on the settings stack, and creates
+ * a new settings. The new settings is NOT initialized
+ *
+ * The settings stack is a linked list of settings, with the new
+ * settings added at the head. This allows the stack to grow
+ * to the limits of memory if necessary.
+ *
+ */
+
+static void PushState(CODE_STATE *cs)
+{
+ struct settings *new_malloc;
+
+ new_malloc= (struct settings *) DbugMalloc(sizeof(struct settings));
+ new_malloc->next= cs->stack;
+ new_malloc->out_file= NULL;
+ cs->stack= new_malloc;
+}
+
+/*
+ * FUNCTION
+ *
+ * FreeState Free memory associated with a struct state.
+ *
+ * SYNOPSIS
+ *
+ * static void FreeState (state)
+ * struct state *state;
+ * int free_state;
+ *
+ * DESCRIPTION
+ *
+ * Deallocates the memory allocated for various information in a
+ * state. If free_state is set, also free 'state'
+ *
+ */
+static void FreeState(CODE_STATE *cs, struct settings *state, int free_state)
+{
+ if (!is_shared(state, keywords))
+ FreeList(state->keywords);
+ if (!is_shared(state, functions))
+ FreeList(state->functions);
+ if (!is_shared(state, processes))
+ FreeList(state->processes);
+ if (!is_shared(state, p_functions))
+ FreeList(state->p_functions);
+ if (!is_shared(state, out_file))
+ DBUGCloseFile(cs, state->out_file);
+ (void) fflush(cs->stack->out_file);
+ if (state->prof_file)
+ DBUGCloseFile(cs, state->prof_file);
+ if (free_state)
+ free((void*) state);
+}
+
+
+/*
+ * FUNCTION
+ *
+ * _db_end_ End debugging, freeing state stack memory.
+ *
+ * SYNOPSIS
+ *
+ * static VOID _db_end_ ()
+ *
+ * DESCRIPTION
+ *
+ * Ends debugging, de-allocating the memory allocated to the
+ * state stack.
+ *
+ * To be called at the very end of the program.
+ *
+ */
+void _db_end_()
+{
+ struct settings *discard;
+ static struct settings tmp;
+ CODE_STATE *cs=0;
+
+ get_code_state_or_return;
+
+ while ((discard= cs->stack))
+ {
+ if (discard == &init_settings)
+ break;
+ cs->stack= discard->next;
+ FreeState(cs, discard, 1);
+ }
+ tmp= init_settings;
+
+ /* Use mutex lock to make it less likely anyone access out_file */
+ pthread_mutex_lock(&THR_LOCK_dbug);
+ init_settings.flags= OPEN_APPEND;
+ init_settings.out_file= stderr;
+ init_settings.prof_file= stderr;
+ init_settings.maxdepth= 0;
+ init_settings.delay= 0;
+ init_settings.sub_level= 0;
+ init_settings.functions= 0;
+ init_settings.p_functions= 0;
+ init_settings.keywords= 0;
+ init_settings.processes= 0;
+ pthread_mutex_unlock(&THR_LOCK_dbug);
+ FreeState(cs, &tmp, 0);
+}
+
+
+/*
+ * FUNCTION
+ *
+ * DoTrace check to see if tracing is current enabled
+ *
+ * SYNOPSIS
+ *
+ * static BOOLEAN DoTrace(stack)
+ *
+ * DESCRIPTION
+ *
+ * Checks to see if tracing is enabled based on whether the
+ * user has specified tracing, the maximum trace depth has
+ * not yet been reached, the current function is selected,
+ * and the current process is selected. Returns TRUE if
+ * tracing is enabled, FALSE otherwise.
+ *
+ */
+
+static BOOLEAN DoTrace(CODE_STATE *cs)
+{
+ return (TRACING && cs->level <= cs->stack->maxdepth &&
+ InList(cs->stack->functions, cs->func) &&
+ InList(cs->stack->processes, cs->process));
+}
+
+
+/*
+ * FUNCTION
+ *
+ * DoProfile check to see if profiling is current enabled
+ *
+ * SYNOPSIS
+ *
+ * static BOOLEAN DoProfile()
+ *
+ * DESCRIPTION
+ *
+ * Checks to see if profiling is enabled based on whether the
+ * user has specified profiling, the maximum trace depth has
+ * not yet been reached, the current function is selected,
+ * and the current process is selected. Returns TRUE if
+ * profiling is enabled, FALSE otherwise.
+ *
+ */
+
+#ifndef THREAD
+static BOOLEAN DoProfile(CODE_STATE *cs)
+{
+ return PROFILING &&
+ cs->level <= cs->stack->maxdepth &&
+ InList(cs->stack->p_functions, cs->func) &&
+ InList(cs->stack->processes, cs->process);
+}
+#endif
+
+FILE *_db_fp_(void)
+{
+ CODE_STATE *cs=0;
+ get_code_state_or_return NULL;
+ return cs->stack->out_file;
+}
+
+
+/*
+ * FUNCTION
+ *
+ * _db_strict_keyword_ test keyword for member of keyword list
+ *
+ * SYNOPSIS
+ *
+ * BOOLEAN _db_strict_keyword_(keyword)
+ * char *keyword;
+ *
+ * DESCRIPTION
+ *
+ * Similar to _db_keyword_, but keyword is NOT accepted if keyword list
+ * is empty. Used in DBUG_EXECUTE_IF() - for actions that must not be
+ * executed by default.
+ *
+ * Returns TRUE if keyword accepted, FALSE otherwise.
+ *
+ */
+
+BOOLEAN _db_strict_keyword_(const char *keyword)
+{
+ CODE_STATE *cs=0;
+ get_code_state_or_return FALSE;
+ if (!DEBUGGING || cs->stack->keywords == NULL)
+ return FALSE;
+ return _db_keyword_(cs, keyword);
+}
+
+/*
+ * FUNCTION
+ *
+ * _db_keyword_ test keyword for member of keyword list
+ *
+ * SYNOPSIS
+ *
+ * BOOLEAN _db_keyword_(keyword)
+ * char *keyword;
+ *
+ * DESCRIPTION
+ *
+ * Test a keyword to determine if it is in the currently active
+ * keyword list. As with the function list, a keyword is accepted
+ * if the list is null, otherwise it must match one of the list
+ * members. When debugging is not on, no keywords are accepted.
+ * After the maximum trace level is exceeded, no keywords are
+ * accepted (this behavior subject to change). Additionally,
+ * the current function and process must be accepted based on
+ * their respective lists.
+ *
+ * Returns TRUE if keyword accepted, FALSE otherwise.
+ *
+ */
+
+BOOLEAN _db_keyword_(CODE_STATE *cs, const char *keyword)
+{
+ get_code_state_or_return FALSE;
+
+ return (DEBUGGING &&
+ (!TRACING || cs->level <= cs->stack->maxdepth) &&
+ InList(cs->stack->functions, cs->func) &&
+ InList(cs->stack->keywords, keyword) &&
+ InList(cs->stack->processes, cs->process));
+}
+
+/*
+ * FUNCTION
+ *
+ * Indent indent a line to the given indentation level
+ *
+ * SYNOPSIS
+ *
+ * static VOID Indent(indent)
+ * int indent;
+ *
+ * DESCRIPTION
+ *
+ * Indent a line to the given level. Note that this is
+ * a simple minded but portable implementation.
+ * There are better ways.
+ *
+ * Also, the indent must be scaled by the compile time option
+ * of character positions per nesting level.
+ *
+ */
+
+static void Indent(CODE_STATE *cs, int indent)
+{
+ REGISTER int count;
+
+ indent= max(indent-1-cs->stack->sub_level,0)*INDENT;
+ for (count= 0; count < indent ; count++)
+ {
+ if ((count % INDENT) == 0)
+ fputc('|',cs->stack->out_file);
+ else
+ fputc(' ',cs->stack->out_file);
+ }
+}
+
+
+/*
+ * FUNCTION
+ *
+ * FreeList free all memory associated with a linked list
+ *
+ * SYNOPSIS
+ *
+ * static VOID FreeList(linkp)
+ * struct link *linkp;
+ *
+ * DESCRIPTION
+ *
+ * Given pointer to the head of a linked list, frees all
+ * memory held by the list and the members of the list.
+ *
+ */
+
+static void FreeList(struct link *linkp)
+{
+ REGISTER struct link *old;
+
+ while (linkp != NULL)
+ {
+ old= linkp;
+ linkp= linkp->next_link;
+ free((void*) old);
+ }
+}
+
+
+/*
+ * FUNCTION
+ *
+ * DoPrefix print debugger line prefix prior to indentation
+ *
+ * SYNOPSIS
+ *
+ * static VOID DoPrefix(_line_)
+ * int _line_;
+ *
+ * DESCRIPTION
+ *
+ * Print prefix common to all debugger output lines, prior to
+ * doing indentation if necessary. Print such information as
+ * current process name, current source file name and line number,
+ * and current function nesting depth.
+ *
+ */
+
+static void DoPrefix(CODE_STATE *cs, uint _line_)
+{
+ cs->lineno++;
+ if (cs->stack->flags & PID_ON)
+ {
+#ifdef THREAD
+ (void) fprintf(cs->stack->out_file, "%-7s: ", my_thread_name());
+#else
+ (void) fprintf(cs->stack->out_file, "%5d: ", (int) getpid());
+#endif
+ }
+ if (cs->stack->flags & NUMBER_ON)
+ (void) fprintf(cs->stack->out_file, "%5d: ", cs->lineno);
+ if (cs->stack->flags & TIMESTAMP_ON)
+ {
+#ifdef __WIN__
+ /* FIXME This doesn't give microseconds as in Unix case, and the resolution is
+ in system ticks, 10 ms intervals. See my_getsystime.c for high res */
+ SYSTEMTIME loc_t;
+ GetLocalTime(&loc_t);
+ (void) fprintf (cs->stack->out_file,
+ /* "%04d-%02d-%02d " */
+ "%02d:%02d:%02d.%06d ",
+ /*tm_p->tm_year + 1900, tm_p->tm_mon + 1, tm_p->tm_mday,*/
+ loc_t.wHour, loc_t.wMinute, loc_t.wSecond, loc_t.wMilliseconds);
+#else
+ struct timeval tv;
+ struct tm *tm_p;
+ if (gettimeofday(&tv, NULL) != -1)
+ {
+ if ((tm_p= localtime((const time_t *)&tv.tv_sec)))
+ {
+ (void) fprintf (cs->stack->out_file,
+ /* "%04d-%02d-%02d " */
+ "%02d:%02d:%02d.%06d ",
+ /*tm_p->tm_year + 1900, tm_p->tm_mon + 1, tm_p->tm_mday,*/
+ tm_p->tm_hour, tm_p->tm_min, tm_p->tm_sec,
+ (int) (tv.tv_usec));
+ }
+ }
+#endif
+ }
+ if (cs->stack->flags & PROCESS_ON)
+ (void) fprintf(cs->stack->out_file, "%s: ", cs->process);
+ if (cs->stack->flags & FILE_ON)
+ (void) fprintf(cs->stack->out_file, "%14s: ", BaseName(cs->file));
+ if (cs->stack->flags & LINE_ON)
+ (void) fprintf(cs->stack->out_file, "%5d: ", _line_);
+ if (cs->stack->flags & DEPTH_ON)
+ (void) fprintf(cs->stack->out_file, "%4d: ", cs->level);
+}
+
+
+/*
+ * FUNCTION
+ *
+ * DBUGOpenFile open new output stream for debugger output
+ *
+ * SYNOPSIS
+ *
+ * static VOID DBUGOpenFile(name)
+ * char *name;
+ *
+ * DESCRIPTION
+ *
+ * Given name of a new file (or "-" for stdout) opens the file
+ * and sets the output stream to the new file.
+ *
+ */
+
+static void DBUGOpenFile(CODE_STATE *cs,
+ const char *name,const char *end,int append)
+{
+ REGISTER FILE *fp;
+ REGISTER BOOLEAN newfile;
+
+ if (name != NULL)
+ {
+ if (end)
+ {
+ int len=end-name;
+ memcpy(cs->stack->name, name, len);
+ cs->stack->name[len]=0;
+ }
+ else
+ strmov(cs->stack->name,name);
+ name=cs->stack->name;
+ if (strcmp(name, "-") == 0)
+ {
+ cs->stack->out_file= stdout;
+ cs->stack->flags |= FLUSH_ON_WRITE;
+ cs->stack->name[0]=0;
+ }
+ else
+ {
+ if (!Writable(name))
+ {
+ (void) fprintf(stderr, ERR_OPEN, cs->process, name);
+ perror("");
+ fflush(stderr);
+ }
+ else
+ {
+ newfile= !EXISTS(name);
+ if (!(fp= fopen(name, append ? "a+" : "w")))
+ {
+ (void) fprintf(stderr, ERR_OPEN, cs->process, name);
+ perror("");
+ fflush(stderr);
+ }
+ else
+ {
+ cs->stack->out_file= fp;
+ if (newfile)
+ {
+ ChangeOwner(cs, name);
+ }
+ }
+ }
+ }
+ }
+}
+
+
+/*
+ * FUNCTION
+ *
+ * OpenProfile open new output stream for profiler output
+ *
+ * SYNOPSIS
+ *
+ * static FILE *OpenProfile(name)
+ * char *name;
+ *
+ * DESCRIPTION
+ *
+ * Given name of a new file, opens the file
+ * and sets the profiler output stream to the new file.
+ *
+ * It is currently unclear whether the prefered behavior is
+ * to truncate any existing file, or simply append to it.
+ * The latter behavior would be desirable for collecting
+ * accumulated runtime history over a number of separate
+ * runs. It might take some changes to the analyzer program
+ * though, and the notes that Binayak sent with the profiling
+ * diffs indicated that append was the normal mode, but this
+ * does not appear to agree with the actual code. I haven't
+ * investigated at this time [fnf; 24-Jul-87].
+ */
+
+#ifndef THREAD
+static FILE *OpenProfile(CODE_STATE *cs, const char *name)
+{
+ REGISTER FILE *fp;
+ REGISTER BOOLEAN newfile;
+
+ fp=0;
+ if (!Writable(name))
+ {
+ (void) fprintf(cs->stack->out_file, ERR_OPEN, cs->process, name);
+ perror("");
+ (void) Delay(cs->stack->delay);
+ }
+ else
+ {
+ newfile= !EXISTS(name);
+ if (!(fp= fopen(name, "w")))
+ {
+ (void) fprintf(cs->stack->out_file, ERR_OPEN, cs->process, name);
+ perror("");
+ }
+ else
+ {
+ cs->stack->prof_file= fp;
+ if (newfile)
+ {
+ ChangeOwner(cs, name);
+ }
+ }
+ }
+ return fp;
+}
+#endif
+
+/*
+ * FUNCTION
+ *
+ * DBUGCloseFile close the debug output stream
+ *
+ * SYNOPSIS
+ *
+ * static VOID DBUGCloseFile(fp)
+ * FILE *fp;
+ *
+ * DESCRIPTION
+ *
+ * Closes the debug output stream unless it is standard output
+ * or standard error.
+ *
+ */
+
+static void DBUGCloseFile(CODE_STATE *cs, FILE *fp)
+{
+ if (fp != stderr && fp != stdout && fclose(fp) == EOF)
+ {
+ pthread_mutex_lock(&THR_LOCK_dbug);
+ (void) fprintf(cs->stack->out_file, ERR_CLOSE, cs->process);
+ perror("");
+ dbug_flush(cs);
+ }
+}
+
+
+/*
+ * FUNCTION
+ *
+ * DbugExit print error message and exit
+ *
+ * SYNOPSIS
+ *
+ * static VOID DbugExit(why)
+ * char *why;
+ *
+ * DESCRIPTION
+ *
+ * Prints error message using current process name, the reason for
+ * aborting (typically out of memory), and exits with status 1.
+ * This should probably be changed to use a status code
+ * defined in the user's debugger include file.
+ *
+ */
+
+static void DbugExit(const char *why)
+{
+ CODE_STATE *cs=code_state();
+ (void) fprintf(stderr, ERR_ABORT, cs ? cs->process : "(null)", why);
+ (void) fflush(stderr);
+ exit(1);
+}
+
+
+/*
+ * FUNCTION
+ *
+ * DbugMalloc allocate memory for debugger runtime support
+ *
+ * SYNOPSIS
+ *
+ * static long *DbugMalloc(size)
+ * int size;
+ *
+ * DESCRIPTION
+ *
+ * Allocate more memory for debugger runtime support functions.
+ * Failure to to allocate the requested number of bytes is
+ * immediately fatal to the current process. This may be
+ * rather unfriendly behavior. It might be better to simply
+ * print a warning message, freeze the current debugger cs,
+ * and continue execution.
+ *
+ */
+
+static char *DbugMalloc(size_t size)
+{
+ register char *new_malloc;
+
+ if (!(new_malloc= (char*) malloc(size)))
+ DbugExit("out of memory");
+ return new_malloc;
+}
+
+
+/*
+ * strtok lookalike - splits on ':', magically handles ::, :\ and :/
+ */
+
+static const char *DbugStrTok(const char *s)
+{
+ while (s[0] && (s[0] != ':' ||
+ (s[1] == '\\' || s[1] == '/' || (s[1] == ':' && s++))))
+ s++;
+ return s;
+}
+
+
+/*
+ * FUNCTION
+ *
+ * BaseName strip leading pathname components from name
+ *
+ * SYNOPSIS
+ *
+ * static char *BaseName(pathname)
+ * char *pathname;
+ *
+ * DESCRIPTION
+ *
+ * Given pointer to a complete pathname, locates the base file
+ * name at the end of the pathname and returns a pointer to
+ * it.
+ *
+ */
+
+static const char *BaseName(const char *pathname)
+{
+ register const char *base;
+
+ base= strrchr(pathname, FN_LIBCHAR);
+ if (base++ == NullS)
+ base= pathname;
+ return base;
+}
+
+
+/*
+ * FUNCTION
+ *
+ * Writable test to see if a pathname is writable/creatable
+ *
+ * SYNOPSIS
+ *
+ * static BOOLEAN Writable(pathname)
+ * char *pathname;
+ *
+ * DESCRIPTION
+ *
+ * Because the debugger might be linked in with a program that
+ * runs with the set-uid-bit (suid) set, we have to be careful
+ * about opening a user named file for debug output. This consists
+ * of checking the file for write access with the real user id,
+ * or checking the directory where the file will be created.
+ *
+ * Returns TRUE if the user would normally be allowed write or
+ * create access to the named file. Returns FALSE otherwise.
+ *
+ */
+
+
+#ifndef Writable
+
+static BOOLEAN Writable(const char *pathname)
+{
+ REGISTER BOOLEAN granted;
+ REGISTER char *lastslash;
+
+ granted= FALSE;
+ if (EXISTS(pathname))
+ {
+ if (WRITABLE(pathname))
+ granted= TRUE;
+ }
+ else
+ {
+ lastslash= strrchr(pathname, '/');
+ if (lastslash != NULL)
+ *lastslash= '\0';
+ else
+ pathname= ".";
+ if (WRITABLE(pathname))
+ granted= TRUE;
+ if (lastslash != NULL)
+ *lastslash= '/';
+ }
+ return granted;
+}
+#endif
+
+
+/*
+ * FUNCTION
+ *
+ * ChangeOwner change owner to real user for suid programs
+ *
+ * SYNOPSIS
+ *
+ * static VOID ChangeOwner(pathname)
+ *
+ * DESCRIPTION
+ *
+ * For unix systems, change the owner of the newly created debug
+ * file to the real owner. This is strictly for the benefit of
+ * programs that are running with the set-user-id bit set.
+ *
+ * Note that at this point, the fact that pathname represents
+ * a newly created file has already been established. If the
+ * program that the debugger is linked to is not running with
+ * the suid bit set, then this operation is redundant (but
+ * harmless).
+ *
+ */
+
+#ifndef ChangeOwner
+static void ChangeOwner(CODE_STATE *cs, char *pathname)
+{
+ if (chown(pathname, getuid(), getgid()) == -1)
+ {
+ (void) fprintf(stderr, ERR_CHOWN, cs->process, pathname);
+ perror("");
+ (void) fflush(stderr);
+ }
+}
+#endif
+
+
+/*
+ * FUNCTION
+ *
+ * _db_setjmp_ save debugger environment
+ *
+ * SYNOPSIS
+ *
+ * VOID _db_setjmp_()
+ *
+ * DESCRIPTION
+ *
+ * Invoked as part of the user's DBUG_SETJMP macro to save
+ * the debugger environment in parallel with saving the user's
+ * environment.
+ *
+ */
+
+#ifdef HAVE_LONGJMP
+
+EXPORT void _db_setjmp_()
+{
+ CODE_STATE *cs=0;
+ get_code_state_or_return;
+
+ cs->jmplevel= cs->level;
+ cs->jmpfunc= cs->func;
+ cs->jmpfile= cs->file;
+}
+
+/*
+ * FUNCTION
+ *
+ * _db_longjmp_ restore previously saved debugger environment
+ *
+ * SYNOPSIS
+ *
+ * VOID _db_longjmp_()
+ *
+ * DESCRIPTION
+ *
+ * Invoked as part of the user's DBUG_LONGJMP macro to restore
+ * the debugger environment in parallel with restoring the user's
+ * previously saved environment.
+ *
+ */
+
+EXPORT void _db_longjmp_()
+{
+ CODE_STATE *cs=0;
+ get_code_state_or_return;
+
+ cs->level= cs->jmplevel;
+ if (cs->jmpfunc)
+ cs->func= cs->jmpfunc;
+ if (cs->jmpfile)
+ cs->file= cs->jmpfile;
+}
+#endif
+
+/*
+ * FUNCTION
+ *
+ * perror perror simulation for systems that don't have it
+ *
+ * SYNOPSIS
+ *
+ * static VOID perror(s)
+ * char *s;
+ *
+ * DESCRIPTION
+ *
+ * Perror produces a message on the standard error stream which
+ * provides more information about the library or system error
+ * just encountered. The argument string s is printed, followed
+ * by a ':', a blank, and then a message and a newline.
+ *
+ * An undocumented feature of the unix perror is that if the string
+ * 's' is a null string (NOT a NULL pointer!), then the ':' and
+ * blank are not printed.
+ *
+ * This version just complains about an "unknown system error".
+ *
+ */
+
+#ifndef HAVE_PERROR
+static void perror(s)
+char *s;
+{
+ if (s && *s != '\0')
+ (void) fprintf(stderr, "%s: ", s);
+ (void) fprintf(stderr, "\n");
+}
+#endif /* HAVE_PERROR */
+
+
+ /* flush dbug-stream, free mutex lock & wait delay */
+ /* This is because some systems (MSDOS!!) dosn't flush fileheader */
+ /* and dbug-file isn't readable after a system crash !! */
+
+static void dbug_flush(CODE_STATE *cs)
+{
+#ifndef THREAD
+ if (cs->stack->flags & FLUSH_ON_WRITE)
+#endif
+ {
+ (void) fflush(cs->stack->out_file);
+ if (cs->stack->delay)
+ (void) Delay(cs->stack->delay);
+ }
+ if (!cs->locked)
+ pthread_mutex_unlock(&THR_LOCK_dbug);
+} /* dbug_flush */
+
+
+void _db_lock_file_()
+{
+ CODE_STATE *cs=0;
+ get_code_state_or_return;
+ pthread_mutex_lock(&THR_LOCK_dbug);
+ cs->locked=1;
+}
+
+void _db_unlock_file_()
+{
+ CODE_STATE *cs=0;
+ get_code_state_or_return;
+ cs->locked=0;
+ pthread_mutex_unlock(&THR_LOCK_dbug);
+}
+
+/*
+ * Here we need the definitions of the clock routine. Add your
+ * own for whatever system that you have.
+ */
+
+#ifndef THREAD
+#if defined(HAVE_GETRUSAGE)
+
+#include
+#include
+
+/* extern int getrusage(int, struct rusage *); */
+
+/*
+ * Returns the user time in milliseconds used by this process so
+ * far.
+ */
+
+static unsigned long Clock()
+{
+ struct rusage ru;
+
+ (void) getrusage(RUSAGE_SELF, &ru);
+ return ru.ru_utime.tv_sec*1000 + ru.ru_utime.tv_usec/1000;
+}
+
+#elif defined(MSDOS) || defined(__WIN__)
+
+static ulong Clock()
+{
+ return clock()*(1000/CLOCKS_PER_SEC);
+}
+#elif defined(amiga)
+
+struct DateStamp { /* Yes, this is a hack, but doing it right */
+ long ds_Days; /* is incredibly ugly without splitting this */
+ long ds_Minute; /* off into a separate file */
+ long ds_Tick;
+};
+
+static int first_clock= TRUE;
+static struct DateStamp begin;
+static struct DateStamp elapsed;
+
+static unsigned long Clock()
+{
+ register struct DateStamp *now;
+ register unsigned long millisec= 0;
+ extern VOID *AllocMem();
+
+ now= (struct DateStamp *) AllocMem((long) sizeof(struct DateStamp), 0L);
+ if (now != NULL)
+ {
+ if (first_clock == TRUE)
+ {
+ first_clock= FALSE;
+ (void) DateStamp(now);
+ begin= *now;
+ }
+ (void) DateStamp(now);
+ millisec= 24 * 3600 * (1000 / HZ) * (now->ds_Days - begin.ds_Days);
+ millisec += 60 * (1000 / HZ) * (now->ds_Minute - begin.ds_Minute);
+ millisec += (1000 / HZ) * (now->ds_Tick - begin.ds_Tick);
+ (void) FreeMem(now, (long) sizeof(struct DateStamp));
+ }
+ return millisec;
+}
+#else
+static unsigned long Clock()
+{
+ return 0;
+}
+#endif /* RUSAGE */
+#endif /* THREADS */
+
+#ifdef NO_VARARGS
+
+/*
+ * Fake vfprintf for systems that don't support it. If this
+ * doesn't work, you are probably SOL...
+ */
+
+static int vfprintf(stream, format, ap)
+FILE *stream;
+char *format;
+va_list ap;
+{
+ int rtnval;
+ ARGS_DCL;
+
+ ARG0= va_arg(ap, ARGS_TYPE);
+ ARG1= va_arg(ap, ARGS_TYPE);
+ ARG2= va_arg(ap, ARGS_TYPE);
+ ARG3= va_arg(ap, ARGS_TYPE);
+ ARG4= va_arg(ap, ARGS_TYPE);
+ ARG5= va_arg(ap, ARGS_TYPE);
+ ARG6= va_arg(ap, ARGS_TYPE);
+ ARG7= va_arg(ap, ARGS_TYPE);
+ ARG8= va_arg(ap, ARGS_TYPE);
+ ARG9= va_arg(ap, ARGS_TYPE);
+ rtnval= fprintf(stream, format, ARGS_LIST);
+ return rtnval;
+}
+
+#endif /* NO_VARARGS */
+
+#else
+
+/*
+ * Dummy function, workaround for MySQL bug#14420 related
+ * build failure on a platform where linking with an empty
+ * archive fails.
+ *
+ * This block can be removed as soon as a fix for bug#14420
+ * is implemented.
+ */
+int i_am_a_dummy_function() {
+ return 0;
+}
+
+#endif
diff --git a/dep/mysqllite/dbug/dbug_long.h b/dep/mysqllite/dbug/dbug_long.h
new file mode 100644
index 0000000000..829df181ef
--- /dev/null
+++ b/dep/mysqllite/dbug/dbug_long.h
@@ -0,0 +1,160 @@
+#error This file is not used in MySQL - see ../include/my_dbug.h instead
+/******************************************************************************
+ * *
+ * N O T I C E *
+ * *
+ * Copyright Abandoned, 1987, Fred Fish *
+ * *
+ * *
+ * This previously copyrighted work has been placed into the public *
+ * domain by the author and may be freely used for any purpose, *
+ * private or commercial. *
+ * *
+ * Because of the number of inquiries I was receiving about the use *
+ * of this product in commercially developed works I have decided to *
+ * simply make it public domain to further its unrestricted use. I *
+ * specifically would be most happy to see this material become a *
+ * part of the standard Unix distributions by AT&T and the Berkeley *
+ * Computer Science Research Group, and a standard part of the GNU *
+ * system from the Free Software Foundation. *
+ * *
+ * I would appreciate it, as a courtesy, if this notice is left in *
+ * all copies and derivative works. Thank you. *
+ * *
+ * The author makes no warranty of any kind with respect to this *
+ * product and explicitly disclaims any implied warranties of mer- *
+ * chantability or fitness for any particular purpose. *
+ * *
+ ******************************************************************************
+ */
+
+/*
+ * FILE
+ *
+ * dbug.h user include file for programs using the dbug package
+ *
+ * SYNOPSIS
+ *
+ * #include
+ *
+ * SCCS ID
+ *
+ * @(#)dbug.h 1.13 7/17/89
+ *
+ * DESCRIPTION
+ *
+ * Programs which use the dbug package must include this file.
+ * It contains the appropriate macros to call support routines
+ * in the dbug runtime library.
+ *
+ * To disable compilation of the macro expansions define the
+ * preprocessor symbol "DBUG_OFF". This will result in null
+ * macros expansions so that the resulting code will be smaller
+ * and faster. (The difference may be smaller than you think
+ * so this step is recommended only when absolutely necessary).
+ * In general, tradeoffs between space and efficiency are
+ * decided in favor of efficiency since space is seldom a
+ * problem on the new machines).
+ *
+ * All externally visible symbol names follow the pattern
+ * "_db_xxx..xx_" to minimize the possibility of a dbug package
+ * symbol colliding with a user defined symbol.
+ *
+ * The DBUG_ style macros are obsolete and should not be used
+ * in new code. Macros to map them to instances of DBUG_PRINT
+ * are provided for compatibility with older code. They may go
+ * away completely in subsequent releases.
+ *
+ * AUTHOR
+ *
+ * Fred Fish
+ * (Currently employed by Motorola Computer Division, Tempe, Az.)
+ * hao!noao!mcdsun!fnf
+ * (602) 438-3614
+ *
+ */
+
+/*
+ * Internally used dbug variables which must be global.
+ */
+
+#ifndef DBUG_OFF
+ extern int _db_on_; /* TRUE if debug currently enabled */
+ extern FILE *_db_fp_; /* Current debug output stream */
+ extern char *_db_process_; /* Name of current process */
+ extern int _db_keyword_ (); /* Accept/reject keyword */
+ extern void _db_push_ (); /* Push state, set up new state */
+ extern void _db_pop_ (); /* Pop previous debug state */
+ extern void _db_enter_ (); /* New user function entered */
+ extern void _db_return_ (); /* User function return */
+ extern void _db_pargs_ (); /* Remember args for line */
+ extern void _db_doprnt_ (); /* Print debug output */
+ extern void _db_setjmp_ (); /* Save debugger environment */
+ extern void _db_longjmp_ (); /* Restore debugger environment */
+ extern void _db_dump_(); /* Dump memory */
+# endif
+
+
+/*
+ * These macros provide a user interface into functions in the
+ * dbug runtime support library. They isolate users from changes
+ * in the MACROS and/or runtime support.
+ *
+ * The symbols "__LINE__" and "__FILE__" are expanded by the
+ * preprocessor to the current source file line number and file
+ * name respectively.
+ *
+ * WARNING --- Because the DBUG_ENTER macro allocates space on
+ * the user function's stack, it must precede any executable
+ * statements in the user function.
+ *
+ */
+
+# ifdef DBUG_OFF
+# define DBUG_ENTER(a1)
+# define DBUG_RETURN(a1) return(a1)
+# define DBUG_VOID_RETURN return
+# define DBUG_EXECUTE(keyword,a1)
+# define DBUG_PRINT(keyword,arglist)
+# define DBUG_2(keyword,format) /* Obsolete */
+# define DBUG_3(keyword,format,a1) /* Obsolete */
+# define DBUG_4(keyword,format,a1,a2) /* Obsolete */
+# define DBUG_5(keyword,format,a1,a2,a3) /* Obsolete */
+# define DBUG_PUSH(a1)
+# define DBUG_POP()
+# define DBUG_PROCESS(a1)
+# define DBUG_FILE (stderr)
+# define DBUG_SETJMP setjmp
+# define DBUG_LONGJMP longjmp
+# define DBUG_DUMP(keyword,a1)
+# else
+# define DBUG_ENTER(a) \
+ auto char *_db_func_; auto char *_db_file_; auto int _db_level_; \
+ auto char **_db_framep_; \
+ _db_enter_ (a,__FILE__,__LINE__,&_db_func_,&_db_file_,&_db_level_, \
+ &_db_framep_)
+# define DBUG_LEAVE \
+ (_db_return_ (__LINE__, &_db_func_, &_db_file_, &_db_level_))
+# define DBUG_RETURN(a1) return (DBUG_LEAVE, (a1))
+/* define DBUG_RETURN(a1) {DBUG_LEAVE; return(a1);} Alternate form */
+# define DBUG_VOID_RETURN {DBUG_LEAVE; return;}
+# define DBUG_EXECUTE(keyword,a1) \
+ {if (_db_on_) {if (_db_keyword_ (keyword)) { a1 }}}
+# define DBUG_PRINT(keyword,arglist) \
+ {if (_db_on_) {_db_pargs_(__LINE__,keyword); _db_doprnt_ arglist;}}
+# define DBUG_2(keyword,format) \
+ DBUG_PRINT(keyword,(format)) /* Obsolete */
+# define DBUG_3(keyword,format,a1) \
+ DBUG_PRINT(keyword,(format,a1)) /* Obsolete */
+# define DBUG_4(keyword,format,a1,a2) \
+ DBUG_PRINT(keyword,(format,a1,a2)) /* Obsolete */
+# define DBUG_5(keyword,format,a1,a2,a3) \
+ DBUG_PRINT(keyword,(format,a1,a2,a3)) /* Obsolete */
+# define DBUG_PUSH(a1) _db_push_ (a1)
+# define DBUG_POP() _db_pop_ ()
+# define DBUG_PROCESS(a1) (_db_process_ = a1)
+# define DBUG_FILE (_db_fp_)
+# define DBUG_SETJMP(a1) (_db_setjmp_ (), setjmp (a1))
+# define DBUG_LONGJMP(a1,a2) (_db_longjmp_ (), longjmp (a1, a2))
+# define DBUG_DUMP(keyword,a1,a2) _db_dump_(__LINE__,keyword,a1,a2)
+# endif
diff --git a/dep/mysqllite/dbug/factorial.c b/dep/mysqllite/dbug/factorial.c
new file mode 100644
index 0000000000..7b190ea8d8
--- /dev/null
+++ b/dep/mysqllite/dbug/factorial.c
@@ -0,0 +1,27 @@
+#ifdef DBUG_OFF /* We are testing dbug */
+
+int factorial(register int value) {
+ if(value > 1) {
+ value *= factorial(value-1);
+ }
+ return value;
+}
+
+#else
+
+#include
+
+int factorial (
+register int value)
+{
+ DBUG_ENTER ("factorial");
+ DBUG_PRINT ("find", ("find %d factorial", value));
+ if (value > 1) {
+ value *= factorial (value - 1);
+ }
+ DBUG_PRINT ("result", ("result is %d", value));
+ DBUG_RETURN (value);
+}
+
+#endif
+
diff --git a/dep/mysqllite/dbug/monty.doc b/dep/mysqllite/dbug/monty.doc
new file mode 100644
index 0000000000..1af67b81d4
--- /dev/null
+++ b/dep/mysqllite/dbug/monty.doc
@@ -0,0 +1,9 @@
+
+All changes that I or other people at MySQL AB have done to all files
+in the dbug library (Mainly in dbug.c, dbug_analyze.c, dbug_long.h,
+dbug.h) are put in public domain, as the rest of the dbug.c library)
+
+To my knowledge, all code in dbug library is in public domain.
+
+Michael Widenius
+
diff --git a/dep/mysqllite/dbug/sanity.c b/dep/mysqllite/dbug/sanity.c
new file mode 100644
index 0000000000..df43fc14ba
--- /dev/null
+++ b/dep/mysqllite/dbug/sanity.c
@@ -0,0 +1,13 @@
+/* Declarate _sanity() if not declared in main program */
+
+#include
+
+extern int _sanity(const char *file,uint line);
+
+#if defined(SAFEMALLOC) && !defined(MASTER) /* Avoid errors in MySQL */
+int _sanity(const char * file __attribute__((unused)),
+ uint line __attribute__((unused)))
+{
+ return 0;
+}
+#endif
diff --git a/dep/mysqllite/dbug/user.r b/dep/mysqllite/dbug/user.r
new file mode 100644
index 0000000000..ef67ef7a7c
--- /dev/null
+++ b/dep/mysqllite/dbug/user.r
@@ -0,0 +1,1193 @@
+.\" @(#)user.r 1.13 10/29/86
+.\"
+.\" 2004-10-29: documented features implemented since 10/29/86
+.\" formatting cleanup
+.\" - Sergei Golubchik
+.\"
+.\" DBUG (Macro Debugger Package) nroff source
+.\"
+.\" nroff -mm user.r >user.t
+.\" groff -mm user.r >user.ps
+.\"
+.\" ===================================================
+.\"
+.\" === Some sort of black magic, but I forget...
+.tr ~
+.\" === Hyphenation control (1 = on)
+.\".nr Hy 1
+.\" === Force all first level headings to start on new page
+.nr Ej 1
+.\" === Set for breaks after headings for levels 1-3
+.nr Hb 3
+.\" === Set for space after headings for levels 1-3
+.nr Hs 3
+.\" === Set standard indent for one/half inch
+.nr Si 10
+.\" === Set page header
+.PH "/DBUG User Manual//\*(DT/"
+.\" === Set page footer
+.PF "// - % - //"
+.\" === Set page offset
+.\".po 0.60i
+.\" === Set line length
+.\".ll 6.5i
+.TL
+.warn 0
+D B U G
+.P 0
+C Program Debugging Package
+.P 0
+by
+.AU "Fred Fish"
+.AF ""
+.SA 1
+.\" === All paragraphs indented.
+.nr Pt 1
+.AS 1
+This document introduces
+.I dbug ,
+a macro based C debugging
+package which has proven to be a very flexible and useful tool
+for debugging, testing, and porting C programs.
+
+.P
+All of the features of the
+.I dbug
+package can be enabled or disabled dynamically at execution time.
+This means that production programs will run normally when
+debugging is not enabled, and eliminates the need to maintain two
+separate versions of a program.
+
+.P
+Many of the things easily accomplished with conventional debugging
+tools, such as symbolic debuggers, are difficult or impossible with this
+package, and vice versa.
+Thus the
+.I dbug
+package should
+.I not
+be thought of as a replacement or substitute for
+other debugging tools, but simply as a useful
+.I addition
+to the
+program development and maintenance environment.
+
+.AE
+.MT 4
+.SK
+.B
+INTRODUCTION
+.R
+
+.P
+Almost every program development environment worthy of the name
+provides some sort of debugging facility.
+Usually this takes the form of a program which is capable of
+controlling execution of other programs and examining the internal
+state of other executing programs.
+These types of programs will be referred to as external debuggers
+since the debugger is not part of the executing program.
+Examples of this type of debugger include the
+.B adb
+and
+.B sdb
+debuggers provided with the
+.B UNIX\*F
+.FS
+UNIX is a trademark of AT&T Bell Laboratories.
+.FE
+operating system.
+
+.P
+One of the problems associated with developing programs in an environment
+with good external debuggers is that developed programs tend to have
+little or no internal instrumentation.
+This is usually not a problem for the developer since he is,
+or at least should be, intimately familiar with the internal organization,
+data structures, and control flow of the program being debugged.
+It is a serious problem for maintenance programmers, who
+are unlikely to have such familiarity with the program being
+maintained, modified, or ported to another environment.
+It is also a problem, even for the developer, when the program is
+moved to an environment with a primitive or unfamiliar debugger,
+or even no debugger.
+
+.P
+On the other hand,
+.I dbug
+is an example of an internal debugger.
+Because it requires internal instrumentation of a program,
+and its usage does not depend on any special capabilities of
+the execution environment, it is always available and will
+execute in any environment that the program itself will
+execute in.
+In addition, since it is a complete package with a specific
+user interface, all programs which use it will be provided
+with similar debugging capabilities.
+This is in sharp contrast to other forms of internal instrumentation
+where each developer has their own, usually less capable, form
+of internal debugger.
+In summary,
+because
+.I dbug
+is an internal debugger it provides consistency across operating
+environments,
+and because it is available to all developers it provides
+consistency across all programs in the same environment.
+
+.P
+The
+.I dbug
+package imposes only a slight speed penalty on executing
+programs, typically much less than 10 percent, and a modest size
+penalty, typically 10 to 20 percent.
+By defining a specific C preprocessor symbol both of these
+can be reduced to zero with no changes required to the
+source code.
+
+.P
+The following list is a quick summary of the capabilities
+of the
+.I dbug
+package.
+Each capability can be individually enabled or disabled
+at the time a program is invoked by specifying the appropriate
+command line arguments.
+.SP 1
+.ML o 1i
+.LI
+Execution trace showing function level control flow in a
+semi-graphically manner using indentation to indicate nesting
+depth.
+.LI
+Output the values of all, or any subset of, key internal variables.
+.LI
+Limit actions to a specific set of named functions.
+.LI
+Limit function trace to a specified nesting depth.
+.LI
+Label each output line with source file name and line number.
+.LI
+Label each output line with name of current process.
+.LI
+Push or pop internal debugging state to allow execution with
+built in debugging defaults.
+.LI
+Redirect the debug output stream to standard output (stdout)
+or a named file.
+The default output stream is standard error (stderr).
+The redirection mechanism is completely independent of
+normal command line redirection to avoid output conflicts.
+.LE
+
+.SK
+.B
+PRIMITIVE DEBUGGING TECHNIQUES
+.R
+
+.P
+Internal instrumentation is already a familiar concept
+to most programmers, since it is usually the first debugging
+technique learned.
+Typically, "print\ statements" are inserted in the source
+code at interesting points, the code is recompiled and executed,
+and the resulting output is examined in an attempt to determine
+where the problem is.
+
+The procedure is iterative, with each iteration yielding more
+and more output, and hopefully the source of the problem is
+discovered before the output becomes too large to deal with
+or previously inserted statements need to be removed.
+Figure 1 is an example of this type of primitive debugging
+technique.
+.DS I N
+.SP 2
+\fC
+.so example1.r
+\fR
+.SP 2
+.ll -5
+.ce
+Figure 1
+.ce
+Primitive Debugging Technique
+.ll +5
+.SP 2
+.DE
+
+.P
+Eventually, and usually after at least several iterations, the
+problem will be found and corrected.
+At this point, the newly inserted print statements must be
+dealt with.
+One obvious solution is to simply delete them all.
+Beginners usually do this a few times until they have to
+repeat the entire process every time a new bug pops up.
+The second most obvious solution is to somehow disable
+the output, either through the source code comment facility,
+creation of a debug variable to be switched on or off, or by using the
+C preprocessor.
+Figure 2 is an example of all three techniques.
+.DS I N
+.SP 2
+\fC
+.so example2.r
+\fR
+.SP 2
+.ll -5
+.ce
+Figure 2
+.ce
+Debug Disable Techniques
+.ll +5
+.SP 2
+.DE
+
+.P
+Each technique has its advantages and disadvantages with respect
+to dynamic vs static activation, source code overhead, recompilation
+requirements, ease of use, program readability, etc.
+Overuse of the preprocessor solution quickly leads to problems with
+source code readability and maintainability when multiple
+.B #ifdef
+symbols are to be defined or undefined based on specific types
+of debug desired.
+The source code can be made slightly more readable by suitable indentation
+of the
+.B #ifdef
+arguments to match the indentation of the code, but
+not all C preprocessors allow this.
+The only requirement for the standard
+.B UNIX
+C preprocessor is for the '#' character to appear
+in the first column, but even this seems
+like an arbitrary and unreasonable restriction.
+Figure 3 is an example of this usage.
+.DS I N
+.SP 2
+\fC
+.so example3.r
+\fR
+.SP 2
+.ll -5
+.ce
+Figure 3
+.ce
+More Readable Preprocessor Usage
+.ll +5
+.SP 2
+.DE
+
+.SK
+.B
+FUNCTION TRACE EXAMPLE
+.R
+
+.P
+We will start off learning about the capabilities of the
+.I dbug
+package by using a simple minded program which computes the
+factorial of a number.
+In order to better demonstrate the function trace mechanism, this
+program is implemented recursively.
+Figure 4 is the main function for this factorial program.
+.DS I N
+.SP 2
+\fC
+.so main.r
+\fR
+.SP 2
+.ll -5
+.ce
+Figure 4
+.ce
+Factorial Program Mainline
+.ll +5
+.SP 2
+.DE
+
+.P
+The
+.B main
+function is responsible for processing any command line
+option arguments and then computing and printing the factorial of
+each non-option argument.
+.P
+First of all, notice that all of the debugger functions are implemented
+via preprocessor macros.
+This does not detract from the readability of the code and makes disabling
+all debug compilation trivial (a single preprocessor symbol,
+.B DBUG_OFF ,
+forces the macro expansions to be null).
+.P
+Also notice the inclusion of the header file
+.B dbug.h
+from the local header file directory.
+(The version included here is the test version in the dbug source
+distribution directory).
+This file contains all the definitions for the debugger macros, which
+all have the form
+.B DBUG_XX...XX .
+
+.P
+The
+.B DBUG_ENTER
+macro informs that debugger that we have entered the
+function named
+.B main .
+It must be the very first "executable" line in a function, after
+all declarations and before any other executable line.
+The
+.B DBUG_PROCESS
+macro is generally used only once per program to
+inform the debugger what name the program was invoked with.
+The
+.B DBUG_PUSH
+macro modifies the current debugger state by
+saving the previous state and setting a new state based on the
+control string passed as its argument.
+The
+.B DBUG_PRINT
+macro is used to print the values of each argument
+for which a factorial is to be computed.
+The
+.B DBUG_RETURN
+macro tells the debugger that the end of the current
+function has been reached and returns a value to the calling
+function.
+All of these macros will be fully explained in subsequent sections.
+.P
+To use the debugger, the factorial program is invoked with a command
+line of the form:
+.DS CB N
+\fCfactorial -#d:t 1 2 3
+.DE
+The
+.B main
+function recognizes the "-#d:t" string as a debugger control
+string, and passes the debugger arguments ("d:t") to the
+.I dbug
+runtime support routines via the
+.B DBUG_PUSH
+macro.
+This particular string enables output from the
+.B DBUG_PRINT
+macro with the 'd' flag and enables function tracing with the 't' flag.
+The factorial function is then called three times, with the arguments
+"1", "2", and "3".
+Note that the DBUG_PRINT takes exactly
+.B two
+arguments, with the second argument (a format string and list
+of printable values) enclosed in parentheses.
+.P
+Debug control strings consist of a header, the "-#", followed
+by a colon separated list of debugger arguments.
+Each debugger argument is a single character flag followed
+by an optional comma separated list of arguments specific
+to the given flag.
+Some examples are:
+.DS CB N
+\fC
+-#d:t:o
+-#d,in,out:f,main:F:L
+.DE
+Note that previously enabled debugger actions can be disabled by the
+control string "-#".
+
+.P
+The definition of the factorial function, symbolized as "N!", is
+given by:
+.DS CB N
+N! = N * N-1 * ... 2 * 1
+.DE
+Figure 5 is the factorial function which implements this algorithm
+recursively.
+Note that this is not necessarily the best way to do factorials
+and error conditions are ignored completely.
+.DS I N
+.SP 2
+\fC
+.so factorial.r
+\fR
+.SP 2
+.ll -5
+.ce
+Figure 5
+.ce
+Factorial Function
+.ll +5
+.SP 2
+.DE
+
+.P
+One advantage (some may not consider it so) to using the
+.I dbug
+package is that it strongly encourages fully structured coding
+with only one entry and one exit point in each function.
+Multiple exit points, such as early returns to escape a loop,
+may be used, but each such point requires the use of an
+appropriate
+.B DBUG_RETURN
+or
+.B DBUG_VOID_RETURN
+macro.
+
+.P
+To build the factorial program on a
+.B UNIX
+system, compile and
+link with the command:
+.DS CB N
+\fCcc -o factorial main.c factorial.c -ldbug
+.DE
+The "-ldbug" argument tells the loader to link in the
+runtime support modules for the
+.I dbug
+package.
+Executing the factorial program with a command of the form:
+.DS CB N
+\fCfactorial 1 2 3 4 5
+.DE
+generates the output shown in figure 6.
+.DS I N
+.SP 2
+\fC
+.so output1.r
+\fR
+.SP 2
+.ll -5
+.ce
+Figure 6
+.ce
+\fCfactorial 1 2 3 4 5
+.ll +5
+.SP 2
+.DE
+
+.P
+Function level tracing is enabled by passing the debugger
+the 't' flag in the debug control string.
+Figure 7 is the output resulting from the command
+"factorial\ -#t:o\ 2\ 3".
+.DS I N
+.SP 2
+\fC
+.so output2.r
+\fR
+.SP 2
+.ll -5
+.ce
+Figure 7
+.ce
+\fCfactorial -#t:o 2 3
+.ll +5
+.SP 2
+.DE
+
+.P
+Each entry to or return from a function is indicated by '>' for the
+entry point and '<' for the exit point, connected by
+vertical bars to allow matching points to be easily found
+when separated by large distances.
+
+.P
+This trace output indicates that there was an initial call
+to factorial from main (to compute 2!), followed by
+a single recursive call to factorial to compute 1!.
+The main program then output the result for 2! and called the
+factorial function again with the second argument, 3.
+Factorial called itself recursively to compute 2! and 1!, then
+returned control to main, which output the value for 3! and exited.
+
+.P
+Note that there is no matching entry point "main>" for the
+return point "\ %s", stp, stp\ ->\ name));\fR
+.SP 1
+.LI DBUG_DUMP\
+Used to dump a memory block in hex via the "fprintf" library function
+on the current debug stream, DBUG_FILE. The first argument is a debug
+keyword, the second is a pointer to a memory to dump, the third is a
+number of bytes to dump.
+.SP 1
+EX: \fCDBUG_DBUG\ ("net",\ packet,\ len);\fR
+.SP 1
+.LI DBUG_SETJMP\
+Used in place of the setjmp() function to first save the current
+debugger state and then execute the standard setjmp call.
+This allows to the debugger to restore its state when the
+DBUG_LONGJMP macro is used to invoke the standard longjmp() call.
+Currently all instances of DBUG_SETJMP must occur within the
+same function and at the same function nesting level.
+.SP 1
+EX: \fCDBUG_SETJMP\ (env);\fR
+.SP 1
+.LI DBUG_LONGJMP\
+Used in place of the longjmp() function to first restore the
+previous debugger state at the time of the last DBUG_SETJMP
+and then execute the standard longjmp() call.
+Note that currently all DBUG_LONGJMP macros restore the state
+at the time of the last DBUG_SETJMP.
+It would be possible to maintain separate DBUG_SETJMP and DBUG_LONGJMP
+pairs by having the debugger runtime support module use the first
+argument to differentiate the pairs.
+.SP 1
+EX: \fCDBUG_LONGJMP\ (env,val);\fR
+.SP 1
+.LI DBUG_LOCK_FILE\
+Used in multi-threaded environment to lock DBUG_FILE stream.
+It can be used, for example, in functions that need to write something to a
+debug stream more than in one fprintf() call and want to ensure that no other
+thread will write something in between.
+.SP 1
+EX:\fC
+.br
+ DBUG_LOCK_FILE;
+.br
+ fprintf (DBUG_FILE, "a=[");
+.br
+ for (int i=0; i < a_length; i++)
+.br
+ fprintf (DBUG_FILE, "0x%03x ", a[i]);
+.br
+ fprintf (DBUG_FILE, "]");
+.br
+ DBUG_UNLOCK_FILE;\fR
+.SP 1
+.LI DBUG_UNLOCK_FILE\
+Unlocks DBUG_FILE stream, that was locked with a DBUG_LOCK_FILE.
+.LI DBUG_ASSERT\
+This macro just does a regular assert(). The difference is that it will be
+disabled by DBUG_OFF togeher with the
+.I dbug
+library. So there will be no need to disable asserts separately with NDEBUG.
+.SP 1
+EX:\ \fCDBUG_ASSERT(\ a\ >\ 0\ );\fR
+.SP 1
+.LI DBUG_EXPLAIN\
+Generates control string corresponding to the current debug state.
+The macro takes two arguments - a buffer to store the result string
+into and its length. The macro (which could be used as a function)
+returns 1 if the control string didn't fit into the buffer and was
+truncated and 0 otherwise.
+.SP 1
+EX:\fC
+.br
+ char buf[256];
+.br
+ DBUG_EXPLAIN( buf, sizeof(buf) );\fR
+.SP 1
+.LI DBUG_SET_INITIAL\
+.LI DBUG_EXPLAIN_INITIAL\
+.br
+These two macros are identical to DBUG_SET and DBUG_EXPLAIN, but they
+operate on the debug state that any new thread starts from.
+Modifying
+.I initial
+value does not affect threads that are already running. Obviously,
+these macros are only useful in the multi-threaded environment.
+.LE
+
+.SK
+.B
+DEBUG CONTROL STRING
+.R
+
+.P
+The debug control string is used to set the state of the debugger
+via the
+.B DBUG_PUSH
+or
+.B DBUG_SET
+macros. Control string consists of colon separate flags. Colons
+that are part of ':\\', ':/', or '::' are not considered flag
+separators. A flag may take an argument or a list of arguments.
+If a control string starts from a '+' sign it works
+.I incrementally,
+that is, it can modify existing state without overriding it. In such a
+string every flag may be preceded by a '+' or '-' to enable or disable
+a corresponding option in the debugger state. This section summarizes
+the currently available debugger options and the flag characters which
+enable or disable them. Argument lists enclosed in '[' and ']' are
+optional.
+.SP 2
+.BL 22
+.LI a[,file]
+Redirect the debugger output stream and append it to the specified
+file. The default output stream is stderr. A null argument list
+causes output to be redirected to stdout.
+.SP 1
+EX: \fCa,C:\\tmp\\log\fR
+.LI A[,file]
+Like 'a[,file]' but ensure that data are written after each write
+(this typically implies flush or close/reopen). It helps to get
+a complete log file in case of crashes. This mode is implicit in
+multi-threaded environment.
+.LI d[,keywords]
+Enable output from macros with specified keywords.
+An empty list of keywords implies that all keywords are selected.
+.LI D[,time]
+Delay for specified time after each output line, to let output drain.
+Time is given in tenths of a second (value of 10 is one second).
+Default is zero.
+.LI f[,functions]
+Limit debugger actions to the specified list of functions.
+An empty list of functions implies that all functions are selected.
+.LI F
+Mark each debugger output line with the name of the source file
+containing the macro causing the output.
+.LI i
+Mark each debugger output line with the PID (or thread ID) of the
+current process.
+.LI g,[functions]
+Enable profiling for the specified list of functions.
+An empty list of functions enables profiling for all functions.
+See
+.B PROFILING\ WITH\ DBUG
+below.
+.LI L
+Mark each debugger output line with the source file line number of
+the macro causing the output.
+.LI n
+Mark each debugger output line with the current function nesting depth.
+.LI N
+Sequentially number each debugger output line starting at 1.
+This is useful for reference purposes when debugger output is
+interspersed with program output.
+.LI o[,file]
+Like 'a[,file]' but overwrite old file, do not append.
+.LI O[,file]
+Like 'A[,file]' but overwrite old file, do not append.
+.LI p[,processes]
+Limit debugger actions to the specified processes. An empty list
+implies all processes. This is useful for processes which run child
+processes. Note that each debugger output line can be marked with the
+name of the current process via the 'P' flag. The process name must
+match the argument passed to the
+.B DBUG_PROCESS
+macro.
+.LI P
+Mark each debugger output line with the name of the current process.
+Most useful when used with a process which runs child processes that
+are also being debugged. Note that the parent process must arrange
+for the debugger control string to be passed to the child processes.
+.LI r
+Used in conjunction with the
+.B DBUG_PUSH
+macro to reset the current
+indentation level back to zero.
+Most useful with
+.B DBUG_PUSH
+macros used to temporarily alter the
+debugger state.
+.LI S
+When compiled with
+.I safemalloc
+this flag forces "sanity" memory checks (for overwrites/underwrites)
+on each
+.B DBUG_ENTER
+and
+.B DBUG_RETURN.
+.LI t[,N]
+Enable function control flow tracing.
+The maximum nesting depth is specified by N, and defaults to
+200.
+.LI T
+Mark each debugger output line with the current timestamp.
+The value is printed with microsecond resolution, as returned by
+.I gettimeofday()
+system call. The actual resolution is OS- and hardware-dependent.
+.LE
+
+.SK
+.B
+MULTI-THREADED DEBUGGING
+.R
+
+.P
+When
+.I dbug
+is used in a multi-threaded environment there are few differences from a single-threaded
+case to keep in mind. This section tries to summarize them.
+.SP 2
+.BL 5
+.LI
+Every thread has its own stack of debugger states.
+.B DBUG_PUSH
+and
+.B DBUG_POP
+affect only the thread that executed them.
+.LI
+At the bottom of the stack for all threads there is the common
+.I initial
+state. Changes to this state (for example, with
+.B DBUG_SET_INITIAL
+macro) affect all new threads and all running threads that didn't
+.B DBUG_PUSH
+yet.
+.LI
+Every thread can have its own name, that can be set with
+.B DBUG_PROCESS
+macro. Thus, "-#p,name1,name2" can be used to limit the output to specific threads.
+.LI
+When printing directly to
+.B DBUG_FILE
+it may be necessary to prevent other threads from writing something between two parts
+of logically indivisible output. It is done with
+.B DBUG_LOCK_FILE
+and
+.B DBUG_UNLOCK_FILE
+macors. See the appropriate section for examples.
+.LI
+"-#o,file" and "-#O,file" are treated as "-#a,file" and "-#A,file" respectively. That is
+all writes to a file are always followed by a flush.
+.LI
+"-#i" prints not a PID but a thread id in the form of "T@nnn"
+.LE
+
+.SK
+.B
+PROFILING WITH DBUG
+.R
+
+.P
+With
+.I dbug
+one can do profiling in a machine independent fashion,
+without a need for profiled version of system libraries.
+For this,
+.I dbug
+can write out a file
+called
+.B dbugmon.out
+(by default). This is an ascii file containing lines of the form:
+.DS CB N
+\fC E
+ X
+.DE
+
+.P
+A second program (\fBanalyze\fR) reads this file, and produces a report on
+standard output.
+
+.P
+Profiling is enabled through the
+.B g
+flag. It can take a list of
+function names for which profiling is enabled. By default, it
+profiles all functions.
+
+.P
+The profile file is opened for appending. This
+is in order that one can run a program several times, and get the
+sum total of all the times, etc.
+
+.P
+An example of the report generated follows:
+.DS CB N
+\fC
+ Profile of Execution
+ Execution times are in milliseconds
+
+ Calls Time
+ ----- ----
+ Times Percentage Time Spent Percentage
+Function Called of total in Function of total Importance
+======== ====== ========== =========== ========== ==========
+factorial 5 83.33 30 100.00 8333
+main 1 16.67 0 0.00 0
+======== ====== ========== =========== ==========
+Totals 6 100.00 30 100.00
+.DE
+.P
+As you can see, it's quite self-evident. The
+.B Importance
+column is a
+metric obtained by multiplying the percentage of the calls and the percentage
+of the time. Functions with higher 'importance' benefit the most from
+being sped up.
+
+.P
+As a limitation - setjmp/longjmp, or child processes, are ignored
+for the time being. Also, profiling does not work
+in a multi-threaded environment.
+
+.P
+Profiling code is (c) Binayak Banerjee.
+
+.SK
+.B
+HINTS AND MISCELLANEOUS
+.R
+
+.P
+One of the most useful capabilities of the
+.I dbug
+package is to compare the executions of a given program in two
+different environments.
+This is typically done by executing the program in the environment
+where it behaves properly and saving the debugger output in a
+reference file.
+The program is then run with identical inputs in the environment where
+it misbehaves and the output is again captured in a reference file.
+The two reference files can then be differentially compared to
+determine exactly where execution of the two processes diverges.
+
+.P
+A related usage is regression testing where the execution of a current
+version is compared against executions of previous versions.
+This is most useful when there are only minor changes.
+
+.P
+It is not difficult to modify an existing compiler to implement
+some of the functionality of the
+.I dbug
+package automatically, without source code changes to the
+program being debugged.
+In fact, such changes were implemented in a version of the
+Portable C Compiler by the author in less than a day.
+However, it is strongly encouraged that all newly
+developed code continue to use the debugger macros
+for the portability reasons noted earlier.
+The modified compiler should be used only for testing existing
+programs.
+
+.SK
+.B
+CAVEATS
+.R
+
+.P
+The
+.I dbug
+package works best with programs which have "line\ oriented"
+output, such as text processors, general purpose utilities, etc.
+It can be interfaced with screen oriented programs such as
+visual editors by redefining the appropriate macros to call
+special functions for displaying the debugger results.
+Of course, this caveat is not applicable if the debugger output
+is simply dumped into a file for post-execution examination.
+
+.P
+Programs which use memory allocation functions other than
+.B malloc
+will usually have problems using the standard
+.I dbug
+package.
+The most common problem is multiply allocated memory.
+.SP 2
+.\" .DE nroff dident like this. davida 900108
+.CS
+
+.\" vim:filetype=nroff
diff --git a/dep/mysqllite/extra/yassl/AUTHORS b/dep/mysqllite/extra/yassl/AUTHORS
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/dep/mysqllite/extra/yassl/COPYING b/dep/mysqllite/extra/yassl/COPYING
new file mode 100644
index 0000000000..d60c31a97a
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ 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; either version 2 of the License, or
+ (at your option) any later version.
+
+ 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
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ , 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/dep/mysqllite/extra/yassl/ChangeLog b/dep/mysqllite/extra/yassl/ChangeLog
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/dep/mysqllite/extra/yassl/INSTALL b/dep/mysqllite/extra/yassl/INSTALL
new file mode 100644
index 0000000000..54caf7c190
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/INSTALL
@@ -0,0 +1,229 @@
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software
+Foundation, Inc.
+
+ This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+ It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring. (Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.)
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+ The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'. You only need
+`configure.ac' if you want to change it or regenerate `configure' using
+a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+ You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment. Here
+is an example:
+
+ ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+
+ *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not support the `VPATH'
+variable, you have to compile the package for one architecture at a
+time in the source code directory. After you have installed the
+package for one architecture, use `make distclean' before reconfiguring
+for another architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on. Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+ CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+ OS KERNEL-OS
+
+ See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+ If you are _building_ compiler tools for cross-compiling, you should
+use the `--target=TYPE' option to select the type of system they will
+produce code for.
+
+ If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+ Variables not defined in a site shell script can be set in the
+environment passed to `configure'. However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'. For example:
+
+ ./configure CC=/usr/local2/bin/gcc
+
+will cause the specified gcc to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+`configure' Invocation
+======================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+ Print a summary of the options to `configure', and exit.
+
+`--version'
+`-V'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`--cache-file=FILE'
+ Enable the cache: use and save the results of the tests in FILE,
+ traditionally `config.cache'. FILE defaults to `/dev/null' to
+ disable caching.
+
+`--config-cache'
+`-C'
+ Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`configure' also accepts some other, not widely useful, options. Run
+`configure --help' for more details.
+
diff --git a/dep/mysqllite/extra/yassl/NEWS b/dep/mysqllite/extra/yassl/NEWS
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/dep/mysqllite/extra/yassl/README b/dep/mysqllite/extra/yassl/README
new file mode 100644
index 0000000000..6c4d101efc
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/README
@@ -0,0 +1,524 @@
+*****************yaSSL Release notes, version 1.6.0 (2/22/07)
+
+ This release of yaSSL contains bug fixes, portability enhancements, and
+ better X509 support.
+
+See normal build instructions below under 1.0.6.
+See libcurl build instructions below under 1.3.0 and note in 1.5.8.
+
+*****************yaSSL Release notes, version 1.5.8 (1/10/07)
+
+ This release of yaSSL contains bug fixes, portability enhancements, and
+ support for GCC 4.1.1 and vs2005 sp1.
+
+
+
+ Since yaSSL now supports zlib, as does libcur, the libcurl build test can
+ fail if yaSSL is built with zlib support since the zlib library isn't
+ passed. You can do two things to fix this:
+
+ 1) build yaSSL w/o zlib --without-zlib
+ 2) or add flags to curl configure LDFLAGS="-lm -lz"
+
+
+
+*****************yaSSL Release notes, version 1.5.0 (11/09/06)
+
+ This release of yaSSL contains bug fixes, portability enhancements,
+ and full TLS 1.1 support. Use the functions:
+
+ SSL_METHOD *TLSv1_1_server_method(void);
+ SSL_METHOD *TLSv1_1_client_method(void);
+
+ or the SSLv23 versions (even though yaSSL doesn't support SSL 2.0 the v23
+ means to pick the highest of SSL 3.0, TLS 1.0, or TLS 1.1).
+
+
+See normal build instructions below under 1.0.6.
+See libcurl build instructions below under 1.3.0.
+
+
+
+****************yaSSL Release notes, version 1.4.5 (10/15/06)
+
+
+ This release of yaSSL contains bug fixes, portability enhancements,
+ zlib compression support, removal of assembly instructions at runtime if
+ not supported, and initial TLS 1.1 support.
+
+
+ Compression Notes: yaSSL uses zlib for compression and the compression
+ should only be used if yaSSL is at both ends because the implementation
+ details aren't yet standard. If you'd like to turn compression on use
+ the SSL_set_compression() function on the client before calling
+ SSL_connect(). If both the client and server were built with zlib support
+ then the connection will use compression. If the client isn't built with
+ support then SSL_set_compression() will return an error (-1).
+
+ To build yaSSL with zlib support on Unix simply have zlib support on your
+ system and configure will find it if it's in the standard locations. If
+ it's somewhere else use the option ./configure --with-zlib=DIR. If you'd
+ like to disable compression support in yaSSL use ./configure --without-zlib.
+
+ To build yaSSL with zlib support on Windows:
+
+ 1) download zlib from http://www.zlib.net/
+ 2) follow the instructions in zlib from projects/visualc6/README.txt
+ for how to add the zlib project into the yaSSL workspace noting that
+ you'll need to add configuration support for "Win32 Debug" and
+ "Win32 Release" in note 3 under "To use:".
+ 3) define HAVE_LIBZ when building yaSSL
+
+
+See normal build instructions below under 1.0.6.
+See libcurl build instructions below under 1.3.0.
+
+
+********************yaSSL Release notes, version 1.4.0 (08/13/06)
+
+
+ This release of yaSSL contains bug fixes, portability enhancements,
+ nonblocking connect and accept, better OpenSSL error mapping, and
+ certificate caching for session resumption.
+
+See normal build instructions below under 1.0.6.
+See libcurl build instructions below under 1.3.0.
+
+
+********************yaSSL Release notes, version 1.3.7 (06/26/06)
+
+
+ This release of yaSSL contains bug fixes, portability enhancements,
+ and libcurl 7.15.4 support (any newer versions may not build).
+
+See normal build instructions below under 1.0.6.
+See libcurl build instructions below under 1.3.0.
+
+
+********************yaSSL Release notes, version 1.3.5 (06/01/06)
+
+
+ This release of yaSSL contains bug fixes, portability enhancements,
+ better libcurl support, and improved non-blocking I/O.
+
+See normal build instructions below under 1.0.6.
+See libcurl build instructions below under 1.3.0.
+
+
+********************yaSSL Release notes, version 1.3.0 (04/26/06)
+
+
+ This release of yaSSL contains minor bug fixes, portability enhancements,
+ and libcurl support.
+
+See normal build instructions below under 1.0.6.
+
+
+--To build for libcurl on Linux, Solaris, *BSD, Mac OS X, or Cygwin:
+
+ To build for libcurl the library needs to be built without C++ globals since
+ the linker will be called in a C context, also libcurl configure will expect
+ OpenSSL library names so some symbolic links are created.
+
+ ./configure --enable-pure-c
+ make
+ make openssl-links
+
+ (then go to your libcurl home and tell libcurl about yaSSL build dir)
+ ./configure --with-ssl=/yaSSL-BuildDir LDFLAGS=-lm
+ make
+
+
+--To build for libcurl on Win32:
+
+ Simply add the yaSSL project as a dependency to libcurl, add
+ yaSSL-Home\include and yaSSL-Home\include\openssl to the include list, and
+ define USE_SSLEAY and USE_OPENSSL
+
+ please email todd@yassl.com if you have any questions.
+
+
+*******************yaSSL Release notes, version 1.2.2 (03/27/06)
+
+
+ This release of yaSSL contains minor bug fixes and portability enhancements.
+
+See build instructions below under 1.0.6:
+
+
+
+*******************yaSSL Release notes, version 1.2.0
+
+
+ This release of yaSSL contains minor bug fixes, portability enhancements,
+ Diffie-Hellman compatibility fixes for other servers and client,
+ optimization improvements, and x86 ASM changes.
+
+See build instructions below under 1.0.6:
+
+
+
+*****************yaSSL Release notes, version 1.1.5
+
+ This release of yaSSL contains minor bug fixes, portability enhancements,
+ and user requested changes including the ability to add all certificates in
+ a directory, more robust socket handling, no new overloading unless
+ requested, and an SSL_VERIFY_NONE option.
+
+
+See build instructions below under 1.0.6:
+
+
+
+******************yaSSL Release notes, version 1.0.6
+
+This release of yaSSL contains minor bug fixes, portability enhancements,
+x86 assembly for ARC4, SHA, MD5, and RIPEMD, --enable-ia32-asm configure
+option, and a security patch for certificate chain processing.
+
+--To build on Linux, Solaris, *BSD, Mac OS X, or Cygwin:
+
+ ./configure
+ make
+
+ run testsuite from yaSSL-Home/testsuite to test the build
+
+to make a release build:
+
+ ./configure --disable-debug
+ make
+
+ run testsuite from yaSSL-Home/testsuite to test the build
+
+
+--To build on Win32
+
+Choose (Re)Build All from the project workspace
+
+run Debug\testsuite.exe from yaSSL-Home\testsuite to test the build
+
+
+
+***************** yaSSL Release notes, version 1.0.5
+
+This release of yaSSL contains minor bug fixes, portability enhancements,
+x86 assembly for AES, 3DES, BLOWFISH, and TWOFISH, --without-debug configure
+option, and --enable-kernel-mode configure option for using TaoCrypt with
+kernel modules.
+
+--To build on Linux, Solaris, *BSD, Mac OS X, or Cygwin:
+
+ ./configure
+ make
+
+ run testsuite from yaSSL-Home/testsuite to test the build
+
+to make a release build:
+
+ ./configure --without-debug
+ make
+
+ run testsuite from yaSSL-Home/testsuite to test the build
+
+
+--To build on Win32
+
+Choose (Re)Build All from the project workspace
+
+run Debug\testsuite.exe from yaSSL-Home\testsuite to test the build
+
+
+******************yaSSL Release notes, version 1.0.1
+
+This release of yaSSL contains minor bug fixes, portability enhancements,
+GCC 3.4.4 support, MSVC 2003 support, and more documentation.
+
+Please see build instructions in the release notes for 0.9.6 below.
+
+
+******************yaSSL Release notes, version 1.0
+
+This release of yaSSL contains minor bug fixes, portability enhancements,
+GCC 4.0 support, testsuite, improvements, and API additions.
+
+Please see build instructions in the release notes for 0.9.6 below.
+
+
+******************yaSSL Release notes, version 0.9.9
+
+This release of yaSSL contains minor bug fixes, portability enchancements,
+MSVC 7 support, memory improvements, and API additions.
+
+Please see build instructions in the release notes for 0.9.6 below.
+
+
+******************yaSSL Release notes, version 0.9.8
+
+This release of yaSSL contains minor bug fixes and portability enchancements.
+
+Please see build instructions in the release notes for 0.9.6 below.
+
+
+******************yaSSL Release notes, version 0.9.6
+
+This release of yaSSL contains minor bug fixes, removal of STL support, and
+removal of exceptions and rtti so that the library can be linked without the
+std c++ library.
+
+--To build on Linux, Solaris, FreeBSD, Mac OS X, or Cygwin
+
+./configure
+make
+
+run testsuite from yaSSL-Home/testsuite to test the build
+
+
+--To build on Win32
+
+Choose (Re)Build All from the project workspace
+
+run Debug\testsuite.exe from yaSSL-Home\testsuite to test the build
+
+
+
+******************yaSSL Release notes, version 0.9.2
+
+This release of yaSSL contains minor bug fixes, expanded certificate
+verification and chaining, and improved documentation.
+
+Please see build instructions in release notes 0.3.0.
+
+
+
+******************yaSSL Release notes, version 0.9.0
+
+This release of yaSSL contains minor bug fixes, client verification handling,
+hex and base64 encoing/decoding, and an improved test suite.
+
+Please see build instructions in release notes 0.3.0.
+
+
+******************yaSSL Release notes, version 0.8.0
+
+This release of yaSSL contains minor bug fixes, and initial porting effort to
+64bit, BigEndian, and more UNIX systems.
+
+Please see build instructions in release notes 0.3.0.
+
+
+******************yaSSL Release notes, version 0.6.0
+
+This release of yaSSL contains minor bug fixes, source cleanup, and binary beta
+(1) of the yaSSL libraries.
+
+Please see build instructions in release notes 0.3.0.
+
+
+
+******************yaSSL Release notes, version 0.5.0
+
+This release of yaSSL contains minor bug fixes, full session resumption
+support, and initial testing suite support.
+
+
+
+Please see build instructions in release notes 0.3.0.
+
+
+
+******************yaSSL Release notes, version 0.4.0
+
+This release of yaSSL contains minor bug fixes, an optional memory tracker,
+an echo client and server with input/output redirection for load testing,
+and initial session caching support.
+
+
+Please see build instructions in release notes 0.3.0.
+
+
+******************yaSSL Release notes, version 0.3.5
+
+This release of yaSSL contains minor bug fixes and extensions to the crypto
+library including a full test suite.
+
+
+*******************yaSSL Release notes, version 0.3.0
+
+This release of yaSSL contains minor bug fixes and extensions to the crypto
+library including AES and an improved random number generator. GNU autoconf
+and automake are now used to simplify the build process on Linux.
+
+*** Linux Build process
+
+./configure
+make
+
+*** Windows Build process
+
+open the yassl workspace and build the project
+
+
+*******************yaSSL Release notes, version 0.2.9
+
+This release of yaSSL contains minor bug fixes and extensions to the crypto
+library.
+
+See the notes at the bottom of this page for build instructions.
+
+
+*******************yaSSL Release notes, version 0.2.5
+
+This release of yaSSL contains minor bug fixes and a beta binary of the yaSSL
+libraries for win32 and linux.
+
+See the notes at the bottom of this page for build instructions.
+
+
+
+*******************yaSSL Release notes, version 0.2.0
+
+This release of yaSSL contains minor bug fixes and initial alternate crypto
+functionality.
+
+*** Complete Build ***
+
+See the notes in Readme.txt for build instructions.
+
+*** Update Build ***
+
+If you have already done a complete build of yaSSL as described in the release
+0.0.1 - 0.1.0 notes and downloaded the update to 0.2.0, place the update file
+yassl-update-0.2.0.tar.gz in the yaSSL home directory and issue the command:
+
+gzip -cd yassl-update-0.2.0.tar.gz | tar xvf -
+
+to update the previous release.
+
+Then issue the make command on linux or rebuild the yaSSL project on Windows.
+
+*******************yaSSL Release notes, version 0.1.0
+
+This release of yaSSL contains minor bug fixes, full client and server TLSv1
+support including full ephemeral Diffie-Hellman support, SSL type RSA and DSS
+signing and verification, and initial stunnel 4.05 build support.
+
+
+
+*********************yaSSL Release notes, version 0.0.3
+
+The third release of yaSSL contains minor bug fixes, client certificate
+enhancements, and initial ephemeral Diffie-Hellman integration:
+
+
+
+*********************
+
+yaSSL Release notes, version 0.0.2
+
+The second release of yaSSL contains minor bug fixes, client certificate
+enhancements, session resumption, and improved TLS support including:
+
+- HMAC for MD5 and SHA-1
+- PRF (pseudo random function)
+- Master Secret and Key derivation routines
+- Record Authentication codes
+- Finish verify data check
+
+Once ephemeral RSA and DH are added yaSSL will be fully complaint with TLS.
+
+
+
+**********************
+
+yassl Release notes, version 0.0.1
+
+The first release of yassl supports normal RSA mode SSLv3 connections with
+support for SHA-1 and MD5 digests. Ciphers include DES, 3DES, and RC4.
+
+yassl uses the CryptoPP library for cryptography, the source is available at
+www.cryptopp.com .
+
+yassl uses CML (the Certificate Management Library) for x509 support. More
+features will be in future versions. The CML source is available for download
+from www.digitalnet.com/knowledge/cml_home.htm .
+
+The next release of yassl will support the 3 lesser-used SSL connection modes;
+HandShake resumption, Ephemeral RSA (or DH), and Client Authentication as well
+as full support for TLS. Backwards support for SSLv2 is not planned at this
+time.
+
+
+**********************
+
+Building yassl on linux:
+
+use the ./buildall script to build everything.
+
+buildall will configure and build CML, CryptoPP, and yassl. Testing was
+preformed with gcc version 3.3.2 on kernel 2.4.22.
+
+
+**********************
+
+Building yassl on Windows:
+
+Testing was preformed on Windows 2000 with Visual C++ 6 sp5.
+
+1) decompress esnacc_r16.tgz in place, see buildall for syntax if unsure
+
+2) decompress smp_r23.tgz in place
+
+3) unzip cryptopp51/crypto51.zip in place
+
+4) Build SNACC (part of CML) using snacc_builds.dsw in the SNACC directory
+
+5) Build SMP (part of CMP) using smp.dsw in the smp directory
+
+6) Build yassl using yassl.dsw
+
+
+**********************
+
+examples, server and client:
+
+Please see the server and client examples in both versions to see how to link
+to yassl and the support libraries. On linux do 'make server' and 'make
+client' to build them. On Windows you will find the example projects in the
+main workspace, yassl.dsw.
+
+The example server and client are compatible with openssl.
+
+
+**********************
+
+Building yassl into mysql on linux:
+
+Testing was done using mysql version 4.0.17.
+
+alter openssl_libs in the configure file, line 21056. Change '-lssl -lcrypto'
+to '-lyassl -lcryptopp -lcmapi -lcmlasn -lctil -lc++asn1'.
+
+see build/config_command for the configure command used to configure mysql
+please change /home/touska/ to the relevant directory of course.
+
+add yassl/lib to the LD_LIBRARY_PATH because libmysql/conf_to_src does not
+use the ssl lib directory though it does use the ssl libraries.
+
+make
+
+make install
+
+
+*********************
+
+License: yassl is currently under the GPL, please see license information
+in the source and include files.
+
+
+*********************
+
+Contact: please send comments or questions to Todd A Ouska at todd@yassl.com
+and/or Larry Stefonic at larry@yassl.com or 425-741-6858.
+
+
+
diff --git a/dep/mysqllite/extra/yassl/include/buffer.hpp b/dep/mysqllite/extra/yassl/include/buffer.hpp
new file mode 100644
index 0000000000..a51bca9a63
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/buffer.hpp
@@ -0,0 +1,207 @@
+/*
+ Copyright (C) 2000-2007 MySQL AB
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+
+/* yaSSL buffer header defines input and output buffers to simulate streaming
+ * with SSL types and sockets
+ */
+
+#ifndef yaSSL_BUFFER_HPP
+#define yaSSL_BUFFER_HPP
+
+#include // assert
+#include "yassl_types.hpp" // ysDelete
+#include "memory.hpp" // mySTL::auto_ptr
+#include STL_ALGORITHM_FILE
+
+
+namespace STL = STL_NAMESPACE;
+
+
+#ifdef _MSC_VER
+ // disable truncated debug symbols
+ #pragma warning(disable:4786)
+#endif
+
+
+namespace yaSSL {
+
+typedef unsigned char byte;
+typedef unsigned int uint;
+const uint AUTO = 0xFEEDBEEF;
+
+
+// Checking Policy should implement a check function that tests whether the
+// index is within the size limit of the array
+struct Check {
+ void check(uint i, uint limit);
+};
+
+
+struct NoCheck {
+ void check(uint, uint);
+};
+
+/* input_buffer operates like a smart c style array with a checking option,
+ * meant to be read from through [] with AUTO index or read().
+ * Should only write to at/near construction with assign() or raw (e.g., recv)
+ * followed by add_size with the number of elements added by raw write.
+ *
+ * Not using vector because need checked []access, offset, and the ability to
+ * write to the buffer bulk wise and have the correct size
+ */
+
+class input_buffer : public Check {
+ uint size_; // number of elements in buffer
+ uint current_; // current offset position in buffer
+ byte* buffer_; // storage for buffer
+ byte* end_; // end of storage marker
+public:
+ input_buffer();
+
+ explicit input_buffer(uint s);
+
+ // with assign
+ input_buffer(uint s, const byte* t, uint len);
+
+ ~input_buffer();
+
+ // users can pass defualt zero length buffer and then allocate
+ void allocate(uint s);
+
+ // for passing to raw writing functions at beginning, then use add_size
+ byte* get_buffer() const;
+
+ // after a raw write user can set new size
+ // if you know the size before the write use assign()
+ void add_size(uint i);
+
+ uint get_capacity() const;
+
+ uint get_current() const;
+
+ uint get_size() const;
+
+ uint get_remaining() const;
+
+ void set_current(uint i);
+
+ // read only access through [], advance current
+ // user passes in AUTO index for ease of use
+ const byte& operator[](uint i);
+
+ // end of input test
+ bool eof();
+
+ // peek ahead
+ byte peek() const;
+
+ // write function, should use at/near construction
+ void assign(const byte* t, uint s);
+
+ // use read to query input, adjusts current
+ void read(byte* dst, uint length);
+
+private:
+ input_buffer(const input_buffer&); // hide copy
+ input_buffer& operator=(const input_buffer&); // and assign
+};
+
+
+/* output_buffer operates like a smart c style array with a checking option.
+ * Meant to be written to through [] with AUTO index or write().
+ * Size (current) counter increases when written to. Can be constructed with
+ * zero length buffer but be sure to allocate before first use.
+ * Don't use add write for a couple bytes, use [] instead, way less overhead.
+ *
+ * Not using vector because need checked []access and the ability to
+ * write to the buffer bulk wise and retain correct size
+ */
+class output_buffer : public Check {
+ uint current_; // current offset and elements in buffer
+ byte* buffer_; // storage for buffer
+ byte* end_; // end of storage marker
+public:
+ // default
+ output_buffer();
+
+ // with allocate
+ explicit output_buffer(uint s);
+
+ // with assign
+ output_buffer(uint s, const byte* t, uint len);
+
+ ~output_buffer();
+
+ uint get_size() const;
+
+ uint get_capacity() const;
+
+ void set_current(uint c);
+
+ // users can pass defualt zero length buffer and then allocate
+ void allocate(uint s);
+
+ // for passing to reading functions when finished
+ const byte* get_buffer() const;
+
+ // allow write access through [], update current
+ // user passes in AUTO as index for ease of use
+ byte& operator[](uint i);
+
+ // end of output test
+ bool eof();
+
+ void write(const byte* t, uint s);
+
+private:
+ output_buffer(const output_buffer&); // hide copy
+ output_buffer& operator=(const output_buffer&); // and assign
+};
+
+
+
+
+// turn delete an incomplete type into comipler error instead of warning
+template
+inline void checked_delete(T* p)
+{
+ typedef char complete_type[sizeof(T) ? 1 : -1];
+ (void)sizeof(complete_type);
+ ysDelete(p);
+}
+
+
+// checked delete functor increases effeciency, no indirection on function call
+// sets pointer to zero so safe for std conatiners
+struct del_ptr_zero
+{
+ template
+ void operator()(T*& p) const
+ {
+ T* tmp = 0;
+ STL::swap(tmp, p);
+ checked_delete(tmp);
+ }
+};
+
+
+
+} // naemspace
+
+#endif // yaSSL_BUUFER_HPP
diff --git a/dep/mysqllite/extra/yassl/include/cert_wrapper.hpp b/dep/mysqllite/extra/yassl/include/cert_wrapper.hpp
new file mode 100644
index 0000000000..572b9f8729
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/cert_wrapper.hpp
@@ -0,0 +1,132 @@
+/*
+ Copyright (C) 2000-2007 MySQL AB
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+
+/* The certificate wrapper header defines certificate management functions
+ *
+ */
+
+
+#ifndef yaSSL_CERT_WRAPPER_HPP
+#define yaSSL_CERT_WRAPPER_HPP
+
+#ifdef _MSC_VER
+ // disable truncated debug symbols
+ #pragma warning(disable:4786)
+#endif
+
+
+#include "yassl_types.hpp" // SignatureAlgorithm
+#include "buffer.hpp" // input_buffer
+#include "asn.hpp" // SignerList
+#include "openssl/ssl.h" // internal and external use
+#include STL_LIST_FILE
+#include STL_ALGORITHM_FILE
+
+
+namespace STL = STL_NAMESPACE;
+
+
+namespace yaSSL {
+
+typedef unsigned char opaque;
+class X509; // forward openSSL type
+
+using TaoCrypt::SignerList;
+
+// an x509 version 3 certificate
+class x509 {
+ uint length_;
+ opaque* buffer_;
+public:
+ explicit x509(uint sz);
+ ~x509();
+
+ uint get_length() const;
+ const opaque* get_buffer() const;
+ opaque* use_buffer();
+
+ x509(const x509&);
+ x509& operator=(const x509&);
+private:
+ void Swap(x509&);
+};
+
+
+// Certificate Manager keeps a list of the cert chain and public key
+class CertManager {
+ typedef STL::list CertList;
+
+ CertList list_; // self
+ input_buffer privateKey_;
+
+ CertList peerList_; // peer
+ input_buffer peerPublicKey_;
+ X509* peerX509_; // peer's openSSL X509
+
+ SignatureAlgorithm keyType_; // self key type
+ SignatureAlgorithm peerKeyType_; // peer's key type
+
+ SignerList signers_; // decoded CA keys and names
+ // plus verified chained certs
+ bool verifyPeer_;
+ bool verifyNone_; // no error if verify fails
+ bool failNoCert_;
+ bool sendVerify_;
+ VerifyCallback verifyCallback_; // user verify callback
+public:
+ CertManager();
+ ~CertManager();
+
+ void AddPeerCert(x509* x); // take ownership
+ void CopySelfCert(const x509* x);
+ int CopyCaCert(const x509* x);
+ int Validate();
+
+ int SetPrivateKey(const x509&);
+
+ const x509* get_cert() const;
+ const opaque* get_peerKey() const;
+ const opaque* get_privateKey() const;
+ X509* get_peerX509() const;
+ SignatureAlgorithm get_keyType() const;
+ SignatureAlgorithm get_peerKeyType() const;
+
+ uint get_peerKeyLength() const;
+ uint get_privateKeyLength() const;
+
+ bool verifyPeer() const;
+ bool verifyNone() const;
+ bool failNoCert() const;
+ bool sendVerify() const;
+
+ void setVerifyPeer();
+ void setVerifyNone();
+ void setFailNoCert();
+ void setSendVerify();
+ void setPeerX509(X509*);
+ void setVerifyCallback(VerifyCallback);
+private:
+ CertManager(const CertManager&); // hide copy
+ CertManager& operator=(const CertManager&); // and assign
+};
+
+
+} // naemspace
+
+#endif // yaSSL_CERT_WRAPPER_HPP
diff --git a/dep/mysqllite/extra/yassl/include/crypto_wrapper.hpp b/dep/mysqllite/extra/yassl/include/crypto_wrapper.hpp
new file mode 100644
index 0000000000..07b5925265
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/crypto_wrapper.hpp
@@ -0,0 +1,427 @@
+/*
+ Copyright (C) 2000-2007 MySQL AB
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+
+/* The crypto wrapper header is used to define policies for the cipher
+ * components used by SSL. There are 3 policies to consider:
+ *
+ * 1) MAC, the Message Authentication Code used for each Message
+ * 2) Bulk Cipher, the Cipher used to encrypt/decrypt each Message
+ * 3) Atuhentication, the Digitial Signing/Verifiaction scheme used
+ *
+ * This header doesn't rely on a specific crypto libraries internals,
+ * only the implementation should.
+ */
+
+
+#ifndef yaSSL_CRYPTO_WRAPPER_HPP
+#define yaSSL_CRYPTO_WRAPPER_HPP
+
+#include "yassl_types.hpp"
+#include // FILE
+
+
+namespace yaSSL {
+
+
+// Digest policy should implement a get_digest, update, and get sizes for pad
+// and digest
+struct Digest : public virtual_base {
+ virtual void get_digest(byte*) = 0;
+ virtual void get_digest(byte*, const byte*, unsigned int) = 0;
+ virtual void update(const byte*, unsigned int) = 0;
+ virtual uint get_digestSize() const = 0;
+ virtual uint get_padSize() const = 0;
+ virtual ~Digest() {}
+};
+
+
+// For use with NULL Digests
+struct NO_MAC : public Digest {
+ void get_digest(byte*);
+ void get_digest(byte*, const byte*, unsigned int);
+ void update(const byte*, unsigned int);
+ uint get_digestSize() const;
+ uint get_padSize() const;
+};
+
+
+// MD5 Digest
+class MD5 : public Digest {
+public:
+ void get_digest(byte*);
+ void get_digest(byte*, const byte*, unsigned int);
+ void update(const byte*, unsigned int);
+ uint get_digestSize() const;
+ uint get_padSize() const;
+ MD5();
+ ~MD5();
+ MD5(const MD5&);
+ MD5& operator=(const MD5&);
+private:
+ struct MD5Impl;
+ MD5Impl* pimpl_;
+};
+
+
+// SHA-1 Digest
+class SHA : public Digest {
+public:
+ void get_digest(byte*);
+ void get_digest(byte*, const byte*, unsigned int);
+ void update(const byte*, unsigned int);
+ uint get_digestSize() const;
+ uint get_padSize() const;
+ SHA();
+ ~SHA();
+ SHA(const SHA&);
+ SHA& operator=(const SHA&);
+private:
+ struct SHAImpl;
+ SHAImpl* pimpl_;
+
+};
+
+
+// RIPEMD-160 Digest
+class RMD : public Digest {
+public:
+ void get_digest(byte*);
+ void get_digest(byte*, const byte*, unsigned int);
+ void update(const byte*, unsigned int);
+ uint get_digestSize() const;
+ uint get_padSize() const;
+ RMD();
+ ~RMD();
+ RMD(const RMD&);
+ RMD& operator=(const RMD&);
+private:
+ struct RMDImpl;
+ RMDImpl* pimpl_;
+
+};
+
+
+// HMAC_MD5
+class HMAC_MD5 : public Digest {
+public:
+ void get_digest(byte*);
+ void get_digest(byte*, const byte*, unsigned int);
+ void update(const byte*, unsigned int);
+ uint get_digestSize() const;
+ uint get_padSize() const;
+ HMAC_MD5(const byte*, unsigned int);
+ ~HMAC_MD5();
+private:
+ struct HMAC_MD5Impl;
+ HMAC_MD5Impl* pimpl_;
+
+ HMAC_MD5(const HMAC_MD5&);
+ HMAC_MD5& operator=(const HMAC_MD5&);
+};
+
+
+// HMAC_SHA-1
+class HMAC_SHA : public Digest {
+public:
+ void get_digest(byte*);
+ void get_digest(byte*, const byte*, unsigned int);
+ void update(const byte*, unsigned int);
+ uint get_digestSize() const;
+ uint get_padSize() const;
+ HMAC_SHA(const byte*, unsigned int);
+ ~HMAC_SHA();
+private:
+ struct HMAC_SHAImpl;
+ HMAC_SHAImpl* pimpl_;
+
+ HMAC_SHA(const HMAC_SHA&);
+ HMAC_SHA& operator=(const HMAC_SHA&);
+};
+
+
+// HMAC_RMD
+class HMAC_RMD : public Digest {
+public:
+ void get_digest(byte*);
+ void get_digest(byte*, const byte*, unsigned int);
+ void update(const byte*, unsigned int);
+ uint get_digestSize() const;
+ uint get_padSize() const;
+ HMAC_RMD(const byte*, unsigned int);
+ ~HMAC_RMD();
+private:
+ struct HMAC_RMDImpl;
+ HMAC_RMDImpl* pimpl_;
+
+ HMAC_RMD(const HMAC_RMD&);
+ HMAC_RMD& operator=(const HMAC_RMD&);
+};
+
+
+// BulkCipher policy should implement encrypt, decrypt, get block size,
+// and set keys for encrypt and decrypt
+struct BulkCipher : public virtual_base {
+ virtual void encrypt(byte*, const byte*, unsigned int) = 0;
+ virtual void decrypt(byte*, const byte*, unsigned int) = 0;
+ virtual void set_encryptKey(const byte*, const byte* = 0) = 0;
+ virtual void set_decryptKey(const byte*, const byte* = 0) = 0;
+ virtual uint get_blockSize() const = 0;
+ virtual int get_keySize() const = 0;
+ virtual int get_ivSize() const = 0;
+ virtual ~BulkCipher() {}
+};
+
+
+// For use with NULL Ciphers
+struct NO_Cipher : public BulkCipher {
+ void encrypt(byte*, const byte*, unsigned int) {}
+ void decrypt(byte*, const byte*, unsigned int) {}
+ void set_encryptKey(const byte*, const byte*) {}
+ void set_decryptKey(const byte*, const byte*) {}
+ uint get_blockSize() const { return 0; }
+ int get_keySize() const { return 0; }
+ int get_ivSize() const { return 0; }
+};
+
+
+// SSLv3 and TLSv1 always use DES in CBC mode so IV is required
+class DES : public BulkCipher {
+public:
+ void encrypt(byte*, const byte*, unsigned int);
+ void decrypt(byte*, const byte*, unsigned int);
+ void set_encryptKey(const byte*, const byte*);
+ void set_decryptKey(const byte*, const byte*);
+ uint get_blockSize() const { return DES_BLOCK; }
+ int get_keySize() const { return DES_KEY_SZ; }
+ int get_ivSize() const { return DES_IV_SZ; }
+ DES();
+ ~DES();
+private:
+ struct DESImpl;
+ DESImpl* pimpl_;
+
+ DES(const DES&); // hide copy
+ DES& operator=(const DES&); // & assign
+};
+
+
+// 3DES Encrypt-Decrypt-Encrypt in CBC mode
+class DES_EDE : public BulkCipher {
+public:
+ void encrypt(byte*, const byte*, unsigned int);
+ void decrypt(byte*, const byte*, unsigned int);
+ void set_encryptKey(const byte*, const byte*);
+ void set_decryptKey(const byte*, const byte*);
+ uint get_blockSize() const { return DES_BLOCK; }
+ int get_keySize() const { return DES_EDE_KEY_SZ; }
+ int get_ivSize() const { return DES_IV_SZ; }
+ DES_EDE();
+ ~DES_EDE();
+private:
+ struct DES_EDEImpl;
+ DES_EDEImpl* pimpl_;
+
+ DES_EDE(const DES_EDE&); // hide copy
+ DES_EDE& operator=(const DES_EDE&); // & assign
+};
+
+
+// Alledged RC4
+class RC4 : public BulkCipher {
+public:
+ void encrypt(byte*, const byte*, unsigned int);
+ void decrypt(byte*, const byte*, unsigned int);
+ void set_encryptKey(const byte*, const byte*);
+ void set_decryptKey(const byte*, const byte*);
+ uint get_blockSize() const { return 0; }
+ int get_keySize() const { return RC4_KEY_SZ; }
+ int get_ivSize() const { return 0; }
+ RC4();
+ ~RC4();
+private:
+ struct RC4Impl;
+ RC4Impl* pimpl_;
+
+ RC4(const RC4&); // hide copy
+ RC4& operator=(const RC4&); // & assign
+};
+
+
+// AES
+class AES : public BulkCipher {
+public:
+ void encrypt(byte*, const byte*, unsigned int);
+ void decrypt(byte*, const byte*, unsigned int);
+ void set_encryptKey(const byte*, const byte*);
+ void set_decryptKey(const byte*, const byte*);
+ uint get_blockSize() const { return AES_BLOCK_SZ; }
+ int get_keySize() const;
+ int get_ivSize() const { return AES_IV_SZ; }
+ explicit AES(unsigned int = AES_128_KEY_SZ);
+ ~AES();
+private:
+ struct AESImpl;
+ AESImpl* pimpl_;
+
+ AES(const AES&); // hide copy
+ AES& operator=(const AES&); // & assign
+};
+
+
+// Random number generator
+class RandomPool {
+public:
+ void Fill(opaque* dst, uint sz) const;
+ RandomPool();
+ ~RandomPool();
+
+ int GetError() const;
+
+ friend class RSA;
+ friend class DSS;
+ friend class DiffieHellman;
+private:
+ struct RandomImpl;
+ RandomImpl* pimpl_;
+
+ RandomPool(const RandomPool&); // hide copy
+ RandomPool& operator=(const RandomPool&); // & assign
+};
+
+
+// Authentication policy should implement sign, and verify
+struct Auth : public virtual_base {
+ virtual void sign(byte*, const byte*, unsigned int, const RandomPool&) = 0;
+ virtual bool verify(const byte*, unsigned int, const byte*,
+ unsigned int) = 0;
+ virtual uint get_signatureLength() const = 0;
+ virtual ~Auth() {}
+};
+
+
+// For use with NULL Authentication schemes
+struct NO_Auth : public Auth {
+ void sign(byte*, const byte*, unsigned int, const RandomPool&) {}
+ bool verify(const byte*, unsigned int, const byte*, unsigned int)
+ { return true; }
+};
+
+
+// Digitial Signature Standard scheme
+class DSS : public Auth {
+public:
+ void sign(byte*, const byte*, unsigned int, const RandomPool&);
+ bool verify(const byte*, unsigned int, const byte*, unsigned int);
+ uint get_signatureLength() const;
+ DSS(const byte*, unsigned int, bool publicKey = true);
+ ~DSS();
+private:
+ struct DSSImpl;
+ DSSImpl* pimpl_;
+
+ DSS(const DSS&);
+ DSS& operator=(const DSS&);
+};
+
+
+// RSA Authentication and exchange
+class RSA : public Auth {
+public:
+ void sign(byte*, const byte*, unsigned int, const RandomPool&);
+ bool verify(const byte*, unsigned int, const byte*, unsigned int);
+ void encrypt(byte*, const byte*, unsigned int, const RandomPool&);
+ void decrypt(byte*, const byte*, unsigned int, const RandomPool&);
+ uint get_signatureLength() const;
+ uint get_cipherLength() const;
+ RSA(const byte*, unsigned int, bool publicKey = true);
+ ~RSA();
+private:
+ struct RSAImpl;
+ RSAImpl* pimpl_;
+
+ RSA(const RSA&); // hide copy
+ RSA& operator=(const RSA&); // & assing
+};
+
+
+class Integer;
+
+// Diffie-Hellman agreement
+// hide for now TODO: figure out a way to give access to C clients p and g args
+class DiffieHellman {
+public:
+ DiffieHellman(const byte*, unsigned int, const byte*, unsigned int,
+ const byte*, unsigned int, const RandomPool& random);
+ //DiffieHellman(const char*, const RandomPool&);
+ DiffieHellman(const Integer&, const Integer&, const RandomPool&);
+ ~DiffieHellman();
+
+ DiffieHellman(const DiffieHellman&);
+ DiffieHellman& operator=(const DiffieHellman&);
+
+ uint get_agreedKeyLength() const;
+ const byte* get_agreedKey() const;
+ const byte* get_publicKey() const;
+ void makeAgreement(const byte*, unsigned int);
+
+ void set_sizes(int&, int&, int&) const;
+ void get_parms(byte*, byte*, byte*) const;
+private:
+ struct DHImpl;
+ DHImpl* pimpl_;
+};
+
+
+// Lagrge Integer
+class Integer {
+public:
+ Integer();
+ ~Integer();
+
+ Integer(const Integer&);
+ Integer& operator=(const Integer&);
+
+ void assign(const byte*, unsigned int);
+
+ friend class DiffieHellman;
+private:
+ struct IntegerImpl;
+ IntegerImpl* pimpl_;
+};
+
+
+class x509;
+
+
+struct EncryptedInfo {
+ enum { IV_SZ = 32, NAME_SZ = 80 };
+ char name[NAME_SZ]; // max one line
+ byte iv[IV_SZ]; // in base16 rep
+ uint ivSz;
+ bool set;
+
+ EncryptedInfo() : ivSz(0), set(false) {}
+};
+
+x509* PemToDer(FILE*, CertType, EncryptedInfo* info = 0);
+
+
+} // naemspace
+
+#endif // yaSSL_CRYPTO_WRAPPER_HPP
diff --git a/dep/mysqllite/extra/yassl/include/factory.hpp b/dep/mysqllite/extra/yassl/include/factory.hpp
new file mode 100644
index 0000000000..e66e32dcdf
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/factory.hpp
@@ -0,0 +1,101 @@
+/*
+ Copyright (C) 2000-2007 MySQL AB
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+/* The factory header defines an Object Factory, used by SSL message and
+ * handshake types.
+ *
+ * See Desgin Pattern in GoF and Alexandrescu's chapter in Modern C++ Design,
+ * page 208
+ */
+
+
+
+#ifndef yaSSL_FACTORY_HPP
+#define yaSSL_FACTORY_HPP
+
+#include STL_VECTOR_FILE
+#include STL_PAIR_FILE
+
+
+namespace STL = STL_NAMESPACE;
+
+
+
+
+
+namespace yaSSL {
+
+
+// Factory uses its callback map to create objects by id,
+// returning an abstract base pointer
+template
+class Factory {
+ typedef STL::pair CallBack;
+ typedef STL::vector CallBackVector;
+
+ CallBackVector callbacks_;
+public:
+ // pass function pointer to register all callbacks upon creation
+ explicit Factory(void (*init)(Factory&))
+ {
+ init(*this);
+ }
+
+ // reserve place in vector before registering, used by init funcion
+ void Reserve(size_t sz)
+ {
+ callbacks_.reserve(sz);
+ }
+
+ // register callback
+ void Register(const IdentifierType& id, ProductCreator pc)
+ {
+ callbacks_.push_back(STL::make_pair(id, pc));
+ }
+
+ // THE Creator, returns a new object of the proper type or 0
+ AbstractProduct* CreateObject(const IdentifierType& id) const
+ {
+ typedef typename STL::vector::const_iterator cIter;
+
+ cIter first = callbacks_.begin();
+ cIter last = callbacks_.end();
+
+ while (first != last) {
+ if (first->first == id)
+ break;
+ ++first;
+ }
+
+ if (first == callbacks_.end())
+ return 0;
+ return (first->second)();
+ }
+private:
+ Factory(const Factory&); // hide copy
+ Factory& operator=(const Factory&); // and assign
+};
+
+
+} // naemspace
+
+#endif // yaSSL_FACTORY_HPP
diff --git a/dep/mysqllite/extra/yassl/include/handshake.hpp b/dep/mysqllite/extra/yassl/include/handshake.hpp
new file mode 100644
index 0000000000..549a31bf3e
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/handshake.hpp
@@ -0,0 +1,69 @@
+/*
+ Copyright (C) 2000-2007 MySQL AB
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+/* The handshake header declares function prototypes for creating and reading
+ * the various handshake messages.
+ */
+
+
+
+#ifndef yaSSL_HANDSHAKE_HPP
+#define yaSSL_HANDSHAKE_HPP
+
+#include "yassl_types.hpp"
+
+
+namespace yaSSL {
+
+// forward decls
+class SSL;
+class Finished;
+class Data;
+class Alert;
+struct Hashes;
+
+enum BufferOutput { buffered, unbuffered };
+
+void sendClientHello(SSL&);
+void sendServerHello(SSL&, BufferOutput = buffered);
+void sendServerHelloDone(SSL&, BufferOutput = buffered);
+void sendClientKeyExchange(SSL&, BufferOutput = buffered);
+void sendServerKeyExchange(SSL&, BufferOutput = buffered);
+void sendChangeCipher(SSL&, BufferOutput = buffered);
+void sendFinished(SSL&, ConnectionEnd, BufferOutput = buffered);
+void sendCertificate(SSL&, BufferOutput = buffered);
+void sendCertificateRequest(SSL&, BufferOutput = buffered);
+void sendCertificateVerify(SSL&, BufferOutput = buffered);
+int sendData(SSL&, const void*, int);
+int sendAlert(SSL& ssl, const Alert& alert);
+
+int receiveData(SSL&, Data&, bool peek = false);
+void processReply(SSL&);
+
+void buildFinished(SSL&, Finished&, const opaque*);
+void build_certHashes(SSL&, Hashes&);
+
+void hmac(SSL&, byte*, const byte*, uint, ContentType, bool verify = false);
+void TLS_hmac(SSL&, byte*, const byte*, uint, ContentType,
+ bool verify = false);
+void PRF(byte* digest, uint digLen, const byte* secret, uint secLen,
+ const byte* label, uint labLen, const byte* seed, uint seedLen);
+
+} // naemspace
+
+#endif // yaSSL_HANDSHAKE_HPP
diff --git a/dep/mysqllite/extra/yassl/include/lock.hpp b/dep/mysqllite/extra/yassl/include/lock.hpp
new file mode 100644
index 0000000000..99829b0b6d
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/lock.hpp
@@ -0,0 +1,95 @@
+/*
+ Copyright (C) 2000-2007 MySQL AB
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+/* lock.hpp provides an os specific Lock, locks mutex on entry and unlocks
+ * automatically upon exit, no-ops provided for Single Threaded
+*/
+
+#ifndef yaSSL_LOCK_HPP
+#define yaSSL_LOCK_HPP
+
+/*
+ Visual Studio Source Annotations header (sourceannotations.h) fails
+ to compile if outside of the global namespace.
+*/
+#ifdef YASSL_THREAD_SAFE
+#ifdef _WIN32
+#include
+#endif
+#endif
+
+namespace yaSSL {
+
+
+#ifdef YASSL_THREAD_SAFE
+ #ifdef _WIN32
+
+ class Mutex {
+ CRITICAL_SECTION cs_;
+ public:
+ Mutex();
+ ~Mutex();
+
+ class Lock;
+ friend class Lock;
+
+ class Lock {
+ Mutex& mutex_;
+ public:
+ explicit Lock(Mutex& lm);
+ ~Lock();
+ };
+ };
+ #else // _WIN32
+ #include
+
+ class Mutex {
+ pthread_mutex_t mutex_;
+ public:
+
+ Mutex();
+ ~Mutex();
+
+ class Lock;
+ friend class Lock;
+
+ class Lock {
+ Mutex& mutex_;
+ public:
+ explicit Lock(Mutex& lm);
+ ~Lock();
+ };
+ };
+
+ #endif // _WIN32
+#else // YASSL_THREAD_SAFE (WE'RE SINGLE)
+
+ class Mutex {
+ public:
+ class Lock {
+ public:
+ explicit Lock(Mutex&) {}
+ };
+ };
+
+#endif // YASSL_THREAD_SAFE
+
+
+
+} // namespace
+#endif // yaSSL_LOCK_HPP
diff --git a/dep/mysqllite/extra/yassl/include/log.hpp b/dep/mysqllite/extra/yassl/include/log.hpp
new file mode 100644
index 0000000000..fb480eeefb
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/log.hpp
@@ -0,0 +1,55 @@
+/*
+ Copyright (C) 2000-2007 MySQL AB
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+
+/* yaSSL log interface
+ *
+ */
+
+#ifndef yaSSL_LOG_HPP
+#define yaSSL_LOG_HPP
+
+#include "socket_wrapper.hpp"
+
+#ifdef YASSL_LOG
+#include
+#endif
+
+namespace yaSSL {
+
+typedef unsigned int uint;
+
+
+// Debug logger
+class Log {
+#ifdef YASSL_LOG
+ FILE* log_;
+#endif
+public:
+ explicit Log(const char* str = "yaSSL.log");
+ ~Log();
+
+ void Trace(const char*);
+ void ShowTCP(socket_t, bool ended = false);
+ void ShowData(uint, bool sent = false);
+};
+
+
+} // naemspace
+
+#endif // yaSSL_LOG_HPP
diff --git a/dep/mysqllite/extra/yassl/include/openssl/crypto.h b/dep/mysqllite/extra/yassl/include/openssl/crypto.h
new file mode 100644
index 0000000000..f53e523102
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/crypto.h
@@ -0,0 +1,18 @@
+/* crypto.h for openSSL */
+
+#ifndef ysSSL_crypto_h__
+#define yaSSL_crypto_h__
+
+#ifdef YASSL_PREFIX
+#include "prefix_crypto.h"
+#endif
+
+const char* SSLeay_version(int type);
+
+#define SSLEAY_NUMBER_DEFINED
+#define SSLEAY_VERSION 0x0900L
+#define SSLEAY_VERSION_NUMBER SSLEAY_VERSION
+
+
+#endif /* yaSSL_crypto_h__ */
+
diff --git a/dep/mysqllite/extra/yassl/include/openssl/des.h b/dep/mysqllite/extra/yassl/include/openssl/des.h
new file mode 100644
index 0000000000..67be7eecfb
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/des.h
@@ -0,0 +1 @@
+/* des.h for openssl */
diff --git a/dep/mysqllite/extra/yassl/include/openssl/des_old.h b/dep/mysqllite/extra/yassl/include/openssl/des_old.h
new file mode 100644
index 0000000000..40e8fbc02a
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/des_old.h
@@ -0,0 +1 @@
+/* des_old.h for openvn */
diff --git a/dep/mysqllite/extra/yassl/include/openssl/engine.h b/dep/mysqllite/extra/yassl/include/openssl/engine.h
new file mode 100644
index 0000000000..39952fcae8
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/engine.h
@@ -0,0 +1,5 @@
+/* engine.h for libcurl */
+
+#undef HAVE_OPENSSL_ENGINE_H
+
+
diff --git a/dep/mysqllite/extra/yassl/include/openssl/err.h b/dep/mysqllite/extra/yassl/include/openssl/err.h
new file mode 100644
index 0000000000..45ac1ca246
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/err.h
@@ -0,0 +1,8 @@
+/* err.h for openssl */
+
+#ifndef yaSSL_err_h__
+#define yaSSL_err_h__
+
+
+
+#endif /* yaSSL_err_h__ */
diff --git a/dep/mysqllite/extra/yassl/include/openssl/evp.h b/dep/mysqllite/extra/yassl/include/openssl/evp.h
new file mode 100644
index 0000000000..1d66b08df4
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/evp.h
@@ -0,0 +1,10 @@
+/* evp.h for openSSL */
+
+#ifndef SSLEAY_NUMBER_DEFINED
+#define SSLEAY_NUMBER_DEFINED
+
+/* for OpenVPN */
+#define SSLEAY_VERSION_NUMBER 0x0090700f
+
+
+#endif /* SSLEAY_NUMBER_DEFINED */
diff --git a/dep/mysqllite/extra/yassl/include/openssl/hmac.h b/dep/mysqllite/extra/yassl/include/openssl/hmac.h
new file mode 100644
index 0000000000..a2eae4c08c
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/hmac.h
@@ -0,0 +1 @@
+/* hmac.h for openvpn */
diff --git a/dep/mysqllite/extra/yassl/include/openssl/lhash.h b/dep/mysqllite/extra/yassl/include/openssl/lhash.h
new file mode 100644
index 0000000000..01f8535f86
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/lhash.h
@@ -0,0 +1,2 @@
+/* lhash.h for openSSL */
+
diff --git a/dep/mysqllite/extra/yassl/include/openssl/md4.h b/dep/mysqllite/extra/yassl/include/openssl/md4.h
new file mode 100644
index 0000000000..2e99f977fc
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/md4.h
@@ -0,0 +1 @@
+/* md4.h for libcurl */
diff --git a/dep/mysqllite/extra/yassl/include/openssl/md5.h b/dep/mysqllite/extra/yassl/include/openssl/md5.h
new file mode 100644
index 0000000000..dfaf9799c4
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/md5.h
@@ -0,0 +1,4 @@
+/* md5.h for openssl */
+
+#include "ssl.h" /* in there for now */
+
diff --git a/dep/mysqllite/extra/yassl/include/openssl/objects.h b/dep/mysqllite/extra/yassl/include/openssl/objects.h
new file mode 100644
index 0000000000..99f2326e51
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/objects.h
@@ -0,0 +1 @@
+/* objects.h for openvpn */
diff --git a/dep/mysqllite/extra/yassl/include/openssl/opensslv.h b/dep/mysqllite/extra/yassl/include/openssl/opensslv.h
new file mode 100644
index 0000000000..d932130684
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/opensslv.h
@@ -0,0 +1,12 @@
+/* opensslv.h compatibility */
+
+#ifndef yaSSL_opensslv_h__
+#define yaSSL_opensslv_h__
+
+
+/* api version compatibility */
+#define OPENSSL_VERSION_NUMBER 0x0090700f
+
+
+#endif /* yaSSLopensslv_h__ */
+
diff --git a/dep/mysqllite/extra/yassl/include/openssl/pem.h b/dep/mysqllite/extra/yassl/include/openssl/pem.h
new file mode 100644
index 0000000000..b4c63d56a4
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/pem.h
@@ -0,0 +1 @@
+/* pem.h for libcurl */
diff --git a/dep/mysqllite/extra/yassl/include/openssl/pkcs12.h b/dep/mysqllite/extra/yassl/include/openssl/pkcs12.h
new file mode 100644
index 0000000000..e452fc879c
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/pkcs12.h
@@ -0,0 +1,5 @@
+/* pkcs12.h for libcurl */
+
+
+#undef HAVE_OPENSSL_PKCS12_H
+
diff --git a/dep/mysqllite/extra/yassl/include/openssl/prefix_crypto.h b/dep/mysqllite/extra/yassl/include/openssl/prefix_crypto.h
new file mode 100644
index 0000000000..3fa5f32c62
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/prefix_crypto.h
@@ -0,0 +1 @@
+#define SSLeay_version yaSSLeay_version
diff --git a/dep/mysqllite/extra/yassl/include/openssl/prefix_ssl.h b/dep/mysqllite/extra/yassl/include/openssl/prefix_ssl.h
new file mode 100644
index 0000000000..138d9fb882
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/prefix_ssl.h
@@ -0,0 +1,169 @@
+#define Copyright yaCopyright
+#define yaSSL_CleanUp yayaSSL_CleanUp
+#define BN_bin2bn yaBN_bin2bn
+#define DH_new yaDH_new
+#define DH_free yaDH_free
+#define RSA_free yaRSA_free
+#define RSA_generate_key yaRSA_generate_key
+#define X509_free yaX509_free
+#define X509_STORE_CTX_get_current_cert yaX509_STORE_CTX_get_current_cert
+#define X509_STORE_CTX_get_error yaX509_STORE_CTX_get_error
+#define X509_STORE_CTX_get_error_depth yaX509_STORE_CTX_get_error_depth
+#define X509_NAME_oneline yaX509_NAME_oneline
+#define X509_get_issuer_name yaX509_get_issuer_name
+#define X509_get_subject_name yaX509_get_subject_name
+#define X509_verify_cert_error_string yaX509_verify_cert_error_string
+#define X509_LOOKUP_add_dir yaX509_LOOKUP_add_dir
+#define X509_LOOKUP_load_file yaX509_LOOKUP_load_file
+#define X509_LOOKUP_hash_dir yaX509_LOOKUP_hash_dir
+#define X509_LOOKUP_file yaX509_LOOKUP_file
+#define X509_STORE_add_lookup yaX509_STORE_add_lookup
+#define X509_STORE_new yaX509_STORE_new
+#define X509_STORE_get_by_subject yaX509_STORE_get_by_subject
+#define ERR_get_error_line_data yaERR_get_error_line_data
+#define ERR_print_errors_fp yaERR_print_errors_fp
+#define ERR_error_string yaERR_error_string
+#define ERR_remove_state yaERR_remove_state
+#define ERR_get_error yaERR_get_error
+#define ERR_peek_error yaERR_peek_error
+#define ERR_GET_REASON yaERR_GET_REASON
+#define SSL_CTX_new yaSSL_CTX_new
+#define SSL_new yaSSL_new
+#define SSL_set_fd yaSSL_set_fd
+#define SSL_get_fd yaSSL_get_fd
+#define SSL_connect yaSSL_connect
+#define SSL_write yaSSL_write
+#define SSL_read yaSSL_read
+#define SSL_accept yaSSL_accept
+#define SSL_CTX_free yaSSL_CTX_free
+#define SSL_free yaSSL_free
+#define SSL_clear yaSSL_clear
+#define SSL_shutdown yaSSL_shutdown
+#define SSL_set_connect_state yaSSL_set_connect_state
+#define SSL_set_accept_state yaSSL_set_accept_state
+#define SSL_do_handshake yaSSL_do_handshake
+#define SSL_get_cipher yaSSL_get_cipher
+#define SSL_get_cipher_name yaSSL_get_cipher_name
+#define SSL_get_shared_ciphers yaSSL_get_shared_ciphers
+#define SSL_get_cipher_list yaSSL_get_cipher_list
+#define SSL_get_version yaSSL_get_version
+#define SSLeay_version yaSSLeay_version
+#define SSL_get_error yaSSL_get_error
+#define SSL_load_error_strings yaSSL_load_error_strings
+#define SSL_set_session yaSSL_set_session
+#define SSL_get_session yaSSL_get_session
+#define SSL_flush_sessions yaSSL_flush_sessions
+#define SSL_SESSION_set_timeout yaSSL_SESSION_set_timeout
+#define SSL_CTX_set_session_cache_mode yaSSL_CTX_set_session_cache_mode
+#define SSL_get_peer_certificate yaSSL_get_peer_certificate
+#define SSL_get_verify_result yaSSL_get_verify_result
+#define SSL_CTX_set_verify yaSSL_CTX_set_verify
+#define SSL_CTX_load_verify_locations yaSSL_CTX_load_verify_locations
+#define SSL_CTX_set_default_verify_paths yaSSL_CTX_set_default_verify_paths
+#define SSL_CTX_check_private_key yaSSL_CTX_check_private_key
+#define SSL_CTX_set_session_id_context yaSSL_CTX_set_session_id_context
+#define SSL_CTX_set_tmp_rsa_callback yaSSL_CTX_set_tmp_rsa_callback
+#define SSL_CTX_set_options yaSSL_CTX_set_options
+#define SSL_CTX_set_session_cache_mode yaSSL_CTX_set_session_cache_mode
+#define SSL_CTX_set_timeout yaSSL_CTX_set_timeout
+#define SSL_CTX_use_certificate_chain_file yaSSL_CTX_use_certificate_chain_file
+#define SSL_CTX_set_default_passwd_cb yaSSL_CTX_set_default_passwd_cb
+#define SSL_CTX_use_RSAPrivateKey_file yaSSL_CTX_use_RSAPrivateKey_file
+#define SSL_CTX_set_info_callback yaSSL_CTX_set_info_callback
+#define SSL_CTX_sess_accept yaSSL_CTX_sess_accept
+#define SSL_CTX_sess_connect yaSSL_CTX_sess_connect
+#define SSL_CTX_sess_accept_good yaSSL_CTX_sess_accept_good
+#define SSL_CTX_sess_connect_good yaSSL_CTX_sess_connect_good
+#define SSL_CTX_sess_accept_renegotiate yaSSL_CTX_sess_accept_renegotiate
+#define SSL_CTX_sess_connect_renegotiate yaSSL_CTX_sess_connect_renegotiate
+#define SSL_CTX_sess_hits yaSSL_CTX_sess_hits
+#define SSL_CTX_sess_cb_hits yaSSL_CTX_sess_cb_hits
+#define SSL_CTX_sess_cache_full yaSSL_CTX_sess_cache_full
+#define SSL_CTX_sess_misses yaSSL_CTX_sess_misses
+#define SSL_CTX_sess_timeouts yaSSL_CTX_sess_timeouts
+#define SSL_CTX_sess_number yaSSL_CTX_sess_number
+#define SSL_CTX_sess_get_cache_size yaSSL_CTX_sess_get_cache_size
+#define SSL_CTX_get_verify_mode yaSSL_CTX_get_verify_mode
+#define SSL_get_verify_mode yaSSL_get_verify_mode
+#define SSL_CTX_get_verify_depth yaSSL_CTX_get_verify_depth
+#define SSL_get_verify_depth yaSSL_get_verify_depth
+#define SSL_get_default_timeout yaSSL_get_default_timeout
+#define SSL_CTX_get_session_cache_mode yaSSL_CTX_get_session_cache_mode
+#define SSL_session_reused yaSSL_session_reused
+#define SSL_set_rfd yaSSL_set_rfd
+#define SSL_set_wfd yaSSL_set_wfd
+#define SSL_set_shutdown yaSSL_set_shutdown
+#define SSL_set_quiet_shutdown yaSSL_set_quiet_shutdown
+#define SSL_get_quiet_shutdown yaSSL_get_quiet_shutdown
+#define SSL_want_read yaSSL_want_read
+#define SSL_want_write yaSSL_want_write
+#define SSL_pending yaSSL_pending
+#define SSLv3_method yaSSLv3_method
+#define SSLv3_server_method yaSSLv3_server_method
+#define SSLv3_client_method yaSSLv3_client_method
+#define TLSv1_server_method yaTLSv1_server_method
+#define TLSv1_client_method yaTLSv1_client_method
+#define TLSv1_1_server_method yaTLSv1_1_server_method
+#define TLSv1_1_client_method yaTLSv1_1_client_method
+#define SSLv23_server_method yaSSLv23_server_method
+#define SSL_CTX_use_certificate_file yaSSL_CTX_use_certificate_file
+#define SSL_CTX_use_PrivateKey_file yaSSL_CTX_use_PrivateKey_file
+#define SSL_CTX_set_cipher_list yaSSL_CTX_set_cipher_list
+#define SSL_CTX_sess_set_cache_size yaSSL_CTX_sess_set_cache_size
+#define SSL_CTX_set_tmp_dh yaSSL_CTX_set_tmp_dh
+#define OpenSSL_add_all_algorithms yaOpenSSL_add_all_algorithms
+#define SSL_library_init yaSSL_library_init
+#define SSLeay_add_ssl_algorithms yaSSLeay_add_ssl_algorithms
+#define SSL_get_current_cipher yaSSL_get_current_cipher
+#define SSL_CIPHER_description yaSSL_CIPHER_description
+#define SSL_alert_type_string_long yaSSL_alert_type_string_long
+#define SSL_alert_desc_string_long yaSSL_alert_desc_string_long
+#define SSL_state_string_long yaSSL_state_string_long
+#define EVP_md5 yaEVP_md5
+#define EVP_des_ede3_cbc yaEVP_des_ede3_cbc
+#define EVP_BytesToKey yaEVP_BytesToKey
+#define DES_set_key_unchecked yaDES_set_key_unchecked
+#define DES_ede3_cbc_encrypt yaDES_ede3_cbc_encrypt
+#define RAND_screen yaRAND_screen
+#define RAND_file_name yaRAND_file_name
+#define RAND_write_file yaRAND_write_file
+#define RAND_load_file yaRAND_load_file
+#define RAND_status yaRAND_status
+#define RAND_bytes yaRAND_bytes
+#define DES_set_key yaDES_set_key
+#define DES_set_odd_parity yaDES_set_odd_parity
+#define DES_ecb_encrypt yaDES_ecb_encrypt
+#define SSL_CTX_set_default_passwd_cb_userdata yaSSL_CTX_set_default_passwd_cb_userdata
+#define SSL_SESSION_free yaSSL_SESSION_free
+#define SSL_peek yaSSL_peek
+#define SSL_get_certificate yaSSL_get_certificate
+#define SSL_get_privatekey yaSSL_get_privatekey
+#define X509_get_pubkey yaX509_get_pubkey
+#define EVP_PKEY_copy_parameters yaEVP_PKEY_copy_parameters
+#define EVP_PKEY_free yaEVP_PKEY_free
+#define ERR_error_string_n yaERR_error_string_n
+#define ERR_free_strings yaERR_free_strings
+#define EVP_cleanup yaEVP_cleanup
+#define X509_get_ext_d2i yaX509_get_ext_d2i
+#define GENERAL_NAMES_free yaGENERAL_NAMES_free
+#define sk_GENERAL_NAME_num yask_GENERAL_NAME_num
+#define sk_GENERAL_NAME_value yask_GENERAL_NAME_value
+#define ASN1_STRING_data yaASN1_STRING_data
+#define ASN1_STRING_length yaASN1_STRING_length
+#define ASN1_STRING_type yaASN1_STRING_type
+#define X509_NAME_get_index_by_NID yaX509_NAME_get_index_by_NID
+#define X509_NAME_ENTRY_get_data yaX509_NAME_ENTRY_get_data
+#define X509_NAME_get_entry yaX509_NAME_get_entry
+#define ASN1_STRING_to_UTF8 yaASN1_STRING_to_UTF8
+#define SSLv23_client_method yaSSLv23_client_method
+#define SSLv2_client_method yaSSLv2_client_method
+#define SSL_get1_session yaSSL_get1_session
+#define X509_get_notBefore yaX509_get_notBefore
+#define X509_get_notAfter yaX509_get_notAfter
+#define MD4_Init yaMD4_Init
+#define MD4_Update yaMD4_Update
+#define MD4_Final yaMD4_Final
+#define MD5_Init yaMD5_Init
+#define MD5_Update yaMD5_Update
+#define MD5_Final yaMD5_Final
+#define SSL_set_compression yaSSL_set_compression
diff --git a/dep/mysqllite/extra/yassl/include/openssl/rand.h b/dep/mysqllite/extra/yassl/include/openssl/rand.h
new file mode 100644
index 0000000000..df9c902034
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/rand.h
@@ -0,0 +1,2 @@
+/* rand.h for openSSL */
+
diff --git a/dep/mysqllite/extra/yassl/include/openssl/rsa.h b/dep/mysqllite/extra/yassl/include/openssl/rsa.h
new file mode 100644
index 0000000000..fe64e655bd
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/rsa.h
@@ -0,0 +1,10 @@
+/* rsa.h for openSSL */
+
+
+#ifndef yaSSL_rsa_h__
+#define yaSSL_rsa_h__
+
+enum { RSA_F4 = 1 };
+
+
+#endif /* yaSSL_rsa_h__ */
diff --git a/dep/mysqllite/extra/yassl/include/openssl/sha.h b/dep/mysqllite/extra/yassl/include/openssl/sha.h
new file mode 100644
index 0000000000..bb487c05c2
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/sha.h
@@ -0,0 +1 @@
+/* sha.h for openvpn */
diff --git a/dep/mysqllite/extra/yassl/include/openssl/ssl.h b/dep/mysqllite/extra/yassl/include/openssl/ssl.h
new file mode 100644
index 0000000000..05b34a0dc4
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/ssl.h
@@ -0,0 +1,554 @@
+/*
+ Copyright (C) 2000-2007 MySQL AB
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+/* ssl.h defines openssl compatibility layer
+ *
+ */
+
+
+
+#ifndef yaSSL_openssl_h__
+#define yaSSL_openssl_h__
+
+#ifdef YASSL_PREFIX
+#include "prefix_ssl.h"
+#endif
+
+#include /* ERR_print fp */
+#include "opensslv.h" /* for version number */
+#include "rsa.h"
+
+
+#define YASSL_VERSION "1.7.2"
+
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+ void yaSSL_CleanUp(); /* call once at end of application use to
+ free static singleton memory holders,
+ not a leak per se, but helpful when
+ looking for them */
+
+#if defined(__cplusplus)
+} // extern
+#endif
+
+#if defined(__cplusplus) && !defined(YASSL_MYSQL_COMPATIBLE)
+namespace yaSSL {
+extern "C" {
+#endif
+
+#undef X509_NAME /* wincrypt.h clash */
+
+#if defined(__cplusplus) && !defined(YASSL_MYSQL_COMPATIBLE)
+ class SSL;
+ class SSL_SESSION;
+ class SSL_METHOD;
+ class SSL_CTX;
+ class SSL_CIPHER;
+
+ class RSA;
+
+ class X509;
+ class X509_NAME;
+#else
+ typedef struct SSL SSL;
+ typedef struct SSL_SESSION SSL_SESSION;
+ typedef struct SSL_METHOD SSL_METHOD;
+ typedef struct SSL_CTX SSL_CTX;
+ typedef struct SSL_CIPHER SSL_CIPHER;
+
+ typedef struct RSA RSA;
+
+ typedef struct X509 X509;
+ typedef struct X509_NAME X509_NAME;
+#endif
+
+
+/* Big Number stuff, different file? */
+typedef struct BIGNUM BIGNUM;
+
+BIGNUM *BN_bin2bn(const unsigned char*, int, BIGNUM*);
+
+
+/* Diffie-Hellman stuff, different file? */
+/* mySQL deferences to set group parameters */
+typedef struct DH {
+ BIGNUM* p;
+ BIGNUM* g;
+} DH;
+
+DH* DH_new(void);
+void DH_free(DH*);
+
+/* RSA stuff */
+
+void RSA_free(RSA*);
+RSA* RSA_generate_key(int, unsigned long, void(*)(int, int, void*), void*);
+
+
+/* X509 stuff, different file? */
+
+typedef struct X509_STORE X509_STORE;
+typedef struct X509_LOOKUP X509_LOOKUP;
+typedef struct X509_OBJECT { char c; } X509_OBJECT;
+typedef struct X509_CRL X509_CRL;
+typedef struct X509_REVOKED X509_REVOKED;
+typedef struct X509_LOOKUP_METHOD X509_LOOKUP_METHOD;
+
+
+void X509_free(X509*);
+
+
+/* bio stuff */
+typedef struct BIO BIO;
+
+/* ASN stuff */
+
+
+
+/* because mySQL dereferences to use error and current_cert, even after calling
+ * get functions for local references */
+typedef struct X509_STORE_CTX {
+ int error;
+ int error_depth;
+ X509* current_cert;
+} X509_STORE_CTX;
+
+
+
+X509* X509_STORE_CTX_get_current_cert(X509_STORE_CTX*);
+int X509_STORE_CTX_get_error(X509_STORE_CTX*);
+int X509_STORE_CTX_get_error_depth(X509_STORE_CTX*);
+
+char* X509_NAME_oneline(X509_NAME*, char*, int);
+X509_NAME* X509_get_issuer_name(X509*);
+X509_NAME* X509_get_subject_name(X509*);
+const char* X509_verify_cert_error_string(long);
+
+int X509_LOOKUP_add_dir(X509_LOOKUP*, const char*, long);
+int X509_LOOKUP_load_file(X509_LOOKUP*, const char*, long);
+X509_LOOKUP_METHOD* X509_LOOKUP_hash_dir(void);
+X509_LOOKUP_METHOD* X509_LOOKUP_file(void);
+
+X509_LOOKUP* X509_STORE_add_lookup(X509_STORE*, X509_LOOKUP_METHOD*);
+X509_STORE* X509_STORE_new(void);
+int X509_STORE_get_by_subject(X509_STORE_CTX*, int, X509_NAME*,
+ X509_OBJECT*);
+
+
+
+
+enum { /* X509 Constants */
+ X509_V_OK = 0,
+ X509_V_ERR_CERT_CHAIN_TOO_LONG = 1,
+ X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT = 2,
+ X509_V_ERR_CERT_NOT_YET_VALID = 3,
+ X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD = 4,
+ X509_V_ERR_CERT_HAS_EXPIRED = 5,
+ X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD = 6,
+ X509_FILETYPE_PEM = 7,
+ X509_LU_X509 = 8,
+ X509_LU_CRL = 9,
+ X509_V_ERR_CRL_SIGNATURE_FAILURE = 10,
+ X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD = 11,
+ X509_V_ERR_CRL_HAS_EXPIRED = 12,
+ X509_V_ERR_CERT_REVOKED = 13,
+ X509_V_FLAG_CRL_CHECK = 14,
+ X509_V_FLAG_CRL_CHECK_ALL = 15
+};
+
+
+/* Error stuff, could move to yassl_error */
+unsigned long ERR_get_error_line_data(const char**, int*, const char**, int *);
+void ERR_print_errors_fp(FILE*);
+char* ERR_error_string(unsigned long,char*);
+void ERR_remove_state(unsigned long);
+unsigned long ERR_get_error(void);
+unsigned long ERR_peek_error(void);
+int ERR_GET_REASON(int);
+
+
+enum { /* ERR Constants */
+ ERR_TXT_STRING = 1,
+ EVP_R_BAD_DECRYPT = 2
+};
+
+/*
+ Allow type used by SSL_set_fd to be changed, default to int
+ in order to be compatible with OpenSSL
+ */
+#ifndef YASSL_SOCKET_T_DEFINED
+typedef int YASSL_SOCKET_T;
+#endif
+
+SSL_CTX* SSL_CTX_new(SSL_METHOD*);
+SSL* SSL_new(SSL_CTX*);
+int SSL_set_fd (SSL*, YASSL_SOCKET_T);
+YASSL_SOCKET_T SSL_get_fd(const SSL*);
+int SSL_connect(SSL*); /* if you get an error from connect
+ see note at top of REAMDE */
+int SSL_write(SSL*, const void*, int);
+int SSL_read(SSL*, void*, int);
+int SSL_accept(SSL*);
+void SSL_CTX_free(SSL_CTX*);
+void SSL_free(SSL*);
+int SSL_clear(SSL*);
+int SSL_shutdown(SSL*);
+
+void SSL_set_connect_state(SSL*);
+void SSL_set_accept_state(SSL*);
+int SSL_do_handshake(SSL*);
+
+const char* SSL_get_cipher(SSL*);
+const char* SSL_get_cipher_name(SSL*); /* uses SSL_get_cipher */
+char* SSL_get_shared_ciphers(SSL*, char*, int);
+const char* SSL_get_cipher_list(SSL*, int);
+const char* SSL_get_version(SSL*);
+const char* SSLeay_version(int);
+
+int SSL_get_error(SSL*, int);
+void SSL_load_error_strings(void);
+
+int SSL_set_session(SSL *ssl, SSL_SESSION *session);
+SSL_SESSION* SSL_get_session(SSL* ssl);
+void SSL_flush_sessions(SSL_CTX *ctx, long tm);
+long SSL_SESSION_set_timeout(SSL_SESSION*, long);
+long SSL_CTX_set_session_cache_mode(SSL_CTX* ctx, long mode);
+X509* SSL_get_peer_certificate(SSL*);
+long SSL_get_verify_result(SSL*);
+
+
+typedef int (*VerifyCallback)(int, X509_STORE_CTX*);
+typedef int (*pem_password_cb)(char*, int, int, void*);
+
+void SSL_CTX_set_verify(SSL_CTX*, int, VerifyCallback verify_callback);
+int SSL_CTX_load_verify_locations(SSL_CTX*, const char*, const char*);
+int SSL_CTX_set_default_verify_paths(SSL_CTX*);
+int SSL_CTX_check_private_key(SSL_CTX*);
+int SSL_CTX_set_session_id_context(SSL_CTX*, const unsigned char*,
+ unsigned int);
+
+void SSL_CTX_set_tmp_rsa_callback(SSL_CTX*, RSA*(*)(SSL*, int, int));
+long SSL_CTX_set_options(SSL_CTX*, long);
+long SSL_CTX_set_session_cache_mode(SSL_CTX*, long);
+long SSL_CTX_set_timeout(SSL_CTX*, long);
+int SSL_CTX_use_certificate_chain_file(SSL_CTX*, const char*);
+void SSL_CTX_set_default_passwd_cb(SSL_CTX*, pem_password_cb);
+int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX*, const char*, int);
+void SSL_CTX_set_info_callback(SSL_CTX*, void (*)());
+
+long SSL_CTX_sess_accept(SSL_CTX*);
+long SSL_CTX_sess_connect(SSL_CTX*);
+long SSL_CTX_sess_accept_good(SSL_CTX*);
+long SSL_CTX_sess_connect_good(SSL_CTX*);
+long SSL_CTX_sess_accept_renegotiate(SSL_CTX*);
+long SSL_CTX_sess_connect_renegotiate(SSL_CTX*);
+long SSL_CTX_sess_hits(SSL_CTX*);
+long SSL_CTX_sess_cb_hits(SSL_CTX*);
+long SSL_CTX_sess_cache_full(SSL_CTX*);
+long SSL_CTX_sess_misses(SSL_CTX*);
+long SSL_CTX_sess_timeouts(SSL_CTX*);
+long SSL_CTX_sess_number(SSL_CTX*);
+long SSL_CTX_sess_get_cache_size(SSL_CTX*);
+
+int SSL_CTX_get_verify_mode(SSL_CTX*);
+int SSL_get_verify_mode(SSL*);
+int SSL_CTX_get_verify_depth(SSL_CTX*);
+int SSL_get_verify_depth(SSL*);
+
+long SSL_get_default_timeout(SSL*);
+long SSL_CTX_get_session_cache_mode(SSL_CTX*);
+int SSL_session_reused(SSL*);
+
+int SSL_set_rfd(SSL*, int);
+int SSL_set_wfd(SSL*, int);
+void SSL_set_shutdown(SSL*, int);
+void SSL_set_quiet_shutdown(SSL *ssl,int mode);
+int SSL_get_quiet_shutdown(SSL *ssl);
+
+int SSL_want_read(SSL*);
+int SSL_want_write(SSL*);
+
+int SSL_pending(SSL*);
+
+
+enum { /* ssl Constants */
+ SSL_WOULD_BLOCK = -8,
+ SSL_BAD_STAT = -7,
+ SSL_BAD_PATH = -6,
+ SSL_BAD_FILETYPE = -5,
+ SSL_BAD_FILE = -4,
+ SSL_NOT_IMPLEMENTED = -3,
+ SSL_UNKNOWN = -2,
+ SSL_FATAL_ERROR = -1,
+ SSL_NORMAL_SHUTDOWN = 0,
+ SSL_ERROR_NONE = 0, /* for most functions */
+ SSL_FAILURE = 0, /* for some functions */
+ SSL_SUCCESS = 1,
+
+ SSL_FILETYPE_ASN1 = 10,
+ SSL_FILETYPE_PEM = 11,
+ SSL_FILETYPE_DEFAULT = 10, /* ASN1 */
+
+ SSL_VERIFY_NONE = 0,
+ SSL_VERIFY_PEER = 1,
+ SSL_VERIFY_FAIL_IF_NO_PEER_CERT = 2,
+ SSL_VERIFY_CLIENT_ONCE = 4,
+
+ SSL_SESS_CACHE_OFF = 30,
+ SSL_SESS_CACHE_CLIENT = 31,
+ SSL_SESS_CACHE_SERVER = 32,
+ SSL_SESS_CACHE_BOTH = 33,
+ SSL_SESS_CACHE_NO_AUTO_CLEAR = 34,
+ SSL_SESS_CACHE_NO_INTERNAL_LOOKUP = 35,
+
+ SSL_OP_MICROSOFT_SESS_ID_BUG = 50,
+ SSL_OP_NETSCAPE_CHALLENGE_BUG = 51,
+ SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG = 52,
+ SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG = 53,
+ SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER = 54,
+ SSL_OP_MSIE_SSLV2_RSA_PADDING = 55,
+ SSL_OP_SSLEAY_080_CLIENT_DH_BUG = 56,
+ SSL_OP_TLS_D5_BUG = 57,
+ SSL_OP_TLS_BLOCK_PADDING_BUG = 58,
+ SSL_OP_TLS_ROLLBACK_BUG = 59,
+ SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS = 60,
+ SSL_OP_ALL = 61,
+ SSL_OP_SINGLE_DH_USE = 62,
+ SSL_OP_EPHEMERAL_RSA = 63,
+ SSL_OP_NO_SSLv2 = 64,
+ SSL_OP_NO_SSLv3 = 65,
+ SSL_OP_NO_TLSv1 = 66,
+ SSL_OP_PKCS1_CHECK_1 = 67,
+ SSL_OP_PKCS1_CHECK_2 = 68,
+ SSL_OP_NETSCAPE_CA_DN_BUG = 69,
+ SSL_OP_NON_EXPORT_FIRST = 70,
+ SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG = 71,
+
+ SSL_ERROR_WANT_READ = 80,
+ SSL_ERROR_WANT_WRITE = 81,
+ SSL_ERROR_SYSCALL = 82,
+ SSL_ERROR_WANT_X509_LOOKUP = 83,
+ SSL_ERROR_ZERO_RETURN = 84,
+ SSL_ERROR_SSL = 85,
+
+ SSL_SENT_SHUTDOWN = 90,
+ SSL_RECEIVED_SHUTDOWN = 91,
+ SSL_CB_LOOP = 92,
+ SSL_ST_CONNECT = 93,
+ SSL_ST_ACCEPT = 94,
+ SSL_CB_ALERT = 95,
+ SSL_CB_READ = 96,
+ SSL_CB_HANDSHAKE_DONE = 97
+
+};
+
+
+SSL_METHOD *SSLv3_method(void);
+SSL_METHOD *SSLv3_server_method(void);
+SSL_METHOD *SSLv3_client_method(void);
+SSL_METHOD *TLSv1_server_method(void);
+SSL_METHOD *TLSv1_client_method(void);
+SSL_METHOD *TLSv1_1_server_method(void);
+SSL_METHOD *TLSv1_1_client_method(void);
+SSL_METHOD *SSLv23_server_method(void);
+
+int SSL_CTX_use_certificate_file(SSL_CTX*, const char*, int);
+int SSL_CTX_use_PrivateKey_file(SSL_CTX*, const char*, int);
+int SSL_CTX_set_cipher_list(SSL_CTX*, const char*);
+
+long SSL_CTX_sess_set_cache_size(SSL_CTX*, long);
+long SSL_CTX_set_tmp_dh(SSL_CTX*, DH*);
+
+void OpenSSL_add_all_algorithms(void);
+int SSL_library_init();
+int SSLeay_add_ssl_algorithms(void);
+
+
+SSL_CIPHER* SSL_get_current_cipher(SSL*);
+char* SSL_CIPHER_description(SSL_CIPHER*, char*, int);
+
+
+char* SSL_alert_type_string_long(int);
+char* SSL_alert_desc_string_long(int);
+char* SSL_state_string_long(SSL*);
+
+
+/* EVP stuff, des and md5, different file? */
+typedef char EVP_MD;
+
+typedef char EVP_CIPHER;
+
+typedef struct EVP_PKEY EVP_PKEY;
+
+typedef unsigned char DES_cblock[8];
+typedef const DES_cblock const_DES_cblock;
+typedef DES_cblock DES_key_schedule;
+
+enum {
+ DES_ENCRYPT = 1,
+ DES_DECRYPT = 0
+};
+
+const EVP_MD* EVP_md5(void);
+const EVP_CIPHER* EVP_des_ede3_cbc(void);
+
+typedef unsigned char opaque;
+
+int EVP_BytesToKey(const EVP_CIPHER*, const EVP_MD*, const opaque*,
+ const opaque*, int, int, opaque*, opaque*);
+
+void DES_set_key_unchecked(const_DES_cblock*, DES_key_schedule*);
+void DES_ede3_cbc_encrypt(const opaque*, opaque*, long, DES_key_schedule*,
+ DES_key_schedule*, DES_key_schedule*, DES_cblock*, int);
+
+
+/* RAND stuff */
+void RAND_screen(void);
+const char* RAND_file_name(char*, size_t);
+int RAND_write_file(const char*);
+int RAND_load_file(const char*, long);
+
+
+/* for libcurl */
+int RAND_status(void);
+int RAND_bytes(unsigned char* buf, int num);
+
+int DES_set_key(const_DES_cblock*, DES_key_schedule*);
+void DES_set_odd_parity(DES_cblock*);
+void DES_ecb_encrypt(DES_cblock*, DES_cblock*, DES_key_schedule*, int);
+
+void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX*, void* userdata);
+void SSL_SESSION_free(SSL_SESSION* session);
+int SSL_peek(SSL* ssl, void* buf, int num);
+
+X509* SSL_get_certificate(SSL* ssl);
+EVP_PKEY* SSL_get_privatekey(SSL* ssl);
+EVP_PKEY* X509_get_pubkey(X509* x);
+
+int EVP_PKEY_copy_parameters(EVP_PKEY* to, const EVP_PKEY* from);
+void EVP_PKEY_free(EVP_PKEY* pkey);
+void ERR_error_string_n(unsigned long e, char *buf, size_t len);
+void ERR_free_strings(void);
+void EVP_cleanup(void);
+
+void* X509_get_ext_d2i(X509* x, int nid, int* crit, int* idx);
+
+#define GEN_IPADD 7
+#define NID_subject_alt_name 85
+#define STACK_OF(x) x
+
+
+/* defined here because libcurl dereferences */
+typedef struct ASN1_STRING {
+ int type;
+ int length;
+ unsigned char* data;
+} ASN1_STRING;
+
+
+typedef struct GENERAL_NAME {
+ int type;
+ union {
+ ASN1_STRING* ia5;
+ } d;
+} GENERAL_NAME;
+
+void GENERAL_NAMES_free(STACK_OF(GENERAL_NAME) *x);
+
+int sk_GENERAL_NAME_num(STACK_OF(GENERAL_NAME) *x);
+GENERAL_NAME* sk_GENERAL_NAME_value(STACK_OF(GENERAL_NAME) *x, int i);
+
+
+unsigned char* ASN1_STRING_data(ASN1_STRING* x);
+int ASN1_STRING_length(ASN1_STRING* x);
+int ASN1_STRING_type(ASN1_STRING *x);
+
+typedef ASN1_STRING X509_NAME_ENTRY;
+
+int X509_NAME_get_index_by_NID(X509_NAME* name,int nid, int lastpos);
+
+ASN1_STRING* X509_NAME_ENTRY_get_data(X509_NAME_ENTRY* ne);
+X509_NAME_ENTRY* X509_NAME_get_entry(X509_NAME* name, int loc);
+
+#define OPENSSL_malloc(x) malloc(x)
+#define OPENSSL_free(x) free(x)
+
+int ASN1_STRING_to_UTF8(unsigned char** out, ASN1_STRING* in);
+
+SSL_METHOD* SSLv23_client_method(void); /* doesn't actually roll back */
+SSL_METHOD* SSLv2_client_method(void); /* will never work, no v 2 */
+
+
+SSL_SESSION* SSL_get1_session(SSL* ssl); /* what's ref count */
+
+
+#define CRYPTO_free(x) free(x)
+#define ASN1_TIME ASN1_STRING
+
+ASN1_TIME* X509_get_notBefore(X509* x);
+ASN1_TIME* X509_get_notAfter(X509* x);
+
+
+#define ASN1_UTCTIME ASN1_STRING
+#define NID_commonName 13
+#define V_ASN1_UTF8STRING 12
+#define GEN_DNS 2
+
+#define CERTFICATE_ERROR 0x14090086 /* SSLv3 error */
+
+
+typedef struct MD4_CTX {
+ int buffer[32]; /* big enough to hold, check size in Init */
+} MD4_CTX;
+
+void MD4_Init(MD4_CTX*);
+void MD4_Update(MD4_CTX*, const void*, unsigned long);
+void MD4_Final(unsigned char*, MD4_CTX*);
+
+
+typedef struct MD5_CTX {
+ int buffer[32]; /* big enough to hold, check size in Init */
+} MD5_CTX;
+
+void MD5_Init(MD5_CTX*);
+void MD5_Update(MD5_CTX*, const void*, unsigned long);
+void MD5_Final(unsigned char*, MD5_CTX*);
+
+#define MD5_DIGEST_LENGTH 16
+
+
+#define SSL_DEFAULT_CIPHER_LIST "" /* default all */
+
+
+/* yaSSL adds */
+int SSL_set_compression(SSL*); /* turn on yaSSL zlib compression */
+
+
+
+
+#if defined(__cplusplus) && !defined(YASSL_MYSQL_COMPATIBLE)
+} /* namespace */
+} /* extern "C" */
+#endif
+
+
+#endif /* yaSSL_openssl_h__ */
diff --git a/dep/mysqllite/extra/yassl/include/openssl/x509.h b/dep/mysqllite/extra/yassl/include/openssl/x509.h
new file mode 100644
index 0000000000..dcd847c033
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/x509.h
@@ -0,0 +1 @@
+/* x509.h for libcurl */
diff --git a/dep/mysqllite/extra/yassl/include/openssl/x509v3.h b/dep/mysqllite/extra/yassl/include/openssl/x509v3.h
new file mode 100644
index 0000000000..adf94af8f4
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/openssl/x509v3.h
@@ -0,0 +1 @@
+/* x509v3.h for libcurl */
diff --git a/dep/mysqllite/extra/yassl/include/socket_wrapper.hpp b/dep/mysqllite/extra/yassl/include/socket_wrapper.hpp
new file mode 100644
index 0000000000..308704c2af
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/socket_wrapper.hpp
@@ -0,0 +1,96 @@
+/*
+ Copyright (C) 2000-2007 MySQL AB
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+
+/* The socket wrapper header defines a Socket class that hides the differences
+ * between Berkely style sockets and Windows sockets, allowing transparent TCP
+ * access.
+ */
+
+
+#ifndef yaSSL_SOCKET_WRAPPER_HPP
+#define yaSSL_SOCKET_WRAPPER_HPP
+
+#include
+
+#ifdef _WIN32
+ #include
+#else
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include
+#endif
+
+
+namespace yaSSL {
+
+typedef unsigned int uint;
+
+#ifdef _WIN32
+ typedef SOCKET socket_t;
+#else
+ typedef int socket_t;
+ const socket_t INVALID_SOCKET = -1;
+ const int SD_RECEIVE = 0;
+ const int SD_SEND = 1;
+ const int SD_BOTH = 2;
+ const int SOCKET_ERROR = -1;
+#endif
+
+
+
+typedef unsigned char byte;
+
+
+// Wraps Windows Sockets and BSD Sockets
+class Socket {
+ socket_t socket_; // underlying socket descriptor
+ bool wouldBlock_; // if non-blocking data, for last read
+ bool nonBlocking_; // is option set
+public:
+ explicit Socket(socket_t s = INVALID_SOCKET);
+ ~Socket();
+
+ void set_fd(socket_t s);
+ uint get_ready() const;
+ socket_t get_fd() const;
+
+ uint send(const byte* buf, unsigned int len, int flags = 0) const;
+ uint receive(byte* buf, unsigned int len, int flags = 0);
+
+ bool wait();
+ bool WouldBlock() const;
+ bool IsNonBlocking() const;
+
+ void closeSocket();
+ void shutDown(int how = SD_SEND);
+
+ static int get_lastError();
+ static void set_lastError(int error);
+private:
+ Socket(const Socket&); // hide copy
+ Socket& operator= (const Socket&); // and assign
+};
+
+
+} // naemspace
+
+#endif // yaSSL_SOCKET_WRAPPER_HPP
diff --git a/dep/mysqllite/extra/yassl/include/timer.hpp b/dep/mysqllite/extra/yassl/include/timer.hpp
new file mode 100644
index 0000000000..725e73cf45
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/timer.hpp
@@ -0,0 +1,40 @@
+/*
+ Copyright (C) 2000-2007 MySQL AB
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+/* timer.hpp provides a high res and low res timers
+ *
+*/
+
+
+#ifndef yaSSL_TIMER_HPP
+#define yaSSL_TIMER_HPP
+
+namespace yaSSL {
+
+typedef double timer_d;
+typedef unsigned int uint;
+
+
+
+timer_d timer();
+uint lowResTimer();
+
+
+
+} // namespace
+#endif // yaSSL_TIMER_HPP
diff --git a/dep/mysqllite/extra/yassl/include/yassl.hpp b/dep/mysqllite/extra/yassl/include/yassl.hpp
new file mode 100644
index 0000000000..29e0a5d94e
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/yassl.hpp
@@ -0,0 +1,85 @@
+/*
+ Copyright (C) 2000-2007 MySQL AB
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+
+/* yaSSL externel header defines yaSSL API
+ */
+
+
+#ifndef yaSSL_EXT_HPP
+#define yaSSL_EXT_HPP
+
+
+namespace yaSSL {
+
+
+#ifdef _WIN32
+ typedef unsigned int SOCKET_T;
+#else
+ typedef int SOCKET_T;
+#endif
+
+
+class Client {
+public:
+ Client();
+ ~Client();
+
+ // basics
+ int Connect(SOCKET_T);
+ int Write(const void*, int);
+ int Read(void*, int);
+
+ // options
+ void SetCA(const char*);
+ void SetCert(const char*);
+ void SetKey(const char*);
+private:
+ struct ClientImpl;
+ ClientImpl* pimpl_;
+
+ Client(const Client&); // hide copy
+ Client& operator=(const Client&); // and assign
+};
+
+
+class Server {
+public:
+ Server();
+ ~Server();
+
+ // basics
+ int Accept(SOCKET_T);
+ int Write(const void*, int);
+ int Read(void*, int);
+
+ // options
+ void SetCA(const char*);
+ void SetCert(const char*);
+ void SetKey(const char*);
+private:
+ struct ServerImpl;
+ ServerImpl* pimpl_;
+
+ Server(const Server&); // hide copy
+ Server& operator=(const Server&); // and assign
+};
+
+
+} // namespace yaSSL
+#endif // yaSSL_EXT_HPP
diff --git a/dep/mysqllite/extra/yassl/include/yassl_error.hpp b/dep/mysqllite/extra/yassl/include/yassl_error.hpp
new file mode 100644
index 0000000000..d2473fb3e2
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/yassl_error.hpp
@@ -0,0 +1,86 @@
+/*
+ Copyright (C) 2000-2007 MySQL AB
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+
+/* yaSSL error header defines error codes and an exception class
+ */
+
+#ifndef yaSSL_ERROR_HPP
+#define yaSSL_ERROR_HPP
+
+
+
+namespace yaSSL {
+
+
+enum YasslError {
+ no_error = 0,
+
+ // 10 - 47 from AlertDescription, 0 also close_notify
+
+ range_error = 101,
+ realloc_error = 102,
+ factory_error = 103,
+ unknown_cipher = 104,
+ prefix_error = 105,
+ record_layer = 106,
+ handshake_layer = 107,
+ out_of_order = 108,
+ bad_input = 109,
+ match_error = 110,
+ no_key_file = 111,
+ verify_error = 112,
+ send_error = 113,
+ receive_error = 114,
+ certificate_error = 115,
+ privateKey_error = 116,
+ badVersion_error = 117,
+ compress_error = 118,
+ decompress_error = 119,
+ pms_version_error = 120
+
+ // !!!! add error message to .cpp !!!!
+
+ // 1000+ from TaoCrypt error.hpp
+
+};
+
+
+enum Library { yaSSL_Lib = 0, CryptoLib, SocketLib };
+enum { MAX_ERROR_SZ = 80 };
+
+void SetErrorString(unsigned long, char*);
+
+/* remove for now, if go back to exceptions use this wrapper
+// Base class for all yaSSL exceptions
+class Error : public mySTL::runtime_error {
+ YasslError error_;
+ Library lib_;
+public:
+ explicit Error(const char* s = "", YasslError e = no_error,
+ Library l = yaSSL_Lib);
+
+ YasslError get_number() const;
+ Library get_lib() const;
+};
+*/
+
+
+} // naemspace
+
+#endif // yaSSL_ERROR_HPP
diff --git a/dep/mysqllite/extra/yassl/include/yassl_imp.hpp b/dep/mysqllite/extra/yassl/include/yassl_imp.hpp
new file mode 100644
index 0000000000..8893ba8a8b
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/yassl_imp.hpp
@@ -0,0 +1,748 @@
+/*
+ Copyright (C) 2000-2007 MySQL AB
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+/* yaSSL implementation header defines all strucutres from the SSL.v3
+ * specification "draft-freier-ssl-version3-02.txt"
+ * all page citations refer to this document unless otherwise noted.
+ */
+
+
+#ifndef yaSSL_IMP_HPP
+#define yaSSL_IMP_HPP
+
+#ifdef _MSC_VER
+ // disable truncated debug symbols
+ #pragma warning(disable:4786)
+#endif
+
+#include "yassl_types.hpp"
+#include "factory.hpp"
+#include STL_LIST_FILE
+
+
+namespace STL = STL_NAMESPACE;
+
+
+namespace yaSSL {
+
+
+class SSL; // forward decls
+class input_buffer;
+class output_buffer;
+
+
+struct ProtocolVersion {
+ uint8 major_;
+ uint8 minor_; // major and minor SSL/TLS version numbers
+
+ ProtocolVersion(uint8 maj = 3, uint8 min = 0);
+};
+
+
+// Record Layer Header for PlainText, Compressed, and CipherText
+struct RecordLayerHeader {
+ ContentType type_;
+ ProtocolVersion version_;
+ uint16 length_; // should not exceed 2^14
+};
+
+
+// base for all messages
+struct Message : public virtual_base {
+ virtual input_buffer& set(input_buffer&) =0;
+ virtual output_buffer& get(output_buffer&) const =0;
+
+ virtual void Process(input_buffer&, SSL&) =0;
+ virtual ContentType get_type() const =0;
+ virtual uint16 get_length() const =0;
+
+ virtual ~Message() {}
+};
+
+
+class ChangeCipherSpec : public Message {
+ CipherChoice type_;
+public:
+ ChangeCipherSpec();
+
+ friend input_buffer& operator>>(input_buffer&, ChangeCipherSpec&);
+ friend output_buffer& operator<<(output_buffer&, const ChangeCipherSpec&);
+
+ input_buffer& set(input_buffer& in);
+ output_buffer& get(output_buffer& out) const;
+
+ ContentType get_type() const;
+ uint16 get_length() const;
+ void Process(input_buffer&, SSL&);
+private:
+ ChangeCipherSpec(const ChangeCipherSpec&); // hide copy
+ ChangeCipherSpec& operator=(const ChangeCipherSpec&); // and assign
+};
+
+
+
+class Alert : public Message {
+ AlertLevel level_;
+ AlertDescription description_;
+public:
+ Alert() {}
+ Alert(AlertLevel al, AlertDescription ad);
+
+ ContentType get_type() const;
+ uint16 get_length() const;
+ void Process(input_buffer&, SSL&);
+
+ friend input_buffer& operator>>(input_buffer&, Alert&);
+ friend output_buffer& operator<<(output_buffer&, const Alert&);
+
+ input_buffer& set(input_buffer& in);
+ output_buffer& get(output_buffer& out) const;
+private:
+ Alert(const Alert&); // hide copy
+ Alert& operator=(const Alert&); // and assign
+};
+
+
+class Data : public Message {
+ uint16 length_;
+ opaque* buffer_; // read buffer used by fillData input
+ const opaque* write_buffer_; // write buffer used by output operator
+public:
+ Data();
+ Data(uint16 len, opaque* b);
+
+ friend output_buffer& operator<<(output_buffer&, const Data&);
+
+ input_buffer& set(input_buffer& in);
+ output_buffer& get(output_buffer& out) const;
+
+ ContentType get_type() const;
+ uint16 get_length() const;
+ void set_length(uint16 l);
+ opaque* set_buffer();
+ void SetData(uint16, const opaque*);
+ void Process(input_buffer&, SSL&);
+private:
+ Data(const Data&); // hide copy
+ Data& operator=(const Data&); // and assign
+};
+
+
+uint32 c24to32(const uint24); // forward form internal header
+void c32to24(uint32, uint24&);
+
+
+// HandShake header, same for each message type from page 20/21
+class HandShakeHeader : public Message {
+ HandShakeType type_;
+ uint24 length_; // length of message
+public:
+ HandShakeHeader() {}
+
+ ContentType get_type() const;
+ uint16 get_length() const;
+ HandShakeType get_handshakeType() const;
+ void Process(input_buffer&, SSL&);
+
+ void set_type(HandShakeType hst);
+ void set_length(uint32 u32);
+
+ friend input_buffer& operator>>(input_buffer&, HandShakeHeader&);
+ friend output_buffer& operator<<(output_buffer&, const HandShakeHeader&);
+
+ input_buffer& set(input_buffer& in);
+ output_buffer& get(output_buffer& out) const;
+private:
+ HandShakeHeader(const HandShakeHeader&); // hide copy
+ HandShakeHeader& operator=(const HandShakeHeader&); // and assign
+};
+
+
+// Base Class for all handshake messages
+class HandShakeBase : public virtual_base {
+ int length_;
+public:
+ int get_length() const;
+ void set_length(int);
+
+ // for building buffer's type field
+ virtual HandShakeType get_type() const =0;
+
+ // handles dispactch of proper >>
+ virtual input_buffer& set(input_buffer& in) =0;
+ virtual output_buffer& get(output_buffer& out) const =0;
+
+ virtual void Process(input_buffer&, SSL&) =0;
+
+ virtual ~HandShakeBase() {}
+};
+
+
+struct HelloRequest : public HandShakeBase {
+ input_buffer& set(input_buffer& in);
+ output_buffer& get(output_buffer& out) const;
+
+ void Process(input_buffer&, SSL&);
+
+ HandShakeType get_type() const;
+};
+
+
+// The Client's Hello Message from page 23
+class ClientHello : public HandShakeBase {
+ ProtocolVersion client_version_;
+ Random random_;
+ uint8 id_len_; // session id length
+ opaque session_id_[ID_LEN];
+ uint16 suite_len_; // cipher suite length
+ opaque cipher_suites_[MAX_SUITE_SZ];
+ uint8 comp_len_; // compression length
+ CompressionMethod compression_methods_;
+public:
+ friend input_buffer& operator>>(input_buffer&, ClientHello&);
+ friend output_buffer& operator<<(output_buffer&, const ClientHello&);
+
+ input_buffer& set(input_buffer& in);
+ output_buffer& get(output_buffer& out) const;
+
+ HandShakeType get_type() const;
+ void Process(input_buffer&, SSL&);
+
+ const opaque* get_random() const;
+ friend void buildClientHello(SSL&, ClientHello&);
+ friend void ProcessOldClientHello(input_buffer& input, SSL& ssl);
+
+ ClientHello();
+ ClientHello(ProtocolVersion pv, bool useCompression);
+private:
+ ClientHello(const ClientHello&); // hide copy
+ ClientHello& operator=(const ClientHello&); // and assign
+};
+
+
+
+// The Server's Hello Message from page 24
+class ServerHello : public HandShakeBase {
+ ProtocolVersion server_version_;
+ Random random_;
+ uint8 id_len_; // session id length
+ opaque session_id_[ID_LEN];
+ opaque cipher_suite_[SUITE_LEN];
+ CompressionMethod compression_method_;
+public:
+ ServerHello(ProtocolVersion pv, bool useCompression);
+ ServerHello();
+
+ friend input_buffer& operator>>(input_buffer&, ServerHello&);
+ friend output_buffer& operator<<(output_buffer&, const ServerHello&);
+
+ input_buffer& set(input_buffer& in);
+ output_buffer& get(output_buffer& out) const;
+
+ HandShakeType get_type() const;
+ void Process(input_buffer&, SSL&);
+
+ const opaque* get_random() const;
+ friend void buildServerHello(SSL&, ServerHello&);
+private:
+ ServerHello(const ServerHello&); // hide copy
+ ServerHello& operator=(const ServerHello&); // and assign
+};
+
+
+class x509;
+
+// Certificate could be a chain
+class Certificate : public HandShakeBase {
+ const x509* cert_;
+public:
+ Certificate();
+ explicit Certificate(const x509* cert);
+ friend output_buffer& operator<<(output_buffer&, const Certificate&);
+
+ const opaque* get_buffer() const;
+
+ // Process handles input, needs SSL
+ input_buffer& set(input_buffer& in);
+ output_buffer& get(output_buffer& out) const;
+
+ HandShakeType get_type() const;
+ void Process(input_buffer&, SSL&);
+private:
+ Certificate(const Certificate&); // hide copy
+ Certificate& operator=(const Certificate&); // and assign
+};
+
+
+
+// RSA Public Key
+struct ServerRSAParams {
+ opaque* rsa_modulus_;
+ opaque* rsa_exponent_;
+};
+
+
+// Ephemeral Diffie-Hellman Parameters
+class ServerDHParams {
+ int pSz_;
+ int gSz_;
+ int pubSz_;
+ opaque* p_;
+ opaque* g_;
+ opaque* Ys_;
+public:
+ ServerDHParams();
+ ~ServerDHParams();
+
+ int get_pSize() const;
+ int get_gSize() const;
+ int get_pubSize() const;
+
+ const opaque* get_p() const;
+ const opaque* get_g() const;
+ const opaque* get_pub() const;
+
+ opaque* alloc_p(int sz);
+ opaque* alloc_g(int sz);
+ opaque* alloc_pub(int sz);
+private:
+ ServerDHParams(const ServerDHParams&); // hide copy
+ ServerDHParams& operator=(const ServerDHParams&); // and assign
+};
+
+
+struct ServerKeyBase : public virtual_base {
+ virtual ~ServerKeyBase() {}
+ virtual void build(SSL&) {}
+ virtual void read(SSL&, input_buffer&) {}
+ virtual int get_length() const;
+ virtual opaque* get_serverKey() const;
+};
+
+
+// Server random number for FORTEZZA KEA
+struct Fortezza_Server : public ServerKeyBase {
+ opaque r_s_[FORTEZZA_MAX];
+};
+
+
+struct SignatureBase : public virtual_base {
+ virtual ~SignatureBase() {}
+};
+
+struct anonymous_sa : public SignatureBase {};
+
+
+struct Hashes {
+ uint8 md5_[MD5_LEN];
+ uint8 sha_[SHA_LEN];
+};
+
+
+struct rsa_sa : public SignatureBase {
+ Hashes hashes_;
+};
+
+
+struct dsa_sa : public SignatureBase {
+ uint8 sha_[SHA_LEN];
+};
+
+
+// Server's Diffie-Hellman exchange
+class DH_Server : public ServerKeyBase {
+ ServerDHParams parms_;
+ opaque* signature_;
+
+ int length_; // total length of message
+ opaque* keyMessage_; // total exchange message
+public:
+ DH_Server();
+ ~DH_Server();
+
+ void build(SSL&);
+ void read(SSL&, input_buffer&);
+ int get_length() const;
+ opaque* get_serverKey() const;
+private:
+ DH_Server(const DH_Server&); // hide copy
+ DH_Server& operator=(const DH_Server&); // and assign
+};
+
+
+// Server's RSA exchange
+struct RSA_Server : public ServerKeyBase {
+ ServerRSAParams params_;
+ opaque* signature_; // signed rsa_sa hashes
+};
+
+
+class ServerKeyExchange : public HandShakeBase {
+ ServerKeyBase* server_key_;
+public:
+ explicit ServerKeyExchange(SSL&);
+ ServerKeyExchange();
+ ~ServerKeyExchange();
+
+ void createKey(SSL&);
+ void build(SSL& ssl);
+
+ const opaque* getKey() const;
+ int getKeyLength() const;
+
+ input_buffer& set(input_buffer& in);
+ output_buffer& get(output_buffer& out) const;
+
+ friend output_buffer& operator<<(output_buffer&, const ServerKeyExchange&);
+
+ void Process(input_buffer&, SSL&);
+ HandShakeType get_type() const;
+private:
+ ServerKeyExchange(const ServerKeyExchange&); // hide copy
+ ServerKeyExchange& operator=(const ServerKeyExchange&); // and assign
+};
+
+
+
+class CertificateRequest : public HandShakeBase {
+ ClientCertificateType certificate_types_[CERT_TYPES];
+ int typeTotal_;
+ STL::list certificate_authorities_;
+public:
+ CertificateRequest();
+ ~CertificateRequest();
+
+ input_buffer& set(input_buffer& in);
+ output_buffer& get(output_buffer& out) const;
+
+ friend input_buffer& operator>>(input_buffer&, CertificateRequest&);
+ friend output_buffer& operator<<(output_buffer&,
+ const CertificateRequest&);
+
+ void Process(input_buffer&, SSL&);
+ HandShakeType get_type() const;
+
+ void Build();
+private:
+ CertificateRequest(const CertificateRequest&); // hide copy
+ CertificateRequest& operator=(const CertificateRequest&); // and assign
+};
+
+
+struct ServerHelloDone : public HandShakeBase {
+ ServerHelloDone();
+ input_buffer& set(input_buffer& in);
+ output_buffer& get(output_buffer& out) const;
+
+ void Process(input_buffer& input, SSL& ssl);
+
+ HandShakeType get_type() const;
+};
+
+
+struct PreMasterSecret {
+ opaque random_[SECRET_LEN]; // first two bytes Protocol Version
+};
+
+
+struct ClientKeyBase : public virtual_base {
+ virtual ~ClientKeyBase() {}
+ virtual void build(SSL&) {}
+ virtual void read(SSL&, input_buffer&) {}
+ virtual int get_length() const;
+ virtual opaque* get_clientKey() const;
+};
+
+
+class EncryptedPreMasterSecret : public ClientKeyBase {
+ opaque* secret_;
+ int length_;
+public:
+ EncryptedPreMasterSecret();
+ ~EncryptedPreMasterSecret();
+
+ void build(SSL&);
+ void read(SSL&, input_buffer&);
+ int get_length() const;
+ opaque* get_clientKey() const;
+ void alloc(int sz);
+private:
+ // hide copy and assign
+ EncryptedPreMasterSecret(const EncryptedPreMasterSecret&);
+ EncryptedPreMasterSecret& operator=(const EncryptedPreMasterSecret&);
+};
+
+
+// Fortezza Key Parameters from page 29
+// hard code lengths cause only used here
+struct FortezzaKeys : public ClientKeyBase {
+ opaque y_c_ [128]; // client's Yc, public value
+ opaque r_c_ [128]; // client's Rc
+ opaque y_signature_ [40]; // DSS signed public key
+ opaque wrapped_client_write_key_ [12]; // wrapped by the TEK
+ opaque wrapped_server_write_key_ [12]; // wrapped by the TEK
+ opaque client_write_iv_ [24];
+ opaque server_write_iv_ [24];
+ opaque master_secret_iv_ [24]; // IV used to encrypt preMaster
+ opaque encrypted_preMasterSecret_[48]; // random & crypted by the TEK
+};
+
+
+
+// Diffie-Hellman public key from page 40/41
+class ClientDiffieHellmanPublic : public ClientKeyBase {
+ PublicValueEncoding public_value_encoding_;
+ int length_; // includes two byte length for message
+ opaque* Yc_; // length + Yc_
+ // dh_Yc only if explicit, otherwise sent in certificate
+ enum { KEY_OFFSET = 2 };
+public:
+ ClientDiffieHellmanPublic();
+ ~ClientDiffieHellmanPublic();
+
+ void build(SSL&);
+ void read(SSL&, input_buffer&);
+ int get_length() const;
+ opaque* get_clientKey() const;
+ void alloc(int sz, bool offset = false);
+private:
+ // hide copy and assign
+ ClientDiffieHellmanPublic(const ClientDiffieHellmanPublic&);
+ ClientDiffieHellmanPublic& operator=(const ClientDiffieHellmanPublic&);
+};
+
+
+class ClientKeyExchange : public HandShakeBase {
+ ClientKeyBase* client_key_;
+public:
+ explicit ClientKeyExchange(SSL& ssl);
+ ClientKeyExchange();
+ ~ClientKeyExchange();
+
+ void createKey(SSL&);
+ void build(SSL& ssl);
+
+ const opaque* getKey() const;
+ int getKeyLength() const;
+
+ friend output_buffer& operator<<(output_buffer&, const ClientKeyExchange&);
+
+ input_buffer& set(input_buffer& in);
+ output_buffer& get(output_buffer& out) const;
+
+ HandShakeType get_type() const;
+ void Process(input_buffer&, SSL&);
+private:
+ ClientKeyExchange(const ClientKeyExchange&); // hide copy
+ ClientKeyExchange& operator=(const ClientKeyExchange&); // and assign
+};
+
+
+class CertificateVerify : public HandShakeBase {
+ Hashes hashes_;
+ byte* signature_; // owns
+public:
+ CertificateVerify();
+ ~CertificateVerify();
+
+ input_buffer& set(input_buffer& in);
+ output_buffer& get(output_buffer& out) const;
+
+ friend input_buffer& operator>>(input_buffer&, CertificateVerify&);
+ friend output_buffer& operator<<(output_buffer&, const CertificateVerify&);
+
+ void Process(input_buffer&, SSL&);
+ HandShakeType get_type() const;
+
+ void Build(SSL&);
+private:
+ CertificateVerify(const CertificateVerify&); // hide copy
+ CertificateVerify& operator=(const CertificateVerify&); // and assign
+};
+
+
+class Finished : public HandShakeBase {
+ Hashes hashes_;
+public:
+ Finished();
+
+ uint8* set_md5();
+ uint8* set_sha();
+
+ friend input_buffer& operator>>(input_buffer&, Finished&);
+ friend output_buffer& operator<<(output_buffer&, const Finished&);
+
+ input_buffer& set(input_buffer& in);
+ output_buffer& get(output_buffer& out) const;
+
+ void Process(input_buffer&, SSL&);
+
+ HandShakeType get_type() const;
+private:
+ Finished(const Finished&); // hide copy
+ Finished& operator=(const Finished&); // and assign
+};
+
+
+class RandomPool; // forward for connection
+
+
+// SSL Connection defined on page 11
+struct Connection {
+ opaque *pre_master_secret_;
+ opaque master_secret_[SECRET_LEN];
+ opaque client_random_[RAN_LEN];
+ opaque server_random_[RAN_LEN];
+ opaque sessionID_[ID_LEN];
+ opaque client_write_MAC_secret_[SHA_LEN]; // sha is max size
+ opaque server_write_MAC_secret_[SHA_LEN];
+ opaque client_write_key_[AES_256_KEY_SZ]; // aes 256bit is max sz
+ opaque server_write_key_[AES_256_KEY_SZ];
+ opaque client_write_IV_[AES_IV_SZ]; // aes is max size
+ opaque server_write_IV_[AES_IV_SZ];
+ uint32 sequence_number_;
+ uint32 peer_sequence_number_;
+ uint32 pre_secret_len_; // pre master length
+ bool send_server_key_; // server key exchange?
+ bool master_clean_; // master secret clean?
+ bool TLS_; // TLSv1 or greater
+ bool TLSv1_1_; // TLSv1.1 or greater
+ bool sessionID_Set_; // do we have a session
+ bool compression_; // zlib compression?
+ ProtocolVersion version_; // negotiated version
+ ProtocolVersion chVersion_; // client hello version
+ RandomPool& random_;
+
+ Connection(ProtocolVersion v, RandomPool& ran);
+ ~Connection();
+
+ void AllocPreSecret(uint sz);
+ void CleanPreMaster();
+ void CleanMaster();
+ void TurnOffTLS();
+ void TurnOffTLS1_1();
+private:
+ Connection(const Connection&); // hide copy
+ Connection& operator=(const Connection&); // and assign
+};
+
+
+struct Ciphers; // forward
+
+
+// TLSv1 Security Spec, defined on page 56 of RFC 2246
+struct Parameters {
+ ConnectionEnd entity_;
+ BulkCipherAlgorithm bulk_cipher_algorithm_;
+ CipherType cipher_type_;
+ uint8 key_size_;
+ uint8 iv_size_;
+ IsExportable is_exportable_;
+ MACAlgorithm mac_algorithm_;
+ uint8 hash_size_;
+ CompressionMethod compression_algorithm_;
+ KeyExchangeAlgorithm kea_; // yassl additions
+ SignatureAlgorithm sig_algo_; // signature auth type
+ SignatureAlgorithm verify_algo_; // cert verify auth type
+ bool pending_;
+ bool resumable_; // new conns by session
+ uint16 encrypt_size_; // current msg encrypt sz
+ Cipher suite_[SUITE_LEN]; // choosen suite
+ uint8 suites_size_;
+ Cipher suites_[MAX_SUITE_SZ];
+ char cipher_name_[MAX_SUITE_NAME];
+ char cipher_list_[MAX_CIPHERS][MAX_SUITE_NAME];
+ bool removeDH_; // for server's later use
+
+ Parameters(ConnectionEnd, const Ciphers&, ProtocolVersion, bool haveDH);
+
+ void SetSuites(ProtocolVersion pv, bool removeDH = false,
+ bool removeRSA = false, bool removeDSA = false);
+ void SetCipherNames();
+private:
+ Parameters(const Parameters&); // hide copy
+ Parameters& operator=(const Parameters&); // and assing
+};
+
+
+input_buffer& operator>>(input_buffer&, RecordLayerHeader&);
+output_buffer& operator<<(output_buffer&, const RecordLayerHeader&);
+
+input_buffer& operator>>(input_buffer&, Message&);
+output_buffer& operator<<(output_buffer&, const Message&);
+
+input_buffer& operator>>(input_buffer&, HandShakeBase&);
+output_buffer& operator<<(output_buffer&, const HandShakeBase&);
+
+
+// Message Factory definition
+// uses the ContentType enumeration for unique id
+typedef Factory MessageFactory;
+void InitMessageFactory(MessageFactory&); // registers derived classes
+
+// HandShake Factory definition
+// uses the HandShakeType enumeration for unique id
+typedef Factory HandShakeFactory;
+void InitHandShakeFactory(HandShakeFactory&); // registers derived classes
+
+// ServerKey Factory definition
+// uses KeyExchangeAlgorithm enumeration for unique id
+typedef Factory ServerKeyFactory;
+void InitServerKeyFactory(ServerKeyFactory&);
+
+// ClientKey Factory definition
+// uses KeyExchangeAlgorithm enumeration for unique id
+typedef Factory ClientKeyFactory;
+void InitClientKeyFactory(ClientKeyFactory&);
+
+
+// Message Creators
+Message* CreateHandShake();
+Message* CreateCipherSpec();
+Message* CreateAlert();
+Message* CreateData();
+
+
+// HandShake Creators
+HandShakeBase* CreateCertificate();
+HandShakeBase* CreateHelloRequest();
+HandShakeBase* CreateClientHello();
+HandShakeBase* CreateServerHello();
+HandShakeBase* CreateServerKeyExchange();
+HandShakeBase* CreateCertificateRequest();
+HandShakeBase* CreateServerHelloDone();
+HandShakeBase* CreateClientKeyExchange();
+HandShakeBase* CreateCertificateVerify();
+HandShakeBase* CreateFinished();
+
+
+// ServerKey Exchange Creators
+ServerKeyBase* CreateRSAServerKEA();
+ServerKeyBase* CreateDHServerKEA();
+ServerKeyBase* CreateFortezzaServerKEA();
+
+// ClientKey Exchange Creators
+ClientKeyBase* CreateRSAClient();
+ClientKeyBase* CreateDHClient();
+ClientKeyBase* CreateFortezzaClient();
+
+
+
+} // naemspace
+
+#endif // yaSSL_IMP_HPP
diff --git a/dep/mysqllite/extra/yassl/include/yassl_int.hpp b/dep/mysqllite/extra/yassl/include/yassl_int.hpp
new file mode 100644
index 0000000000..1e761f559e
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/yassl_int.hpp
@@ -0,0 +1,693 @@
+/*
+ Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+
+/* yaSSL internal header defines SSL supporting types not specified in the
+ * draft along with type conversion functions and openssl compatibility
+ */
+
+
+#ifndef yaSSL_INT_HPP
+#define yaSSL_INT_HPP
+
+#include "yassl_imp.hpp"
+#include "yassl_error.hpp"
+#include "crypto_wrapper.hpp"
+#include "cert_wrapper.hpp"
+#include "log.hpp"
+#include "lock.hpp"
+#include "openssl/ssl.h" // ASN1_STRING and DH
+
+// Check if _POSIX_THREADS should be forced
+#if !defined(_POSIX_THREADS) && (defined(__NETWARE__) || defined(__hpux))
+// HPUX does not define _POSIX_THREADS as it's not _fully_ implemented
+// Netware supports pthreads but does not announce it
+#define _POSIX_THREADS
+#endif
+
+#ifdef _POSIX_THREADS
+ #include
+#endif
+
+
+namespace STL = STL_NAMESPACE;
+
+
+namespace yaSSL {
+
+
+// State Machine for Record Layer Protocol
+enum RecordLayerState {
+ recordNotReady = 0, // fatal error, no more processing
+ recordReady
+};
+
+
+// State Machine for HandShake Protocol
+enum HandShakeState {
+ handShakeNotReady = 0, // fatal error, no more processing
+ preHandshake, // initial state
+ inHandshake, // handshake started
+ handShakeReady // handshake done
+};
+
+
+// client input HandShake state, use if HandShakeState == inHandShake
+enum ClientState {
+ serverNull = 0,
+ serverHelloComplete,
+ serverCertComplete,
+ serverKeyExchangeComplete,
+ serverHelloDoneComplete,
+ serverFinishedComplete
+};
+
+
+// server input HandShake state, use if HandShakeState == inHandShake
+enum ServerState {
+ clientNull = 0,
+ clientHelloComplete,
+ clientKeyExchangeComplete,
+ clientFinishedComplete
+};
+
+
+// client connect state for nonblocking restart
+enum ConnectState {
+ CONNECT_BEGIN = 0,
+ CLIENT_HELLO_SENT,
+ FIRST_REPLY_DONE,
+ FINISHED_DONE,
+ SECOND_REPLY_DONE
+};
+
+
+// server accpet state for nonblocking restart
+enum AcceptState {
+ ACCEPT_BEGIN = 0,
+ ACCEPT_FIRST_REPLY_DONE,
+ SERVER_HELLO_DONE,
+ ACCEPT_SECOND_REPLY_DONE,
+ ACCEPT_FINISHED_DONE,
+ ACCEPT_THIRD_REPLY_DONE
+};
+
+
+// combines all states
+class States {
+ RecordLayerState recordLayer_;
+ HandShakeState handshakeLayer_;
+ ClientState clientState_;
+ ServerState serverState_;
+ ConnectState connectState_;
+ AcceptState acceptState_;
+ char errorString_[MAX_ERROR_SZ];
+ YasslError what_;
+public:
+ States();
+
+ const RecordLayerState& getRecord() const;
+ const HandShakeState& getHandShake() const;
+ const ClientState& getClient() const;
+ const ServerState& getServer() const;
+ const ConnectState& GetConnect() const;
+ const AcceptState& GetAccept() const;
+ const char* getString() const;
+ YasslError What() const;
+
+ RecordLayerState& useRecord();
+ HandShakeState& useHandShake();
+ ClientState& useClient();
+ ServerState& useServer();
+ ConnectState& UseConnect();
+ AcceptState& UseAccept();
+ char* useString();
+ void SetError(YasslError);
+private:
+ States(const States&); // hide copy
+ States& operator=(const States&); // and assign
+};
+
+
+// holds all factories
+class sslFactory {
+ MessageFactory messageFactory_; // creates new messages by type
+ HandShakeFactory handShakeFactory_; // creates new handshake types
+ ServerKeyFactory serverKeyFactory_; // creates new server key types
+ ClientKeyFactory clientKeyFactory_; // creates new client key types
+
+ sslFactory(); // only GetSSL_Factory creates
+public:
+ const MessageFactory& getMessage() const;
+ const HandShakeFactory& getHandShake() const;
+ const ServerKeyFactory& getServerKey() const;
+ const ClientKeyFactory& getClientKey() const;
+
+ friend sslFactory& GetSSL_Factory(); // singleton creator
+private:
+ sslFactory(const sslFactory&); // hide copy
+ sslFactory& operator=(const sslFactory&); // and assign
+};
+
+
+#undef X509_NAME // wincrypt.h clash
+
+// openSSL X509 names
+class X509_NAME {
+ char* name_;
+ size_t sz_;
+ ASN1_STRING entry_;
+public:
+ X509_NAME(const char*, size_t sz);
+ ~X509_NAME();
+
+ const char* GetName() const;
+ ASN1_STRING* GetEntry(int i);
+ size_t GetLength() const;
+private:
+ X509_NAME(const X509_NAME&); // hide copy
+ X509_NAME& operator=(const X509_NAME&); // and assign
+};
+
+
+class StringHolder {
+ ASN1_STRING asnString_;
+public:
+ StringHolder(const char* str, int sz);
+ ~StringHolder();
+
+ ASN1_STRING* GetString();
+private:
+ StringHolder(const StringHolder&); // hide copy
+ StringHolder& operator=(const StringHolder&); // and assign
+};
+
+
+// openSSL X509
+class X509 {
+ X509_NAME issuer_;
+ X509_NAME subject_;
+ StringHolder beforeDate_; // not valid before
+ StringHolder afterDate_; // not valid after
+public:
+ X509(const char* i, size_t, const char* s, size_t,
+ const char* b, int, const char* a, int);
+ ~X509() {}
+
+ X509_NAME* GetIssuer();
+ X509_NAME* GetSubject();
+
+ ASN1_STRING* GetBefore();
+ ASN1_STRING* GetAfter();
+
+private:
+ X509(const X509&); // hide copy
+ X509& operator=(const X509&); // and assign
+};
+
+
+// openSSL bignum
+struct BIGNUM {
+ /*
+ gcc 2.96 fix: because of two Integer classes (yaSSL::Integer and
+ TaoCrypt::Integer), we need to explicitly state the namespace
+ here to let gcc 2.96 deduce the correct type.
+ */
+ yaSSL::Integer int_;
+ void assign(const byte* b, uint s) { int_.assign(b,s); }
+};
+
+
+// openSSL session
+class SSL_SESSION {
+ opaque sessionID_[ID_LEN];
+ opaque master_secret_[SECRET_LEN];
+ Cipher suite_[SUITE_LEN];
+ uint bornOn_; // create time in seconds
+ uint timeout_; // timeout in seconds
+ RandomPool& random_; // will clean master secret
+ X509* peerX509_;
+public:
+ explicit SSL_SESSION(RandomPool&);
+ SSL_SESSION(const SSL&, RandomPool&);
+ ~SSL_SESSION();
+
+ const opaque* GetID() const;
+ const opaque* GetSecret() const;
+ const Cipher* GetSuite() const;
+ uint GetBornOn() const;
+ uint GetTimeOut() const;
+ X509* GetPeerX509() const;
+ void SetTimeOut(uint);
+
+ SSL_SESSION& operator=(const SSL_SESSION&); // allow assign for resumption
+private:
+ SSL_SESSION(const SSL_SESSION&); // hide copy
+
+ void CopyX509(X509*);
+};
+
+
+// holds all sessions
+class Sessions {
+ STL::list list_;
+ RandomPool random_; // for session cleaning
+ Mutex mutex_; // no-op for single threaded
+ int count_; // flush counter
+
+ Sessions() : count_(0) {} // only GetSessions can create
+public:
+ SSL_SESSION* lookup(const opaque*, SSL_SESSION* copy = 0);
+ void add(const SSL&);
+ void remove(const opaque*);
+ void Flush();
+
+ ~Sessions();
+
+ friend Sessions& GetSessions(); // singleton creator
+private:
+ Sessions(const Sessions&); // hide copy
+ Sessions& operator=(const Sessions&); // and assign
+};
+
+
+#ifdef _POSIX_THREADS
+ typedef pthread_t THREAD_ID_T;
+#else
+ typedef DWORD THREAD_ID_T;
+#endif
+
+// thread error data
+struct ThreadError {
+ THREAD_ID_T threadID_;
+ int errorID_;
+};
+
+
+// holds all errors
+class Errors {
+ STL::list list_;
+ Mutex mutex_;
+
+ Errors() {} // only GetErrors can create
+public:
+ int Lookup(bool peek); // self lookup
+ void Add(int);
+ void Remove(); // remove self
+
+ ~Errors() {}
+
+ friend Errors& GetErrors(); // singleton creator
+private:
+ Errors(const Errors&); // hide copy
+ Errors& operator=(const Errors); // and assign
+};
+
+
+Sessions& GetSessions(); // forward singletons
+sslFactory& GetSSL_Factory();
+Errors& GetErrors();
+
+
+// openSSL method and context types
+class SSL_METHOD {
+ ProtocolVersion version_;
+ ConnectionEnd side_;
+ bool verifyPeer_; // request or send certificate
+ bool verifyNone_; // whether to verify certificate
+ bool failNoCert_;
+ bool multipleProtocol_; // for SSLv23 compatibility
+public:
+ SSL_METHOD(ConnectionEnd ce, ProtocolVersion pv,
+ bool multipleProtocol = false);
+
+ ProtocolVersion getVersion() const;
+ ConnectionEnd getSide() const;
+
+ void setVerifyPeer();
+ void setVerifyNone();
+ void setFailNoCert();
+
+ bool verifyPeer() const;
+ bool verifyNone() const;
+ bool failNoCert() const;
+ bool multipleProtocol() const;
+private:
+ SSL_METHOD(const SSL_METHOD&); // hide copy
+ SSL_METHOD& operator=(const SSL_METHOD&); // and assign
+};
+
+
+struct Ciphers {
+ bool setSuites_; // user set suites from default
+ byte suites_[MAX_SUITE_SZ]; // new suites
+ int suiteSz_; // suite length in bytes
+
+ Ciphers() : setSuites_(false), suiteSz_(0) {}
+};
+
+
+struct DH; // forward
+
+
+// save for SSL construction
+struct DH_Parms {
+ Integer p_;
+ Integer g_;
+ bool set_; // if set by user
+
+ DH_Parms() : set_(false) {}
+};
+
+
+enum StatsField {
+ Accept, Connect, AcceptGood, ConnectGood, AcceptRenegotiate,
+ ConnectRenegotiate, Hits, CbHits, CacheFull, Misses, Timeouts, Number,
+ GetCacheSize, VerifyMode, VerifyDepth
+};
+
+
+// SSL stats
+struct Stats {
+ long accept_;
+ long connect_;
+ long acceptGood_;
+ long connectGood_;
+ long acceptRenegotiate_;
+ long connectRenegotiate_;
+
+ long hits_;
+ long cbHits_;
+ long cacheFull_;
+ long misses_;
+ long timeouts_;
+ long number_;
+ long getCacheSize_;
+
+ int verifyMode_;
+ int verifyDepth_;
+public:
+ Stats() : accept_(0), connect_(0), acceptGood_(0), connectGood_(0),
+ acceptRenegotiate_(0), connectRenegotiate_(0), hits_(0), cbHits_(0),
+ cacheFull_(0), misses_(0), timeouts_(0), number_(0), getCacheSize_(0),
+ verifyMode_(0), verifyDepth_(0)
+ {}
+private:
+ Stats(const Stats&); // hide copy
+ Stats& operator=(const Stats&); // and assign
+};
+
+
+// the SSL context
+class SSL_CTX {
+public:
+ typedef STL::list CertList;
+private:
+ SSL_METHOD* method_;
+ x509* certificate_;
+ x509* privateKey_;
+ CertList caList_;
+ Ciphers ciphers_;
+ DH_Parms dhParms_;
+ pem_password_cb passwordCb_;
+ void* userData_;
+ bool sessionCacheOff_;
+ bool sessionCacheFlushOff_;
+ Stats stats_;
+ Mutex mutex_; // for Stats
+ VerifyCallback verifyCallback_;
+public:
+ explicit SSL_CTX(SSL_METHOD* meth);
+ ~SSL_CTX();
+
+ const x509* getCert() const;
+ const x509* getKey() const;
+ const SSL_METHOD* getMethod() const;
+ const Ciphers& GetCiphers() const;
+ const DH_Parms& GetDH_Parms() const;
+ const Stats& GetStats() const;
+ VerifyCallback getVerifyCallback() const;
+ pem_password_cb GetPasswordCb() const;
+ void* GetUserData() const;
+ bool GetSessionCacheOff() const;
+ bool GetSessionCacheFlushOff() const;
+
+ void setVerifyPeer();
+ void setVerifyNone();
+ void setFailNoCert();
+ void setVerifyCallback(VerifyCallback);
+ bool SetCipherList(const char*);
+ bool SetDH(const DH&);
+ void SetPasswordCb(pem_password_cb cb);
+ void SetUserData(void*);
+ void SetSessionCacheOff();
+ void SetSessionCacheFlushOff();
+
+ void IncrementStats(StatsField);
+ void AddCA(x509* ca);
+ const CertList& GetCA_List() const;
+
+ friend int read_file(SSL_CTX*, const char*, int, CertType);
+private:
+ SSL_CTX(const SSL_CTX&); // hide copy
+ SSL_CTX& operator=(const SSL_CTX&); // and assign
+};
+
+
+// holds all cryptographic types
+class Crypto {
+ Digest* digest_; // agreed upon digest
+ BulkCipher* cipher_; // agreed upon cipher
+ DiffieHellman* dh_; // dh parms
+ RandomPool random_; // random number generator
+ CertManager cert_; // manages certificates
+public:
+ explicit Crypto();
+ ~Crypto();
+
+ const Digest& get_digest() const;
+ const BulkCipher& get_cipher() const;
+ const DiffieHellman& get_dh() const;
+ const RandomPool& get_random() const;
+ const CertManager& get_certManager() const;
+
+ Digest& use_digest();
+ BulkCipher& use_cipher();
+ DiffieHellman& use_dh();
+ RandomPool& use_random();
+ CertManager& use_certManager();
+
+ void SetDH(DiffieHellman*);
+ void SetDH(const DH_Parms&);
+ void setDigest(Digest*);
+ void setCipher(BulkCipher*);
+
+ bool DhSet();
+private:
+ Crypto(const Crypto&); // hide copy
+ Crypto& operator=(const Crypto&); // and assign
+};
+
+
+// holds all handshake and verify hashes
+class sslHashes {
+ MD5 md5HandShake_; // md5 handshake hash
+ SHA shaHandShake_; // sha handshake hash
+ Finished verify_; // peer's verify hash
+ Hashes certVerify_; // peer's cert verify hash
+public:
+ sslHashes() {}
+
+ const MD5& get_MD5() const;
+ const SHA& get_SHA() const;
+ const Finished& get_verify() const;
+ const Hashes& get_certVerify() const;
+
+ MD5& use_MD5();
+ SHA& use_SHA();
+ Finished& use_verify();
+ Hashes& use_certVerify();
+private:
+ sslHashes(const sslHashes&); // hide copy
+ sslHashes& operator=(const sslHashes&); // and assign
+};
+
+
+// holds input and output buffers
+class Buffers {
+public:
+ typedef STL::list inputList;
+ typedef STL::list outputList;
+private:
+ inputList dataList_; // list of users app data / handshake
+ outputList handShakeList_; // buffered handshake msgs
+ input_buffer* rawInput_; // buffered raw input yet to process
+public:
+ Buffers();
+ ~Buffers();
+
+ const inputList& getData() const;
+ const outputList& getHandShake() const;
+
+ inputList& useData();
+ outputList& useHandShake();
+
+ void SetRawInput(input_buffer*); // takes ownership
+ input_buffer* TakeRawInput(); // takes ownership
+private:
+ Buffers(const Buffers&); // hide copy
+ Buffers& operator=(const Buffers&); // and assign
+};
+
+
+// wraps security parameters
+class Security {
+ Connection conn_; // connection information
+ Parameters parms_; // may be pending
+ SSL_SESSION resumeSession_; // if resuming
+ SSL_CTX* ctx_; // context used to init
+ bool resuming_; // trying to resume
+public:
+ Security(ProtocolVersion, RandomPool&, ConnectionEnd, const Ciphers&,
+ SSL_CTX*, bool);
+
+ const SSL_CTX* GetContext() const;
+ const Connection& get_connection() const;
+ const Parameters& get_parms() const;
+ const SSL_SESSION& get_resume() const;
+ bool get_resuming() const;
+
+ Connection& use_connection();
+ Parameters& use_parms();
+ SSL_SESSION& use_resume();
+
+ void set_resuming(bool b);
+private:
+ Security(const Security&); // hide copy
+ Security& operator=(const Security&); // and assign
+};
+
+
+// THE SSL type
+class SSL {
+ Crypto crypto_; // agreed crypto agents
+ Security secure_; // Connection and Session parms
+ States states_; // Record and HandShake states
+ sslHashes hashes_; // handshake, finished hashes
+ Socket socket_; // socket wrapper
+ Buffers buffers_; // buffered handshakes and data
+ Log log_; // logger
+ bool quietShutdown_;
+
+ // optimization variables
+ bool has_data_; // buffered data ready?
+public:
+ SSL(SSL_CTX* ctx);
+
+ // gets and uses
+ const Crypto& getCrypto() const;
+ const Security& getSecurity() const;
+ const States& getStates() const;
+ const sslHashes& getHashes() const;
+ const sslFactory& getFactory() const;
+ const Socket& getSocket() const;
+ YasslError GetError() const;
+ bool GetMultiProtocol() const;
+ bool CompressionOn() const;
+
+ Crypto& useCrypto();
+ Security& useSecurity();
+ States& useStates();
+ sslHashes& useHashes();
+ Socket& useSocket();
+ Log& useLog();
+ Buffers& useBuffers();
+
+ bool HasData() const;
+ bool GetQuietShutdown() const;
+
+ // sets
+ void set_pending(Cipher suite);
+ void set_random(const opaque*, ConnectionEnd);
+ void set_sessionID(const opaque*);
+ void set_session(SSL_SESSION*);
+ void set_preMaster(const opaque*, uint);
+ void set_masterSecret(const opaque*);
+ void SetError(YasslError);
+ int SetCompression();
+ void UnSetCompression();
+ void SetQuietShutdown(bool mode);
+
+ // helpers
+ bool isTLS() const;
+ bool isTLSv1_1() const;
+ void order_error();
+ void makeMasterSecret();
+ void makeTLSMasterSecret();
+ void addData(input_buffer* data);
+ void fillData(Data&);
+ void PeekData(Data&);
+ void addBuffer(output_buffer* b);
+ void flushBuffer();
+ void verifyState(const RecordLayerHeader&);
+ void verifyState(const HandShakeHeader&);
+ void verifyState(ClientState);
+ void verifyState(ServerState);
+ void verfiyHandShakeComplete();
+ void matchSuite(const opaque*, uint length);
+ void deriveKeys();
+ void deriveTLSKeys();
+ void Send(const byte*, uint);
+
+ uint bufferedData();
+ uint get_SEQIncrement(bool);
+
+ const byte* get_macSecret(bool);
+private:
+ void storeKeys(const opaque*);
+ void setKeys();
+ void verifyClientState(HandShakeType);
+ void verifyServerState(HandShakeType);
+
+ SSL(const SSL&); // hide copy
+ const SSL& operator=(const SSL&); // and assign
+};
+
+
+// compression
+int Compress(const byte*, int, input_buffer&);
+int DeCompress(input_buffer&, int, input_buffer&);
+
+
+// conversion functions
+void c32to24(uint32, uint24&);
+void c24to32(const uint24, uint32&);
+
+uint32 c24to32(const uint24);
+
+void ato16(const opaque*, uint16&);
+void ato24(const opaque*, uint24&);
+
+void c16toa(uint16, opaque*);
+void c24toa(const uint24, opaque*);
+void c32toa(uint32 u32, opaque*);
+
+
+} // naemspace
+
+#endif // yaSSL_INT_HPP
diff --git a/dep/mysqllite/extra/yassl/include/yassl_types.hpp b/dep/mysqllite/extra/yassl/include/yassl_types.hpp
new file mode 100644
index 0000000000..2853579282
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/include/yassl_types.hpp
@@ -0,0 +1,530 @@
+/*
+ Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+/* yaSSL types header defines all constants, enums, and typedefs
+ * from the SSL.v3 specification "draft-freier-ssl-version3-02.txt"
+ */
+
+
+#ifndef yaSSL_TYPES_HPP
+#define yaSSL_TYPES_HPP
+
+#include
+#include
+#include "type_traits.hpp"
+
+
+#ifdef _MSC_VER
+ // disable conversion warning
+ // 4996 warning to use MS extensions e.g., strcpy_s instead of strncpy
+ #pragma warning(disable:4244 4996)
+#endif
+
+
+namespace yaSSL {
+
+#define YASSL_LIB
+
+
+#ifdef YASSL_PURE_C
+
+ // library allocation
+ struct new_t {}; // yaSSL New type
+ extern new_t ys; // pass in parameter
+
+ } // namespace yaSSL
+
+ void* operator new (size_t, yaSSL::new_t);
+ void* operator new[](size_t, yaSSL::new_t);
+
+ void operator delete (void*, yaSSL::new_t);
+ void operator delete[](void*, yaSSL::new_t);
+
+
+ namespace yaSSL {
+
+
+ template
+ void ysDelete(T* ptr)
+ {
+ if (ptr) ptr->~T();
+ ::operator delete(ptr, yaSSL::ys);
+ }
+
+ template
+ void ysArrayDelete(T* ptr)
+ {
+ // can't do array placement destruction since not tracking size in
+ // allocation, only allow builtins to use array placement since they
+ // don't need destructors called
+ typedef char builtin[TaoCrypt::IsFundamentalType::Yes ? 1 : -1];
+ (void)sizeof(builtin);
+
+ ::operator delete[](ptr, yaSSL::ys);
+ }
+
+ #define NEW_YS new (yaSSL::ys)
+
+ // to resolve compiler generated operator delete on base classes with
+ // virtual destructors (when on stack), make sure doesn't get called
+ class virtual_base {
+ public:
+ static void operator delete(void*) { assert(0); }
+ };
+
+
+#else // YASSL_PURE_C
+
+
+ template
+ void ysDelete(T* ptr)
+ {
+ delete ptr;
+ }
+
+ template
+ void ysArrayDelete(T* ptr)
+ {
+ delete[] ptr;
+ }
+
+ #define NEW_YS new
+
+ class virtual_base {};
+
+
+
+#endif // YASSL_PURE_C
+
+
+typedef unsigned char uint8;
+typedef unsigned short uint16;
+typedef unsigned int uint32;
+typedef uint8 uint24[3];
+typedef uint32 uint64[2];
+
+typedef uint8 opaque;
+typedef opaque byte;
+
+typedef unsigned int uint;
+
+
+#ifdef USE_SYS_STL
+ // use system STL
+ #define STL_VECTOR_FILE
+ #define STL_LIST_FILE
+ #define STL_ALGORITHM_FILE
+ #define STL_MEMORY_FILE
+ #define STL_PAIR_FILE
+
+ #define STL_NAMESPACE std
+#else
+ // use mySTL
+ #define STL_VECTOR_FILE "vector.hpp"
+ #define STL_LIST_FILE "list.hpp"
+ #define STL_ALGORITHM_FILE "algorithm.hpp"
+ #define STL_MEMORY_FILE "memory.hpp"
+ #define STL_PAIR_FILE "pair.hpp"
+
+ #define STL_NAMESPACE mySTL
+#endif
+
+
+#ifdef min
+ #undef min
+#endif
+
+template
+T min(T a, T b)
+{
+ return a < b ? a : b;
+}
+
+
+
+// all length constants in bytes
+const int ID_LEN = 32; // session id length
+const int SUITE_LEN = 2; // cipher suite length
+const int SECRET_LEN = 48; // pre RSA and all master secret length
+const int MASTER_ROUNDS = 3; // master secret derivation rounds
+const int RAN_LEN = 32; // client and server random length
+const int MAC_BLOCK_SZ = 64; // MAC block size, & padding
+const int MD5_LEN = 16; // MD5 digest length
+const int SHA_LEN = 20; // SHA digest length
+const int RMD_LEN = 20; // RIPEMD-160 digest length
+const int PREFIX = 3; // up to 3 prefix letters for secret rounds
+const int KEY_PREFIX = 7; // up to 7 prefix letters for key rounds
+const int FORTEZZA_MAX = 128; // Maximum Fortezza Key length
+const int MAX_SUITE_SZ = 128; // 64 max suites * sizeof(suite)
+const int MAX_SUITE_NAME = 48; // max length of suite name
+const int MAX_CIPHERS = 32; // max supported ciphers for cipher list
+const int SIZEOF_ENUM = 1; // SSL considers an enum 1 byte, not 4
+const int SIZEOF_SENDER = 4; // Sender constant, for finished generation
+const int PAD_MD5 = 48; // pad length 1 and 2 for md5 finished
+const int PAD_SHA = 40; // should be 44, specd wrong by netscape
+const int PAD_RMD = 44; // pad length for RIPEMD-160, some use 40??
+const int CERT_HEADER = 3; // always use 3 bytes for certificate
+const int CERT_TYPES = 7; // certificate request types
+const int REQUEST_HEADER = 2; // request uses 2 bytes
+const int VERIFY_HEADER = 2; // verify length field
+const int MIN_CERT_TYPES = 1; // minimum certificate request types
+const int MIN_DIS_NAMES = 3; // minimum distinguished names
+const int MIN_DIS_SIZE = 1; // minimum distinguished name size
+const int RECORD_HEADER = 5; // type + version + length(2)
+const int HANDSHAKE_HEADER = 4; // type + length(3)
+const int FINISHED_SZ = MD5_LEN + SHA_LEN; // sizeof finished data
+const int TLS_FINISHED_SZ = 12; // TLS verify data size
+const int SEQ_SZ = 8; // 64 bit sequence number
+const int LENGTH_SZ = 2; // length field for HMAC, data only
+const int VERSION_SZ = SIZEOF_ENUM * 2; // SSL/TLS length of version
+const int DES_KEY_SZ = 8; // DES Key length
+const int DES_EDE_KEY_SZ = 24; // DES EDE Key length
+const int DES_BLOCK = 8; // DES is always fixed block size 8
+const int DES_IV_SZ = DES_BLOCK; // Init Vector length for DES
+const int RC4_KEY_SZ = 16; // RC4 Key length
+const int AES_128_KEY_SZ = 16; // AES 128bit Key length
+const int AES_192_KEY_SZ = 24; // AES 192bit Key length
+const int AES_256_KEY_SZ = 32; // AES 256bit Key length
+const int AES_BLOCK_SZ = 16; // AES 128bit block size, rfc 3268
+const int AES_IV_SZ = AES_BLOCK_SZ; // AES Init Vector length
+const int DSS_SIG_SZ = 40; // two 20 byte high byte first Integers
+const int DSS_ENCODED_EXTRA = 6; // seqID + len(1) + (intID + len(1)) * 2
+const int EVP_SALT_SZ = 8;
+const int MASTER_LABEL_SZ = 13; // TLS master secret label size
+const int KEY_LABEL_SZ = 13; // TLS key block expansion size
+const int FINISHED_LABEL_SZ = 15; // TLS finished lable length
+const int SEED_LEN = RAN_LEN * 2; // TLS seed, client + server random
+const int DEFAULT_TIMEOUT = 500; // Default Session timeout in seconds
+const int MAX_RECORD_SIZE = 16384; // 2^14, max size by standard
+const int COMPRESS_EXTRA = 1024; // extra compression possible addition
+const int SESSION_FLUSH_COUNT = 256; // when to flush session cache
+
+
+typedef uint8 Cipher; // first byte is always 0x00 for SSLv3 & TLS
+
+typedef opaque Random[RAN_LEN];
+
+typedef opaque* DistinguishedName;
+
+typedef bool IsExportable;
+
+
+enum CompressionMethod { no_compression = 0, zlib = 221 };
+
+enum CipherType { stream, block };
+
+enum CipherChoice { change_cipher_spec_choice = 1 };
+
+enum PublicValueEncoding { implicit_encoding, explicit_encoding };
+
+enum ConnectionEnd { server_end, client_end };
+
+enum AlertLevel { warning = 1, fatal = 2 };
+
+
+
+// Record Layer Header identifier from page 12
+enum ContentType {
+ no_type = 0,
+ change_cipher_spec = 20,
+ alert = 21,
+ handshake = 22,
+ application_data = 23
+};
+
+
+// HandShake Layer Header identifier from page 20
+enum HandShakeType {
+ no_shake = -1,
+ hello_request = 0,
+ client_hello = 1,
+ server_hello = 2,
+ certificate = 11,
+ server_key_exchange = 12,
+ certificate_request = 13,
+ server_hello_done = 14,
+ certificate_verify = 15,
+ client_key_exchange = 16,
+ finished = 20
+};
+
+
+// Valid Alert types from page 16/17
+enum AlertDescription {
+ close_notify = 0,
+ unexpected_message = 10,
+ bad_record_mac = 20,
+ decompression_failure = 30,
+ handshake_failure = 40,
+ no_certificate = 41,
+ bad_certificate = 42,
+ unsupported_certificate = 43,
+ certificate_revoked = 44,
+ certificate_expired = 45,
+ certificate_unknown = 46,
+ illegal_parameter = 47
+};
+
+
+// Supported Key Exchange Protocols
+enum KeyExchangeAlgorithm {
+ no_kea = 0,
+ rsa_kea,
+ diffie_hellman_kea,
+ fortezza_kea
+};
+
+
+// Supported Authentication Schemes
+enum SignatureAlgorithm {
+ anonymous_sa_algo = 0,
+ rsa_sa_algo,
+ dsa_sa_algo
+};
+
+
+// Valid client certificate request types from page 27
+enum ClientCertificateType {
+ rsa_sign = 1,
+ dss_sign = 2,
+ rsa_fixed_dh = 3,
+ dss_fixed_dh = 4,
+ rsa_ephemeral_dh = 5,
+ dss_ephemeral_dh = 6,
+ fortezza_kea_cert = 20
+};
+
+
+// Supported Ciphers from page 43
+enum BulkCipherAlgorithm {
+ cipher_null,
+ rc4,
+ rc2,
+ des,
+ triple_des, // leading 3 (3des) not valid identifier
+ des40,
+ idea,
+ aes
+};
+
+
+// Supported Message Authentication Codes from page 43
+enum MACAlgorithm {
+ no_mac,
+ md5,
+ sha,
+ rmd
+};
+
+
+// Certificate file Type
+enum CertType { Cert = 0, PrivateKey, CA };
+
+
+// all Cipher Suites from pages 41/42
+const Cipher SSL_NULL_WITH_NULL_NULL = 0; // { 0x00, 0x00 }
+const Cipher SSL_RSA_WITH_NULL_MD5 = 1; // { 0x00, 0x01 }
+const Cipher SSL_RSA_WITH_NULL_SHA = 2; // { 0x00, 0x02 }
+const Cipher SSL_RSA_EXPORT_WITH_RC4_40_MD5 = 3; // { 0x00, 0x03 }
+const Cipher SSL_RSA_WITH_RC4_128_MD5 = 4; // { 0x00, 0x04 }
+const Cipher SSL_RSA_WITH_RC4_128_SHA = 5; // { 0x00, 0x05 }
+const Cipher SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5 = 6; // { 0x00, 0x06 }
+const Cipher SSL_RSA_WITH_IDEA_CBC_SHA = 7; // { 0x00, 0x07 }
+const Cipher SSL_RSA_EXPORT_WITH_DES40_CBC_SHA = 8; // { 0x00, 0x08 }
+const Cipher SSL_RSA_WITH_DES_CBC_SHA = 9; // { 0x00, 0x09 }
+const Cipher SSL_RSA_WITH_3DES_EDE_CBC_SHA = 10; // { 0x00, 0x0A }
+const Cipher SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA = 11; // { 0x00, 0x0B }
+const Cipher SSL_DH_DSS_WITH_DES_CBC_SHA = 12; // { 0x00, 0x0C }
+const Cipher SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA = 13; // { 0x00, 0x0D }
+const Cipher SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA = 14; // { 0x00, 0x0E }
+const Cipher SSL_DH_RSA_WITH_DES_CBC_SHA = 15; // { 0x00, 0x0F }
+const Cipher SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA = 16; // { 0x00, 0x10 }
+const Cipher SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA = 17; // { 0x00, 0x11 }
+const Cipher SSL_DHE_DSS_WITH_DES_CBC_SHA = 18; // { 0x00, 0x12 }
+const Cipher SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA = 19; // { 0x00, 0x13 }
+const Cipher SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA = 20; // { 0x00, 0x14 }
+const Cipher SSL_DHE_RSA_WITH_DES_CBC_SHA = 21; // { 0x00, 0x15 }
+const Cipher SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA = 22; // { 0x00, 0x16 }
+const Cipher SSL_DH_anon_EXPORT_WITH_RC4_40_MD5 = 23; // { 0x00, 0x17 }
+const Cipher SSL_DH_anon_WITH_RC4_128_MD5 = 24; // { 0x00, 0x18 }
+const Cipher SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA = 25; // { 0x00, 0x19 }
+const Cipher SSL_DH_anon_WITH_DES_CBC_SHA = 26; // { 0x00, 0x1A }
+const Cipher SSL_DH_anon_WITH_3DES_EDE_CBC_SHA = 27; // { 0x00, 0x1B }
+const Cipher SSL_FORTEZZA_KEA_WITH_NULL_SHA = 28; // { 0x00, 0x1C }
+const Cipher SSL_FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHA = 29; // { 0x00, 0x1D }
+const Cipher SSL_FORTEZZA_KEA_WITH_RC4_128_SHA = 30; // { 0x00, 0x1E }
+
+// .. to 0x2B uses Kerberos Authentication
+
+
+// TLS AES extensions
+const Cipher TLS_RSA_WITH_AES_128_CBC_SHA = 47; // { 0x00, 0x2F }
+const Cipher TLS_DH_DSS_WITH_AES_128_CBC_SHA = 48; // { 0x00, 0x30 }
+const Cipher TLS_DH_RSA_WITH_AES_128_CBC_SHA = 49; // { 0x00, 0x31 }
+const Cipher TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 50; // { 0x00, 0x32 }
+const Cipher TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 51; // { 0x00, 0x33 }
+const Cipher TLS_DH_anon_WITH_AES_128_CBC_SHA = 52; // { 0x00, 0x34 }
+
+const Cipher TLS_RSA_WITH_AES_256_CBC_SHA = 53; // { 0x00, 0x35 }
+const Cipher TLS_DH_DSS_WITH_AES_256_CBC_SHA = 54; // { 0x00, 0x36 }
+const Cipher TLS_DH_RSA_WITH_AES_256_CBC_SHA = 55; // { 0x00, 0x37 }
+const Cipher TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 56; // { 0x00, 0x38 }
+const Cipher TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 57; // { 0x00, 0x39 }
+const Cipher TLS_DH_anon_WITH_AES_256_CBC_SHA = 58; // { 0x00, 0x3A }
+
+
+// OpenPGP extensions
+
+const Cipher TLS_DHE_DSS_WITH_3DES_EDE_CBC_RMD160 = 114; // { 0x00, 0x72 };
+const Cipher TLS_DHE_DSS_WITH_AES_128_CBC_RMD160 = 115; // { 0x00, 0x73 };
+const Cipher TLS_DHE_DSS_WITH_AES_256_CBC_RMD160 = 116; // { 0x00, 0x74 };
+const Cipher TLS_DHE_RSA_WITH_3DES_EDE_CBC_RMD160 = 119; // { 0x00, 0x77 };
+const Cipher TLS_DHE_RSA_WITH_AES_128_CBC_RMD160 = 120; // { 0x00, 0x78 };
+const Cipher TLS_DHE_RSA_WITH_AES_256_CBC_RMD160 = 121; // { 0x00, 0x79 };
+const Cipher TLS_RSA_WITH_3DES_EDE_CBC_RMD160 = 124; // { 0x00, 0x7C };
+const Cipher TLS_RSA_WITH_AES_128_CBC_RMD160 = 125; // { 0x00, 0x7D };
+const Cipher TLS_RSA_WITH_AES_256_CBC_RMD160 = 126; // { 0x00, 0x7E };
+
+
+const char* const null_str = "";
+
+const char* const cipher_names[128] =
+{
+ null_str, // SSL_NULL_WITH_NULL_NULL = 0
+ null_str, // SSL_RSA_WITH_NULL_MD5 = 1
+ null_str, // SSL_RSA_WITH_NULL_SHA = 2
+ null_str, // SSL_RSA_EXPORT_WITH_RC4_40_MD5 = 3
+ "RC4-MD5", // SSL_RSA_WITH_RC4_128_MD5 = 4
+ "RC4-SHA", // SSL_RSA_WITH_RC4_128_SHA = 5
+ null_str, // SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5 = 6
+ null_str, // SSL_RSA_WITH_IDEA_CBC_SHA = 7
+ null_str, // SSL_RSA_EXPORT_WITH_DES40_CBC_SHA = 8
+ "DES-CBC-SHA", // SSL_RSA_WITH_DES_CBC_SHA = 9
+ "DES-CBC3-SHA", // SSL_RSA_WITH_3DES_EDE_CBC_SHA = 10
+
+ null_str, // SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA = 11
+ null_str, // SSL_DH_DSS_WITH_DES_CBC_SHA = 12
+ null_str, // SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA = 13
+ null_str, // SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA = 14
+ null_str, // SSL_DH_RSA_WITH_DES_CBC_SHA = 15
+ null_str, // SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA = 16
+ null_str, // SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA = 17
+ "EDH-DSS-DES-CBC-SHA", // SSL_DHE_DSS_WITH_DES_CBC_SHA = 18
+ "EDH-DSS-DES-CBC3-SHA", // SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA = 19
+ null_str, // SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA = 20
+
+ "EDH-RSA-DES-CBC-SHA", // SSL_DHE_RSA_WITH_DES_CBC_SHA = 21
+ "EDH-RSA-DES-CBC3-SHA", // SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA = 22
+ null_str, // SSL_DH_anon_EXPORT_WITH_RC4_40_MD5 = 23
+ null_str, // SSL_DH_anon_WITH_RC4_128_MD5 = 24
+ null_str, // SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA = 25
+ null_str, // SSL_DH_anon_WITH_DES_CBC_SHA = 26
+ null_str, // SSL_DH_anon_WITH_3DES_EDE_CBC_SHA = 27
+ null_str, // SSL_FORTEZZA_KEA_WITH_NULL_SHA = 28
+ null_str, // SSL_FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHA = 29
+ null_str, // SSL_FORTEZZA_KEA_WITH_RC4_128_SHA = 30
+
+ null_str, null_str, null_str, null_str, null_str, // 31 - 35
+ null_str, null_str, null_str, null_str, null_str, // 36 - 40
+ null_str, null_str, null_str, null_str, null_str, // 41 - 45
+ null_str, // 46
+
+ // TLS AES extensions
+ "AES128-SHA", // TLS_RSA_WITH_AES_128_CBC_SHA = 47
+ null_str, // TLS_DH_DSS_WITH_AES_128_CBC_SHA = 48
+ null_str, // TLS_DH_RSA_WITH_AES_128_CBC_SHA = 49
+ "DHE-DSS-AES128-SHA", // TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 50
+ "DHE-RSA-AES128-SHA", // TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 51
+ null_str, // TLS_DH_anon_WITH_AES_128_CBC_SHA = 52
+
+ "AES256-SHA", // TLS_RSA_WITH_AES_256_CBC_SHA = 53
+ null_str, // TLS_DH_DSS_WITH_AES_256_CBC_SHA = 54
+ null_str, // TLS_DH_RSA_WITH_AES_256_CBC_SHA = 55
+ "DHE-DSS-AES256-SHA", // TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 56
+ "DHE-RSA-AES256-SHA", // TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 57
+ null_str, // TLS_DH_anon_WITH_AES_256_CBC_SHA = 58
+
+ null_str, // 59
+ null_str, // 60
+ null_str, null_str, null_str, null_str, null_str, // 61 - 65
+ null_str, null_str, null_str, null_str, null_str, // 66 - 70
+ null_str, null_str, null_str, null_str, null_str, // 71 - 75
+ null_str, null_str, null_str, null_str, null_str, // 76 - 80
+ null_str, null_str, null_str, null_str, null_str, // 81 - 85
+ null_str, null_str, null_str, null_str, null_str, // 86 - 90
+ null_str, null_str, null_str, null_str, null_str, // 91 - 95
+ null_str, null_str, null_str, null_str, null_str, // 96 - 100
+ null_str, null_str, null_str, null_str, null_str, // 101 - 105
+ null_str, null_str, null_str, null_str, null_str, // 106 - 110
+ null_str, null_str, null_str, // 111 - 113
+
+ "DHE-DSS-DES-CBC3-RMD", // TLS_DHE_DSS_WITH_3DES_EDE_CBC_RMD160 = 114
+ "DHE-DSS-AES128-RMD", // TLS_DHE_DSS_WITH_AES_128_CBC_RMD160 = 115
+ "DHE-DSS-AES256-RMD", // TLS_DHE_DSS_WITH_AES_256_CBC_RMD160 = 116
+ null_str, // 117
+ null_str, // 118
+ "DHE-RSA-DES-CBC3-RMD", // TLS_DHE_RSA_WITH_3DES_EDE_CBC_RMD160 = 119
+ "DHE-RSA-AES128-RMD", // TLS_DHE_RSA_WITH_AES_128_CBC_RMD160 = 120
+ "DHE-RSA-AES256-RMD", // TLS_DHE_RSA_WITH_AES_256_CBC_RMD160 = 121
+ null_str, // 122
+ null_str, // 123
+ "DES-CBC3-RMD", // TLS_RSA_WITH_3DES_EDE_CBC_RMD160 = 124
+ "AES128-RMD", // TLS_RSA_WITH_AES_128_CBC_RMD160 = 125
+ "AES256-RMD", // TLS_RSA_WITH_AES_256_CBC_RMD160 = 126
+ null_str // 127
+};
+
+// fill with MD5 pad size since biggest required
+const opaque PAD1[PAD_MD5] = { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
+ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
+ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
+ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
+ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
+ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36
+ };
+const opaque PAD2[PAD_MD5] = { 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
+ 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
+ 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
+ 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
+ 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
+ 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c
+ };
+
+const opaque client[SIZEOF_SENDER] = { 0x43, 0x4C, 0x4E, 0x54 };
+const opaque server[SIZEOF_SENDER] = { 0x53, 0x52, 0x56, 0x52 };
+
+const opaque tls_client[FINISHED_LABEL_SZ + 1] = "client finished";
+const opaque tls_server[FINISHED_LABEL_SZ + 1] = "server finished";
+
+const opaque master_label[MASTER_LABEL_SZ + 1] = "master secret";
+const opaque key_label [KEY_LABEL_SZ + 1] = "key expansion";
+
+
+} // naemspace
+
+#if __GNUC__ == 2 && __GNUC_MINOR__ <= 96
+/*
+ gcc 2.96 bails out because of two declarations of byte: yaSSL::byte and
+ TaoCrypt::byte. TODO: define global types.hpp and move the declaration of
+ 'byte' there.
+*/
+using yaSSL::byte;
+#endif
+
+
+#endif // yaSSL_TYPES_HPP
diff --git a/dep/mysqllite/extra/yassl/src/buffer.cpp b/dep/mysqllite/extra/yassl/src/buffer.cpp
new file mode 100644
index 0000000000..66107dbe0a
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/src/buffer.cpp
@@ -0,0 +1,279 @@
+/*
+ Copyright (C) 2000-2007 MySQL AB
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+
+/* yaSSL buffer header implements input/output buffers to simulate streaming
+ * with SSL types and sockets
+ */
+
+
+#include // memcpy
+#include "runtime.hpp"
+#include "buffer.hpp"
+#include "yassl_types.hpp"
+
+namespace yaSSL {
+
+
+
+// Checking Policy should implement a check function that tests whether the
+// index is within the size limit of the array
+
+void Check::check(uint i, uint limit)
+{
+ assert(i < limit);
+}
+
+
+void NoCheck::check(uint, uint)
+{
+}
+
+
+/* input_buffer operates like a smart c style array with a checking option,
+ * meant to be read from through [] with AUTO index or read().
+ * Should only write to at/near construction with assign() or raw (e.g., recv)
+ * followed by add_size with the number of elements added by raw write.
+ *
+ * Not using vector because need checked []access, offset, and the ability to
+ * write to the buffer bulk wise and have the correct size
+ */
+
+
+input_buffer::input_buffer()
+ : size_(0), current_(0), buffer_(0), end_(0)
+{}
+
+
+input_buffer::input_buffer(uint s)
+ : size_(0), current_(0), buffer_(NEW_YS byte[s]), end_(buffer_ + s)
+{}
+
+
+// with assign
+input_buffer::input_buffer(uint s, const byte* t, uint len)
+ : size_(0), current_(0), buffer_(NEW_YS byte[s]), end_(buffer_ + s)
+{
+ assign(t, len);
+}
+
+
+input_buffer::~input_buffer()
+{
+ ysArrayDelete(buffer_);
+}
+
+
+// users can pass defualt zero length buffer and then allocate
+void input_buffer::allocate(uint s)
+{
+ assert(!buffer_); // find realloc error
+ buffer_ = NEW_YS byte[s];
+ end_ = buffer_ + s;
+}
+
+
+// for passing to raw writing functions at beginning, then use add_size
+byte* input_buffer::get_buffer() const
+{
+ return buffer_;
+}
+
+
+// after a raw write user can set NEW_YS size
+// if you know the size before the write use assign()
+void input_buffer::add_size(uint i)
+{
+ check(size_ + i-1, get_capacity());
+ size_ += i;
+}
+
+
+uint input_buffer::get_capacity() const
+{
+ return (uint) (end_ - buffer_);
+}
+
+
+uint input_buffer::get_current() const
+{
+ return current_;
+}
+
+
+uint input_buffer::get_size() const
+{
+ return size_;
+}
+
+
+uint input_buffer::get_remaining() const
+{
+ return size_ - current_;
+}
+
+
+void input_buffer::set_current(uint i)
+{
+ if (i)
+ check(i - 1, size_);
+ current_ = i;
+}
+
+
+// read only access through [], advance current
+// user passes in AUTO index for ease of use
+const byte& input_buffer::operator[](uint i)
+{
+ assert (i == AUTO);
+ check(current_, size_);
+ return buffer_[current_++];
+}
+
+
+// end of input test
+bool input_buffer::eof()
+{
+ return current_ >= size_;
+}
+
+
+// peek ahead
+byte input_buffer::peek() const
+{
+ return buffer_[current_];
+}
+
+
+// write function, should use at/near construction
+void input_buffer::assign(const byte* t, uint s)
+{
+ check(current_, get_capacity());
+ add_size(s);
+ memcpy(&buffer_[current_], t, s);
+}
+
+
+// use read to query input, adjusts current
+void input_buffer::read(byte* dst, uint length)
+{
+ check(current_ + length - 1, size_);
+ memcpy(dst, &buffer_[current_], length);
+ current_ += length;
+}
+
+
+
+/* output_buffer operates like a smart c style array with a checking option.
+ * Meant to be written to through [] with AUTO index or write().
+ * Size (current) counter increases when written to. Can be constructed with
+ * zero length buffer but be sure to allocate before first use.
+ * Don't use add write for a couple bytes, use [] instead, way less overhead.
+ *
+ * Not using vector because need checked []access and the ability to
+ * write to the buffer bulk wise and retain correct size
+ */
+
+
+output_buffer::output_buffer()
+ : current_(0), buffer_(0), end_(0)
+{}
+
+
+// with allocate
+output_buffer::output_buffer(uint s)
+ : current_(0), buffer_(NEW_YS byte[s]), end_(buffer_ + s)
+{}
+
+
+// with assign
+output_buffer::output_buffer(uint s, const byte* t, uint len)
+ : current_(0), buffer_(NEW_YS byte[s]), end_(buffer_+ s)
+{
+ write(t, len);
+}
+
+
+output_buffer::~output_buffer()
+{
+ ysArrayDelete(buffer_);
+}
+
+
+uint output_buffer::get_size() const
+{
+ return current_;
+}
+
+
+uint output_buffer::get_capacity() const
+{
+ return (uint) (end_ - buffer_);
+}
+
+
+void output_buffer::set_current(uint c)
+{
+ check(c, get_capacity());
+ current_ = c;
+}
+
+
+// users can pass defualt zero length buffer and then allocate
+void output_buffer::allocate(uint s)
+{
+ assert(!buffer_); // find realloc error
+ buffer_ = NEW_YS byte[s]; end_ = buffer_ + s;
+}
+
+
+// for passing to reading functions when finished
+const byte* output_buffer::get_buffer() const
+{
+ return buffer_;
+}
+
+
+// allow write access through [], update current
+// user passes in AUTO as index for ease of use
+byte& output_buffer::operator[](uint i)
+{
+ assert(i == AUTO);
+ check(current_, get_capacity());
+ return buffer_[current_++];
+}
+
+
+// end of output test
+bool output_buffer::eof()
+{
+ return current_ >= get_capacity();
+}
+
+
+void output_buffer::write(const byte* t, uint s)
+{
+ check(current_ + s - 1, get_capacity());
+ memcpy(&buffer_[current_], t, s);
+ current_ += s;
+}
+
+
+
+} // naemspace
+
diff --git a/dep/mysqllite/extra/yassl/src/cert_wrapper.cpp b/dep/mysqllite/extra/yassl/src/cert_wrapper.cpp
new file mode 100644
index 0000000000..ebec088226
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/src/cert_wrapper.cpp
@@ -0,0 +1,370 @@
+/*
+ Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+
+/* The certificate wrapper source implements certificate management functions
+ *
+ */
+
+#include "runtime.hpp"
+#include "cert_wrapper.hpp"
+#include "yassl_int.hpp"
+#include "error.hpp"
+
+#if defined(USE_CML_LIB)
+ #include "cmapi_cpp.h"
+#else
+ #include "asn.hpp"
+ #include "file.hpp"
+#endif // USE_CML_LIB
+
+
+namespace yaSSL {
+
+
+x509::x509(uint sz) : length_(sz), buffer_(NEW_YS opaque[sz])
+{
+}
+
+
+x509::~x509()
+{
+ ysArrayDelete(buffer_);
+}
+
+
+x509::x509(const x509& that) : length_(that.length_),
+ buffer_(NEW_YS opaque[length_])
+{
+ memcpy(buffer_, that.buffer_, length_);
+}
+
+
+void x509::Swap(x509& that)
+{
+ STL::swap(length_, that.length_);
+ STL::swap(buffer_, that.buffer_);
+}
+
+
+x509& x509::operator=(const x509& that)
+{
+ x509 temp(that);
+ Swap(temp);
+ return *this;
+}
+
+
+uint x509::get_length() const
+{
+ return length_;
+}
+
+
+const opaque* x509::get_buffer() const
+{
+ return buffer_;
+}
+
+
+opaque* x509::use_buffer()
+{
+ return buffer_;
+}
+
+
+//CertManager
+CertManager::CertManager()
+ : peerX509_(0), verifyPeer_(false), verifyNone_(false), failNoCert_(false),
+ sendVerify_(false), verifyCallback_(0)
+{}
+
+
+CertManager::~CertManager()
+{
+ ysDelete(peerX509_);
+
+ STL::for_each(signers_.begin(), signers_.end(), del_ptr_zero()) ;
+
+ STL::for_each(peerList_.begin(), peerList_.end(), del_ptr_zero()) ;
+
+ STL::for_each(list_.begin(), list_.end(), del_ptr_zero()) ;
+}
+
+
+bool CertManager::verifyPeer() const
+{
+ return verifyPeer_;
+}
+
+
+bool CertManager::verifyNone() const
+{
+ return verifyNone_;
+}
+
+
+bool CertManager::failNoCert() const
+{
+ return failNoCert_;
+}
+
+
+bool CertManager::sendVerify() const
+{
+ return sendVerify_;
+}
+
+
+void CertManager::setVerifyPeer()
+{
+ verifyPeer_ = true;
+}
+
+
+void CertManager::setVerifyNone()
+{
+ verifyNone_ = true;
+}
+
+
+void CertManager::setFailNoCert()
+{
+ failNoCert_ = true;
+}
+
+
+void CertManager::setSendVerify()
+{
+ sendVerify_ = true;
+}
+
+
+void CertManager::setVerifyCallback(VerifyCallback vc)
+{
+ verifyCallback_ = vc;
+}
+
+
+void CertManager::AddPeerCert(x509* x)
+{
+ peerList_.push_back(x); // take ownership
+}
+
+
+void CertManager::CopySelfCert(const x509* x)
+{
+ if (x)
+ list_.push_back(NEW_YS x509(*x));
+}
+
+
+// add to signers
+int CertManager::CopyCaCert(const x509* x)
+{
+ TaoCrypt::Source source(x->get_buffer(), x->get_length());
+ TaoCrypt::CertDecoder cert(source, true, &signers_, verifyNone_,
+ TaoCrypt::CertDecoder::CA);
+
+ if (!cert.GetError().What()) {
+ const TaoCrypt::PublicKey& key = cert.GetPublicKey();
+ signers_.push_back(NEW_YS TaoCrypt::Signer(key.GetKey(), key.size(),
+ cert.GetCommonName(), cert.GetHash()));
+ }
+ // just don't add, not an error return cert.GetError().What();
+ return 0;
+}
+
+
+const x509* CertManager::get_cert() const
+{
+ return list_.front();
+}
+
+
+const opaque* CertManager::get_peerKey() const
+{
+ return peerPublicKey_.get_buffer();
+}
+
+
+X509* CertManager::get_peerX509() const
+{
+ return peerX509_;
+}
+
+
+SignatureAlgorithm CertManager::get_peerKeyType() const
+{
+ return peerKeyType_;
+}
+
+
+SignatureAlgorithm CertManager::get_keyType() const
+{
+ return keyType_;
+}
+
+
+uint CertManager::get_peerKeyLength() const
+{
+ return peerPublicKey_.get_size();
+}
+
+
+const opaque* CertManager::get_privateKey() const
+{
+ return privateKey_.get_buffer();
+}
+
+
+uint CertManager::get_privateKeyLength() const
+{
+ return privateKey_.get_size();
+}
+
+
+// Validate the peer's certificate list, from root to peer (last to first)
+int CertManager::Validate()
+{
+ CertList::reverse_iterator last = peerList_.rbegin();
+ size_t count = peerList_.size();
+
+ while ( count > 1 ) {
+ TaoCrypt::Source source((*last)->get_buffer(), (*last)->get_length());
+ TaoCrypt::CertDecoder cert(source, true, &signers_, verifyNone_);
+
+ if (int err = cert.GetError().What())
+ return err;
+
+ const TaoCrypt::PublicKey& key = cert.GetPublicKey();
+ signers_.push_back(NEW_YS TaoCrypt::Signer(key.GetKey(), key.size(),
+ cert.GetCommonName(), cert.GetHash()));
+ ++last;
+ --count;
+ }
+
+ if (count) {
+ // peer's is at the front
+ TaoCrypt::Source source((*last)->get_buffer(), (*last)->get_length());
+ TaoCrypt::CertDecoder cert(source, true, &signers_, verifyNone_);
+
+ int err = cert.GetError().What();
+ if ( err )
+ return err;
+
+ uint sz = cert.GetPublicKey().size();
+ peerPublicKey_.allocate(sz);
+ peerPublicKey_.assign(cert.GetPublicKey().GetKey(), sz);
+
+ if (cert.GetKeyType() == TaoCrypt::RSAk)
+ peerKeyType_ = rsa_sa_algo;
+ else
+ peerKeyType_ = dsa_sa_algo;
+
+ size_t iSz = strlen(cert.GetIssuer()) + 1;
+ size_t sSz = strlen(cert.GetCommonName()) + 1;
+ int bSz = (int)strlen(cert.GetBeforeDate()) + 1;
+ int aSz = (int)strlen(cert.GetAfterDate()) + 1;
+ peerX509_ = NEW_YS X509(cert.GetIssuer(), iSz, cert.GetCommonName(),
+ sSz, cert.GetBeforeDate(), bSz,
+ cert.GetAfterDate(), aSz);
+
+ if (err == TaoCrypt::SIG_OTHER_E && verifyCallback_) {
+ X509_STORE_CTX store;
+ store.error = err;
+ store.error_depth = static_cast(count) - 1;
+ store.current_cert = peerX509_;
+
+ int ok = verifyCallback_(0, &store);
+ if (ok) return 0;
+ }
+
+ if (err == TaoCrypt::SIG_OTHER_E) return err;
+ }
+ return 0;
+}
+
+
+// Set the private key
+int CertManager::SetPrivateKey(const x509& key)
+{
+ privateKey_.allocate(key.get_length());
+ privateKey_.assign(key.get_buffer(), key.get_length());
+
+ // set key type
+ if (x509* cert = list_.front()) {
+ TaoCrypt::Source source(cert->get_buffer(), cert->get_length());
+ TaoCrypt::CertDecoder cd(source, false);
+ cd.DecodeToKey();
+ if (int err = cd.GetError().What())
+ return err;
+ if (cd.GetKeyType() == TaoCrypt::RSAk)
+ keyType_ = rsa_sa_algo;
+ else
+ keyType_ = dsa_sa_algo;
+ }
+ return 0;
+}
+
+
+// Store OpenSSL type peer's cert
+void CertManager::setPeerX509(X509* x)
+{
+ assert(peerX509_ == 0);
+ if (x == 0) return;
+
+ X509_NAME* issuer = x->GetIssuer();
+ X509_NAME* subject = x->GetSubject();
+ ASN1_STRING* before = x->GetBefore();
+ ASN1_STRING* after = x->GetAfter();
+
+ peerX509_ = NEW_YS X509(issuer->GetName(), issuer->GetLength(),
+ subject->GetName(), subject->GetLength(), (const char*) before->data,
+ before->length, (const char*) after->data, after->length);
+}
+
+
+#if defined(USE_CML_LIB)
+
+// Get the peer's certificate, extract and save public key
+void CertManager::SetPeerKey()
+{
+ // first cert is the peer's
+ x509* main = peerList_.front();
+
+ Bytes_struct cert;
+ cert.num = main->get_length();
+ cert.data = main->set_buffer();
+
+ CML::Certificate cm(cert);
+ const CML::ASN::Cert& raw = cm.base();
+ CTIL::CSM_Buffer key = raw.pubKeyInfo.key;
+
+ uint sz;
+ opaque* key_buffer = reinterpret_cast(key.Get(sz));
+ peerPublicKey_.allocate(sz);
+ peerPublicKey_.assign(key_buffer, sz);
+}
+
+
+#endif // USE_CML_LIB
+
+
+
+} // namespace
diff --git a/dep/mysqllite/extra/yassl/src/crypto_wrapper.cpp b/dep/mysqllite/extra/yassl/src/crypto_wrapper.cpp
new file mode 100644
index 0000000000..b968ec1e6c
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/src/crypto_wrapper.cpp
@@ -0,0 +1,1014 @@
+/*
+ Copyright (C) 2000-2007 MySQL AB
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+/* The crypto wrapper source implements the policies for the cipher
+ * components used by SSL.
+ *
+ * The implementation relies on a specfic library, taoCrypt.
+ */
+
+#if !defined(USE_CRYPTOPP_LIB)
+
+#include "runtime.hpp"
+#include "crypto_wrapper.hpp"
+#include "cert_wrapper.hpp"
+
+#include "md5.hpp"
+#include "sha.hpp"
+#include "ripemd.hpp"
+#include "hmac.hpp"
+#include "modes.hpp"
+#include "des.hpp"
+#include "arc4.hpp"
+#include "aes.hpp"
+#include "rsa.hpp"
+#include "dsa.hpp"
+#include "dh.hpp"
+#include "random.hpp"
+#include "file.hpp"
+#include "coding.hpp"
+
+
+namespace yaSSL {
+
+
+// MD5 Implementation
+struct MD5::MD5Impl {
+ TaoCrypt::MD5 md5_;
+ MD5Impl() {}
+ explicit MD5Impl(const TaoCrypt::MD5& md5) : md5_(md5) {}
+};
+
+
+MD5::MD5() : pimpl_(NEW_YS MD5Impl) {}
+
+
+MD5::~MD5() { ysDelete(pimpl_); }
+
+
+MD5::MD5(const MD5& that) : Digest(), pimpl_(NEW_YS
+ MD5Impl(that.pimpl_->md5_)) {}
+
+
+MD5& MD5::operator=(const MD5& that)
+{
+ pimpl_->md5_ = that.pimpl_->md5_;
+ return *this;
+}
+
+
+uint MD5::get_digestSize() const
+{
+ return MD5_LEN;
+}
+
+
+uint MD5::get_padSize() const
+{
+ return PAD_MD5;
+}
+
+
+// Fill out with MD5 digest from in that is sz bytes, out must be >= digest sz
+void MD5::get_digest(byte* out, const byte* in, unsigned int sz)
+{
+ pimpl_->md5_.Update(in, sz);
+ pimpl_->md5_.Final(out);
+}
+
+// Fill out with MD5 digest from previous updates
+void MD5::get_digest(byte* out)
+{
+ pimpl_->md5_.Final(out);
+}
+
+
+// Update the current digest
+void MD5::update(const byte* in, unsigned int sz)
+{
+ pimpl_->md5_.Update(in, sz);
+}
+
+
+// SHA Implementation
+struct SHA::SHAImpl {
+ TaoCrypt::SHA sha_;
+ SHAImpl() {}
+ explicit SHAImpl(const TaoCrypt::SHA& sha) : sha_(sha) {}
+};
+
+
+SHA::SHA() : pimpl_(NEW_YS SHAImpl) {}
+
+
+SHA::~SHA() { ysDelete(pimpl_); }
+
+
+SHA::SHA(const SHA& that) : Digest(), pimpl_(NEW_YS SHAImpl(that.pimpl_->sha_)) {}
+
+SHA& SHA::operator=(const SHA& that)
+{
+ pimpl_->sha_ = that.pimpl_->sha_;
+ return *this;
+}
+
+
+uint SHA::get_digestSize() const
+{
+ return SHA_LEN;
+}
+
+
+uint SHA::get_padSize() const
+{
+ return PAD_SHA;
+}
+
+
+// Fill out with SHA digest from in that is sz bytes, out must be >= digest sz
+void SHA::get_digest(byte* out, const byte* in, unsigned int sz)
+{
+ pimpl_->sha_.Update(in, sz);
+ pimpl_->sha_.Final(out);
+}
+
+
+// Fill out with SHA digest from previous updates
+void SHA::get_digest(byte* out)
+{
+ pimpl_->sha_.Final(out);
+}
+
+
+// Update the current digest
+void SHA::update(const byte* in, unsigned int sz)
+{
+ pimpl_->sha_.Update(in, sz);
+}
+
+
+// RMD-160 Implementation
+struct RMD::RMDImpl {
+ TaoCrypt::RIPEMD160 rmd_;
+ RMDImpl() {}
+ explicit RMDImpl(const TaoCrypt::RIPEMD160& rmd) : rmd_(rmd) {}
+};
+
+
+RMD::RMD() : pimpl_(NEW_YS RMDImpl) {}
+
+
+RMD::~RMD() { ysDelete(pimpl_); }
+
+
+RMD::RMD(const RMD& that) : Digest(), pimpl_(NEW_YS RMDImpl(that.pimpl_->rmd_)) {}
+
+RMD& RMD::operator=(const RMD& that)
+{
+ pimpl_->rmd_ = that.pimpl_->rmd_;
+ return *this;
+}
+
+
+uint RMD::get_digestSize() const
+{
+ return RMD_LEN;
+}
+
+
+uint RMD::get_padSize() const
+{
+ return PAD_RMD;
+}
+
+
+// Fill out with RMD digest from in that is sz bytes, out must be >= digest sz
+void RMD::get_digest(byte* out, const byte* in, unsigned int sz)
+{
+ pimpl_->rmd_.Update(in, sz);
+ pimpl_->rmd_.Final(out);
+}
+
+
+// Fill out with RMD digest from previous updates
+void RMD::get_digest(byte* out)
+{
+ pimpl_->rmd_.Final(out);
+}
+
+
+// Update the current digest
+void RMD::update(const byte* in, unsigned int sz)
+{
+ pimpl_->rmd_.Update(in, sz);
+}
+
+
+// HMAC_MD5 Implementation
+struct HMAC_MD5::HMAC_MD5Impl {
+ TaoCrypt::HMAC mac_;
+ HMAC_MD5Impl() {}
+};
+
+
+HMAC_MD5::HMAC_MD5(const byte* secret, unsigned int len)
+ : pimpl_(NEW_YS HMAC_MD5Impl)
+{
+ pimpl_->mac_.SetKey(secret, len);
+}
+
+
+HMAC_MD5::~HMAC_MD5() { ysDelete(pimpl_); }
+
+
+uint HMAC_MD5::get_digestSize() const
+{
+ return MD5_LEN;
+}
+
+
+uint HMAC_MD5::get_padSize() const
+{
+ return PAD_MD5;
+}
+
+
+// Fill out with MD5 digest from in that is sz bytes, out must be >= digest sz
+void HMAC_MD5::get_digest(byte* out, const byte* in, unsigned int sz)
+{
+ pimpl_->mac_.Update(in, sz);
+ pimpl_->mac_.Final(out);
+}
+
+// Fill out with MD5 digest from previous updates
+void HMAC_MD5::get_digest(byte* out)
+{
+ pimpl_->mac_.Final(out);
+}
+
+
+// Update the current digest
+void HMAC_MD5::update(const byte* in, unsigned int sz)
+{
+ pimpl_->mac_.Update(in, sz);
+}
+
+
+// HMAC_SHA Implementation
+struct HMAC_SHA::HMAC_SHAImpl {
+ TaoCrypt::HMAC mac_;
+ HMAC_SHAImpl() {}
+};
+
+
+HMAC_SHA::HMAC_SHA(const byte* secret, unsigned int len)
+ : pimpl_(NEW_YS HMAC_SHAImpl)
+{
+ pimpl_->mac_.SetKey(secret, len);
+}
+
+
+HMAC_SHA::~HMAC_SHA() { ysDelete(pimpl_); }
+
+
+uint HMAC_SHA::get_digestSize() const
+{
+ return SHA_LEN;
+}
+
+
+uint HMAC_SHA::get_padSize() const
+{
+ return PAD_SHA;
+}
+
+
+// Fill out with SHA digest from in that is sz bytes, out must be >= digest sz
+void HMAC_SHA::get_digest(byte* out, const byte* in, unsigned int sz)
+{
+ pimpl_->mac_.Update(in, sz);
+ pimpl_->mac_.Final(out);
+}
+
+// Fill out with SHA digest from previous updates
+void HMAC_SHA::get_digest(byte* out)
+{
+ pimpl_->mac_.Final(out);
+}
+
+
+// Update the current digest
+void HMAC_SHA::update(const byte* in, unsigned int sz)
+{
+ pimpl_->mac_.Update(in, sz);
+}
+
+
+
+// HMAC_RMD Implementation
+struct HMAC_RMD::HMAC_RMDImpl {
+ TaoCrypt::HMAC mac_;
+ HMAC_RMDImpl() {}
+};
+
+
+HMAC_RMD::HMAC_RMD(const byte* secret, unsigned int len)
+ : pimpl_(NEW_YS HMAC_RMDImpl)
+{
+ pimpl_->mac_.SetKey(secret, len);
+}
+
+
+HMAC_RMD::~HMAC_RMD() { ysDelete(pimpl_); }
+
+
+uint HMAC_RMD::get_digestSize() const
+{
+ return RMD_LEN;
+}
+
+
+uint HMAC_RMD::get_padSize() const
+{
+ return PAD_RMD;
+}
+
+
+// Fill out with RMD digest from in that is sz bytes, out must be >= digest sz
+void HMAC_RMD::get_digest(byte* out, const byte* in, unsigned int sz)
+{
+ pimpl_->mac_.Update(in, sz);
+ pimpl_->mac_.Final(out);
+}
+
+// Fill out with RMD digest from previous updates
+void HMAC_RMD::get_digest(byte* out)
+{
+ pimpl_->mac_.Final(out);
+}
+
+
+// Update the current digest
+void HMAC_RMD::update(const byte* in, unsigned int sz)
+{
+ pimpl_->mac_.Update(in, sz);
+}
+
+
+struct DES::DESImpl {
+ TaoCrypt::DES_CBC_Encryption encryption;
+ TaoCrypt::DES_CBC_Decryption decryption;
+};
+
+
+DES::DES() : pimpl_(NEW_YS DESImpl) {}
+
+DES::~DES() { ysDelete(pimpl_); }
+
+
+void DES::set_encryptKey(const byte* k, const byte* iv)
+{
+ pimpl_->encryption.SetKey(k, DES_KEY_SZ, iv);
+}
+
+
+void DES::set_decryptKey(const byte* k, const byte* iv)
+{
+ pimpl_->decryption.SetKey(k, DES_KEY_SZ, iv);
+}
+
+// DES encrypt plain of length sz into cipher
+void DES::encrypt(byte* cipher, const byte* plain, unsigned int sz)
+{
+ pimpl_->encryption.Process(cipher, plain, sz);
+}
+
+
+// DES decrypt cipher of length sz into plain
+void DES::decrypt(byte* plain, const byte* cipher, unsigned int sz)
+{
+ pimpl_->decryption.Process(plain, cipher, sz);
+}
+
+
+struct DES_EDE::DES_EDEImpl {
+ TaoCrypt::DES_EDE3_CBC_Encryption encryption;
+ TaoCrypt::DES_EDE3_CBC_Decryption decryption;
+};
+
+
+DES_EDE::DES_EDE() : pimpl_(NEW_YS DES_EDEImpl) {}
+
+DES_EDE::~DES_EDE() { ysDelete(pimpl_); }
+
+
+void DES_EDE::set_encryptKey(const byte* k, const byte* iv)
+{
+ pimpl_->encryption.SetKey(k, DES_EDE_KEY_SZ, iv);
+}
+
+
+void DES_EDE::set_decryptKey(const byte* k, const byte* iv)
+{
+ pimpl_->decryption.SetKey(k, DES_EDE_KEY_SZ, iv);
+}
+
+
+// 3DES encrypt plain of length sz into cipher
+void DES_EDE::encrypt(byte* cipher, const byte* plain, unsigned int sz)
+{
+ pimpl_->encryption.Process(cipher, plain, sz);
+}
+
+
+// 3DES decrypt cipher of length sz into plain
+void DES_EDE::decrypt(byte* plain, const byte* cipher, unsigned int sz)
+{
+ pimpl_->decryption.Process(plain, cipher, sz);
+}
+
+
+// Implementation of alledged RC4
+struct RC4::RC4Impl {
+ TaoCrypt::ARC4::Encryption encryption;
+ TaoCrypt::ARC4::Decryption decryption;
+};
+
+
+RC4::RC4() : pimpl_(NEW_YS RC4Impl) {}
+
+RC4::~RC4() { ysDelete(pimpl_); }
+
+
+void RC4::set_encryptKey(const byte* k, const byte*)
+{
+ pimpl_->encryption.SetKey(k, RC4_KEY_SZ);
+}
+
+
+void RC4::set_decryptKey(const byte* k, const byte*)
+{
+ pimpl_->decryption.SetKey(k, RC4_KEY_SZ);
+}
+
+
+// RC4 encrypt plain of length sz into cipher
+void RC4::encrypt(byte* cipher, const byte* plain, unsigned int sz)
+{
+ pimpl_->encryption.Process(cipher, plain, sz);
+}
+
+
+// RC4 decrypt cipher of length sz into plain
+void RC4::decrypt(byte* plain, const byte* cipher, unsigned int sz)
+{
+ pimpl_->decryption.Process(plain, cipher, sz);
+}
+
+
+
+// Implementation of AES
+struct AES::AESImpl {
+ TaoCrypt::AES_CBC_Encryption encryption;
+ TaoCrypt::AES_CBC_Decryption decryption;
+ unsigned int keySz_;
+
+ AESImpl(unsigned int ks) : keySz_(ks) {}
+};
+
+
+AES::AES(unsigned int ks) : pimpl_(NEW_YS AESImpl(ks)) {}
+
+AES::~AES() { ysDelete(pimpl_); }
+
+
+int AES::get_keySize() const
+{
+ return pimpl_->keySz_;
+}
+
+
+void AES::set_encryptKey(const byte* k, const byte* iv)
+{
+ pimpl_->encryption.SetKey(k, pimpl_->keySz_, iv);
+}
+
+
+void AES::set_decryptKey(const byte* k, const byte* iv)
+{
+ pimpl_->decryption.SetKey(k, pimpl_->keySz_, iv);
+}
+
+
+// AES encrypt plain of length sz into cipher
+void AES::encrypt(byte* cipher, const byte* plain, unsigned int sz)
+{
+ pimpl_->encryption.Process(cipher, plain, sz);
+}
+
+
+// AES decrypt cipher of length sz into plain
+void AES::decrypt(byte* plain, const byte* cipher, unsigned int sz)
+{
+ pimpl_->decryption.Process(plain, cipher, sz);
+}
+
+
+struct RandomPool::RandomImpl {
+ TaoCrypt::RandomNumberGenerator RNG_;
+};
+
+RandomPool::RandomPool() : pimpl_(NEW_YS RandomImpl) {}
+
+RandomPool::~RandomPool() { ysDelete(pimpl_); }
+
+int RandomPool::GetError() const
+{
+ return pimpl_->RNG_.GetError();
+}
+
+void RandomPool::Fill(opaque* dst, uint sz) const
+{
+ pimpl_->RNG_.GenerateBlock(dst, sz);
+}
+
+
+// Implementation of DSS Authentication
+struct DSS::DSSImpl {
+ void SetPublic (const byte*, unsigned int);
+ void SetPrivate(const byte*, unsigned int);
+ TaoCrypt::DSA_PublicKey publicKey_;
+ TaoCrypt::DSA_PrivateKey privateKey_;
+};
+
+
+// Decode and store the public key
+void DSS::DSSImpl::SetPublic(const byte* key, unsigned int sz)
+{
+ TaoCrypt::Source source(key, sz);
+ publicKey_.Initialize(source);
+}
+
+
+// Decode and store the public key
+void DSS::DSSImpl::SetPrivate(const byte* key, unsigned int sz)
+{
+ TaoCrypt::Source source(key, sz);
+ privateKey_.Initialize(source);
+ publicKey_ = TaoCrypt::DSA_PublicKey(privateKey_);
+
+}
+
+
+// Set public or private key
+DSS::DSS(const byte* key, unsigned int sz, bool publicKey)
+ : pimpl_(NEW_YS DSSImpl)
+{
+ if (publicKey)
+ pimpl_->SetPublic(key, sz);
+ else
+ pimpl_->SetPrivate(key, sz);
+}
+
+
+DSS::~DSS()
+{
+ ysDelete(pimpl_);
+}
+
+
+uint DSS::get_signatureLength() const
+{
+ return pimpl_->publicKey_.SignatureLength();
+}
+
+
+// DSS Sign message of length sz into sig
+void DSS::sign(byte* sig, const byte* sha_digest, unsigned int /* shaSz */,
+ const RandomPool& random)
+{
+ using namespace TaoCrypt;
+
+ DSA_Signer signer(pimpl_->privateKey_);
+ signer.Sign(sha_digest, sig, random.pimpl_->RNG_);
+}
+
+
+// DSS Verify message of length sz against sig, is it correct?
+bool DSS::verify(const byte* sha_digest, unsigned int /* shaSz */,
+ const byte* sig, unsigned int /* sigSz */)
+{
+ using namespace TaoCrypt;
+
+ DSA_Verifier ver(pimpl_->publicKey_);
+ return ver.Verify(sha_digest, sig);
+}
+
+
+// Implementation of RSA key interface
+struct RSA::RSAImpl {
+ void SetPublic (const byte*, unsigned int);
+ void SetPrivate(const byte*, unsigned int);
+ TaoCrypt::RSA_PublicKey publicKey_;
+ TaoCrypt::RSA_PrivateKey privateKey_;
+};
+
+
+// Decode and store the public key
+void RSA::RSAImpl::SetPublic(const byte* key, unsigned int sz)
+{
+ TaoCrypt::Source source(key, sz);
+ publicKey_.Initialize(source);
+}
+
+
+// Decode and store the private key
+void RSA::RSAImpl::SetPrivate(const byte* key, unsigned int sz)
+{
+ TaoCrypt::Source source(key, sz);
+ privateKey_.Initialize(source);
+ publicKey_ = TaoCrypt::RSA_PublicKey(privateKey_);
+}
+
+
+// Set public or private key
+RSA::RSA(const byte* key, unsigned int sz, bool publicKey)
+ : pimpl_(NEW_YS RSAImpl)
+{
+ if (publicKey)
+ pimpl_->SetPublic(key, sz);
+ else
+ pimpl_->SetPrivate(key, sz);
+}
+
+RSA::~RSA()
+{
+ ysDelete(pimpl_);
+}
+
+
+// get cipher text length, varies on key size
+unsigned int RSA::get_cipherLength() const
+{
+ return pimpl_->publicKey_.FixedCiphertextLength();
+}
+
+
+// get signautre length, varies on key size
+unsigned int RSA::get_signatureLength() const
+{
+ return get_cipherLength();
+}
+
+
+// RSA Sign message of length sz into sig
+void RSA::sign(byte* sig, const byte* message, unsigned int sz,
+ const RandomPool& random)
+{
+ TaoCrypt::RSAES_Decryptor dec(pimpl_->privateKey_);
+ dec.SSL_Sign(message, sz, sig, random.pimpl_->RNG_);
+}
+
+
+// RSA Verify message of length sz against sig
+bool RSA::verify(const byte* message, unsigned int sz, const byte* sig,
+ unsigned int)
+{
+ TaoCrypt::RSAES_Encryptor enc(pimpl_->publicKey_);
+ return enc.SSL_Verify(message, sz, sig);
+}
+
+
+// RSA public encrypt plain of length sz into cipher
+void RSA::encrypt(byte* cipher, const byte* plain, unsigned int sz,
+ const RandomPool& random)
+{
+
+ TaoCrypt::RSAES_Encryptor enc(pimpl_->publicKey_);
+ enc.Encrypt(plain, sz, cipher, random.pimpl_->RNG_);
+}
+
+
+// RSA private decrypt cipher of length sz into plain
+void RSA::decrypt(byte* plain, const byte* cipher, unsigned int sz,
+ const RandomPool& random)
+{
+ TaoCrypt::RSAES_Decryptor dec(pimpl_->privateKey_);
+ dec.Decrypt(cipher, sz, plain, random.pimpl_->RNG_);
+}
+
+
+struct Integer::IntegerImpl {
+ TaoCrypt::Integer int_;
+
+ IntegerImpl() {}
+ explicit IntegerImpl(const TaoCrypt::Integer& i) : int_(i) {}
+};
+
+Integer::Integer() : pimpl_(NEW_YS IntegerImpl) {}
+
+Integer::~Integer() { ysDelete(pimpl_); }
+
+
+
+Integer::Integer(const Integer& other) : pimpl_(NEW_YS
+ IntegerImpl(other.pimpl_->int_))
+{}
+
+
+Integer& Integer::operator=(const Integer& that)
+{
+ pimpl_->int_ = that.pimpl_->int_;
+
+ return *this;
+}
+
+
+void Integer::assign(const byte* num, unsigned int sz)
+{
+ pimpl_->int_ = TaoCrypt::Integer(num, sz);
+}
+
+
+struct DiffieHellman::DHImpl {
+ TaoCrypt::DH dh_;
+ TaoCrypt::RandomNumberGenerator& ranPool_;
+ byte* publicKey_;
+ byte* privateKey_;
+ byte* agreedKey_;
+
+ DHImpl(TaoCrypt::RandomNumberGenerator& r) : ranPool_(r), publicKey_(0),
+ privateKey_(0), agreedKey_(0) {}
+ ~DHImpl()
+ {
+ ysArrayDelete(agreedKey_);
+ ysArrayDelete(privateKey_);
+ ysArrayDelete(publicKey_);
+ }
+
+ DHImpl(const DHImpl& that) : dh_(that.dh_), ranPool_(that.ranPool_),
+ publicKey_(0), privateKey_(0), agreedKey_(0)
+ {
+ uint length = dh_.GetByteLength();
+ AllocKeys(length, length, length);
+ }
+
+ void AllocKeys(unsigned int pubSz, unsigned int privSz, unsigned int agrSz)
+ {
+ publicKey_ = NEW_YS byte[pubSz];
+ privateKey_ = NEW_YS byte[privSz];
+ agreedKey_ = NEW_YS byte[agrSz];
+ }
+};
+
+
+
+/*
+// server Side DH, server's view
+DiffieHellman::DiffieHellman(const char* file, const RandomPool& random)
+ : pimpl_(NEW_YS DHImpl(random.pimpl_->RNG_))
+{
+ using namespace TaoCrypt;
+ Source source;
+ FileSource(file, source);
+ if (source.size() == 0)
+ return; // TODO add error state, and force check
+ HexDecoder hd(source);
+
+ pimpl_->dh_.Initialize(source);
+
+ uint length = pimpl_->dh_.GetByteLength();
+
+ pimpl_->AllocKeys(length, length, length);
+ pimpl_->dh_.GenerateKeyPair(pimpl_->ranPool_, pimpl_->privateKey_,
+ pimpl_->publicKey_);
+}
+*/
+
+
+// server Side DH, client's view
+DiffieHellman::DiffieHellman(const byte* p, unsigned int pSz, const byte* g,
+ unsigned int gSz, const byte* pub,
+ unsigned int pubSz, const RandomPool& random)
+ : pimpl_(NEW_YS DHImpl(random.pimpl_->RNG_))
+{
+ using TaoCrypt::Integer;
+
+ pimpl_->dh_.Initialize(Integer(p, pSz).Ref(), Integer(g, gSz).Ref());
+ pimpl_->publicKey_ = NEW_YS opaque[pubSz];
+ memcpy(pimpl_->publicKey_, pub, pubSz);
+}
+
+
+// Server Side DH, server's view
+DiffieHellman::DiffieHellman(const Integer& p, const Integer& g,
+ const RandomPool& random)
+: pimpl_(NEW_YS DHImpl(random.pimpl_->RNG_))
+{
+ using TaoCrypt::Integer;
+
+ pimpl_->dh_.Initialize(p.pimpl_->int_, g.pimpl_->int_);
+
+ uint length = pimpl_->dh_.GetByteLength();
+
+ pimpl_->AllocKeys(length, length, length);
+ pimpl_->dh_.GenerateKeyPair(pimpl_->ranPool_, pimpl_->privateKey_,
+ pimpl_->publicKey_);
+}
+
+DiffieHellman::~DiffieHellman() { ysDelete(pimpl_); }
+
+
+// Client side and view, use server that for p and g
+DiffieHellman::DiffieHellman(const DiffieHellman& that)
+ : pimpl_(NEW_YS DHImpl(*that.pimpl_))
+{
+ pimpl_->dh_.GenerateKeyPair(pimpl_->ranPool_, pimpl_->privateKey_,
+ pimpl_->publicKey_);
+}
+
+
+DiffieHellman& DiffieHellman::operator=(const DiffieHellman& that)
+{
+ pimpl_->dh_ = that.pimpl_->dh_;
+ pimpl_->dh_.GenerateKeyPair(pimpl_->ranPool_, pimpl_->privateKey_,
+ pimpl_->publicKey_);
+ return *this;
+}
+
+
+void DiffieHellman::makeAgreement(const byte* other, unsigned int otherSz)
+{
+ pimpl_->dh_.Agree(pimpl_->agreedKey_, pimpl_->privateKey_, other, otherSz);
+}
+
+
+uint DiffieHellman::get_agreedKeyLength() const
+{
+ return pimpl_->dh_.GetByteLength();
+}
+
+
+const byte* DiffieHellman::get_agreedKey() const
+{
+ return pimpl_->agreedKey_;
+}
+
+
+const byte* DiffieHellman::get_publicKey() const
+{
+ return pimpl_->publicKey_;
+}
+
+
+void DiffieHellman::set_sizes(int& pSz, int& gSz, int& pubSz) const
+{
+ using TaoCrypt::Integer;
+ Integer p = pimpl_->dh_.GetP();
+ Integer g = pimpl_->dh_.GetG();
+
+ pSz = p.ByteCount();
+ gSz = g.ByteCount();
+ pubSz = pimpl_->dh_.GetByteLength();
+}
+
+
+void DiffieHellman::get_parms(byte* bp, byte* bg, byte* bpub) const
+{
+ using TaoCrypt::Integer;
+ Integer p = pimpl_->dh_.GetP();
+ Integer g = pimpl_->dh_.GetG();
+
+ p.Encode(bp, p.ByteCount());
+ g.Encode(bg, g.ByteCount());
+ memcpy(bpub, pimpl_->publicKey_, pimpl_->dh_.GetByteLength());
+}
+
+
+// convert PEM file to DER x509 type
+x509* PemToDer(FILE* file, CertType type, EncryptedInfo* info)
+{
+ using namespace TaoCrypt;
+
+ char header[80];
+ char footer[80];
+
+ if (type == Cert) {
+ strncpy(header, "-----BEGIN CERTIFICATE-----", sizeof(header));
+ strncpy(footer, "-----END CERTIFICATE-----", sizeof(footer));
+ } else {
+ strncpy(header, "-----BEGIN RSA PRIVATE KEY-----", sizeof(header));
+ strncpy(footer, "-----END RSA PRIVATE KEY-----", sizeof(header));
+ }
+
+ long begin = -1;
+ long end = 0;
+ bool foundEnd = false;
+
+ char line[80];
+
+ while(fgets(line, sizeof(line), file))
+ if (strncmp(header, line, strlen(header)) == 0) {
+ begin = ftell(file);
+ break;
+ }
+
+ // remove encrypted header if there
+ if (fgets(line, sizeof(line), file)) {
+ char encHeader[] = "Proc-Type";
+ if (strncmp(encHeader, line, strlen(encHeader)) == 0 &&
+ fgets(line,sizeof(line), file)) {
+
+ char* start = strstr(line, "DES");
+ char* finish = strstr(line, ",");
+ if (!start)
+ start = strstr(line, "AES");
+
+ if (!info) return 0;
+
+ if ( start && finish && (start < finish)) {
+ memcpy(info->name, start, finish - start);
+ info->name[finish - start] = 0;
+ memcpy(info->iv, finish + 1, sizeof(info->iv));
+
+ char* newline = strstr(line, "\r");
+ if (!newline) newline = strstr(line, "\n");
+ if (newline && (newline > finish)) {
+ info->ivSz = newline - (finish + 1);
+ info->set = true;
+ }
+ }
+ // get blank line
+ if (fgets(line, sizeof(line), file))
+ begin = ftell(file);
+ }
+
+ }
+
+ while(fgets(line, sizeof(line), file))
+ if (strncmp(footer, line, strlen(footer)) == 0) {
+ foundEnd = true;
+ break;
+ }
+ else
+ end = ftell(file);
+
+ if (begin == -1 || !foundEnd)
+ return 0;
+
+ input_buffer tmp(end - begin);
+ fseek(file, begin, SEEK_SET);
+ size_t bytes = fread(tmp.get_buffer(), end - begin, 1, file);
+ if (bytes != 1)
+ return 0;
+
+ Source der(tmp.get_buffer(), end - begin);
+ Base64Decoder b64Dec(der);
+
+ uint sz = der.size();
+ mySTL::auto_ptr x(NEW_YS x509(sz));
+ memcpy(x->use_buffer(), der.get_buffer(), sz);
+
+ return x.release();
+}
+
+
+} // namespace
+
+
+#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATION
+namespace yaSSL {
+template void ysDelete(DiffieHellman::DHImpl*);
+template void ysDelete(Integer::IntegerImpl*);
+template void ysDelete(RSA::RSAImpl*);
+template void ysDelete(DSS::DSSImpl*);
+template void ysDelete(RandomPool::RandomImpl*);
+template void ysDelete(AES::AESImpl*);
+template void ysDelete(RC4::RC4Impl*);
+template void ysDelete(DES_EDE::DES_EDEImpl*);
+template void ysDelete(DES::DESImpl*);
+template void ysDelete(HMAC_RMD::HMAC_RMDImpl*);
+template void ysDelete(HMAC_SHA::HMAC_SHAImpl*);
+template void ysDelete(HMAC_MD5::HMAC_MD5Impl*);
+template void ysDelete(RMD::RMDImpl*);
+template void ysDelete(SHA::SHAImpl*);
+template void ysDelete(MD5::MD5Impl*);
+}
+#endif // HAVE_EXPLICIT_TEMPLATE_INSTANTIATION
+
+#endif // !USE_CRYPTOPP_LIB
diff --git a/dep/mysqllite/extra/yassl/src/handshake.cpp b/dep/mysqllite/extra/yassl/src/handshake.cpp
new file mode 100644
index 0000000000..b4d9005af1
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/src/handshake.cpp
@@ -0,0 +1,1121 @@
+/*
+ Copyright (C) 2000-2007 MySQL AB
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+
+/* The handshake source implements functions for creating and reading
+ * the various handshake messages.
+ */
+
+
+
+#include "runtime.hpp"
+#include "handshake.hpp"
+#include "yassl_int.hpp"
+
+
+namespace yaSSL {
+
+
+
+// Build a client hello message from cipher suites and compression method
+void buildClientHello(SSL& ssl, ClientHello& hello)
+{
+ // store for pre master secret
+ ssl.useSecurity().use_connection().chVersion_ = hello.client_version_;
+
+ ssl.getCrypto().get_random().Fill(hello.random_, RAN_LEN);
+ if (ssl.getSecurity().get_resuming()) {
+ hello.id_len_ = ID_LEN;
+ memcpy(hello.session_id_, ssl.getSecurity().get_resume().GetID(),
+ ID_LEN);
+ }
+ else
+ hello.id_len_ = 0;
+ hello.suite_len_ = ssl.getSecurity().get_parms().suites_size_;
+ memcpy(hello.cipher_suites_, ssl.getSecurity().get_parms().suites_,
+ hello.suite_len_);
+ hello.comp_len_ = 1;
+
+ hello.set_length(sizeof(ProtocolVersion) +
+ RAN_LEN +
+ hello.id_len_ + sizeof(hello.id_len_) +
+ hello.suite_len_ + sizeof(hello.suite_len_) +
+ hello.comp_len_ + sizeof(hello.comp_len_));
+}
+
+
+// Build a server hello message
+void buildServerHello(SSL& ssl, ServerHello& hello)
+{
+ if (ssl.getSecurity().get_resuming()) {
+ memcpy(hello.random_,ssl.getSecurity().get_connection().server_random_,
+ RAN_LEN);
+ memcpy(hello.session_id_, ssl.getSecurity().get_resume().GetID(),
+ ID_LEN);
+ }
+ else {
+ ssl.getCrypto().get_random().Fill(hello.random_, RAN_LEN);
+ ssl.getCrypto().get_random().Fill(hello.session_id_, ID_LEN);
+ }
+ hello.id_len_ = ID_LEN;
+ ssl.set_sessionID(hello.session_id_);
+
+ hello.cipher_suite_[0] = ssl.getSecurity().get_parms().suite_[0];
+ hello.cipher_suite_[1] = ssl.getSecurity().get_parms().suite_[1];
+ hello.compression_method_ = hello.compression_method_;
+
+ hello.set_length(sizeof(ProtocolVersion) + RAN_LEN + ID_LEN +
+ sizeof(hello.id_len_) + SUITE_LEN + SIZEOF_ENUM);
+}
+
+
+// add handshake from buffer into md5 and sha hashes, use handshake header
+void hashHandShake(SSL& ssl, const input_buffer& input, uint sz)
+{
+ const opaque* buffer = input.get_buffer() + input.get_current() -
+ HANDSHAKE_HEADER;
+ sz += HANDSHAKE_HEADER;
+ ssl.useHashes().use_MD5().update(buffer, sz);
+ ssl.useHashes().use_SHA().update(buffer, sz);
+}
+
+
+// locals
+namespace {
+
+// Write a plaintext record to buffer
+void buildOutput(output_buffer& buffer, const RecordLayerHeader& rlHdr,
+ const Message& msg)
+{
+ buffer.allocate(RECORD_HEADER + rlHdr.length_);
+ buffer << rlHdr << msg;
+}
+
+
+// Write a plaintext record to buffer
+void buildOutput(output_buffer& buffer, const RecordLayerHeader& rlHdr,
+ const HandShakeHeader& hsHdr, const HandShakeBase& shake)
+{
+ buffer.allocate(RECORD_HEADER + rlHdr.length_);
+ buffer << rlHdr << hsHdr << shake;
+}
+
+
+// Build Record Layer header for Message without handshake header
+void buildHeader(SSL& ssl, RecordLayerHeader& rlHeader, const Message& msg)
+{
+ ProtocolVersion pv = ssl.getSecurity().get_connection().version_;
+ rlHeader.type_ = msg.get_type();
+ rlHeader.version_.major_ = pv.major_;
+ rlHeader.version_.minor_ = pv.minor_;
+ rlHeader.length_ = msg.get_length();
+}
+
+
+// Build HandShake and RecordLayer Headers for handshake output
+void buildHeaders(SSL& ssl, HandShakeHeader& hsHeader,
+ RecordLayerHeader& rlHeader, const HandShakeBase& shake)
+{
+ int sz = shake.get_length();
+
+ hsHeader.set_type(shake.get_type());
+ hsHeader.set_length(sz);
+
+ ProtocolVersion pv = ssl.getSecurity().get_connection().version_;
+ rlHeader.type_ = handshake;
+ rlHeader.version_.major_ = pv.major_;
+ rlHeader.version_.minor_ = pv.minor_;
+ rlHeader.length_ = sz + HANDSHAKE_HEADER;
+}
+
+
+// add handshake from buffer into md5 and sha hashes, exclude record header
+void hashHandShake(SSL& ssl, const output_buffer& output, bool removeIV = false)
+{
+ uint sz = output.get_size() - RECORD_HEADER;
+
+ const opaque* buffer = output.get_buffer() + RECORD_HEADER;
+
+ if (removeIV) { // TLSv1_1 IV
+ uint blockSz = ssl.getCrypto().get_cipher().get_blockSize();
+ sz -= blockSz;
+ buffer += blockSz;
+ }
+
+ ssl.useHashes().use_MD5().update(buffer, sz);
+ ssl.useHashes().use_SHA().update(buffer, sz);
+}
+
+
+// calculate MD5 hash for finished
+void buildMD5(SSL& ssl, Finished& fin, const opaque* sender)
+{
+
+ opaque md5_result[MD5_LEN];
+ opaque md5_inner[SIZEOF_SENDER + SECRET_LEN + PAD_MD5];
+ opaque md5_outer[SECRET_LEN + PAD_MD5 + MD5_LEN];
+
+ const opaque* master_secret =
+ ssl.getSecurity().get_connection().master_secret_;
+
+ // make md5 inner
+ memcpy(md5_inner, sender, SIZEOF_SENDER);
+ memcpy(&md5_inner[SIZEOF_SENDER], master_secret, SECRET_LEN);
+ memcpy(&md5_inner[SIZEOF_SENDER + SECRET_LEN], PAD1, PAD_MD5);
+
+ ssl.useHashes().use_MD5().get_digest(md5_result, md5_inner,
+ sizeof(md5_inner));
+
+ // make md5 outer
+ memcpy(md5_outer, master_secret, SECRET_LEN);
+ memcpy(&md5_outer[SECRET_LEN], PAD2, PAD_MD5);
+ memcpy(&md5_outer[SECRET_LEN + PAD_MD5], md5_result, MD5_LEN);
+
+ ssl.useHashes().use_MD5().get_digest(fin.set_md5(), md5_outer,
+ sizeof(md5_outer));
+}
+
+
+// calculate SHA hash for finished
+void buildSHA(SSL& ssl, Finished& fin, const opaque* sender)
+{
+
+ opaque sha_result[SHA_LEN];
+ opaque sha_inner[SIZEOF_SENDER + SECRET_LEN + PAD_SHA];
+ opaque sha_outer[SECRET_LEN + PAD_SHA + SHA_LEN];
+
+ const opaque* master_secret =
+ ssl.getSecurity().get_connection().master_secret_;
+
+ // make sha inner
+ memcpy(sha_inner, sender, SIZEOF_SENDER);
+ memcpy(&sha_inner[SIZEOF_SENDER], master_secret, SECRET_LEN);
+ memcpy(&sha_inner[SIZEOF_SENDER + SECRET_LEN], PAD1, PAD_SHA);
+
+ ssl.useHashes().use_SHA().get_digest(sha_result, sha_inner,
+ sizeof(sha_inner));
+
+ // make sha outer
+ memcpy(sha_outer, master_secret, SECRET_LEN);
+ memcpy(&sha_outer[SECRET_LEN], PAD2, PAD_SHA);
+ memcpy(&sha_outer[SECRET_LEN + PAD_SHA], sha_result, SHA_LEN);
+
+ ssl.useHashes().use_SHA().get_digest(fin.set_sha(), sha_outer,
+ sizeof(sha_outer));
+}
+
+
+// decrypt input message in place, store size in case needed later
+void decrypt_message(SSL& ssl, input_buffer& input, uint sz)
+{
+ input_buffer plain(sz);
+ opaque* cipher = input.get_buffer() + input.get_current();
+
+ ssl.useCrypto().use_cipher().decrypt(plain.get_buffer(), cipher, sz);
+ memcpy(cipher, plain.get_buffer(), sz);
+ ssl.useSecurity().use_parms().encrypt_size_ = sz;
+
+ if (ssl.isTLSv1_1()) // IV
+ input.set_current(input.get_current() +
+ ssl.getCrypto().get_cipher().get_blockSize());
+}
+
+
+// output operator for input_buffer
+output_buffer& operator<<(output_buffer& output, const input_buffer& input)
+{
+ output.write(input.get_buffer(), input.get_size());
+ return output;
+}
+
+
+// write headers, handshake hash, mac, pad, and encrypt
+void cipherFinished(SSL& ssl, Finished& fin, output_buffer& output)
+{
+ uint digestSz = ssl.getCrypto().get_digest().get_digestSize();
+ uint finishedSz = ssl.isTLS() ? TLS_FINISHED_SZ : FINISHED_SZ;
+ uint sz = RECORD_HEADER + HANDSHAKE_HEADER + finishedSz + digestSz;
+ uint pad = 0;
+ uint blockSz = ssl.getCrypto().get_cipher().get_blockSize();
+
+ if (ssl.getSecurity().get_parms().cipher_type_ == block) {
+ if (ssl.isTLSv1_1())
+ sz += blockSz; // IV
+ sz += 1; // pad byte
+ pad = (sz - RECORD_HEADER) % blockSz;
+ pad = blockSz - pad;
+ sz += pad;
+ }
+
+ RecordLayerHeader rlHeader;
+ HandShakeHeader hsHeader;
+ buildHeaders(ssl, hsHeader, rlHeader, fin);
+ rlHeader.length_ = sz - RECORD_HEADER; // record header includes mac
+ // and pad, hanshake doesn't
+ input_buffer iv;
+ if (ssl.isTLSv1_1() && ssl.getSecurity().get_parms().cipher_type_== block){
+ iv.allocate(blockSz);
+ ssl.getCrypto().get_random().Fill(iv.get_buffer(), blockSz);
+ iv.add_size(blockSz);
+ }
+ uint ivSz = iv.get_size();
+ output.allocate(sz);
+ output << rlHeader << iv << hsHeader << fin;
+
+ hashHandShake(ssl, output, ssl.isTLSv1_1() ? true : false);
+ opaque digest[SHA_LEN]; // max size
+ if (ssl.isTLS())
+ TLS_hmac(ssl, digest, output.get_buffer() + RECORD_HEADER + ivSz,
+ output.get_size() - RECORD_HEADER - ivSz, handshake);
+ else
+ hmac(ssl, digest, output.get_buffer() + RECORD_HEADER,
+ output.get_size() - RECORD_HEADER, handshake);
+ output.write(digest, digestSz);
+
+ if (ssl.getSecurity().get_parms().cipher_type_ == block)
+ for (uint i = 0; i <= pad; i++) output[AUTO] = pad; // pad byte gets
+ // pad value too
+ input_buffer cipher(rlHeader.length_);
+ ssl.useCrypto().use_cipher().encrypt(cipher.get_buffer(),
+ output.get_buffer() + RECORD_HEADER, output.get_size() - RECORD_HEADER);
+ output.set_current(RECORD_HEADER);
+ output.write(cipher.get_buffer(), cipher.get_capacity());
+}
+
+
+// build an encrypted data or alert message for output
+void buildMessage(SSL& ssl, output_buffer& output, const Message& msg)
+{
+ uint digestSz = ssl.getCrypto().get_digest().get_digestSize();
+ uint sz = RECORD_HEADER + msg.get_length() + digestSz;
+ uint pad = 0;
+ uint blockSz = ssl.getCrypto().get_cipher().get_blockSize();
+
+ if (ssl.getSecurity().get_parms().cipher_type_ == block) {
+ if (ssl.isTLSv1_1()) // IV
+ sz += blockSz;
+ sz += 1; // pad byte
+ pad = (sz - RECORD_HEADER) % blockSz;
+ pad = blockSz - pad;
+ sz += pad;
+ }
+
+ RecordLayerHeader rlHeader;
+ buildHeader(ssl, rlHeader, msg);
+ rlHeader.length_ = sz - RECORD_HEADER; // record header includes mac
+ // and pad, hanshake doesn't
+ input_buffer iv;
+ if (ssl.isTLSv1_1() && ssl.getSecurity().get_parms().cipher_type_== block){
+ iv.allocate(blockSz);
+ ssl.getCrypto().get_random().Fill(iv.get_buffer(), blockSz);
+ iv.add_size(blockSz);
+ }
+
+ uint ivSz = iv.get_size();
+ output.allocate(sz);
+ output << rlHeader << iv << msg;
+
+ opaque digest[SHA_LEN]; // max size
+ if (ssl.isTLS())
+ TLS_hmac(ssl, digest, output.get_buffer() + RECORD_HEADER + ivSz,
+ output.get_size() - RECORD_HEADER - ivSz, msg.get_type());
+ else
+ hmac(ssl, digest, output.get_buffer() + RECORD_HEADER,
+ output.get_size() - RECORD_HEADER, msg.get_type());
+ output.write(digest, digestSz);
+
+ if (ssl.getSecurity().get_parms().cipher_type_ == block)
+ for (uint i = 0; i <= pad; i++) output[AUTO] = pad; // pad byte gets
+ // pad value too
+ input_buffer cipher(rlHeader.length_);
+ ssl.useCrypto().use_cipher().encrypt(cipher.get_buffer(),
+ output.get_buffer() + RECORD_HEADER, output.get_size() - RECORD_HEADER);
+ output.set_current(RECORD_HEADER);
+ output.write(cipher.get_buffer(), cipher.get_capacity());
+}
+
+
+// build alert message
+void buildAlert(SSL& ssl, output_buffer& output, const Alert& alert)
+{
+ if (ssl.getSecurity().get_parms().pending_ == false) // encrypted
+ buildMessage(ssl, output, alert);
+ else {
+ RecordLayerHeader rlHeader;
+ buildHeader(ssl, rlHeader, alert);
+ buildOutput(output, rlHeader, alert);
+ }
+}
+
+
+// build TLS finished message
+void buildFinishedTLS(SSL& ssl, Finished& fin, const opaque* sender)
+{
+ opaque handshake_hash[FINISHED_SZ];
+
+ ssl.useHashes().use_MD5().get_digest(handshake_hash);
+ ssl.useHashes().use_SHA().get_digest(&handshake_hash[MD5_LEN]);
+
+ const opaque* side;
+ if ( strncmp((const char*)sender, (const char*)client, SIZEOF_SENDER) == 0)
+ side = tls_client;
+ else
+ side = tls_server;
+
+ PRF(fin.set_md5(), TLS_FINISHED_SZ,
+ ssl.getSecurity().get_connection().master_secret_, SECRET_LEN,
+ side, FINISHED_LABEL_SZ,
+ handshake_hash, FINISHED_SZ);
+
+ fin.set_length(TLS_FINISHED_SZ); // shorter length for TLS
+}
+
+
+// compute p_hash for MD5 or SHA-1 for TLSv1 PRF
+void p_hash(output_buffer& result, const output_buffer& secret,
+ const output_buffer& seed, MACAlgorithm hash)
+{
+ uint len = hash == md5 ? MD5_LEN : SHA_LEN;
+ uint times = result.get_capacity() / len;
+ uint lastLen = result.get_capacity() % len;
+ opaque previous[SHA_LEN]; // max size
+ opaque current[SHA_LEN]; // max size
+ mySTL::auto_ptr hmac;
+
+ if (lastLen) times += 1;
+
+ if (hash == md5)
+ hmac.reset(NEW_YS HMAC_MD5(secret.get_buffer(), secret.get_size()));
+ else
+ hmac.reset(NEW_YS HMAC_SHA(secret.get_buffer(), secret.get_size()));
+ // A0 = seed
+ hmac->get_digest(previous, seed.get_buffer(), seed.get_size());// A1
+ uint lastTime = times - 1;
+
+ for (uint i = 0; i < times; i++) {
+ hmac->update(previous, len);
+ hmac->get_digest(current, seed.get_buffer(), seed.get_size());
+
+ if (lastLen && (i == lastTime))
+ result.write(current, lastLen);
+ else {
+ result.write(current, len);
+ //memcpy(previous, current, len);
+ hmac->get_digest(previous, previous, len);
+ }
+ }
+}
+
+
+// calculate XOR for TLSv1 PRF
+void get_xor(byte *digest, uint digLen, output_buffer& md5,
+ output_buffer& sha)
+{
+ for (uint i = 0; i < digLen; i++)
+ digest[i] = md5[AUTO] ^ sha[AUTO];
+}
+
+
+// build MD5 part of certificate verify
+void buildMD5_CertVerify(SSL& ssl, byte* digest)
+{
+ opaque md5_result[MD5_LEN];
+ opaque md5_inner[SECRET_LEN + PAD_MD5];
+ opaque md5_outer[SECRET_LEN + PAD_MD5 + MD5_LEN];
+
+ const opaque* master_secret =
+ ssl.getSecurity().get_connection().master_secret_;
+
+ // make md5 inner
+ memcpy(md5_inner, master_secret, SECRET_LEN);
+ memcpy(&md5_inner[SECRET_LEN], PAD1, PAD_MD5);
+
+ ssl.useHashes().use_MD5().get_digest(md5_result, md5_inner,
+ sizeof(md5_inner));
+
+ // make md5 outer
+ memcpy(md5_outer, master_secret, SECRET_LEN);
+ memcpy(&md5_outer[SECRET_LEN], PAD2, PAD_MD5);
+ memcpy(&md5_outer[SECRET_LEN + PAD_MD5], md5_result, MD5_LEN);
+
+ ssl.useHashes().use_MD5().get_digest(digest, md5_outer, sizeof(md5_outer));
+}
+
+
+// build SHA part of certificate verify
+void buildSHA_CertVerify(SSL& ssl, byte* digest)
+{
+ opaque sha_result[SHA_LEN];
+ opaque sha_inner[SECRET_LEN + PAD_SHA];
+ opaque sha_outer[SECRET_LEN + PAD_SHA + SHA_LEN];
+
+ const opaque* master_secret =
+ ssl.getSecurity().get_connection().master_secret_;
+
+ // make sha inner
+ memcpy(sha_inner, master_secret, SECRET_LEN);
+ memcpy(&sha_inner[SECRET_LEN], PAD1, PAD_SHA);
+
+ ssl.useHashes().use_SHA().get_digest(sha_result, sha_inner,
+ sizeof(sha_inner));
+
+ // make sha outer
+ memcpy(sha_outer, master_secret, SECRET_LEN);
+ memcpy(&sha_outer[SECRET_LEN], PAD2, PAD_SHA);
+ memcpy(&sha_outer[SECRET_LEN + PAD_SHA], sha_result, SHA_LEN);
+
+ ssl.useHashes().use_SHA().get_digest(digest, sha_outer, sizeof(sha_outer));
+}
+
+
+} // namespace for locals
+
+
+// some clients still send sslv2 client hello
+void ProcessOldClientHello(input_buffer& input, SSL& ssl)
+{
+ if (input.get_remaining() < 2) {
+ ssl.SetError(bad_input);
+ return;
+ }
+ byte b0 = input[AUTO];
+ byte b1 = input[AUTO];
+
+ uint16 sz = ((b0 & 0x7f) << 8) | b1;
+
+ if (sz > input.get_remaining()) {
+ ssl.SetError(bad_input);
+ return;
+ }
+
+ // hashHandShake manually
+ const opaque* buffer = input.get_buffer() + input.get_current();
+ ssl.useHashes().use_MD5().update(buffer, sz);
+ ssl.useHashes().use_SHA().update(buffer, sz);
+
+ b1 = input[AUTO]; // does this value mean client_hello?
+
+ ClientHello ch;
+ ch.client_version_.major_ = input[AUTO];
+ ch.client_version_.minor_ = input[AUTO];
+
+ byte len[2];
+
+ input.read(len, sizeof(len));
+ ato16(len, ch.suite_len_);
+
+ input.read(len, sizeof(len));
+ uint16 sessionLen;
+ ato16(len, sessionLen);
+ ch.id_len_ = sessionLen;
+
+ input.read(len, sizeof(len));
+ uint16 randomLen;
+ ato16(len, randomLen);
+ if (ch.suite_len_ > MAX_SUITE_SZ || sessionLen > ID_LEN ||
+ randomLen > RAN_LEN) {
+ ssl.SetError(bad_input);
+ return;
+ }
+
+ int j = 0;
+ for (uint16 i = 0; i < ch.suite_len_; i += 3) {
+ byte first = input[AUTO];
+ if (first) // sslv2 type
+ input.read(len, SUITE_LEN); // skip
+ else {
+ input.read(&ch.cipher_suites_[j], SUITE_LEN);
+ j += SUITE_LEN;
+ }
+ }
+ ch.suite_len_ = j;
+
+ if (ch.id_len_)
+ input.read(ch.session_id_, ch.id_len_);
+
+ if (randomLen < RAN_LEN)
+ memset(ch.random_, 0, RAN_LEN - randomLen);
+ input.read(&ch.random_[RAN_LEN - randomLen], randomLen);
+
+
+ ch.Process(input, ssl);
+}
+
+
+// Build a finished message, see 7.6.9
+void buildFinished(SSL& ssl, Finished& fin, const opaque* sender)
+{
+ // store current states, building requires get_digest which resets state
+ MD5 md5(ssl.getHashes().get_MD5());
+ SHA sha(ssl.getHashes().get_SHA());
+
+ if (ssl.isTLS())
+ buildFinishedTLS(ssl, fin, sender);
+ else {
+ buildMD5(ssl, fin, sender);
+ buildSHA(ssl, fin, sender);
+ }
+
+ // restore
+ ssl.useHashes().use_MD5() = md5;
+ ssl.useHashes().use_SHA() = sha;
+}
+
+
+/* compute SSLv3 HMAC into digest see
+ * buffer is of sz size and includes HandShake Header but not a Record Header
+ * verify means to check peers hmac
+*/
+void hmac(SSL& ssl, byte* digest, const byte* buffer, uint sz,
+ ContentType content, bool verify)
+{
+ Digest& mac = ssl.useCrypto().use_digest();
+ opaque inner[SHA_LEN + PAD_MD5 + SEQ_SZ + SIZEOF_ENUM + LENGTH_SZ];
+ opaque outer[SHA_LEN + PAD_MD5 + SHA_LEN];
+ opaque result[SHA_LEN]; // max possible sizes
+ uint digestSz = mac.get_digestSize(); // actual sizes
+ uint padSz = mac.get_padSize();
+ uint innerSz = digestSz + padSz + SEQ_SZ + SIZEOF_ENUM + LENGTH_SZ;
+ uint outerSz = digestSz + padSz + digestSz;
+
+ // data
+ const opaque* mac_secret = ssl.get_macSecret(verify);
+ opaque seq[SEQ_SZ] = { 0x00, 0x00, 0x00, 0x00 };
+ opaque length[LENGTH_SZ];
+ c16toa(sz, length);
+ c32toa(ssl.get_SEQIncrement(verify), &seq[sizeof(uint32)]);
+
+ // make inner
+ memcpy(inner, mac_secret, digestSz);
+ memcpy(&inner[digestSz], PAD1, padSz);
+ memcpy(&inner[digestSz + padSz], seq, SEQ_SZ);
+ inner[digestSz + padSz + SEQ_SZ] = content;
+ memcpy(&inner[digestSz + padSz + SEQ_SZ + SIZEOF_ENUM], length, LENGTH_SZ);
+
+ mac.update(inner, innerSz);
+ mac.get_digest(result, buffer, sz); // append content buffer
+
+ // make outer
+ memcpy(outer, mac_secret, digestSz);
+ memcpy(&outer[digestSz], PAD2, padSz);
+ memcpy(&outer[digestSz + padSz], result, digestSz);
+
+ mac.get_digest(digest, outer, outerSz);
+}
+
+
+// TLS type HAMC
+void TLS_hmac(SSL& ssl, byte* digest, const byte* buffer, uint sz,
+ ContentType content, bool verify)
+{
+ mySTL::auto_ptr hmac;
+ opaque seq[SEQ_SZ] = { 0x00, 0x00, 0x00, 0x00 };
+ opaque length[LENGTH_SZ];
+ opaque inner[SIZEOF_ENUM + VERSION_SZ + LENGTH_SZ]; // type + version + len
+
+ c16toa(sz, length);
+ c32toa(ssl.get_SEQIncrement(verify), &seq[sizeof(uint32)]);
+
+ MACAlgorithm algo = ssl.getSecurity().get_parms().mac_algorithm_;
+
+ if (algo == sha)
+ hmac.reset(NEW_YS HMAC_SHA(ssl.get_macSecret(verify), SHA_LEN));
+ else if (algo == rmd)
+ hmac.reset(NEW_YS HMAC_RMD(ssl.get_macSecret(verify), RMD_LEN));
+ else
+ hmac.reset(NEW_YS HMAC_MD5(ssl.get_macSecret(verify), MD5_LEN));
+
+ hmac->update(seq, SEQ_SZ); // seq_num
+ inner[0] = content; // type
+ inner[SIZEOF_ENUM] = ssl.getSecurity().get_connection().version_.major_;
+ inner[SIZEOF_ENUM + SIZEOF_ENUM] =
+ ssl.getSecurity().get_connection().version_.minor_; // version
+ memcpy(&inner[SIZEOF_ENUM + VERSION_SZ], length, LENGTH_SZ); // length
+ hmac->update(inner, sizeof(inner));
+ hmac->get_digest(digest, buffer, sz); // content
+}
+
+
+// compute TLSv1 PRF (pseudo random function using HMAC)
+void PRF(byte* digest, uint digLen, const byte* secret, uint secLen,
+ const byte* label, uint labLen, const byte* seed, uint seedLen)
+{
+ uint half = (secLen + 1) / 2;
+
+ output_buffer md5_half(half);
+ output_buffer sha_half(half);
+ output_buffer labelSeed(labLen + seedLen);
+
+ md5_half.write(secret, half);
+ sha_half.write(secret + half - secLen % 2, half);
+ labelSeed.write(label, labLen);
+ labelSeed.write(seed, seedLen);
+
+ output_buffer md5_result(digLen);
+ output_buffer sha_result(digLen);
+
+ p_hash(md5_result, md5_half, labelSeed, md5);
+ p_hash(sha_result, sha_half, labelSeed, sha);
+
+ md5_result.set_current(0);
+ sha_result.set_current(0);
+ get_xor(digest, digLen, md5_result, sha_result);
+}
+
+
+// build certificate hashes
+void build_certHashes(SSL& ssl, Hashes& hashes)
+{
+ // store current states, building requires get_digest which resets state
+ MD5 md5(ssl.getHashes().get_MD5());
+ SHA sha(ssl.getHashes().get_SHA());
+
+ if (ssl.isTLS()) {
+ ssl.useHashes().use_MD5().get_digest(hashes.md5_);
+ ssl.useHashes().use_SHA().get_digest(hashes.sha_);
+ }
+ else {
+ buildMD5_CertVerify(ssl, hashes.md5_);
+ buildSHA_CertVerify(ssl, hashes.sha_);
+ }
+
+ // restore
+ ssl.useHashes().use_MD5() = md5;
+ ssl.useHashes().use_SHA() = sha;
+}
+
+
+
+// do process input requests, return 0 is done, 1 is call again to complete
+int DoProcessReply(SSL& ssl)
+{
+ // wait for input if blocking
+ if (!ssl.useSocket().wait()) {
+ ssl.SetError(receive_error);
+ return 0;
+ }
+ uint ready = ssl.getSocket().get_ready();
+ if (!ready) return 1;
+
+ // add buffered data if its there
+ input_buffer* buffered = ssl.useBuffers().TakeRawInput();
+ uint buffSz = buffered ? buffered->get_size() : 0;
+ input_buffer buffer(buffSz + ready);
+ if (buffSz) {
+ buffer.assign(buffered->get_buffer(), buffSz);
+ ysDelete(buffered);
+ buffered = 0;
+ }
+
+ // add new data
+ uint read = ssl.useSocket().receive(buffer.get_buffer() + buffSz, ready);
+ if (read == static_cast(-1)) {
+ ssl.SetError(receive_error);
+ return 0;
+ }
+ buffer.add_size(read);
+ uint offset = 0;
+ const MessageFactory& mf = ssl.getFactory().getMessage();
+
+ // old style sslv2 client hello?
+ if (ssl.getSecurity().get_parms().entity_ == server_end &&
+ ssl.getStates().getServer() == clientNull)
+ if (buffer.peek() != handshake) {
+ ProcessOldClientHello(buffer, ssl);
+ if (ssl.GetError())
+ return 0;
+ }
+
+ while(!buffer.eof()) {
+ // each record
+ RecordLayerHeader hdr;
+ bool needHdr = false;
+
+ if (static_cast(RECORD_HEADER) > buffer.get_remaining())
+ needHdr = true;
+ else {
+ buffer >> hdr;
+ ssl.verifyState(hdr);
+ }
+
+ // make sure we have enough input in buffer to process this record
+ if (needHdr || hdr.length_ > buffer.get_remaining()) {
+ // put header in front for next time processing
+ uint extra = needHdr ? 0 : RECORD_HEADER;
+ uint sz = buffer.get_remaining() + extra;
+ ssl.useBuffers().SetRawInput(NEW_YS input_buffer(sz,
+ buffer.get_buffer() + buffer.get_current() - extra, sz));
+ return 1;
+ }
+
+ while (buffer.get_current() < hdr.length_ + RECORD_HEADER + offset) {
+ // each message in record, can be more than 1 if not encrypted
+ if (ssl.getSecurity().get_parms().pending_ == false) // cipher on
+ decrypt_message(ssl, buffer, hdr.length_);
+
+ mySTL::auto_ptr msg(mf.CreateObject(hdr.type_));
+ if (!msg.get()) {
+ ssl.SetError(factory_error);
+ return 0;
+ }
+ buffer >> *msg;
+ msg->Process(buffer, ssl);
+ if (ssl.GetError())
+ return 0;
+ }
+ offset += hdr.length_ + RECORD_HEADER;
+ }
+ return 0;
+}
+
+
+// process input requests
+void processReply(SSL& ssl)
+{
+ if (ssl.GetError()) return;
+
+ if (DoProcessReply(ssl))
+ {
+ // didn't complete process
+ if (!ssl.getSocket().IsNonBlocking()) {
+ // keep trying now, blocking ok
+ while (!ssl.GetError())
+ if (DoProcessReply(ssl) == 0) break;
+ }
+ else
+ // user will have try again later, non blocking
+ ssl.SetError(YasslError(SSL_ERROR_WANT_READ));
+ }
+}
+
+
+// send client_hello, no buffering
+void sendClientHello(SSL& ssl)
+{
+ ssl.verifyState(serverNull);
+ if (ssl.GetError()) return;
+
+ ClientHello ch(ssl.getSecurity().get_connection().version_,
+ ssl.getSecurity().get_connection().compression_);
+ RecordLayerHeader rlHeader;
+ HandShakeHeader hsHeader;
+ output_buffer out;
+
+ buildClientHello(ssl, ch);
+ ssl.set_random(ch.get_random(), client_end);
+ buildHeaders(ssl, hsHeader, rlHeader, ch);
+ buildOutput(out, rlHeader, hsHeader, ch);
+ hashHandShake(ssl, out);
+
+ ssl.Send(out.get_buffer(), out.get_size());
+}
+
+
+// send client key exchange
+void sendClientKeyExchange(SSL& ssl, BufferOutput buffer)
+{
+ ssl.verifyState(serverHelloDoneComplete);
+ if (ssl.GetError()) return;
+
+ ClientKeyExchange ck(ssl);
+ ck.build(ssl);
+ ssl.makeMasterSecret();
+
+ RecordLayerHeader rlHeader;
+ HandShakeHeader hsHeader;
+ mySTL::auto_ptr out(NEW_YS output_buffer);
+ buildHeaders(ssl, hsHeader, rlHeader, ck);
+ buildOutput(*out.get(), rlHeader, hsHeader, ck);
+ hashHandShake(ssl, *out.get());
+
+ if (buffer == buffered)
+ ssl.addBuffer(out.release());
+ else
+ ssl.Send(out->get_buffer(), out->get_size());
+}
+
+
+// send server key exchange
+void sendServerKeyExchange(SSL& ssl, BufferOutput buffer)
+{
+ if (ssl.GetError()) return;
+ ServerKeyExchange sk(ssl);
+ sk.build(ssl);
+
+ RecordLayerHeader rlHeader;
+ HandShakeHeader hsHeader;
+ mySTL::auto_ptr out(NEW_YS output_buffer);
+ buildHeaders(ssl, hsHeader, rlHeader, sk);
+ buildOutput(*out.get(), rlHeader, hsHeader, sk);
+ hashHandShake(ssl, *out.get());
+
+ if (buffer == buffered)
+ ssl.addBuffer(out.release());
+ else
+ ssl.Send(out->get_buffer(), out->get_size());
+}
+
+
+// send change cipher
+void sendChangeCipher(SSL& ssl, BufferOutput buffer)
+{
+ if (ssl.getSecurity().get_parms().entity_ == server_end)
+ {
+ if (ssl.getSecurity().get_resuming())
+ ssl.verifyState(clientKeyExchangeComplete);
+ else
+ ssl.verifyState(clientFinishedComplete);
+ }
+ if (ssl.GetError()) return;
+
+ ChangeCipherSpec ccs;
+ RecordLayerHeader rlHeader;
+ buildHeader(ssl, rlHeader, ccs);
+ mySTL::auto_ptr out(NEW_YS output_buffer);
+ buildOutput(*out.get(), rlHeader, ccs);
+
+ if (buffer == buffered)
+ ssl.addBuffer(out.release());
+ else
+ ssl.Send(out->get_buffer(), out->get_size());
+}
+
+
+// send finished
+void sendFinished(SSL& ssl, ConnectionEnd side, BufferOutput buffer)
+{
+ if (ssl.GetError()) return;
+
+ Finished fin;
+ buildFinished(ssl, fin, side == client_end ? client : server);
+ mySTL::auto_ptr out(NEW_YS output_buffer);
+ cipherFinished(ssl, fin, *out.get()); // hashes handshake
+
+ if (ssl.getSecurity().get_resuming()) {
+ if (side == server_end)
+ buildFinished(ssl, ssl.useHashes().use_verify(), client); // client
+ }
+ else {
+ if (!ssl.getSecurity().GetContext()->GetSessionCacheOff())
+ GetSessions().add(ssl); // store session
+ if (side == client_end)
+ buildFinished(ssl, ssl.useHashes().use_verify(), server); // server
+ }
+ ssl.useSecurity().use_connection().CleanMaster();
+
+ if (buffer == buffered)
+ ssl.addBuffer(out.release());
+ else
+ ssl.Send(out->get_buffer(), out->get_size());
+}
+
+
+// send data
+int sendData(SSL& ssl, const void* buffer, int sz)
+{
+ if (ssl.GetError() == YasslError(SSL_ERROR_WANT_READ))
+ ssl.SetError(no_error);
+
+ ssl.verfiyHandShakeComplete();
+ if (ssl.GetError()) return -1;
+ int sent = 0;
+
+ for (;;) {
+ int len = min(sz - sent, MAX_RECORD_SIZE);
+ output_buffer out;
+ input_buffer tmp;
+
+ Data data;
+
+ if (ssl.CompressionOn()) {
+ if (Compress(static_cast(buffer) + sent, len,
+ tmp) == -1) {
+ ssl.SetError(compress_error);
+ return -1;
+ }
+ data.SetData(tmp.get_size(), tmp.get_buffer());
+ }
+ else
+ data.SetData(len, static_cast(buffer) + sent);
+
+ buildMessage(ssl, out, data);
+ ssl.Send(out.get_buffer(), out.get_size());
+
+ if (ssl.GetError()) return -1;
+ sent += len;
+ if (sent == sz) break;
+ }
+ ssl.useLog().ShowData(sent, true);
+ return sent;
+}
+
+
+// send alert
+int sendAlert(SSL& ssl, const Alert& alert)
+{
+ output_buffer out;
+ buildAlert(ssl, out, alert);
+ ssl.Send(out.get_buffer(), out.get_size());
+
+ return alert.get_length();
+}
+
+
+// process input data
+int receiveData(SSL& ssl, Data& data, bool peek)
+{
+ if (ssl.GetError() == YasslError(SSL_ERROR_WANT_READ))
+ ssl.SetError(no_error);
+
+ ssl.verfiyHandShakeComplete();
+ if (ssl.GetError()) return -1;
+
+ if (!ssl.HasData())
+ processReply(ssl);
+
+ if (peek)
+ ssl.PeekData(data);
+ else
+ ssl.fillData(data);
+
+ ssl.useLog().ShowData(data.get_length());
+ if (ssl.GetError()) return -1;
+
+ if (data.get_length() == 0 && ssl.getSocket().WouldBlock()) {
+ ssl.SetError(YasslError(SSL_ERROR_WANT_READ));
+ return SSL_WOULD_BLOCK;
+ }
+ return data.get_length();
+}
+
+
+// send server hello
+void sendServerHello(SSL& ssl, BufferOutput buffer)
+{
+ if (ssl.getSecurity().get_resuming())
+ ssl.verifyState(clientKeyExchangeComplete);
+ else
+ ssl.verifyState(clientHelloComplete);
+ if (ssl.GetError()) return;
+
+ ServerHello sh(ssl.getSecurity().get_connection().version_,
+ ssl.getSecurity().get_connection().compression_);
+ RecordLayerHeader rlHeader;
+ HandShakeHeader hsHeader;
+ mySTL::auto_ptr out(NEW_YS output_buffer);
+
+ buildServerHello(ssl, sh);
+ ssl.set_random(sh.get_random(), server_end);
+ buildHeaders(ssl, hsHeader, rlHeader, sh);
+ buildOutput(*out.get(), rlHeader, hsHeader, sh);
+ hashHandShake(ssl, *out.get());
+
+ if (buffer == buffered)
+ ssl.addBuffer(out.release());
+ else
+ ssl.Send(out->get_buffer(), out->get_size());
+}
+
+
+// send server hello done
+void sendServerHelloDone(SSL& ssl, BufferOutput buffer)
+{
+ if (ssl.GetError()) return;
+
+ ServerHelloDone shd;
+ RecordLayerHeader rlHeader;
+ HandShakeHeader hsHeader;
+ mySTL::auto_ptr out(NEW_YS output_buffer);
+
+ buildHeaders(ssl, hsHeader, rlHeader, shd);
+ buildOutput(*out.get(), rlHeader, hsHeader, shd);
+ hashHandShake(ssl, *out.get());
+
+ if (buffer == buffered)
+ ssl.addBuffer(out.release());
+ else
+ ssl.Send(out->get_buffer(), out->get_size());
+}
+
+
+// send certificate
+void sendCertificate(SSL& ssl, BufferOutput buffer)
+{
+ if (ssl.GetError()) return;
+
+ Certificate cert(ssl.getCrypto().get_certManager().get_cert());
+ RecordLayerHeader rlHeader;
+ HandShakeHeader hsHeader;
+ mySTL::auto_ptr out(NEW_YS output_buffer);
+
+ buildHeaders(ssl, hsHeader, rlHeader, cert);
+ buildOutput(*out.get(), rlHeader, hsHeader, cert);
+ hashHandShake(ssl, *out.get());
+
+ if (buffer == buffered)
+ ssl.addBuffer(out.release());
+ else
+ ssl.Send(out->get_buffer(), out->get_size());
+}
+
+
+// send certificate request
+void sendCertificateRequest(SSL& ssl, BufferOutput buffer)
+{
+ if (ssl.GetError()) return;
+
+ CertificateRequest request;
+ request.Build();
+ RecordLayerHeader rlHeader;
+ HandShakeHeader hsHeader;
+ mySTL::auto_ptr out(NEW_YS output_buffer);
+
+ buildHeaders(ssl, hsHeader, rlHeader, request);
+ buildOutput(*out.get(), rlHeader, hsHeader, request);
+ hashHandShake(ssl, *out.get());
+
+ if (buffer == buffered)
+ ssl.addBuffer(out.release());
+ else
+ ssl.Send(out->get_buffer(), out->get_size());
+}
+
+
+// send certificate verify
+void sendCertificateVerify(SSL& ssl, BufferOutput buffer)
+{
+ if (ssl.GetError()) return;
+
+ CertificateVerify verify;
+ verify.Build(ssl);
+ RecordLayerHeader rlHeader;
+ HandShakeHeader hsHeader;
+ mySTL::auto_ptr out(NEW_YS output_buffer);
+
+ buildHeaders(ssl, hsHeader, rlHeader, verify);
+ buildOutput(*out.get(), rlHeader, hsHeader, verify);
+ hashHandShake(ssl, *out.get());
+
+ if (buffer == buffered)
+ ssl.addBuffer(out.release());
+ else
+ ssl.Send(out->get_buffer(), out->get_size());
+}
+
+
+} // namespace
diff --git a/dep/mysqllite/extra/yassl/src/lock.cpp b/dep/mysqllite/extra/yassl/src/lock.cpp
new file mode 100644
index 0000000000..6e85fefa14
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/src/lock.cpp
@@ -0,0 +1,87 @@
+/*
+ Copyright (C) 2000-2007 MySQL AB
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+/* Locking functions
+ */
+
+#include "runtime.hpp"
+#include "lock.hpp"
+
+
+namespace yaSSL {
+
+
+#ifdef YASSL_THREAD_SAFE
+ #ifdef _WIN32
+
+ Mutex::Mutex()
+ {
+ InitializeCriticalSection(&cs_);
+ }
+
+
+ Mutex::~Mutex()
+ {
+ DeleteCriticalSection(&cs_);
+ }
+
+
+ Mutex::Lock::Lock(Mutex& lm) : mutex_(lm)
+ {
+ EnterCriticalSection(&mutex_.cs_);
+ }
+
+
+ Mutex::Lock::~Lock()
+ {
+ LeaveCriticalSection(&mutex_.cs_);
+ }
+
+ #else // _WIN32
+
+ Mutex::Mutex()
+ {
+ pthread_mutex_init(&mutex_, 0);
+ }
+
+
+ Mutex::~Mutex()
+ {
+ pthread_mutex_destroy(&mutex_);
+ }
+
+
+ Mutex::Lock::Lock(Mutex& lm) : mutex_(lm)
+ {
+ pthread_mutex_lock(&mutex_.mutex_);
+ }
+
+
+ Mutex::Lock::~Lock()
+ {
+ pthread_mutex_unlock(&mutex_.mutex_);
+ }
+
+
+ #endif // _WIN32
+#endif // YASSL_THREAD_SAFE
+
+
+
+} // namespace yaSSL
+
diff --git a/dep/mysqllite/extra/yassl/src/log.cpp b/dep/mysqllite/extra/yassl/src/log.cpp
new file mode 100644
index 0000000000..35db4136a5
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/src/log.cpp
@@ -0,0 +1,146 @@
+/*
+ Copyright (C) 2000-2007 MySQL AB
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+/* Debug logging functions
+ */
+
+
+#include "runtime.hpp"
+#include "log.hpp"
+
+#ifdef YASSL_LOG
+ #include
+ #include
+ #include
+#endif
+
+
+
+namespace yaSSL {
+
+
+#ifdef YASSL_LOG
+
+ enum { MAX_MSG = 81 };
+
+ Log::Log(const char* str)
+ {
+ log_ = fopen(str, "w");
+ Trace("********** Logger Attached **********");
+ }
+
+
+ Log::~Log()
+ {
+ Trace("********** Logger Detached **********");
+ fclose(log_);
+ }
+
+
+ // Trace a message
+ void Log::Trace(const char* str)
+ {
+ if (!log_) return;
+
+ time_t clicks = time(0);
+ char timeStr[32];
+
+ // get rid of newline
+ strncpy(timeStr, ctime(&clicks), sizeof(timeStr));
+ unsigned int len = strlen(timeStr);
+ timeStr[len - 1] = 0;
+
+ char msg[MAX_MSG];
+
+ strncpy(msg, timeStr, sizeof(timeStr));
+ strncat(msg, ":", 1);
+ strncat(msg, str, MAX_MSG - sizeof(timeStr) - 2);
+ strncat(msg, "\n", 1);
+ msg[MAX_MSG - 1] = 0;
+
+ fputs(msg, log_);
+ }
+
+
+ #if defined(_WIN32) || defined(__MACH__) || defined(__hpux__)
+ typedef int socklen_t;
+ #endif
+
+
+ // write tcp address
+ void Log::ShowTCP(socket_t fd, bool ended)
+ {
+ sockaddr_in peeraddr;
+ socklen_t len = sizeof(peeraddr);
+ if (getpeername(fd, (sockaddr*)&peeraddr, &len) != 0)
+ return;
+
+ const char* p = reinterpret_cast(&peeraddr.sin_addr);
+ char msg[MAX_MSG];
+ char number[16];
+
+ if (ended)
+ strncpy(msg, "yaSSL conn DONE w/ peer ", 26);
+ else
+ strncpy(msg, "yaSSL conn BEGUN w/ peer ", 26);
+ for (int i = 0; i < 4; ++i) {
+ sprintf(number, "%u", static_cast(p[i]));
+ strncat(msg, number, 8);
+ if (i < 3)
+ strncat(msg, ".", 1);
+ }
+ strncat(msg, " port ", 8);
+ sprintf(number, "%d", htons(peeraddr.sin_port));
+ strncat(msg, number, 8);
+
+ msg[MAX_MSG - 1] = 0;
+ Trace(msg);
+ }
+
+
+ // log processed data
+ void Log::ShowData(uint bytes, bool sent)
+ {
+ char msg[MAX_MSG];
+ char number[16];
+
+ if (sent)
+ strncpy(msg, "Sent ", 10);
+ else
+ strncpy(msg, "Received ", 10);
+ sprintf(number, "%u", bytes);
+ strncat(msg, number, 8);
+ strncat(msg, " bytes of application data", 27);
+
+ msg[MAX_MSG - 1] = 0;
+ Trace(msg);
+ }
+
+
+#else // no YASSL_LOG
+
+
+ Log::Log(const char*) {}
+ Log::~Log() {}
+ void Log::Trace(const char*) {}
+ void Log::ShowTCP(socket_t, bool) {}
+ void Log::ShowData(uint, bool) {}
+
+
+#endif // YASSL_LOG
+} // namespace
diff --git a/dep/mysqllite/extra/yassl/src/socket_wrapper.cpp b/dep/mysqllite/extra/yassl/src/socket_wrapper.cpp
new file mode 100644
index 0000000000..eee5d47377
--- /dev/null
+++ b/dep/mysqllite/extra/yassl/src/socket_wrapper.cpp
@@ -0,0 +1,199 @@
+/*
+ Copyright (C) 2000-2007 MySQL AB
+
+ 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; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+
+/* The socket wrapper source implements a Socket class that hides the
+ * differences between Berkely style sockets and Windows sockets, allowing
+ * transparent TCP access.
+ */
+
+
+#include "runtime.hpp"
+#include "socket_wrapper.hpp"
+
+#ifndef _WIN32
+ #include
+ #include
+ #include
+ #include
+ #include
+ #include