From d70db360fed0bfc61074cf089920318ce8553e3f Mon Sep 17 00:00:00 2001 From: Raven Date: Wed, 21 Feb 2024 15:07:07 +0600 Subject: [PATCH] first commit --- .gitignore | 19 + README.md | 1 + compat-libicu4/canonicalize.patch | 22 + compat-libicu4/icu-3.4-multiarchdevel.patch | 70 + .../icu-4.2.1-configure-cxx_try_link.patch | 13 + compat-libicu4/icu-config | 424 ++ compat-libicu4/icu.6969.pkgdata.patch | 189 + compat-libicu4/icu.6995.kannada.patch | 11 + compat-libicu4/icu.7119.s390x.patch | 12 + compat-libicu4/icu.XXXX.install.patch | 11 + compat-libicu4/icu.icu7039.badextract.patch | 96 + compat-libicu4/icu.spec | 532 +++ .../gstreamer1-plugins-ugly.spec | 322 ++ mysql55/0001-Cloud-Linux-userstat.patch | 3537 +++++++++++++++++ ...id-files-in-datadir-when-stopping-to.patch | 47 + ...05-Use-accessors-and-fix-type-errors.patch | 49 + mysql55/README.mysql-docs | 4 + mysql55/README.mysql-license | 6 + mysql55/filter-requires-mysql.sh | 5 + mysql55/libmysql.version | 150 + .../max_connection2_mysql_5_5_30_b404.patch | 1669 ++++++++ mysql55/my.cnf | 33 + mysql55/my_config.h | 29 + mysql55/mysql-chain-certs.patch | 41 + mysql55/mysql-cipherspec.patch | 115 + mysql55/mysql-dh1024.patch | 63 + mysql55/mysql-dubious-exports.patch | 169 + mysql55/mysql-embedded-check.c | 26 + mysql55/mysql-errno.patch | 21 + mysql55/mysql-expired-certs.patch | 555 +++ mysql55/mysql-file-contents.patch | 27 + ...sql-governor-embedded-exclude-5_5_28.patch | 119 + mysql55/mysql-install-test.patch | 52 + mysql55/mysql-logrotate.patch | 66 + mysql55/mysql-netdevname.patch | 59 + mysql55/mysql-openssl.patch | 13 + mysql55/mysql-plugin-bool.patch | 42 + mysql55/mysql-plugin-test.patch | 96 + mysql55/mysql-s390-tsc.patch | 41 + mysql55/mysql-stack-guard.patch | 139 + mysql55/mysql-string-overflow.patch | 57 + mysql55/mysql-strmov.patch | 34 + mysql55/mysql-va-list.patch | 55 + mysql55/mysql-versioning.patch | 18 + mysql55/mysql.init | 237 ++ mysql55/mysql.spec | 1368 +++++++ mysql55/mysql.sysconfig | 11 + mysql55/mysql.tmpfiles.d | 1 + mysql55/mysqld-prepare-db-dir | 82 + mysql55/mysqld-wait-ready | 56 + mysql55/mysqld.service | 43 + mysql55/openssl.pc | 13 + mysql55/rh-skipped-tests-arm.list | 8 + mysql55/rh-skipped-tests-base.list | 13 + mysql55/scriptstub.c | 32 + mysql57/README.mysql-docs | 4 + mysql57/README.mysql-license | 6 + mysql57/filter-requires-mysql.sh | 6 + mysql57/my.cnf | 25 + mysql57/my_config.h | 29 + mysql57/mysql-embedded-check.c | 26 + mysql57/mysql-install-test.patch | 33 + mysql57/mysql.init | 209 + mysql57/mysql.sysconfig | 11 + mysql57/mysql.tmpfiles.d | 1 + mysql57/mysql57.spec | 819 ++++ mysql57/mysqlclient20.spec | 360 ++ mysql57/mysqld-nowatch.patch | 51 + mysql57/mysqld-prepare-db-dir | 82 + mysql57/mysqld-wait-ready | 56 + mysql57/mysqld.service | 43 + mysql57/scriptstub.c | 32 + 72 files changed, 12716 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 compat-libicu4/canonicalize.patch create mode 100644 compat-libicu4/icu-3.4-multiarchdevel.patch create mode 100644 compat-libicu4/icu-4.2.1-configure-cxx_try_link.patch create mode 100755 compat-libicu4/icu-config create mode 100644 compat-libicu4/icu.6969.pkgdata.patch create mode 100644 compat-libicu4/icu.6995.kannada.patch create mode 100644 compat-libicu4/icu.7119.s390x.patch create mode 100644 compat-libicu4/icu.XXXX.install.patch create mode 100644 compat-libicu4/icu.icu7039.badextract.patch create mode 100644 compat-libicu4/icu.spec create mode 100644 gstreamer1-plugins-ugly/gstreamer1-plugins-ugly.spec create mode 100644 mysql55/0001-Cloud-Linux-userstat.patch create mode 100644 mysql55/0003_1-Clean-up-stale-pid-files-in-datadir-when-stopping-to.patch create mode 100644 mysql55/0005-Use-accessors-and-fix-type-errors.patch create mode 100644 mysql55/README.mysql-docs create mode 100644 mysql55/README.mysql-license create mode 100755 mysql55/filter-requires-mysql.sh create mode 100644 mysql55/libmysql.version create mode 100644 mysql55/max_connection2_mysql_5_5_30_b404.patch create mode 100644 mysql55/my.cnf create mode 100644 mysql55/my_config.h create mode 100644 mysql55/mysql-chain-certs.patch create mode 100644 mysql55/mysql-cipherspec.patch create mode 100644 mysql55/mysql-dh1024.patch create mode 100644 mysql55/mysql-dubious-exports.patch create mode 100644 mysql55/mysql-embedded-check.c create mode 100644 mysql55/mysql-errno.patch create mode 100644 mysql55/mysql-expired-certs.patch create mode 100644 mysql55/mysql-file-contents.patch create mode 100644 mysql55/mysql-governor-embedded-exclude-5_5_28.patch create mode 100644 mysql55/mysql-install-test.patch create mode 100644 mysql55/mysql-logrotate.patch create mode 100644 mysql55/mysql-netdevname.patch create mode 100644 mysql55/mysql-openssl.patch create mode 100644 mysql55/mysql-plugin-bool.patch create mode 100644 mysql55/mysql-plugin-test.patch create mode 100644 mysql55/mysql-s390-tsc.patch create mode 100644 mysql55/mysql-stack-guard.patch create mode 100644 mysql55/mysql-string-overflow.patch create mode 100644 mysql55/mysql-strmov.patch create mode 100644 mysql55/mysql-va-list.patch create mode 100644 mysql55/mysql-versioning.patch create mode 100644 mysql55/mysql.init create mode 100644 mysql55/mysql.spec create mode 100644 mysql55/mysql.sysconfig create mode 100644 mysql55/mysql.tmpfiles.d create mode 100644 mysql55/mysqld-prepare-db-dir create mode 100644 mysql55/mysqld-wait-ready create mode 100644 mysql55/mysqld.service create mode 100644 mysql55/openssl.pc create mode 100644 mysql55/rh-skipped-tests-arm.list create mode 100644 mysql55/rh-skipped-tests-base.list create mode 100644 mysql55/scriptstub.c create mode 100644 mysql57/README.mysql-docs create mode 100644 mysql57/README.mysql-license create mode 100755 mysql57/filter-requires-mysql.sh create mode 100644 mysql57/my.cnf create mode 100644 mysql57/my_config.h create mode 100644 mysql57/mysql-embedded-check.c create mode 100644 mysql57/mysql-install-test.patch create mode 100644 mysql57/mysql.init create mode 100644 mysql57/mysql.sysconfig create mode 100644 mysql57/mysql.tmpfiles.d create mode 100644 mysql57/mysql57.spec create mode 100644 mysql57/mysqlclient20.spec create mode 100644 mysql57/mysqld-nowatch.patch create mode 100644 mysql57/mysqld-prepare-db-dir create mode 100644 mysql57/mysqld-wait-ready create mode 100644 mysql57/mysqld.service create mode 100644 mysql57/scriptstub.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..314d02a --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +temp/* +*.tar +*.tgz +*.tbz +*.xz +*.gz +*.bz2 +*.zip +*.rar +*.rpm +*.asc +*.sig +*.swp +*_orig +*_old +*.bak +*.old +/a/* +/b/* \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..3500af7 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +RPM packages dedicated to RHEL 9 diff --git a/compat-libicu4/canonicalize.patch b/compat-libicu4/canonicalize.patch new file mode 100644 index 0000000..87a75a0 --- /dev/null +++ b/compat-libicu4/canonicalize.patch @@ -0,0 +1,22 @@ +Index: source/common/uloc.c +=================================================================== +--- source/common/uloc.c (revision 113138) ++++ source/common/uloc.c (working copy) +@@ -1797,7 +1797,7 @@ + int32_t variantLen = _deleteVariant(variant, uprv_min(variantSize, (nameCapacity-len)), variantToCompare, n); + len -= variantLen; + if (variantLen > 0) { +- if (name[len-1] == '_') { /* delete trailing '_' */ ++ if (len > 0 && name[len-1] == '_') { /* delete trailing '_' */ + --len; + } + addKeyword = VARIANT_MAP[j].keyword; +@@ -1805,7 +1805,7 @@ + break; + } + } +- if (name[len-1] == '_') { /* delete trailing '_' */ ++ if (len > 0 && len <= nameCapacity && name[len-1] == '_') { /* delete trailing '_' */ + --len; + } + } diff --git a/compat-libicu4/icu-3.4-multiarchdevel.patch b/compat-libicu4/icu-3.4-multiarchdevel.patch new file mode 100644 index 0000000..2b43a2b --- /dev/null +++ b/compat-libicu4/icu-3.4-multiarchdevel.patch @@ -0,0 +1,70 @@ +--- icu/source/configure.in.orig 2006-05-02 12:10:31.000000000 +0100 ++++ icu/source/configure.in 2006-05-02 15:06:07.000000000 +0100 +@@ -1117,6 +1117,7 @@ + Makefile \ + data/pkgdataMakefile \ + config/Makefile.inc \ ++ config/icu.pc \ + config/pkgdataMakefile \ + data/Makefile \ + stubdata/Makefile \ +--- /dev/null 2006-04-29 13:38:37.035974750 +0100 ++++ icu/source/config/icu.pc.in 2006-05-02 15:03:14.000000000 +0100 +@@ -0,0 +1,46 @@ ++prefix = @prefix@ ++bindir = @bindir@ ++exec_prefix = @exec_prefix@ ++libdir = @libdir@ ++includedir = @includedir@ ++datadir = @datadir@ ++sbindir = @sbindir@ ++mandir = @mandir@ ++sysconfdir = @sysconfdir@ ++CFLAGS = @CFLAGS@ ++CXXFLAGS = @CXXFLAGS@ ++DEFS = @DEFS@ ++UNICODE_VERSION=@UNICODE_VERSION@ ++ICUPREFIX=icu ++ICULIBSUFFIX=@ICULIBSUFFIX@ ++LIBICU=lib${ICUPREFIX} ++LIBCPPFLAGS=-D_REENTRANT ++CPPFLAGS=@CPPFLAGS@ ${LIBCPPFLAGS} -I${prefix}/include ++SHAREDLIBCPPFLAGS=-DPIC ++SHAREDLIBCXXFLAGS=-fPIC ++SHAREDLIBCFLAGS=-fPIC ++pkglibdir=${libdir}/@PACKAGE@${ICULIBSUFFIX}/@VERSION@ ++pkgdatadir=${datadir}/@PACKAGE@${ICULIBSUFFIX}/@VERSION@ ++ICUDATA_NAME = icudt@LIB_VERSION_MAJOR@@ICUDATA_CHAR@ ++ICUPKGDATA_DIR=@libdir@ ++ICUDATA_DIR=${pkgdatadir} ++SO=so ++ICULIBS_COMMON_LIB_NAME=${LIBICU}uc${ICULIBSUFFIX}.${SO} ++SHLIB_cc=cxx ${DEFS} ${CPPFLAGS} ${CXXFLAGS} @LDFLAGS@ -shared ++SHLIB_c=cc ${DEFS} ${CPPFLAGS} ${CFLAGS} @LDFLAGS@ -shared ++ICULIBS_LAYOUT = -l${ICUPREFIX}le${ICULIBSUFFIX} -l${ICUPREFIX}lx${ICULIBSUFFIX} ++ICULIBS_TOOLUTIL = -l${ICUPREFIX}tu${ICULIBSUFFIX} ++ICULIBS_OBSOLETE = -l${ICUPREFIX}obsolete${ICULIBSUFFIX} ++ICULIBS_ICUIO = -l${ICUPREFIX}io${ICULIBSUFFIX} ++ICULIBS_I18N = -l${ICUPREFIX}i18n${ICULIBSUFFIX} ++ICULIBS_COMMON = -l${ICUPREFIX}uc${ICULIBSUFFIX} ++ICULIBS_DATA = -l${ICUPREFIX}data${ICULIBSUFFIX} ++ICULIBS_LIBSONLY = ${ICULIBS_I18N} ${ICULIBS_COMMON} ${ICULIBS_DATA} ++ICULIBS_SYSTEMLIBS = @LIBS@ ++ICULIBS_BASE = @LIBS@ -L${libdir} ++ICULIBS = ${ICULIBS_BASE} ${ICULIBS_I18N} ${ICULIBS_COMMON} ${ICULIBS_DATA} ++ ++Name: @PACKAGE@ ++Description: International Components for Unicode ++Version: @VERSION@ ++Libs: @LDFLAGS@ ${ICULIBS} @LIBS@ +--- icu/source/Makefile.in.orig 2006-05-02 12:10:31.000000000 +0100 ++++ icu/source/Makefile.in 2006-05-02 15:18:15.000000000 +0100 +@@ -126,6 +126,8 @@ + $(INSTALL_DATA) @platform_make_fragment@ $(DESTDIR)$(pkgdatadir)/config/@platform_make_fragment_name@ + $(INSTALL_SCRIPT) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(pkgdatadir)/mkinstalldirs + $(INSTALL_SCRIPT) $(top_srcdir)/install-sh $(DESTDIR)$(pkgdatadir)/install-sh ++ @$(MKINSTALLDIRS) $(DESTDIR)$(libdir)/pkgconfig ++ $(INSTALL_DATA) $(top_srcdir)/config/icu.pc $(DESTDIR)$(libdir)/pkgconfig/icu.pc + $(INSTALL_DATA) $(top_srcdir)/../license.html $(DESTDIR)$(pkgdatadir)/license.html + $(INSTALL_SCRIPT) $(top_builddir)/config/icu-config $(DESTDIR)$(bindir)/icu-config + $(INSTALL_DATA) $(top_builddir)/config/Makefile.inc $(DESTDIR)$(pkglibdir)/Makefile.inc diff --git a/compat-libicu4/icu-4.2.1-configure-cxx_try_link.patch b/compat-libicu4/icu-4.2.1-configure-cxx_try_link.patch new file mode 100644 index 0000000..ca82f01 --- /dev/null +++ b/compat-libicu4/icu-4.2.1-configure-cxx_try_link.patch @@ -0,0 +1,13 @@ +diff -up icu/source/configure.in~ icu/source/configure.in +--- icu/source/configure.in~ 2014-03-07 21:55:33.000000000 +0000 ++++ icu/source/configure.in 2014-03-07 21:56:30.000000000 +0000 +@@ -268,6 +268,9 @@ if test "x$AR" = "x"; then + AC_MSG_ERROR(Archiver ar not found. Set AR= or fix PATH) + fi + ++AC_LANG_PUSH([C++]) ++AC_LINK_IFELSE([AC_LANG_PROGRAM()]) ++AC_LANG_POP([C++]) + + AC_MSG_CHECKING([whether to enable renaming of symbols]) + enabled=yes diff --git a/compat-libicu4/icu-config b/compat-libicu4/icu-config new file mode 100755 index 0000000..024959c --- /dev/null +++ b/compat-libicu4/icu-config @@ -0,0 +1,424 @@ +#!/bin/sh +## -*-sh-*- +#set -x +# BEGIN of icu-config-top +#****************************************************************************** +# Copyright (C) 1999-2004, International Business Machines +# Corporation and others. All Rights Reserved. +#****************************************************************************** +# This script is designed to aid configuration of ICU. + +### END of icu-config-top + +exec_prefix=`pkg-config --variable=exec_prefix icu` +execprefix=$exec_prefix +prefix=`pkg-config --variable=prefix icu` + + +loaddefs() +{ + +libdir=`pkg-config --variable=libdir icu` +bindir=`pkg-config --variable=bindir icu` +datadir=`pkg-config --variable=datadir icu` +bindir=`pkg-config --variable=sbindir icu` + +# about the ICU version +VERSION=`pkg-config --modversion icu` +UNICODE_VERSION=`pkg-config --variable=UNICODE_VERSION icu` + +# for icu-config to test with +ICULIBS_COMMON_LIB_NAME=`pkg-config --variable=ICULIBS_COMMON_LIB_NAME icu` + +# Proper echo newline handling is needed in icu-config +ECHO_N="-n" +ECHO_C="" + +LDLIBRARYPATH_ENVVAR="LD_LIBRARY_PATH" + +pkgdatadir=`pkg-config --variable=pkgdatadir icu` +pkglibdir=`pkg-config --variable=pkglibdir icu` + +CC="gcc" +CXX="g++" +# use a consistent INSTALL +INSTALL="${SHELL} ${pkgdatadir}/install-sh -c" +MKINSTALLDIRS="${SHELL} ${pkgdatadir}/mkinstalldirs" +PKGDATA_MODE="dll" + +## End Linux-specific setup + +## -*-sh-*- +## BEGIN of icu-config-bottom. +## Copyright (c) 2002-2008, International Business Machines Corporation and +## others. All Rights Reserved. + +ICUUC_FILE=${libdir}/${ICULIBS_COMMON_LIB_NAME} + +} + +## The actual code of icu-config goes here. + +ME=`basename "$0"` + +allflags() +{ + echo " --bindir Print binary directory path (bin)" + echo " --cc Print C compiler used [CC]" + echo " --cflags Print C compiler flags [CFLAGS]" + echo " --cflags-dynamic Print additional C flags for" + echo " building shared libraries." + echo " --cppflags Print C Preprocessor flags [CPPFLAGS]" + echo " --cppflags-dynamic Print additional C Preprocessor flags for" + echo " building shared libraries." + echo " --cppflags-searchpath Print only -I include directives (-Iinclude)" + echo " --cxx Print C++ compiler used [CXX]" + echo " --cxxflags Print C++ compiler flags [CXXFLAGS]" + echo " --cxxflags-dynamic Print additional C++ flags for" + echo " building shared libraries." + echo " --detect-prefix Attempt to detect prefix based on PATH" + echo " --exec-prefix Print prefix for executables (/bin)" + echo " --exists Return with 0 status if ICU exists else fail" + echo " --help, -?, --usage Print this message" + echo " --icudata Print shortname of ICU data file (icudt21l)" + echo " --icudata-install-dir Print path to install data to - use as --install option to pkgdata(1)" + echo " --icudata-mode Print default ICU pkgdata mode (dll) - use as --mode option to pkgdata(1)." + echo " --icudatadir Print path to packaged archive data. Can set as [ICU_DATA]" + echo " --invoke Print commands to invoke an ICU program" + echo " --invoke= Print commands to invoke an ICU program named (ex: genrb)" + echo " --ldflags Print -L search path and -l libraries to link with ICU [LDFLAGS]. This is for the data, uc (common), and i18n libraries only. " + echo " --ldflags-layout Print ICU layout engine link directive. Use in addition to --ldflags" + echo " --ldflags-libsonly Same as --ldflags, but only the -l directives" + echo " --ldflags-searchpath Print only -L (search path) directive" + echo " --ldflags-system Print only system libs ICU links with (-lpthread, -lm)" + echo " --ldflags-icuio Print ICU icuio link directive. Use in addition to --ldflags " + echo " --ldflags-obsolete Print ICU obsolete link directive. Use in addition to --ldflags. (requires icuapps/obsolete to be built and installed.) " + echo " --mandir Print manpage (man) path" + echo " --prefix Print PREFIX to icu install (/usr/local)" + echo " --prefix=XXX Set prefix to XXX for remainder of command" + echo " --sbindir Print system binary path (sbin) " + echo " --shared-datadir Print shared data (share) path. This is NOT the ICU data dir." + echo " --shlib-c Print the command to compile and build C shared libraries with ICU" + echo " --shlib-cc Print the command to compile and build C++ shared libraries with ICU" + echo " --sysconfdir Print system config (etc) path" + echo " --unicode-version Print version of Unicode data used in ICU ($UNICODE_VERSION)" + echo " --version Print ICU version ($VERSION)" + echo " --incfile Print path to Makefile.inc" + echo " --incpkgdatafile Print path to pkgdata.inc (for -O option of pkgdata)" + echo " --install Print path to install-sh" + echo " --mkinstalldirs Print path to mkinstalldirs" +} + +## Print the normal usage message +shortusage() +{ + echo "usage: ${ME} " `allflags | cut -c-25 | sed -e 's%.*%[ & ]%'` +} + + +usage() +{ + echo "${ME}: icu-config: ICU configuration helper script" + echo + echo "The most commonly used options will be --cflags, --cxxflags, --cppflags, and --ldflags." + echo 'Example (in make): CPFLAGS=$(shell icu-config --cppflags)' + echo ' LDFLAGS=$(shell icu-config --ldflags)' + echo " (etc).." + echo + echo "Usage:" + allflags + + echo + echo " [Brackets] show MAKE variable equivalents, (parenthesis) show example output" + echo + echo "Copyright (c) 2002, International Business Machines Corporation and others. All Rights Reserved." +} + +## Check the sanity of current variables +sanity() +{ + if [ ! -f ${ICUUC_FILE} ] && [ ${IGNORE_ICUUC_FILE_CHECK} = "no" ]; + then + echo "### $ME: Can't find ${ICUUC_FILE} - ICU prefix is wrong." 1>&2 + echo "### Try the --prefix= option " 1>&2 + echo "### or --detect-prefix" + echo "### $ME: Exitting." 1>&2 + exit 2 + fi +} + +## Main starts here. + +if [ $# -lt 1 ]; then + shortusage + exit 1 +fi + +# For certain options (e.g. --detect-prefix) don't check for icuuc library file. +IGNORE_ICUUC_FILE_CHECK="no"; +case "$1" in +*prefix*) + IGNORE_ICUUC_FILE_CHECK="yes" + ;; +esac + +# Load our variables from autoconf +# ALWAYS load twice because of dependencies +loaddefs +loaddefs + +if [ $1 = "--selfcheck" ]; +then + echo "passed" + exit + # EXIT for self check +fi + +sanity + +while [ $# -gt 0 ]; +do + arg="$1" + var=`echo $arg | sed -e 's/^[^=]*=//'` +# echo "### processing $arg" 1>&2 + case "$arg" in + + # undocumented. + --debug) + set -x + ;; + + --so) + pkg-config --variable=SO icu + ;; + + --bindir) + echo $bindir + ;; + + --libdir) + echo $libdir + ;; + + --exists) + sanity + ;; + + --sbindir) + echo $sbindir + ;; + + --mkinstalldirs) + echo ${MKINSTALLDIRS} + ;; + + --install) + echo ${INSTALL} + ;; + + --invoke=*) + QUOT="\"" + CMD="${var}" + + # If it's not a locally executable command (1st choice) then + # search for it in the ICU directories. + if [ ! -x ${CMD} ]; then + if [ -x ${bindir}/${var} ]; then + CMD="${bindir}/${var}" + fi + if [ -x ${sbindir}/${var} ]; then + CMD="${sbindir}/${var}" + fi + fi + + echo "env ${QUOT}${LDLIBRARYPATH_ENVVAR}=${libdir}:"'${'"${LDLIBRARYPATH_ENVVAR}"'}'${QUOT} ${CMD} + ;; + + --invoke) + QUOT="\"" + echo "env ${QUOT}${LDLIBRARYPATH_ENVVAR}=${libdir}:"'${'"${LDLIBRARYPATH_ENVVAR}"'}'${QUOT} + ;; + + --cflags) + pkg-config --variable=CFLAGS icu + ;; + + --cc) + echo $ECHO_N "${CC}${ECHO_C} " + ;; + + --cxx) + echo $ECHO_N "${CXX}${ECHO_C} " + ;; + + --cxxflags) + pkg-config --variable=CXXFLAGS icu + ;; + + --cppflags) + # Don't echo the -I. - it's unneeded. + CPPFLAGS=`pkg-config --variable=CPPFLAGS icu` + echo $ECHO_N "${CPPFLAGS}${ECHO_C} " | sed -e 's/-I. //' + ;; + + --cppflags-searchpath) + echo $ECHO_N "-I${prefix}/include${ECHO_C} " + ;; + + --cppflags-dynamic) + pkg-config --variable=SHAREDLIBCPPFLAGS icu + ;; + + --cxxflags-dynamic) + pkg-config --variable=SHAREDLIBCXXFLAGS icu + ;; + + --cflags-dynamic) + pkg-config --variable=SHAREDLIBCFLAGS icu + ;; + + --ldflags-system) + pkg-config --variable=ICULIBS_SYSTEMLIBS icu + ;; + + --ldflags) + pkg-config --libs icu + ;; + + --ldflags-libsonly) + pkg-config --variable=ICULIBS_LIBSONLY icu + ;; + + --ldflags-icuio) + pkg-config --variable=ICULIBS_ICUIO icu + ;; + + --ldflags-obsolete) + pkg-config --variable=ICULIBS_OBSOLETE icu + ;; + + --ldflags-toolutil) + pkg-config --variable=ICULIBS_TOOLUTIL icu + ;; + + --ldflags-layout) + pkg-config --variable=ICULIBS_LAYOUT icu + ;; + + --ldflags-searchpath) + echo $ECHO_N "-L${libdir}${ECHO_C} " + ;; + + --detect-prefix) + HERE=`echo $0 | sed -e "s/$ME//g"` + if [ -f $HERE/../lib/${ICULIBS_COMMON_LIB_NAME} ]; then + prefix=$HERE/.. + echo "## Using --prefix=${prefix}" 1>&2 + fi + loaddefs + loaddefs + ;; + + --exec-prefix) + echo $exec_prefix + ;; + + --prefix) + echo $prefix + ;; + + --prefix=*) + prefix=$var + loaddefs + loaddefs + ;; + + --sysconfdir) + pkg-config --variable=sysconfdir icu + ;; + + --mandir) + pkg-config --variable=mandir icu + ;; + + --shared-datadir) + echo $ECHO_N "${datadir}${ECHO_C} " + ;; + + --incfile) + echo $ECHO_N "${pkglibdir}/Makefile.inc${ECHO_C} " + ;; + + --incpkgdatafile) + echo $ECHO_N "${pkglibdir}/pkgdata.inc${ECHO_C} " + ;; + + --icudata) + pkg-config --variable=ICUDATA_NAME icu + ;; + + --icudata-mode) + echo $ECHO_N "${PKGDATA_MODE}${ECHO_C} " + ;; + + --icudata-install-dir) + pkg-config --variable=ICUPKGDATA_DIR icu + ;; + + --icudatadir) + pkg-config --variable=ICUDATA_DIR icu + ;; + + --shlib-c) + pkg-config --variable=SHLIB_c icu + ;; + + --shlib-cc) + pkg-config --variable=SHLIB_cc icu + ;; + + --version) + echo $ECHO_N $VERSION + ;; + + --unicode-version) + echo $ECHO_N $UNICODE_VERSION + ;; + + --help) + usage + exit 0 + ;; + + --usage) + usage + exit 0 + ;; + + -?) + usage + exit 0 + ;; + + *) + echo ${ME}: ERROR Unknown Option $arg 1>&2 + echo 1>&2 + shortusage 1>&2 + echo "### $ME: Exitting." 1>&2 + exit 1; + ;; + esac + shift + + # Reset the ignore icuuc file check flag + if [ $IGNORE_ICUUC_FILE_CHECK = "yes" ]; then + IGNORE_ICUUC_FILE_CHECK="no" + sanity + fi +done +echo +# Check once before we quit (will check last used prefix) +sanity +## END of icu-config-bottom + +exit 0 diff --git a/compat-libicu4/icu.6969.pkgdata.patch b/compat-libicu4/icu.6969.pkgdata.patch new file mode 100644 index 0000000..094b0bf --- /dev/null +++ b/compat-libicu4/icu.6969.pkgdata.patch @@ -0,0 +1,189 @@ +Index: source/tools/pkgdata/pkgdata.cpp +=================================================================== +--- source.orig/tools/pkgdata/pkgdata.cpp 2009-06-26 14:57:38.000000000 -0400 ++++ source/tools/pkgdata/pkgdata.cpp 2009-06-27 10:12:08.437285758 -0400 +@@ -118,6 +118,7 @@ + static void createFileNames(const char *version_major, const char *version, const char *libName, const UBool reverseExt); + + static int32_t pkg_getOptionsFromICUConfig(UOption *option); ++static int runCommand(const char* command); + + enum { + NAME, +@@ -461,6 +462,17 @@ + return result; + } + ++static int runCommand(const char* command) ++{ ++ printf("pkgdata: %s\n", command); ++ int result = system(command); ++ if (result != 0) ++ { ++ printf("-- return status = %d\n", result); ++ } ++ return result; ++} ++ + #define LN_CMD "ln -s" + #define RM_CMD "rm -f" + +@@ -724,7 +736,7 @@ + LN_CMD, + libFileNames[LIB_FILE_VERSION], + libFileNames[LIB_FILE_VERSION_MAJOR]); +- result = system(cmd); ++ result = runCommand(cmd); + if (result != 0) { + return result; + } +@@ -737,7 +749,7 @@ + libFileNames[LIB_FILE_VERSION], + libFileNames[LIB_FILE], pkgDataFlags[SO_EXT]); + +- result = system(cmd); ++ result = runCommand(cmd); + + return result; + } +@@ -753,7 +765,7 @@ + installDir, PKGDATA_FILE_SEP_STRING, libFileNames[LIB_FILE_VERSION] + ); + +- result = system(cmd); ++ result = runCommand(cmd); + + if (result != 0) { + return result; +@@ -795,7 +807,7 @@ + srcDir, PKGDATA_FILE_SEP_STRING, buffer, + installDir, PKGDATA_FILE_SEP_STRING, buffer); + +- result = system(cmd); ++ result = runCommand(cmd); + if (result != 0) { + fprintf(stderr, "Failed to install data file with command: %s\n", cmd); + break; +@@ -815,7 +827,7 @@ + } + #else + sprintf(cmd, "%s %s %s %s", WIN_INSTALL_CMD, srcDir, installDir, WIN_INSTALL_CMD_FLAGS); +- result = system(cmd); ++ result = runCommand(cmd); + if (result != 0) { + fprintf(stderr, "Failed to install data file with command: %s\n", cmd); + } +@@ -849,7 +861,17 @@ + targetDir, + libFileNames[LIB_FILE_VERSION_TMP]); + +- result = system(cmd); ++ result = runCommand(cmd); ++ if (result != 0) { ++ return result; ++ } ++ ++ sprintf(cmd, "%s %s%s", ++ pkgDataFlags[RANLIB], ++ targetDir, ++ libFileNames[LIB_FILE_VERSION]); ++ ++ result = runCommand(cmd); + if (result != 0) { + return result; + } +@@ -860,7 +882,7 @@ + targetDir, + libFileNames[LIB_FILE_VERSION_TMP]); + +- result = system(cmd); ++ result = runCommand(cmd); + if (result != 0) { + return result; + } +@@ -908,7 +930,21 @@ + pkgDataFlags[A_EXT], + objectFile); + +- result = system(cmd); ++ result = runCommand(cmd); ++ if (result == 0) ++ { ++#ifdef OS400 ++ sprintf(cmd, "QSH CMD('%s %s%s.%s')", ++#else ++ sprintf(cmd, "%s %s%s.%s", ++#endif ++ pkgDataFlags[RANLIB], ++ targetDir, ++ libFileNames[LIB_FILE], ++ pkgDataFlags[A_EXT]); ++ ++ result = runCommand(cmd); ++ } + } else /* if (mode == MODE_DLL) */ { + #ifdef U_CYGWIN + sprintf(cmd, "%s%s%s %s -o %s%s %s %s%s %s %s", +@@ -935,7 +971,7 @@ + pkgDataFlags[BIR_FLAGS]); + + /* Generate the library file. */ +- result = system(cmd); ++ result = runCommand(cmd); + } + + if (freeCmd) { +@@ -961,7 +997,7 @@ + tempObjectFile, + gencFilePath); + +- result = system(cmd); ++ result = runCommand(cmd); + if (result != 0) { + return result; + } +@@ -1043,7 +1079,7 @@ + tempObjectFile, + gencmnFile); + +- result = system(cmd); ++ result = runCommand(cmd); + if (result != 0) { + break; + } +@@ -1094,7 +1130,7 @@ + sprintf(cmd, "cat %s >> %s", gencmnFile, icudtAll); + #endif + +- result = system(cmd); ++ result = runCommand(cmd); + if (result != 0) { + break; + } +@@ -1110,7 +1146,7 @@ + pkgDataFlags[LIBFLAGS], + tempObjectFile, + gencmnFile); +- result = system(cmd); ++ result = runCommand(cmd); + if (result != 0) { + break; + } +@@ -1139,7 +1175,7 @@ + tempObjectFile, + icudtAll); + +- result = system(cmd); ++ result = runCommand(cmd); + if (result == 0) { + sprintf(buffer, "%s %s", + buffer, +@@ -1222,7 +1258,7 @@ + ); + } + +- return system(cmd); ++ return runCommand(cmd); + } + #endif + diff --git a/compat-libicu4/icu.6995.kannada.patch b/compat-libicu4/icu.6995.kannada.patch new file mode 100644 index 0000000..a9d1fa4 --- /dev/null +++ b/compat-libicu4/icu.6995.kannada.patch @@ -0,0 +1,11 @@ +--- icu.orig/source/layout/IndicClassTables.cpp 2009-06-11 11:10:08.000000000 +0100 ++++ icu/source/layout/IndicClassTables.cpp 2009-06-11 11:11:30.000000000 +0100 +@@ -179,7 +179,7 @@ + // http://brahmi.sourceforge.net/docs/KannadaComputing.html + static const IndicClassTable::CharClass kndaCharClasses[] = + { +- _xx, _xx, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, // 0C80 - 0C8F ++ _xx, _xx, _mp, _mp, _xx, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _iv, _xx, _iv, _iv, // 0C80 - 0C8F + _iv, _xx, _iv, _iv, _iv, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, // 0C90 - 0C9F + _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _bb, // 0CA0 - 0CAF + _rb, _ct, _bb, _bb, _xx, _bb, _bb, _bb, _bb, _bb, _xx, _xx, _xx, _xx, _dr, _da, // 0CB0 - 0CBF diff --git a/compat-libicu4/icu.7119.s390x.patch b/compat-libicu4/icu.7119.s390x.patch new file mode 100644 index 0000000..b94863c --- /dev/null +++ b/compat-libicu4/icu.7119.s390x.patch @@ -0,0 +1,12 @@ +diff -ru icu.orig/source/configure.in icu/source/configure.in +--- icu.orig/source/configure.in 2009-09-01 08:56:46.000000000 +0100 ++++ icu/source/configure.in 2009-09-01 10:38:25.000000000 +0100 +@@ -462,7 +462,7 @@ + # Check to see if genccode can generate simple assembly. + GENCCODE_ASSEMBLY= + case "${host}" in +-i*86-*-linux*|x86_64-*-linux*|powerpc*-*-linux*|i*86-*-*bsd*|i*86-pc-gnu) ++*-linux*|i*86-*-*bsd*|i*86-pc-gnu) + if test "$GCC" = yes; then + # We're using gcc, and the simple -a gcc command line works for genccode + GENCCODE_ASSEMBLY="-a gcc" diff --git a/compat-libicu4/icu.XXXX.install.patch b/compat-libicu4/icu.XXXX.install.patch new file mode 100644 index 0000000..b045510 --- /dev/null +++ b/compat-libicu4/icu.XXXX.install.patch @@ -0,0 +1,11 @@ +--- icu/source/Makefile.in.orig 2009-08-31 21:15:03.000000000 +0100 ++++ icu/source/Makefile.in 2009-08-31 21:19:23.000000000 +0100 +@@ -146,7 +146,7 @@ + install-doc: doc + $(RM) -r $(DESTDIR)$(docdir)/$(docsubdir) + $(MKINSTALLDIRS) $(DESTDIR)$(docdir)/$(docsubdir) +- $(INSTALL_DATA) doc/html/* $(DESTDIR)$(docdir)/$(docsubdir) ++ cp -r doc/html/* $(DESTDIR)$(docdir)/$(docsubdir) + endif + + $(DESTDIR)$(pkglibdir)/%: $(top_srcdir)/../data/% diff --git a/compat-libicu4/icu.icu7039.badextract.patch b/compat-libicu4/icu.icu7039.badextract.patch new file mode 100644 index 0000000..3b27762 --- /dev/null +++ b/compat-libicu4/icu.icu7039.badextract.patch @@ -0,0 +1,96 @@ +diff -ru icu.orig/source/common/unicode/unistr.h icu/source/common/unicode/unistr.h +--- icu.orig/source/common/unicode/unistr.h 2009-07-28 16:02:03.000000000 +0100 ++++ icu/source/common/unicode/unistr.h 2009-07-28 16:36:48.000000000 +0100 +@@ -4048,7 +4048,7 @@ + + { + // This dstSize value will be checked explicitly +- return extract(start, _length, dst, dst!=0 ? 0xffffffff : 0, codepage); ++ return extract(start, _length, dst, dst!=0 ? (((size_t)dst >= ((size_t)-1) - UINT32_MAX) ? (((char*)UINT32_MAX) - dst) : UINT32_MAX) : 0, codepage); + } + + #endif +diff -ru icu.orig/source/test/intltest/dadrcal.cpp icu/source/test/intltest/dadrcal.cpp +--- icu.orig/source/test/intltest/dadrcal.cpp 2009-07-28 16:01:10.000000000 +0100 ++++ icu/source/test/intltest/dadrcal.cpp 2009-07-28 16:52:15.000000000 +0100 +@@ -114,7 +114,7 @@ + + UnicodeString(" - ")); + continue; + } +- testSetting.extract(0, testSetting.length(), toCalLoc, (const char*)0); ++ testSetting.extract(0, testSetting.length(), toCalLoc, sizeof(toCalLoc)-1, (const char*)0); + fromCalendar = Calendar::createInstance(toCalLoc, status); + if (U_FAILURE(status)) { + errln(caseString+": Unable to instantiate calendar for " +@@ -371,7 +371,7 @@ + // build to calendar + UnicodeString testSetting = settings->getString("ToCalendar", status); + if (U_SUCCESS(status)) { +- testSetting.extract(0, testSetting.length(), toCalLoc, (const char*)0); ++ testSetting.extract(0, testSetting.length(), toCalLoc, sizeof(toCalLoc)-1, (const char*)0); + toCalendar = Calendar::createInstance(toCalLoc, status); + if (U_FAILURE(status)) { + errln("Unable to instantiate ToCalendar for "+testSetting); +@@ -394,7 +394,7 @@ + Calendar *fromCalendar= NULL; + UnicodeString locale = currentCase->getString("locale", status); + if (U_SUCCESS(status)) { +- locale.extract(0, locale.length(), fromCalLoc, (const char*)0); // default codepage. Invariant codepage doesn't have '@'! ++ locale.extract(0, locale.length(), fromCalLoc, sizeof(fromCalLoc)-1, (const char*)0); // default codepage. Invariant codepage doesn't have '@'! + fromCalendar = Calendar::createInstance(fromCalLoc, status); + if (U_FAILURE(status)) { + errln("Unable to instantiate fromCalendar for "+locale); +@@ -464,7 +464,7 @@ + logln("---"); + } + logln(testSetting + "---"); +- testSetting.extract(0, testSetting.length(), testType, ""); ++ testSetting.extract(0, testSetting.length(), testType, sizeof(testType)-1, ""); + } else { + errln("Unable to extract 'Type'. Skipping.."); + continue; +diff -ru icu.orig/source/test/intltest/dadrcoll.cpp icu/source/test/intltest/dadrcoll.cpp +--- icu.orig/source/test/intltest/dadrcoll.cpp 2009-07-28 16:01:10.000000000 +0100 ++++ icu/source/test/intltest/dadrcoll.cpp 2009-07-28 16:49:56.000000000 +0100 +@@ -179,7 +179,7 @@ + testSetting = settings->getString("TestLocale", intStatus); + if(U_SUCCESS(intStatus)) { + char localeName[256]; +- testSetting.extract(0, testSetting.length(), localeName, ""); ++ testSetting.extract(0, testSetting.length(), localeName, sizeof(localeName)-1, ""); + col = Collator::createInstance(localeName, status); + if(U_SUCCESS(status)) { + logln("Testing collator for locale "+testSetting); +diff -ru icu.orig/source/test/intltest/dadrfmt.cpp icu/source/test/intltest/dadrfmt.cpp +--- icu.orig/source/test/intltest/dadrfmt.cpp 2009-07-28 16:01:10.000000000 +0100 ++++ icu/source/test/intltest/dadrfmt.cpp 2009-07-28 16:50:36.000000000 +0100 +@@ -149,7 +149,7 @@ + DateFormat *format = NULL; + + // Process: 'locale' +- locale.extract(0, locale.length(), calLoc, (const char*)0); // default codepage. Invariant codepage doesn't have '@'! ++ locale.extract(0, locale.length(), calLoc, sizeof(calLoc)-1, (const char*)0); // default codepage. Invariant codepage doesn't have '@'! + Locale loc(calLoc); + if(spec.startsWith(kPATTERN)) { + pattern = UnicodeString(spec,kPATTERN.length()); +@@ -323,7 +323,7 @@ + logln("---"); + } + logln(testSetting + "---"); +- testSetting.extract(0, testSetting.length(), testType, ""); ++ testSetting.extract(0, testSetting.length(), testType, sizeof(testType)-1, ""); + } else { + errln("Unable to extract 'Type'. Skipping.."); + continue; +diff -ru icu.orig/source/test/intltest/loctest.cpp icu/source/test/intltest/loctest.cpp +--- icu.orig/source/test/intltest/loctest.cpp 2009-07-28 16:01:10.000000000 +0100 ++++ icu/source/test/intltest/loctest.cpp 2009-07-28 16:51:30.000000000 +0100 +@@ -616,7 +616,7 @@ + { + char *ch; + ch = new char[l.length() + 1]; +- ch[l.extract(0, 0x7fffffff, ch, "")] = 0; ++ ch[l.extract(0, 0x7fffffff, ch, l.length(), "")] = 0; + setFromPOSIXID(ch); + delete [] ch; + } diff --git a/compat-libicu4/icu.spec b/compat-libicu4/icu.spec new file mode 100644 index 0000000..e468f25 --- /dev/null +++ b/compat-libicu4/icu.spec @@ -0,0 +1,532 @@ +%global compat 1 + +%if %{compat} +Name: compat-libicu4 +%else +Name: icu +%endif +Version: 4.2.1 +Release: 9%{?dist} +Summary: International Components for Unicode +Group: Development/Tools +License: MIT and UCD and Public Domain +URL: http://www.icu-project.org/ +Source0: http://download.icu-project.org/files/icu4c/4.2.1/icu4c-4_2_1-src.tgz +Source1: icu-config +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +BuildRequires: doxygen, autoconf +%if ! %{compat} +Requires: lib%{name} = %{version}-%{release} +%endif + +# need an older compiler because the newer ones are too strict on this code +#%global gccv 44 +#BuildRequires: gcc%{gccv}, gcc%{gccv}-c++ + +Patch1: icu-3.4-multiarchdevel.patch +Patch2: icu.6995.kannada.patch +Patch3: icu.icu7039.badextract.patch +Patch4: icu.6969.pkgdata.patch +Patch5: icu.XXXX.install.patch +Patch6: icu.7119.s390x.patch +Patch7: canonicalize.patch + +# Amazon +Patch10: icu-4.2.1-configure-cxx_try_link.patch + +%description +Tools and utilities for developing with icu. + +%if ! %{compat} +%package -n lib%{name} +Summary: International Components for Unicode - libraries +Group: System Environment/Libraries + +%description -n lib%{name} +%endif +The International Components for Unicode (ICU) libraries provide +robust and full-featured Unicode services on a wide variety of +platforms. ICU supports the most current version of the Unicode +standard, and they provide support for supplementary Unicode +characters (needed for GB 18030 repertoire support). +As computing environments become more heterogeneous, software +portability becomes more important. ICU lets you produce the same +results across all the various platforms you support, without +sacrificing performance. It offers great flexibility to extend and +customize the supplied services. + +#%if ! %{compat} +%package -n lib%{name}-devel +Summary: Development files for International Components for Unicode +Group: Development/Libraries +Requires: lib%{name} = %{version}-%{release} +Requires: pkgconfig + +%description -n lib%{name}-devel +Includes and definitions for developing with icu. + +%package -n lib%{name}-doc +Summary: Documentation for International Components for Unicode +Group: Documentation +BuildArch: noarch + +%description -n lib%{name}-doc +%{summary}. +#%endif # !compat + +%prep +%if %{compat} +%setup -q -n icu +%else +%setup -q -n %{name} +%endif +%patch1 -p1 -b .multiarchdevel +%patch2 -p1 -b .icu6995.kannada.patch +%patch3 -p1 -b .icu7039.badextract.patch +%patch4 -p0 -b .icu.6969.pkgdata.patch +%patch5 -p1 -b .icu.XXXX.install.patch +%patch6 -p1 -b .icu.7119.s390x.patch +%patch7 -p0 -b .canonicalize.patch + +# Amazon +%patch10 -p1 + +%build +#export CC=gcc%{gccv} +#export CXX=g++%{gccv} +cd source +autoconf +CFLAGS='%optflags -fno-strict-aliasing' +CXXFLAGS='%optflags -fno-strict-aliasing' +%configure --with-data-packaging=library --disable-samples +# CC=gcc%{gccv} CXX=g++%{gccv} +#rhbz#225896 +sed -i -- "s/-nodefaultlibs -nostdlib//" config/mh-linux +make # %{?_smp_mflags} # -j(X>1) may "break" man pages as of 3.2, b.f.u #2357 +%if ! %{compat} +make doc +%endif + +%install +rm -rf $RPM_BUILD_ROOT source/__docs +make -C source install DESTDIR=$RPM_BUILD_ROOT +%if ! %{compat} +make -C source install-doc docdir=__docs +%endif +chmod +x $RPM_BUILD_ROOT%{_libdir}/*.so.* +cp -p %{SOURCE1} $RPM_BUILD_ROOT%{_bindir}/%{name}-config +chmod 0755 $RPM_BUILD_ROOT%{_bindir}/%{name}-config +sed -i s/\\\$\(THREADSCXXFLAGS\)// $RPM_BUILD_ROOT/%{_libdir}/pkgconfig/icu.pc +sed -i s/\\\$\(THREADSCPPFLAGS\)/-D_REENTRANT/ $RPM_BUILD_ROOT/%{_libdir}/pkgconfig/icu.pc + +%check +make -C source check + +%clean +rm -rf $RPM_BUILD_ROOT + +%if %{compat} +%post -p /sbin/ldconfig +%postun -p /sbin/ldconfig +%else +%post -n lib%{name} -p /sbin/ldconfig +%postun -n lib%{name} -p /sbin/ldconfig +%endif + +%files +%defattr(-,root,root,-) +%doc license.html readme.html +%if %{compat} +%exclude %{_bindir}/* +%exclude %{_mandir}/* +%else +%{_bindir}/derb +%{_bindir}/genbrk +%{_bindir}/gencfu +%{_bindir}/gencnval +%{_bindir}/genctd +%{_bindir}/genrb +%{_bindir}/makeconv +%{_bindir}/pkgdata +%{_bindir}/uconv +%{_sbindir}/* +%{_mandir}/man1/derb.1* +%{_mandir}/man1/gencnval.1* +%{_mandir}/man1/genrb.1* +%{_mandir}/man1/genbrk.1* +%{_mandir}/man1/genctd.1* +%{_mandir}/man1/makeconv.1* +%{_mandir}/man1/pkgdata.1* +%{_mandir}/man1/uconv.1* +%{_mandir}/man8/*.8* +%endif + +%if ! %{compat} +%files -n lib%{name} +%defattr(-,root,root,-) +%endif +%{_libdir}/*.so.* + +#%if ! %{compat} +%files -n lib%{name}-devel +%defattr(-,root,root,-) +%{_bindir}/%{name}-config +%{_mandir}/man1/%{name}-config.1* +%{_includedir}/layout +%{_includedir}/unicode +%{_libdir}/*.so +%{_libdir}/pkgconfig/icu.pc +%{_libdir}/%{name} +%dir %{_datadir}/%{name} +%dir %{_datadir}/%{name}/%{version} +%{_datadir}/%{name}/%{version}/install-sh +%{_datadir}/%{name}/%{version}/mkinstalldirs +%{_datadir}/%{name}/%{version}/config +%doc %{_datadir}/%{name}/%{version}/license.html + +%files -n lib%{name}-doc +%defattr(-,root,root,-) +%doc source/__docs/%{name}/html/* +#%else +#%exclude %{_includedir} +#%exclude %{_libdir}/icu +#%exclude %{_libdir}/pkgconfig/icu.pc +#%exclude %{_datadir}/icu +#%exclude %{_libdir}/*.so +#%exclude %{_sbindir}/* +#%endif + +%changelog +* Fri Mar 7 2014 Cristian Gafton +- eliminate redundant require for compat package +- select an older compiler version for compat with older builds +- transform into a compat package +- add patch to keep the code compiling under newer compilers + +* Mon Jan 9 2012 Andrew Jorgensen +- Fix release number so it increments + +* Thu Dec 15 2011 Cristian Gafton +- import source package RHEL6/icu-4.2.1-9.1.el6_2 + +* Mon Dec 12 2011 Caolan McNamara - 4.2.1-9.1 +- Resolves: rhbz#766539 CVE-2011-4599 localeID overflow + +* Thu Dec 2 2010 Cristian Gafton +- import source package RHEL6/icu-4.2.1-9.el6 + +* Fri Jul 9 2010 Cristian Gafton +- import source package RHEL6/icu-4.2.1-8.el6 +- import source package RHEL6/icu-4.2.1-7.el6 + +* Thu May 27 2010 Caolan McNamara - 4.2.1-9 +- Resolves: rhbz#596171 drop icu.icu6284.strictalias.patch and use + -fno-strict-aliasig as upstream has added a pile more and doesn't look + interested in proposed patchs + +* Fri May 7 2010 Cristian Gafton +- import source package RHEL5/icu-3.6-5.11.4 +- import source package RHEL5/icu-3.6-5.11.2 +- import source package RHEL5/icu-3.6-5.11.1 +- import source package RHEL5/icu-3.6-5.11 +- import source package RHEL5/icu-3.6-5.9 +- added submodule prep for package icu + +* Thu Apr 01 2010 Caolan McNamara - 4.2.1-8 +- Resolves: rhbz#578749 clarify license + +* Wed Dec 02 2009 Caolan McNamara - 4.2.1-7 +- Resolves: rhbz#543386 update icu-config + +* Tue Sep 01 2009 Caolan McNamara - 4.2.1-6 +- Resolves: rhbz#520468 fix s390x and other secondary archs + +* Tue Jul 28 2009 Caolan McNamara - 4.2.1-5 +- icu#7039 fix broken use of extract to get tests working + +* Fri Jul 24 2009 Fedora Release Engineering - 4.2.1-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Wed Jul 22 2009 Caolan McNamara - 4.2.1-3 +- make documentation noarch + +* Tue Jul 14 2009 Caolan McNamara - 4.2.1-2 +- rpmlint warnings + +* Fri Jul 03 2009 Caolan McNamara - 4.2.1-1 +- 4.2.1 release + +* Fri Jun 26 2009 Caolan McNamara - 4.2.0.1-3 +- Resolves: rhbz#508288 multilib conflict + +* Thu Jun 11 2009 Caolan McNamara - 4.2.0.1-2 +- Resolves: rhbz#505252 add icu.6995.kannada.patch + +* Mon Jun 08 2009 Caolan McNamara - 4.2.0.1-1 +- 4.2.0.1 release + +* Sat May 09 2009 Caolan McNamara - 4.2-1 +- 4.2 release + +* Sun May 03 2009 Caolan McNamara - 4.2-0.1.d03 +- 4.2 release candidate +- drop resolved icu.icu6008.arm.padding.patch +- drop resolved icu.icu6439.bare.elif.patch + +* Tue Feb 24 2009 Fedora Release Engineering - 4.0.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Tue Feb 03 2009 Caolan McNamara - 4.0.1-2 +- fix bare elif for gcc-4.4 + +* Fri Jan 16 2009 Caolan McNamara - 4.0.1-1 +- 4.0.1 release + +* Mon Dec 29 2008 Caolan McNamara - 4.0-6 +- Resolves rhbz#225896 clean up low hanging rpmlint warnings + +* Tue Dec 16 2008 Caolan McNamara - 4.0-5 +- drop integrated icu.icu5557.safety.patch + +* Thu Nov 20 2008 Caolan McNamara - 4.0-4 +- annoyingly upstream tarball was repacked apparently to remove + some unused/cached dirs + +* Sat Sep 06 2008 Caolan McNamara - 4.0-3 +- Resolves: rhbz#461348 wrong icu-config + +* Tue Aug 26 2008 Caolan McNamara - 4.0-2 +- Resolves: rhbz#459698 drop Malayalam patches. Note test with Rachana/Meera + instead of Lohit Malayalam before filing bugs against icu wrt. + Malayalam rendering + +* Sat Jul 05 2008 Caolan McNamara - 4.0-1 +- final release + +* Mon Jun 30 2008 Caolan McNamara - 4.0-0.3.d03 +- 4.0 release candidate + +* Wed Jun 04 2008 Caolan McNamara - 4.0-0.2.d02 +- drop icu.icu5498.openoffice.org.patch + +* Sun May 31 2008 Caolan McNamara - 4.0-0.1.d02 +- 4.0 release candidate +- drop integrated icu.regexp.patch + +* Mon May 19 2008 Caolan McNamara - 3.8.1-8 +- add icu.icu6284.strictalias.patch and build with + strict-aliasing + +* Tue Mar 18 2008 Caolan McNamara - 3.8.1-7 +- Resolves: rhbz#437761 modify to icu.icu6213.worstcase.patch for + other worst case expansions + +* Mon Mar 17 2008 Caolan McNamara - 3.8.1-6 +- Resolves: rhbz#437761 add icu.icu6213.bengali.worstcase.patch + +* Mon Feb 04 2008 Caolan McNamara - 3.8.1-5 +- Resolves: rhbz#431401 split syllables on 1st 0d4d of a 0d4d + + (>= 0d15 && <= 0d39) + 0d4d + 0d30 sequence + +* Thu Jan 31 2008 Caolan McNamara - 3.8.1-4 +- Resolves: rhbz#431029, rhbz#424661 Remove workaround for 0D31 characters + +* Fri Jan 25 2008 Caolan McNamara - 3.8.1-3 +- CVE-2007-4770 CVE-2007-4771 add icu.regexp.patch +- Resolves: rhbz#423211 fix malalayam stuff in light of syllable + changes + +* Fri Jan 11 2008 Caolan McNamara - 3.8.1-2 +- remove icu.icu5365.dependantvowels.patch and cleanup + icu.icu5506.multiplevowels.patch as they patch and unpatch + eachother (thanks George Rhoten for pointing out that madness) + +* Fri Jan 11 2008 Caolan McNamara - 3.8.1-1 +- latest version +- drop fixed icu.icu6084.zwnj.notdef.patch + +* Thu Dec 13 2007 Caolan McNamara - 3.8-6 +- Resolves: rhbz#423211 experimental hack for 0d15+0d4d+0d30 + +* Tue Dec 11 2007 Caolan McNamara - 3.8-5 +- Resolves: rhbz#415541 icu.icu6084.zwnj.notdef.patch + +* Wed Nov 28 2007 Caolan McNamara - 3.8-4 +- Resolves: ooo#83991 Malayalam "Kartika" font fix + +* Tue Nov 13 2007 Caolan McNamara - 3.8-3 +- add icu.openoffice.org.patch + +* Sat Oct 27 2007 Caolan McNamara - 3.8-2 +- add icu.icu6008.arm.padding.patch to fix an arm problem + +* Tue Oct 02 2007 Caolan McNamara - 3.8-1 +- latest version + +* Mon Sep 03 2007 Caolan McNamara - 3.8-0.2.d02 +- next release candidate + +* Wed Aug 29 2007 Caolan McNamara - 3.8-0.2.d01 +- rebuild + +* Tue Aug 07 2007 Caolan McNamara - 3.8-0.1.d01 +- 3.8 release candidate +- drop integrated icu.icu5433.oriya.patch +- drop integrated icu.icu5488.assamese.patch +- drop integrated icu.icu5500.devicetablecrash.patch +- drop integrated icu.icu5501.sinhala.biggerexpand.patch +- drop integrated icu.icu5594.gujarati.patch +- drop integrated icu.icu5465.telegu.patch + +* Wed Jun 13 2007 Caolan McNamara - 3.6-20 +- Resolves: rhbz#243984 change the icu group as it is libicu + which is "System Environment/Libraries" not icu + +* Mon Apr 30 2007 Caolan McNamara - 3.6-19 +- Resolves: rhbz#220867 Malayalam rendering + +* Tue Feb 13 2007 Caolan McNamara - 3.6-18 +- Resolves: rhbz#228457 icu.icu5594.gujarati.patch + +* Mon Feb 09 2007 Caolan McNamara - 3.6-17 +- spec cleanups + +* Mon Feb 05 2007 Caolan McNamara - 3.6-16 +- Resolves: rhbz#226949 layout telegu like pango + +* Fri Jan 19 2007 Caolan McNamara - 3.6-15 +- Resolves: rhbz#214948 icu.icu5506.multiplevowels.patch + +* Thu Jan 09 2007 Caolan McNamara - 3.6-14 +- Related: rhbz#216089 add icu.icu5557.safety.patch + +* Thu Dec 21 2006 Caolan McNamara - 3.6-13 +- Resolves: rhbz#220433 modify icu.icu5431.malayam.patch + +* Fri Nov 10 2006 Caolan McNamara - 3.6-12 +- Resolves: rhbz#214948 icu.icu5506.multiplevowels.patch + +* Wed Nov 08 2006 Caolan McNamara - 3.6-11 +- Resolves: rhbz#214555 icu.icu5501.sinhala.biggerexpand.patch + +* Wed Nov 08 2006 Caolan McNamara - 3.6-10 +- Resolves: rhbz#214555 icu.icu5500.devicetablecrash.patch + +* Thu Oct 18 2006 Caolan McNamara - 3.6-9 +- Resolves: rhbz#213648 extend prev/next to handle ZWJ + +* Tue Oct 18 2006 Caolan McNamara - 3.6-8 +- Resolves: rhbz213375 (icu.icu5488.assamese.patch) + +* Tue Oct 18 2006 Caolan McNamara - 3.6-7 +- Resolves: rhbz#211258 (icu.icu5465.telegu.patch) + +* Thu Oct 05 2006 Caolan McNamara - 3.6-6 +- rh#209391# add icu.icuXXXX.virama.prevnext.patch + +* Mon Oct 02 2006 Caolan McNamara - 3.6-5 +- rh#208705# add pkg-config Require for -devel package +- add icu.icu5431.malayam.patch for rh#208551#/rh#209084# +- add icu.icu5433.oriya.patch for rh#208559#/rh#209083# + +* Sun Oct 01 2006 Jesse Keating - 3.6-4 +- rebuilt for unwind info generation, broken in gcc-4.1.1-21 + +* Mon Sep 25 2006 Caolan McNamara - 3.6-3 +- rh#206615# render malayam like pango + +* Wed Sep 06 2006 Caolan McNamara - 3.6-2 +- fix rh#205252#/icu#5365 (gnome#121882#/#icu#4026#) to make icu + like pango for multiple dependant vowels + +* Mon Sep 03 2006 Caolan McNamara - 3.6-1 +- final release + +* Mon Aug 14 2006 Caolan McNamara - 3.6-0.1.d02 +- bump + +* Tue Aug 08 2006 Caolan McNamara - 3.6-0.2.d01 +- c++ code not alias correct + +* Mon Jul 31 2006 Caolan McNamara - 3.6-0.1.d01 +- rh#200728# update to prelease 3.6d01 to pick up on sinhala fixes +- drop integrated rh190879.patch +- drop integrated icu-3.4-sinhala1.patch + +* Wed Jul 12 2006 Jesse Keating - 3.4-10.1.1 +- rebuild + +* Wed Jul 12 2006 Jesse Keating - 3.4-10.1 +- rebuild + +* Sat Jun 10 2006 Caolan McNamara - 3.4-10 +- rh#194686# BuildRequires + +* Tue May 09 2006 Caolan McNamara - 3.4-9 +- rh#190879# backport fix + +* Wed May 03 2006 Caolan McNamara - 3.4-8 +- add Harshula's icu-3.4-sinhala1.patch for some Sinhala support + +* Tue May 02 2006 Caolan McNamara - 3.4-7 +- add a pkgconfig.pc, make icu-config use it + +* Fri Feb 10 2006 Jesse Keating - 3.4-6.2 +- bump again for double-long bug on ppc(64) + +* Tue Feb 07 2006 Jesse Keating - 3.4-6.1 +- rebuilt for new gcc4.1 snapshot and glibc changes + +* Tue Jan 03 2006 Caolan McNamara - 3.4-6 +- add icu-gcc41.patch + +* Tue Oct 11 2005 Caolan McNamara - 3.4-5 +- clear execstack requirement for libicudata + +* Mon Sep 12 2005 Caolan McNamara - 3.4-4 +- import extra icu.spec into fedora core for openoffice.org +- build with gcc 4 + +* Wed Aug 31 2005 Thorsten Leemhuis - 3.4-3 +- Use dist +- gcc32 does not understand -fstack-protector and + --param=ssp-buffer-size=4 + +* Tue Aug 2 2005 Ville Skyttä - 3.4-2 +- 3.4. + +* Sun Jul 31 2005 Ville Skyttä - 3.4-0.2.d02 +- 3.4-d02. +- Don't ship static libraries. + +* Wed Apr 27 2005 Ville Skyttä - 3.2-3 +- Apply upstream case mapping mutex lock removal patch. +- Build with gcc 3.2 as a temporary workaround for #152495. + +* Fri Apr 7 2005 Michael Schwendt - 3.2-2 +- rebuilt + +* Sat Jan 1 2005 Ville Skyttä - 3.2-1 +- Don't use %%{_smp_mflags} (b.f.u #2357). +- Remove unnecessary Epochs. + +* Sat Dec 4 2004 Ville Skyttä - 0:3.2-0.fdr.1 +- Update to 3.2. + +* Sun Jul 18 2004 Ville Skyttä - 0:3.0-0.fdr.1 +- Update to 3.0, datadirs patch no longer needed. +- Package data in shared libs, drop -locales subpackage. +- Rename -docs subpackage to libicu-doc, and generate graphs with graphviz. + +* Sat Dec 13 2003 Ville Skyttä - 0:2.6.1-0.fdr.3 +- Partial fix for bad datadirs returned by icu-config (works as long as + data packaging mode is not "common" or "dll"). + +* Sun Nov 23 2003 Ville Skyttä - 0:2.6.1-0.fdr.2 +- First complete version. + +* Sun Sep 28 2003 Ville Skyttä - 0:2.6.1-0.fdr.1 +- Update to 2.6.1. + +* Wed Aug 27 2003 Ville Skyttä - 0:2.6-0.fdr.1 +- First build, based on upstream and SuSE 8.2 packages. diff --git a/gstreamer1-plugins-ugly/gstreamer1-plugins-ugly.spec b/gstreamer1-plugins-ugly/gstreamer1-plugins-ugly.spec new file mode 100644 index 0000000..43eb1e7 --- /dev/null +++ b/gstreamer1-plugins-ugly/gstreamer1-plugins-ugly.spec @@ -0,0 +1,322 @@ +%global src_name gst-plugins-ugly + +Summary: GStreamer 1.0 streaming media framework "ugly" plug-ins +Name: gstreamer1-plugins-ugly +Version: 1.18.4 +Release: 1%{?dist} +License: LGPLv2+ +URL: https://gstreamer.freedesktop.org/ +Source0: %{url}/src/%{src_name}/%{src_name}-%{version}.tar.xz + +BuildRequires: gcc +BuildRequires: gstreamer1-devel >= %{version} +BuildRequires: gstreamer1-plugins-base-devel >= %{version} +BuildRequires: libid3tag-devel >= 0.15.0 +BuildRequires: meson +BuildRequires: opencore-amr-devel +BuildRequires: orc-devel >= 0.4.5 +BuildRequires: x264-devel >= 0.0.0-0.28 + +# Provides locale files +# relax dep to >= to make fedora/rpmfusion upgrades easier +Requires: %{name}-free%{?_isa} >= %{version} + +# Subpkg is empty, so no point -- rex +Obsoletes: %{name}-devel-docs < 1.13 + +%description +GStreamer is a streaming media framework, based on graphs of elements which +operate on media data. + +This package contains well-written plug-ins that can't be shipped in +gstreamer-plugins-good because: +- the license is not LGPL +- the license of the library is not LGPL +- there are possible licensing issues with the code. + +%prep +%autosetup -p1 -n %{src_name}-%{version} + + +%build +%meson \ + -D package-name='gst-plugins-ugly 1.0 rpmfusion rpm' \ + -D package-origin='http://rpmfusion.org/' \ + -D doc=disabled \ + -D cdio=disabled \ + -D dvdread=disabled \ + -D a52dec=disabled \ + -D sidplay=disabled \ + -D xingmux=disabled \ + -D mpeg2dec=disabled \ + -D nls=disabled + +%meson_build + +%install +%meson_install + +%files +%doc AUTHORS README REQUIREMENTS +%license COPYING +%{_datadir}/gstreamer-1.0 +# Plugins without external dependencies +%{_libdir}/gstreamer-1.0/libgstasf.so +%{_libdir}/gstreamer-1.0/libgstdvdlpcmdec.so +%{_libdir}/gstreamer-1.0/libgstdvdsub.so +%{_libdir}/gstreamer-1.0/libgstrealmedia.so +# Plugins with external dependencies +%{_libdir}/gstreamer-1.0/libgstamrnb.so +%{_libdir}/gstreamer-1.0/libgstamrwbdec.so +%{_libdir}/gstreamer-1.0/libgstx264.so + + +%changelog +* Wed Mar 17 2021 Leigh Scott - 1.18.4-1 +- 1.18.4 + +* Wed Feb 03 2021 RPM Fusion Release Engineering - 1.18.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Sun Dec 13 2020 Leigh Scott - 1.18.2-1 +- 1.18.2 + +* Fri Nov 27 2020 Sérgio Basto - 1.18.1-2 +- Mass rebuild for x264-0.161 + +* Sun Nov 1 2020 Leigh Scott - 1.18.1-1 +- 1.18.1 + +* Wed Sep 9 2020 Leigh Scott - 1.18.0-1 +- 1.18.0 + +* Sun Aug 23 2020 Leigh Scott - 1.17.90-1 +- 1.17.90 + +* Tue Aug 18 2020 RPM Fusion Release Engineering - 1.17.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Wed Jul 08 2020 Leigh Scott - 1.17.2-1 +- 1.17.2 + +* Tue Jul 07 2020 Sérgio Basto - 1.17.1-2 +- Mass rebuild for x264 + +* Mon Jun 22 2020 Leigh Scott - 1.17.1-1 +- 1.17.1 + +* Thu Mar 12 2020 Leigh Scott - 1.16.2-3 +- Rebuilt for i686 + +* Tue Feb 04 2020 RPM Fusion Release Engineering - 1.16.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Sat Feb 01 2020 Leigh Scott - 1.16.2-1 +- 1.16.2 + +* Tue Dec 17 2019 Leigh Scott - 1.16.1-2 +- Mass rebuild for x264 + +* Wed Sep 25 2019 Leigh Scott - 1.16.1-1 +- 1.16.1 + +* Fri Aug 09 2019 RPM Fusion Release Engineering - 1.16.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Thu May 16 2019 Leigh Scott - 1.16.0-2 +- Disable mpeg2dec, it's been moved to the fedora package + +* Wed Apr 24 2019 Leigh Scott - 1.16.0-1 +- 1.16.0 + +* Mon Mar 18 2019 Sérgio Basto - 1.15.2-1 +- Update to 1.15.2 + +* Tue Mar 12 2019 Sérgio Basto - 1.15.1-3 +- Mass rebuild for x264 + +* Mon Mar 04 2019 RPM Fusion Release Engineering - 1.15.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Sat Feb 09 2019 Leigh Scott - 1.15.1-1 +- 1.15.1 +- clean spec + +* Wed Nov 07 2018 Rex Dieter - 1.14.4-2 +- rebuild for x264 (rf#5071) + +* Tue Oct 09 2018 Rex Dieter - 1.14.4-1 +- 1.14.4 + +* Thu Oct 04 2018 Sérgio Basto - 1.14.3-2 +- Mass rebuild for x264 and/or x265 + +* Tue Sep 18 2018 Leigh Scott - 1.14.3-1 +- 1.14.3 + +* Sat Aug 18 2018 Rex Dieter - 1.14.2-1 +- 1.14.2 + +* Thu Jul 26 2018 RPM Fusion Release Engineering - 1.14.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Thu May 31 2018 Rex Dieter - 1.14.1-2 +- BR: s/mpeg2dec-devel/libmpeg2-devel/ + +* Thu May 31 2018 Rex Dieter - 1.14.1-1 +- 1.14.1 + +* Fri Mar 23 2018 Rex Dieter - 1.14.0-1 +- 1.14.0 + +* Wed Feb 28 2018 Rex Dieter - 1.13.1-1 +- 1.13.1 + +* Wed Jan 17 2018 Leigh Scott - 1.12.4-3 +- remove twolame (rfbz#4766) + +* Sat Dec 30 2017 Sérgio Basto - 1.12.4-2 +- Mass rebuild for x264 and x265 + +* Mon Dec 11 2017 Leigh Scott - 1.12.4-1 +- Update to 1.12.4 + +* Thu Sep 21 2017 Leigh Scott - 1.12.3-1 +- Update to 1.12.3 + +* Thu Aug 31 2017 RPM Fusion Release Engineering - 1.12.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Tue Jul 18 2017 Leigh Scott - 1.12.2-1 +- Update to 1.12.2 + +* Sun Jul 09 2017 Leigh Scott - 1.12.1-3 +- A better fix, add requires gstreamer1-plugins-ugly-free-devel (rfbz #4589) + +* Sun Jul 09 2017 Leigh Scott - 1.12.1-2 +- Remove conflicting file in devel-docs (rfbz #4589) + +* Fri Jun 23 2017 Leigh Scott - 1.12.1-1 +- Update to 1.12.1 + +* Fri May 12 2017 Leigh Scott - 1.12.0-2 +- Remove lame plugin + +* Thu May 11 2017 Leigh Scott - 1.12.0-1 +- Update to 1.12.0 +- Add requires gstreamer1-plugins-ugly-free +- remove a52dec, cdio, dvdread and xingmux plugins, + moved to gstreamer1-plugins-ugly-free package. +- Remove locale files + +* Tue Apr 18 2017 Leigh Scott - 1.11.90-1 +- Update to 1.11.90 +- Upstream renamed libgstrmdemux.so to libgstrealmedia.so + +* Sun Mar 19 2017 RPM Fusion Release Engineering - 1.11.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Mon Feb 27 2017 Leigh Scott - 1.11.2-1 +- Update to 1.11.2 +- Add upstream gcc-7 commit + +* Mon Jan 16 2017 Leigh Scott - 1.11.1-1 +- Update to 1.11.1 +- Remove libmad bits as mad is no longer included in the source + +* Wed Nov 30 2016 leigh scott - 1.10.2-1 +- Update to 1.10.2 + +* Fri Nov 18 2016 Adrian Reber - 1.10.0-3 +- Rebuilt for libcdio-0.94 + +* Sun Nov 13 2016 Hans de Goede - 1.10.0-2 +- Drop mpg123 plugin, it is in Fedora proper now + +* Fri Nov 11 2016 Hans de Goede - 1.10.0-1 +- Rebase to new upstream release 1.10.0 + +* Sun Jun 12 2016 Hans de Goede - 1.8.2-1 +- Rebase to new upstream release 1.8.2 + +* Wed May 18 2016 Hans de Goede - 1.8.1-1 +- Rebase to new upstream release 1.8.1 + +* Sat Jan 23 2016 Hans de Goede - 1.6.3-1 +- Rebase to new upstream release 1.6.3 + +* Thu Dec 24 2015 Hans de Goede - 1.6.2-1 +- Rebase to new upstream release 1.6.2 + +* Sat Oct 31 2015 Hans de Goede - 1.6.1-1 +- Rebase to new upstream release 1.6.1 + +* Sat May 16 2015 Hans de Goede - 1.4.5-1 +- Rebase to new upstream release 1.4.5 + +* Wed Oct 1 2014 Hans de Goede - 1.4.3-1 +- Rebase to new upstream release 1.4.3 + +* Fri Aug 29 2014 Hans de Goede - 1.4.1-1 +- Rebase to new upstream release 1.4.1 (rf#3343) + +* Sun Jun 15 2014 Hans de Goede - 1.2.4-1 +- Rebase to new upstream release 1.2.4 + +* Sat Mar 22 2014 Sérgio Basto - 1.2.3-3 +- Rebuilt for x264 + +* Thu Mar 06 2014 Nicolas Chauvet - 1.2.3-2 +- Rebuilt for x264 + +* Sun Feb 23 2014 Hans de Goede - 1.2.3-1 +- Rebase to new upstream release 1.2.3 + +* Fri Feb 21 2014 Nicolas Chauvet - 1.2.1-2 +- Rebuilt + +* Sat Nov 16 2013 Hans de Goede - 1.2.1-1 +- Rebase to new upstream release 1.2.1 + +* Tue Nov 05 2013 Nicolas Chauvet - 1.2.0-3 +- Rebuilt for x264/FFmpeg + +* Tue Oct 22 2013 Nicolas Chauvet - 1.2.0-2 +- Rebuilt for x264 + +* Sun Oct 13 2013 Hans de Goede - 1.2.0-1 +- Rebase to new upstream release 1.2.0 + +* Thu Aug 08 2013 Hans de Goede - 1.1.3-1 +- Rebase to new upstream release 1.1.3 + +* Wed Aug 07 2013 Hans de Goede - 1.0.9-1 +- New upstream release 1.0.9 + +* Tue May 07 2013 Nicolas Chauvet - 1.0.6-2 +- Rebuilt for x264 + +* Mon Mar 25 2013 Hans de Goede - 1.0.6-1 +- New upstream release 1.0.6 + +* Sat Mar 2 2013 Hans de Goede - 1.0.5-1 +- New upstream release 1.0.5 +- Drop no longer needed PyXML BuildRequires (rf#2572) + +* Sun Jan 20 2013 Nicolas Chauvet - 1.0.2-3 +- Rebuilt for FFmpeg/x264 + +* Fri Nov 23 2012 Nicolas Chauvet - 1.0.2-2 +- Rebuilt for x264 + +* Sun Oct 28 2012 Hans de Goede - 1.0.2-1 +- New upstream release 1.0.2 + +* Sun Sep 23 2012 Hans de Goede - 0.11.99-1 +- New upstream release 0.11.99 + +* Sun Sep 16 2012 Hans de Goede - 0.11.93-2 +- Fix gtk-doc dir ownership (rf#2474) + +* Sun Sep 9 2012 Hans de Goede - 0.11.93-1 +- First version of gstreamer1-plugins-ugly for rpmfusion diff --git a/mysql55/0001-Cloud-Linux-userstat.patch b/mysql55/0001-Cloud-Linux-userstat.patch new file mode 100644 index 0000000..da45156 --- /dev/null +++ b/mysql55/0001-Cloud-Linux-userstat.patch @@ -0,0 +1,3537 @@ +From 866d5ef180cf5af94a1da9ce725a737435fff685 Mon Sep 17 00:00:00 2001 +From: Kyle Lafkoff +Date: Wed, 26 Oct 2011 13:11:58 -0500 +Subject: [PATCH 1/6] Cloud Linux userstat + +Provided by Cloud Linux for MySQL 5.5.17. This patch was modified to +remove the portion for sql_parse.cc + +File=userstats.patch +Name=SHOW USER/TABLE/INDEX statistics +Version=V2 +Author=Google +License=GPL +Comment=Added INFORMATION_SCHEMA.*_STATISTICS +2008-12-01 +YK: fix behavior for prepared statements + +2008-11-26 +YK: add switch variable "userstat" to control INFORMATION_SCHEMA.*_STATISTICS (default:OFF) +2010-12-31 +Ported to 5.5.8 +2011-1-5 +Fix porting +2011-02 +Rename variable USERSTAT_RUNNING => USERSTAT +--- + SOURCES/mysql/include/mysql/plugin.h | 2 + + SOURCES/mysql/include/mysql_com.h | 7 + + .../mysql/mysql-test/r/userstat_bug602047.result | 15 + + SOURCES/mysql/mysql-test/t/userstat_bug602047.test | 11 + + SOURCES/mysql/sql/handler.cc | 128 +++++ + SOURCES/mysql/sql/handler.h | 22 +- + SOURCES/mysql/sql/lex.h | 5 + + SOURCES/mysql/sql/log.cc | 29 +- + SOURCES/mysql/sql/log.h | 4 +- + SOURCES/mysql/sql/mysqld.cc | 43 +- + SOURCES/mysql/sql/mysqld.h | 24 +- + SOURCES/mysql/sql/sql_base.cc | 7 + + SOURCES/mysql/sql/sql_class.cc | 126 +++++ + SOURCES/mysql/sql/sql_class.h | 65 +++ + SOURCES/mysql/sql/sql_connect.cc | 613 +++++++++++++++++++++ + SOURCES/mysql/sql/sql_delete.cc | 2 + + SOURCES/mysql/sql/sql_insert.cc | 12 +- + SOURCES/mysql/sql/sql_lex.h | 3 + + SOURCES/mysql/sql/sql_parse.cc | 97 ++++ + SOURCES/mysql/sql/sql_prepare.cc | 307 ++++++++++- + SOURCES/mysql/sql/sql_reload.cc | 36 +- + SOURCES/mysql/sql/sql_show.cc | 424 ++++++++++++++ + SOURCES/mysql/sql/sql_update.cc | 12 +- + SOURCES/mysql/sql/sql_yacc.yy | 54 ++ + SOURCES/mysql/sql/structs.h | 166 ++++++ + SOURCES/mysql/sql/sys_vars.cc | 11 + + SOURCES/mysql/storage/myisam/ha_myisam.cc | 85 ++- + 27 files changed, 2283 insertions(+), 27 deletions(-) + create mode 100644 SOURCES/mysql/mysql-test/r/userstat_bug602047.result + create mode 100644 SOURCES/mysql/mysql-test/t/userstat_bug602047.test + +diff --git a/SOURCES/mysql/include/mysql/plugin.h b/SOURCES/mysql/include/mysql/plugin.h +index 0dced1b..41773de 100644 +--- a/SOURCES/mysql/include/mysql/plugin.h ++++ b/SOURCES/mysql/include/mysql/plugin.h +@@ -16,6 +16,8 @@ + #ifndef _my_plugin_h + #define _my_plugin_h + ++#define EXTENDED_FOR_USERSTAT ++ + /* + On Windows, exports from DLL need to be declared + Also, plugin needs to be declared as extern "C" because MSVC +diff --git a/SOURCES/mysql/include/mysql_com.h b/SOURCES/mysql/include/mysql_com.h +index f2345be..21e3427 100644 +--- a/SOURCES/mysql/include/mysql_com.h ++++ b/SOURCES/mysql/include/mysql_com.h +@@ -31,6 +31,7 @@ + + #define SERVER_VERSION_LENGTH 60 + #define SQLSTATE_LENGTH 5 ++#define LIST_PROCESS_HOST_LEN 64 + + /* + Maximum length of comments +@@ -146,6 +147,12 @@ enum enum_server_command + #define REFRESH_DES_KEY_FILE 0x40000L + #define REFRESH_USER_RESOURCES 0x80000L + ++#define REFRESH_TABLE_STATS 0x200000L /* Refresh table stats my_hash table */ ++#define REFRESH_INDEX_STATS 0x400000L /* Refresh index stats my_hash table */ ++#define REFRESH_USER_STATS 0x800000L /* Refresh user stats my_hash table */ ++#define REFRESH_CLIENT_STATS 0x1000000L /* Refresh client stats my_hash table */ ++#define REFRESH_THREAD_STATS 0x2000000L /* Refresh thread stats my_hash table */ ++ + #define CLIENT_LONG_PASSWORD 1 /* new more secure passwords */ + #define CLIENT_FOUND_ROWS 2 /* Found instead of affected rows */ + #define CLIENT_LONG_FLAG 4 /* Get all column flags */ +diff --git a/SOURCES/mysql/mysql-test/r/userstat_bug602047.result b/SOURCES/mysql/mysql-test/r/userstat_bug602047.result +new file mode 100644 +index 0000000..966439b +--- /dev/null ++++ b/SOURCES/mysql/mysql-test/r/userstat_bug602047.result +@@ -0,0 +1,15 @@ ++DROP TABLE IF EXISTS t1; ++SET GLOBAL userstat=ON; ++CREATE TABLE t1 ( id int(10), PRIMARY KEY (id)) ENGINE=InnoDB; ++INSERT INTO t1 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); ++SELECT COUNT(*) FROM t1; ++COUNT(*) ++10 ++SELECT ROWS_READ FROM information_schema.table_statistics WHERE TABLE_NAME='t1'; ++ROWS_READ ++10 ++SELECT ROWS_READ FROM information_schema.index_statistics WHERE TABLE_NAME='t1'; ++ROWS_READ ++10 ++SET GLOBAL userstat=OFF; ++DROP TABLE t1; +diff --git a/SOURCES/mysql/mysql-test/t/userstat_bug602047.test b/SOURCES/mysql/mysql-test/t/userstat_bug602047.test +new file mode 100644 +index 0000000..436b864 +--- /dev/null ++++ b/SOURCES/mysql/mysql-test/t/userstat_bug602047.test +@@ -0,0 +1,11 @@ ++--disable_warnings ++DROP TABLE IF EXISTS t1; ++--enable_warnings ++SET GLOBAL userstat=ON; ++CREATE TABLE t1 ( id int(10), PRIMARY KEY (id)) ENGINE=InnoDB; ++INSERT INTO t1 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); ++SELECT COUNT(*) FROM t1; ++SELECT ROWS_READ FROM information_schema.table_statistics WHERE TABLE_NAME='t1'; ++SELECT ROWS_READ FROM information_schema.index_statistics WHERE TABLE_NAME='t1'; ++SET GLOBAL userstat=OFF; ++DROP TABLE t1; +\ No newline at end of file +diff --git a/SOURCES/mysql/sql/handler.cc b/SOURCES/mysql/sql/handler.cc +index c3ad1ca..9a38e85 100644 +--- a/SOURCES/mysql/sql/handler.cc ++++ b/SOURCES/mysql/sql/handler.cc +@@ -1333,6 +1333,8 @@ int ha_commit_trans(THD *thd, bool all) + goto end; + } + DBUG_EXECUTE_IF("crash_commit_after", DBUG_SUICIDE();); ++ if (is_real_trans) ++ thd->diff_commit_trans++; + RUN_HOOK(transaction, after_commit, (thd, FALSE)); + end: + if (rw_trans && mdl_request.ticket) +@@ -1493,6 +1495,8 @@ int ha_rollback_trans(THD *thd, bool all) + /* Always cleanup. Even if nht==0. There may be savepoints. */ + if (is_real_trans) + thd->transaction.cleanup(); ++ ++ thd->diff_rollback_trans++; + if (all) + thd->transaction_rollback_request= FALSE; + +@@ -1897,6 +1901,7 @@ int ha_rollback_to_savepoint(THD *thd, SAVEPOINT *sv) + ha_info->reset(); /* keep it conveniently zero-filled */ + } + trans->ha_list= sv->ha_list; ++ thd->diff_rollback_trans++; + DBUG_RETURN(error); + } + +@@ -2273,6 +2278,8 @@ int handler::ha_open(TABLE *table_arg, const char *name, int mode, + dup_ref=ref+ALIGN_SIZE(ref_length); + cached_table_flags= table_flags(); + } ++ rows_read= rows_changed= 0; ++ memset(index_rows_read, 0, sizeof(index_rows_read)); + DBUG_RETURN(error); + } + +@@ -3784,6 +3791,127 @@ void handler::get_dynamic_partition_info(PARTITION_STATS *stat_info, + return; + } + ++// Updates the global table stats with the TABLE this handler represents. ++void handler::update_global_table_stats() ++{ ++ if (!opt_userstat) ++ { ++ rows_read= rows_changed= 0; ++ return; ++ } ++ ++ if (!rows_read && !rows_changed) ++ return; // Nothing to update. ++ // table_cache_key is db_name + '\0' + table_name + '\0'. ++ if (!table->s || !table->s->table_cache_key.str || !table->s->table_name.str) ++ return; ++ ++ TABLE_STATS* table_stats; ++ char key[NAME_LEN * 2 + 2]; ++ // [db] + '.' + [table] ++ sprintf(key, "%s.%s", table->s->table_cache_key.str, table->s->table_name.str); ++ ++ mysql_mutex_lock(&LOCK_global_table_stats); ++ // Gets the global table stats, creating one if necessary. ++ if (!(table_stats = (TABLE_STATS *) my_hash_search(&global_table_stats, ++ (uchar*)key, ++ strlen(key)))) ++ { ++ if (!(table_stats = ((TABLE_STATS *) ++ my_malloc(sizeof(TABLE_STATS), MYF(MY_WME | MY_ZEROFILL))))) ++ { ++ // Out of memory. ++ sql_print_error("Allocating table stats failed."); ++ goto end; ++ } ++ strncpy(table_stats->table, key, sizeof(table_stats->table)); ++ table_stats->rows_read= 0; ++ table_stats->rows_changed= 0; ++ table_stats->rows_changed_x_indexes= 0; ++ table_stats->engine_type= (int) ht->db_type; ++ ++ if (my_hash_insert(&global_table_stats, (uchar *) table_stats)) ++ { ++ // Out of memory. ++ sql_print_error("Inserting table stats failed."); ++ my_free((char *) table_stats); ++ goto end; ++ } ++ } ++ // Updates the global table stats. ++ table_stats->rows_read+= rows_read; ++ table_stats->rows_changed+= rows_changed; ++ table_stats->rows_changed_x_indexes+= ++ rows_changed * (table->s->keys ? table->s->keys : 1); ++ current_thd->diff_total_read_rows+= rows_read; ++ rows_read= rows_changed= 0; ++end: ++ mysql_mutex_unlock(&LOCK_global_table_stats); ++} ++ ++// Updates the global index stats with this handler's accumulated index reads. ++void handler::update_global_index_stats() ++{ ++ // table_cache_key is db_name + '\0' + table_name + '\0'. ++ if (!table->s || !table->s->table_cache_key.str || !table->s->table_name.str) ++ return; ++ ++ if (!opt_userstat) ++ { ++ for (uint x= 0; x < table->s->keys; ++x) ++ { ++ index_rows_read[x]= 0; ++ } ++ return; ++ } ++ ++ for (uint x = 0; x < table->s->keys; ++x) ++ { ++ if (index_rows_read[x]) ++ { ++ // Rows were read using this index. ++ KEY* key_info = &table->key_info[x]; ++ ++ if (!key_info->name) continue; ++ ++ INDEX_STATS* index_stats; ++ char key[NAME_LEN * 3 + 3]; ++ // [db] + '.' + [table] + '.' + [index] ++ sprintf(key, "%s.%s.%s", table->s->table_cache_key.str, ++ table->s->table_name.str, key_info->name); ++ ++ mysql_mutex_lock(&LOCK_global_index_stats); ++ // Gets the global index stats, creating one if necessary. ++ if (!(index_stats = (INDEX_STATS *) my_hash_search(&global_index_stats, ++ (uchar *) key, ++ strlen(key)))) ++ { ++ if (!(index_stats = ((INDEX_STATS *) ++ my_malloc(sizeof(INDEX_STATS), MYF(MY_WME | MY_ZEROFILL))))) ++ { ++ // Out of memory. ++ sql_print_error("Allocating index stats failed."); ++ goto end; ++ } ++ strncpy(index_stats->index, key, sizeof(index_stats->index)); ++ index_stats->rows_read= 0; ++ ++ if (my_hash_insert(&global_index_stats, (uchar *) index_stats)) ++ { ++ // Out of memory. ++ sql_print_error("Inserting index stats failed."); ++ my_free((char *) index_stats); ++ goto end; ++ } ++ } ++ // Updates the global index stats. ++ index_stats->rows_read+= index_rows_read[x]; ++ index_rows_read[x]= 0; ++ end: ++ mysql_mutex_unlock(&LOCK_global_index_stats); ++ } ++ } ++} + + /**************************************************************************** + ** Some general functions that isn't in the handler class +diff --git a/SOURCES/mysql/sql/handler.h b/SOURCES/mysql/sql/handler.h +index 5eb2d6b..18da7c5 100644 +--- a/SOURCES/mysql/sql/handler.h ++++ b/SOURCES/mysql/sql/handler.h +@@ -36,6 +36,10 @@ + #include + #include + ++#if MAX_KEY > 128 ++#error MAX_KEY is too large. Values up to 128 are supported. ++#endif ++ + // the following is for checking tables + + #define HA_ADMIN_ALREADY_DONE 1 +@@ -579,10 +583,12 @@ struct TABLE; + enum enum_schema_tables + { + SCH_CHARSETS= 0, ++ SCH_CLIENT_STATS, + SCH_COLLATIONS, + SCH_COLLATION_CHARACTER_SET_APPLICABILITY, + SCH_COLUMNS, + SCH_COLUMN_PRIVILEGES, ++ SCH_INDEX_STATS, + SCH_ENGINES, + SCH_EVENTS, + SCH_FILES, +@@ -608,8 +614,11 @@ enum enum_schema_tables + SCH_TABLE_CONSTRAINTS, + SCH_TABLE_NAMES, + SCH_TABLE_PRIVILEGES, ++ SCH_TABLE_STATS, ++ SCH_THREAD_STATS, + SCH_TRIGGERS, + SCH_USER_PRIVILEGES, ++ SCH_USER_STATS, + SCH_VARIABLES, + SCH_VIEWS + }; +@@ -1280,6 +1289,9 @@ public: + bool locked; + bool implicit_emptied; /* Can be !=0 only if HEAP */ + const COND *pushed_cond; ++ ulonglong rows_read; ++ ulonglong rows_changed; ++ ulonglong index_rows_read[MAX_KEY]; + /** + next_insert_id is the next value which should be inserted into the + auto_increment column: in a inserting-multi-row statement (like INSERT +@@ -1331,10 +1343,12 @@ public: + ref_length(sizeof(my_off_t)), + ft_handler(0), inited(NONE), + locked(FALSE), implicit_emptied(0), +- pushed_cond(0), next_insert_id(0), insert_id_for_cur_row(0), ++ pushed_cond(0), rows_read(0), rows_changed(0), next_insert_id(0), insert_id_for_cur_row(0), + auto_inc_intervals_count(0), + m_psi(NULL) +- {} ++ { ++ memset(index_rows_read, 0, sizeof(index_rows_read)); ++ } + virtual ~handler(void) + { + DBUG_ASSERT(locked == FALSE); +@@ -1459,6 +1473,8 @@ public: + { + table= table_arg; + table_share= share; ++ rows_read = rows_changed= 0; ++ memset(index_rows_read, 0, sizeof(index_rows_read)); + } + virtual double scan_time() + { return ulonglong2double(stats.data_file_length) / IO_SIZE + 2; } +@@ -1854,6 +1870,8 @@ public: + virtual bool is_crashed() const { return 0; } + virtual bool auto_repair() const { return 0; } + ++ void update_global_table_stats(); ++ void update_global_index_stats(); + + #define CHF_CREATE_FLAG 0 + #define CHF_DELETE_FLAG 1 +diff --git a/SOURCES/mysql/sql/lex.h b/SOURCES/mysql/sql/lex.h +index 4a49858..9e90725 100644 +--- a/SOURCES/mysql/sql/lex.h ++++ b/SOURCES/mysql/sql/lex.h +@@ -111,6 +111,7 @@ static SYMBOL symbols[] = { + { "CIPHER", SYM(CIPHER_SYM)}, + { "CLASS_ORIGIN", SYM(CLASS_ORIGIN_SYM)}, + { "CLIENT", SYM(CLIENT_SYM)}, ++ { "CLIENT_STATISTICS", SYM(CLIENT_STATS_SYM)}, + { "CLOSE", SYM(CLOSE_SYM)}, + { "COALESCE", SYM(COALESCE)}, + { "CODE", SYM(CODE_SYM)}, +@@ -257,6 +258,7 @@ static SYMBOL symbols[] = { + { "IN", SYM(IN_SYM)}, + { "INDEX", SYM(INDEX_SYM)}, + { "INDEXES", SYM(INDEXES)}, ++ { "INDEX_STATISTICS", SYM(INDEX_STATS_SYM)}, + { "INFILE", SYM(INFILE)}, + { "INITIAL_SIZE", SYM(INITIAL_SIZE_SYM)}, + { "INNER", SYM(INNER_SYM)}, +@@ -547,12 +549,14 @@ static SYMBOL symbols[] = { + { "TABLES", SYM(TABLES)}, + { "TABLESPACE", SYM(TABLESPACE)}, + { "TABLE_CHECKSUM", SYM(TABLE_CHECKSUM_SYM)}, ++ { "TABLE_STATISTICS", SYM(TABLE_STATS_SYM)}, + { "TEMPORARY", SYM(TEMPORARY)}, + { "TEMPTABLE", SYM(TEMPTABLE_SYM)}, + { "TERMINATED", SYM(TERMINATED)}, + { "TEXT", SYM(TEXT_SYM)}, + { "THAN", SYM(THAN_SYM)}, + { "THEN", SYM(THEN_SYM)}, ++ { "THREAD_STATISTICS", SYM(THREAD_STATS_SYM)}, + { "TIME", SYM(TIME_SYM)}, + { "TIMESTAMP", SYM(TIMESTAMP)}, + { "TIMESTAMPADD", SYM(TIMESTAMP_ADD)}, +@@ -588,6 +592,7 @@ static SYMBOL symbols[] = { + { "USE", SYM(USE_SYM)}, + { "USER", SYM(USER)}, + { "USER_RESOURCES", SYM(RESOURCES)}, ++ { "USER_STATISTICS", SYM(USER_STATS_SYM)}, + { "USE_FRM", SYM(USE_FRM)}, + { "USING", SYM(USING)}, + { "UTC_DATE", SYM(UTC_DATE_SYM)}, +diff --git a/SOURCES/mysql/sql/log.cc b/SOURCES/mysql/sql/log.cc +index 83ba7b0..96aee56 100644 +--- a/SOURCES/mysql/sql/log.cc ++++ b/SOURCES/mysql/sql/log.cc +@@ -1006,6 +1006,13 @@ void Log_to_file_event_handler::flush() + mysql_slow_log.reopen_file(); + } + ++void Log_to_file_event_handler::flush_slow_log() ++{ ++ /* reopen slow log file */ ++ if (opt_slow_log) ++ mysql_slow_log.reopen_file(); ++} ++ + /* + Log error with all enabled log event handlers + +@@ -5001,6 +5008,8 @@ bool MYSQL_BIN_LOG::write(Log_event *event_info) + thd->first_successful_insert_id_in_prev_stmt_for_binlog); + if (e.write(file)) + goto err; ++ if (file == &log_file) ++ thd->binlog_bytes_written+= e.data_written; + } + if (thd->auto_inc_intervals_in_cur_stmt_for_binlog.nb_elements() > 0) + { +@@ -5012,12 +5021,16 @@ bool MYSQL_BIN_LOG::write(Log_event *event_info) + minimum()); + if (e.write(file)) + goto err; ++ if (file == &log_file) ++ thd->binlog_bytes_written+= e.data_written; + } + if (thd->rand_used) + { + Rand_log_event e(thd,thd->rand_saved_seed1,thd->rand_saved_seed2); + if (e.write(file)) + goto err; ++ if (file == &log_file) ++ thd->binlog_bytes_written+= e.data_written; + } + if (thd->user_var_events.elements) + { +@@ -5040,6 +5053,8 @@ bool MYSQL_BIN_LOG::write(Log_event *event_info) + flags); + if (e.write(file)) + goto err; ++ if (file == &log_file) ++ thd->binlog_bytes_written+= e.data_written; + } + } + } +@@ -5051,6 +5066,8 @@ bool MYSQL_BIN_LOG::write(Log_event *event_info) + if (event_info->write(file) || + DBUG_EVALUATE_IF("injecting_fault_writing", 1, 0)) + goto err; ++ if (file == &log_file) ++ thd->binlog_bytes_written+= event_info->data_written; + + error= 0; + err: +@@ -5285,7 +5302,8 @@ uint MYSQL_BIN_LOG::next_file_id() + be reset as a READ_CACHE to be able to read the contents from it. + */ + +-int MYSQL_BIN_LOG::write_cache(IO_CACHE *cache, bool lock_log, bool sync_log) ++int MYSQL_BIN_LOG::write_cache(THD *thd, IO_CACHE *cache, ++ bool lock_log, bool sync_log) + { + Mutex_sentry sentry(lock_log ? &LOCK_log : NULL); + +@@ -5332,6 +5350,7 @@ int MYSQL_BIN_LOG::write_cache(IO_CACHE *cache, bool lock_log, bool sync_log) + /* write the first half of the split header */ + if (my_b_write(&log_file, header, carry)) + return ER_ERROR_ON_WRITE; ++ thd->binlog_bytes_written+= carry; + + /* + copy fixed second half of header to cache so the correct +@@ -5400,6 +5419,7 @@ int MYSQL_BIN_LOG::write_cache(IO_CACHE *cache, bool lock_log, bool sync_log) + /* Write data to the binary log file */ + if (my_b_write(&log_file, cache->read_pos, length)) + return ER_ERROR_ON_WRITE; ++ thd->binlog_bytes_written+= length; + cache->read_pos=cache->read_end; // Mark buffer used up + } while ((length= my_b_fill(cache))); + +@@ -5523,20 +5543,23 @@ bool MYSQL_BIN_LOG::write(THD *thd, IO_CACHE *cache, Log_event *commit_event, + Query_log_event qinfo(thd, STRING_WITH_LEN("BEGIN"), TRUE, FALSE, TRUE, 0); + if (qinfo.write(&log_file)) + goto err; ++ thd->binlog_bytes_written+= qinfo.data_written; + DBUG_EXECUTE_IF("crash_before_writing_xid", + { +- if ((write_error= write_cache(cache, false, true))) ++ if ((write_error= write_cache(thd, cache, false, true))) + DBUG_PRINT("info", ("error writing binlog cache: %d", + write_error)); + DBUG_PRINT("info", ("crashing before writing xid")); + DBUG_SUICIDE(); + }); + +- if ((write_error= write_cache(cache, false, false))) ++ if ((write_error= write_cache(thd, cache, false, false))) + goto err; + + if (commit_event && commit_event->write(&log_file)) + goto err; ++ if (commit_event) ++ thd->binlog_bytes_written+= commit_event->data_written; + + if (incident && write_incident(thd, FALSE)) + goto err; +diff --git a/SOURCES/mysql/sql/log.h b/SOURCES/mysql/sql/log.h +index 1fc13af..443985c 100644 +--- a/SOURCES/mysql/sql/log.h ++++ b/SOURCES/mysql/sql/log.h +@@ -442,7 +442,8 @@ public: + bool write(THD *thd, IO_CACHE *cache, Log_event *commit_event, bool incident); + bool write_incident(THD *thd, bool lock); + +- int write_cache(IO_CACHE *cache, bool lock_log, bool flush_and_sync); ++ int write_cache(THD *thd, IO_CACHE *cache, ++ bool lock_log, bool flush_and_sync); + void set_write_error(THD *thd, bool is_transactional); + bool check_write_error(THD *thd); + +@@ -596,6 +597,7 @@ public: + const char *sql_text, uint sql_text_len, + CHARSET_INFO *client_cs); + void flush(); ++ void flush_slow_log(); + void init_pthread_objects(); + MYSQL_QUERY_LOG *get_mysql_slow_log() { return &mysql_slow_log; } + MYSQL_QUERY_LOG *get_mysql_log() { return &mysql_log; } +diff --git a/SOURCES/mysql/sql/mysqld.cc b/SOURCES/mysql/sql/mysqld.cc +index 145e222..2bebb2a 100644 +--- a/SOURCES/mysql/sql/mysqld.cc ++++ b/SOURCES/mysql/sql/mysqld.cc +@@ -434,6 +434,7 @@ uint opt_large_page_size= 0; + MYSQL_PLUGIN_IMPORT uint opt_debug_sync_timeout= 0; + #endif /* defined(ENABLED_DEBUG_SYNC) */ + my_bool opt_old_style_user_limits= 0, trust_function_creators= 0; ++my_bool opt_userstat= 0, opt_thread_statistics= 0; + /* + True if there is at least one per-hour limit for some user, so we should + check them before each query (and possibly reset counters when hour is +@@ -485,6 +486,7 @@ ulong specialflag=0; + ulong binlog_cache_use= 0, binlog_cache_disk_use= 0; + ulong binlog_stmt_cache_use= 0, binlog_stmt_cache_disk_use= 0; + ulong max_connections, max_connect_errors; ++ulonglong denied_connections= 0; + /* + Maximum length of parameter value which can be set through + mysql_send_long_data() call. +@@ -648,7 +650,9 @@ mysql_mutex_t + LOCK_crypt, + LOCK_global_system_variables, + LOCK_user_conn, LOCK_slave_list, LOCK_active_mi, +- LOCK_connection_count, LOCK_error_messages; ++ LOCK_connection_count, LOCK_error_messages, ++ LOCK_stats, LOCK_global_user_client_stats, ++ LOCK_global_table_stats, LOCK_global_index_stats; + /** + The below lock protects access to two global server variables: + max_prepared_stmt_count and prepared_stmt_count. These variables +@@ -1506,6 +1510,11 @@ void clean_up(bool print_message) + my_free(opt_bin_logname); + bitmap_free(&temp_pool); + free_max_user_conn(); ++ free_global_user_stats(); ++ free_global_client_stats(); ++ free_global_thread_stats(); ++ free_global_table_stats(); ++ free_global_index_stats(); + #ifdef HAVE_REPLICATION + end_slave_list(); + #endif +@@ -1609,6 +1618,10 @@ static void clean_up_mutexes() + mysql_cond_destroy(&COND_thread_cache); + mysql_cond_destroy(&COND_flush_thread_cache); + mysql_cond_destroy(&COND_manager); ++ mysql_mutex_destroy(&LOCK_stats); ++ mysql_mutex_destroy(&LOCK_global_user_client_stats); ++ mysql_mutex_destroy(&LOCK_global_table_stats); ++ mysql_mutex_destroy(&LOCK_global_index_stats); + } + #endif /*EMBEDDED_LIBRARY*/ + +@@ -3023,6 +3036,7 @@ SHOW_VAR com_status_vars[]= { + {"show_binlog_events", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_BINLOG_EVENTS]), SHOW_LONG_STATUS}, + {"show_binlogs", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_BINLOGS]), SHOW_LONG_STATUS}, + {"show_charsets", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_CHARSETS]), SHOW_LONG_STATUS}, ++ {"show_client_statistics",(char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_CLIENT_STATS]), SHOW_LONG_STATUS}, + {"show_collations", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_COLLATIONS]), SHOW_LONG_STATUS}, + {"show_contributors", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_CONTRIBUTORS]), SHOW_LONG_STATUS}, + {"show_create_db", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_CREATE_DB]), SHOW_LONG_STATUS}, +@@ -3043,6 +3057,7 @@ SHOW_VAR com_status_vars[]= { + #endif + {"show_function_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_STATUS_FUNC]), SHOW_LONG_STATUS}, + {"show_grants", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_GRANTS]), SHOW_LONG_STATUS}, ++ {"show_index_statistics",(char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_INDEX_STATS]), SHOW_LONG_STATUS}, + {"show_keys", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_KEYS]), SHOW_LONG_STATUS}, + {"show_master_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_MASTER_STAT]), SHOW_LONG_STATUS}, + {"show_open_tables", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_OPEN_TABLES]), SHOW_LONG_STATUS}, +@@ -3060,9 +3075,12 @@ SHOW_VAR com_status_vars[]= { + {"show_slave_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_SLAVE_STAT]), SHOW_LONG_STATUS}, + {"show_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_STATUS]), SHOW_LONG_STATUS}, + {"show_storage_engines", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_STORAGE_ENGINES]), SHOW_LONG_STATUS}, ++ {"show_table_statistics",(char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_TABLE_STATS]), SHOW_LONG_STATUS}, + {"show_table_status", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_TABLE_STATUS]), SHOW_LONG_STATUS}, + {"show_tables", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_TABLES]), SHOW_LONG_STATUS}, ++ {"show_thread_statistics",(char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_THREAD_STATS]), SHOW_LONG_STATUS}, + {"show_triggers", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_TRIGGERS]), SHOW_LONG_STATUS}, ++ {"show_user_statistics", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_USER_STATS]), SHOW_LONG_STATUS}, + {"show_variables", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_VARIABLES]), SHOW_LONG_STATUS}, + {"show_warnings", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SHOW_WARNS]), SHOW_LONG_STATUS}, + {"slave_start", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_SLAVE_START]), SHOW_LONG_STATUS}, +@@ -3640,6 +3658,13 @@ static int init_thread_environment() + mysql_mutex_init(key_LOCK_server_started, + &LOCK_server_started, MY_MUTEX_INIT_FAST); + mysql_cond_init(key_COND_server_started, &COND_server_started, NULL); ++ mysql_mutex_init(key_LOCK_stats, &LOCK_stats, MY_MUTEX_INIT_FAST); ++ mysql_mutex_init(key_LOCK_global_user_client_stats, ++ &LOCK_global_user_client_stats, MY_MUTEX_INIT_FAST); ++ mysql_mutex_init(key_LOCK_global_table_stats, ++ &LOCK_global_table_stats, MY_MUTEX_INIT_FAST); ++ mysql_mutex_init(key_LOCK_global_index_stats, ++ &LOCK_global_index_stats, MY_MUTEX_INIT_FAST); + sp_cache_init(); + #ifdef HAVE_EVENT_SCHEDULER + Events::init_mutexes(); +@@ -4010,6 +4035,9 @@ a file name for --log-bin-index option", opt_binlog_index_name); + unireg_abort(1); + + /* We have to initialize the storage engines before CSV logging */ ++ init_global_table_stats(); ++ init_global_index_stats(); ++ + if (ha_init()) + { + sql_print_error("Can't init databases"); +@@ -4146,6 +4174,9 @@ a file name for --log-bin-index option", opt_binlog_index_name); + + init_max_user_conn(); + init_update_queries(); ++ init_global_user_stats(); ++ init_global_client_stats(); ++ init_global_thread_stats(); + DBUG_RETURN(0); + } + +@@ -5121,6 +5152,7 @@ static void create_new_thread(THD *thd) + + DBUG_PRINT("error",("Too many connections")); + close_connection(thd, ER_CON_COUNT_ERROR); ++ statistic_increment(denied_connections, &LOCK_status); + delete thd; + DBUG_VOID_RETURN; + } +@@ -7858,6 +7890,8 @@ PSI_mutex_key key_BINLOG_LOCK_index, key_BINLOG_LOCK_prep_xids, + key_delayed_insert_mutex, key_hash_filo_lock, key_LOCK_active_mi, + key_LOCK_connection_count, key_LOCK_crypt, key_LOCK_delayed_create, + key_LOCK_delayed_insert, key_LOCK_delayed_status, key_LOCK_error_log, ++ key_LOCK_stats, key_LOCK_global_user_client_stats, ++ key_LOCK_global_table_stats, key_LOCK_global_index_stats, + key_LOCK_gdl, key_LOCK_global_system_variables, + key_LOCK_manager, + key_LOCK_prepared_stmt_count, +@@ -7900,6 +7934,13 @@ static PSI_mutex_info all_server_mutexes[]= + { &key_LOCK_delayed_insert, "LOCK_delayed_insert", PSI_FLAG_GLOBAL}, + { &key_LOCK_delayed_status, "LOCK_delayed_status", PSI_FLAG_GLOBAL}, + { &key_LOCK_error_log, "LOCK_error_log", PSI_FLAG_GLOBAL}, ++ { &key_LOCK_stats, "LOCK_stats", PSI_FLAG_GLOBAL}, ++ { &key_LOCK_global_user_client_stats, ++ "LOCK_global_user_client_stats", PSI_FLAG_GLOBAL}, ++ { &key_LOCK_global_table_stats, ++ "LOCK_global_table_stats", PSI_FLAG_GLOBAL}, ++ { &key_LOCK_global_index_stats, ++ "LOCK_global_index_stats", PSI_FLAG_GLOBAL}, + { &key_LOCK_gdl, "LOCK_gdl", PSI_FLAG_GLOBAL}, + { &key_LOCK_global_system_variables, "LOCK_global_system_variables", PSI_FLAG_GLOBAL}, + { &key_LOCK_manager, "LOCK_manager", PSI_FLAG_GLOBAL}, +diff --git a/SOURCES/mysql/sql/mysqld.h b/SOURCES/mysql/sql/mysqld.h +index 8a20192..c2e39ad 100644 +--- a/SOURCES/mysql/sql/mysqld.h ++++ b/SOURCES/mysql/sql/mysqld.h +@@ -23,6 +23,7 @@ + #include "my_atomic.h" /* my_atomic_rwlock_t */ + #include "mysql/psi/mysql_file.h" /* MYSQL_FILE */ + #include "sql_list.h" /* I_List */ ++#include "hash.h" + + class THD; + struct handlerton; +@@ -109,6 +110,7 @@ extern ulong slave_exec_mode_options; + extern ulonglong slave_type_conversions_options; + extern my_bool read_only, opt_readonly; + extern my_bool lower_case_file_system; ++extern my_bool opt_userstat, opt_thread_statistics; + extern my_bool opt_enable_named_pipe, opt_sync_frm, opt_allow_suspicious_udfs; + extern my_bool opt_secure_auth; + extern char* opt_secure_file_priv; +@@ -173,6 +175,7 @@ extern LEX_CSTRING reason_slave_blocked; + extern ulong slave_trans_retries; + extern uint slave_net_timeout; + extern uint max_user_connections; ++extern ulonglong denied_connections; + extern ulong what_to_log,flush_time; + extern ulong max_prepared_stmt_count, prepared_stmt_count; + extern ulong open_files_limit; +@@ -200,6 +203,11 @@ extern SHOW_VAR status_vars[]; + extern struct system_variables max_system_variables; + extern struct system_status_var global_status_var; + extern struct rand_struct sql_rand; ++extern HASH global_user_stats; ++extern HASH global_client_stats; ++extern HASH global_thread_stats; ++extern HASH global_table_stats; ++extern HASH global_index_stats; + extern const char *opt_date_time_formats[]; + extern handlerton *partition_hton; + extern handlerton *myisam_hton; +@@ -240,6 +248,8 @@ extern PSI_mutex_key key_BINLOG_LOCK_index, key_BINLOG_LOCK_prep_xids, + key_delayed_insert_mutex, key_hash_filo_lock, key_LOCK_active_mi, + key_LOCK_connection_count, key_LOCK_crypt, key_LOCK_delayed_create, + key_LOCK_delayed_insert, key_LOCK_delayed_status, key_LOCK_error_log, ++ key_LOCK_stats, key_LOCK_global_user_client_stats, ++ key_LOCK_global_table_stats, key_LOCK_global_index_stats, + key_LOCK_gdl, key_LOCK_global_system_variables, + key_LOCK_logger, key_LOCK_manager, + key_LOCK_prepared_stmt_count, +@@ -344,7 +354,9 @@ extern mysql_mutex_t + LOCK_delayed_status, LOCK_delayed_create, LOCK_crypt, LOCK_timezone, + LOCK_slave_list, LOCK_active_mi, LOCK_manager, + LOCK_global_system_variables, LOCK_user_conn, +- LOCK_prepared_stmt_count, LOCK_error_messages, LOCK_connection_count; ++ LOCK_prepared_stmt_count, LOCK_error_messages, LOCK_connection_count, ++ LOCK_stats, LOCK_global_user_client_stats, ++ LOCK_global_table_stats, LOCK_global_index_stats; + extern MYSQL_PLUGIN_IMPORT mysql_mutex_t LOCK_thread_count; + #ifdef HAVE_OPENSSL + extern mysql_mutex_t LOCK_des_key_file; +@@ -456,6 +468,16 @@ inline query_id_t get_query_id() + return id; + } + ++void init_global_user_stats(void); ++void init_global_table_stats(void); ++void init_global_index_stats(void); ++void init_global_client_stats(void); ++void init_global_thread_stats(void); ++void free_global_user_stats(void); ++void free_global_table_stats(void); ++void free_global_index_stats(void); ++void free_global_client_stats(void); ++void free_global_thread_stats(void); + + /* + TODO: Replace this with an inline function. +diff --git a/SOURCES/mysql/sql/sql_base.cc b/SOURCES/mysql/sql/sql_base.cc +index 040c042..9cb5b92 100644 +--- a/SOURCES/mysql/sql/sql_base.cc ++++ b/SOURCES/mysql/sql/sql_base.cc +@@ -1587,6 +1587,11 @@ bool close_thread_table(THD *thd, TABLE **table_ptr) + table->mdl_ticket= NULL; + + mysql_mutex_lock(&thd->LOCK_thd_data); ++ if(table->file) ++ { ++ table->file->update_global_table_stats(); ++ table->file->update_global_index_stats(); ++ } + *table_ptr=table->next; + mysql_mutex_unlock(&thd->LOCK_thd_data); + +@@ -2212,6 +2217,8 @@ void close_temporary(TABLE *table, bool free_share, bool delete_table) + DBUG_PRINT("tmptable", ("closing table: '%s'.'%s'", + table->s->db.str, table->s->table_name.str)); + ++ table->file->update_global_table_stats(); ++ table->file->update_global_index_stats(); + free_io_cache(table); + closefrm(table, 0); + if (delete_table) +diff --git a/SOURCES/mysql/sql/sql_class.cc b/SOURCES/mysql/sql/sql_class.cc +index 93f1d8e..99db9ab 100644 +--- a/SOURCES/mysql/sql/sql_class.cc ++++ b/SOURCES/mysql/sql/sql_class.cc +@@ -854,6 +854,13 @@ THD::THD() + mysys_var=0; + binlog_evt_union.do_union= FALSE; + enable_slow_log= 0; ++ busy_time= 0; ++ cpu_time= 0; ++ bytes_received= 0; ++ bytes_sent= 0; ++ binlog_bytes_written= 0; ++ updated_row_count= 0; ++ sent_row_count_2= 0; + #ifndef DBUG_OFF + dbug_sentry=THD_SENTRY_MAGIC; + #endif +@@ -1235,6 +1242,7 @@ void THD::init(void) + variables.option_bits|= OPTION_BIN_LOG; + else + variables.option_bits&= ~OPTION_BIN_LOG; ++ reset_stats(); + + #if defined(ENABLED_DEBUG_SYNC) + /* Initialize the Debug Sync Facility. See debug_sync.cc. */ +@@ -1242,6 +1250,94 @@ void THD::init(void) + #endif /* defined(ENABLED_DEBUG_SYNC) */ + } + ++// Resets stats in a THD. ++void THD::reset_stats(void) ++{ ++ current_connect_time= time(NULL); ++ last_global_update_time= current_connect_time; ++ reset_diff_stats(); ++} ++ ++// Resets the 'diff' stats, which are used to update global stats. ++void THD::reset_diff_stats(void) ++{ ++ diff_total_busy_time= 0; ++ diff_total_cpu_time= 0; ++ diff_total_bytes_received= 0; ++ diff_total_bytes_sent= 0; ++ diff_total_binlog_bytes_written= 0; ++ diff_total_sent_rows= 0; ++ diff_total_updated_rows= 0; ++ diff_total_read_rows= 0; ++ diff_select_commands= 0; ++ diff_update_commands= 0; ++ diff_other_commands= 0; ++ diff_commit_trans= 0; ++ diff_rollback_trans= 0; ++ diff_denied_connections= 0; ++ diff_lost_connections= 0; ++ diff_access_denied_errors= 0; ++ diff_empty_queries= 0; ++} ++ ++// Updates 'diff' stats of a THD. ++void THD::update_stats(bool ran_command) ++{ ++ if (opt_userstat) ++ { ++ diff_total_busy_time+= busy_time; ++ diff_total_cpu_time+= cpu_time; ++ diff_total_bytes_received+= bytes_received; ++ diff_total_bytes_sent+= bytes_sent; ++ diff_total_binlog_bytes_written+= binlog_bytes_written; ++ diff_total_sent_rows+= sent_row_count_2; ++ diff_total_updated_rows+= updated_row_count; ++ // diff_total_read_rows is updated in handler.cc. ++ ++ if (ran_command) ++ { ++ // The replication thread has the COM_CONNECT command. ++ if ((old_command == COM_QUERY || command == COM_CONNECT) && ++ (lex->sql_command >= 0 && lex->sql_command < SQLCOM_END)) ++ { ++ // A SQL query. ++ if (lex->sql_command == SQLCOM_SELECT) ++ { ++ diff_select_commands++; ++ if (!sent_row_count_2) ++ diff_empty_queries++; ++ } ++ else if (!sql_command_flags[lex->sql_command] & CF_STATUS_COMMAND) ++ { ++ // 'SHOW ' commands become SQLCOM_SELECT. ++ diff_other_commands++; ++ // 'SHOW ' commands shouldn't inflate total sent row count. ++ diff_total_sent_rows-= sent_row_count_2; ++ } else if (is_update_query(lex->sql_command)) { ++ diff_update_commands++; ++ } else { ++ diff_other_commands++; ++ } ++ } ++ } ++ // diff_commit_trans is updated in handler.cc. ++ // diff_rollback_trans is updated in handler.cc. ++ // diff_denied_connections is updated in sql_parse.cc. ++ // diff_lost_connections is updated in sql_parse.cc. ++ // diff_access_denied_errors is updated in sql_parse.cc. ++ ++ /* reset counters to zero to avoid double-counting since values ++ are already store in diff_total_*. ++ */ ++ } ++ busy_time= 0; ++ cpu_time= 0; ++ bytes_received= 0; ++ bytes_sent= 0; ++ binlog_bytes_written= 0; ++ updated_row_count= 0; ++ sent_row_count_2= 0; ++} + + /* + Init THD for query processing. +@@ -2018,6 +2114,32 @@ void THD::close_active_vio() + } + #endif + ++char *THD::get_client_host_port(THD *client) ++{ ++ Security_context *client_sctx= client->security_ctx; ++ char *client_host= NULL; ++ ++ if (client->peer_port && (client_sctx->host || client_sctx->ip) && ++ security_ctx->host_or_ip[0]) ++ { ++ if ((client_host= (char *) this->alloc(LIST_PROCESS_HOST_LEN+1))) ++ my_snprintf((char *) client_host, LIST_PROCESS_HOST_LEN, ++ "%s:%u", client_sctx->host_or_ip, client->peer_port); ++ } ++ else ++ client_host= this->strdup(client_sctx->host_or_ip[0] ? ++ client_sctx->host_or_ip : ++ client_sctx->host ? client_sctx->host : ""); ++ ++ return client_host; ++} ++ ++const char *get_client_host(THD *client) ++{ ++ return client->security_ctx->host_or_ip[0] ? ++ client->security_ctx->host_or_ip : ++ client->security_ctx->host ? client->security_ctx->host : ""; ++} + + struct Item_change_record: public ilink + { +@@ -2194,6 +2316,7 @@ bool select_send::send_data(List &items) + } + + thd->sent_row_count++; ++ thd->sent_row_count_2++; + + if (thd->vio_ok()) + DBUG_RETURN(protocol->write()); +@@ -2286,6 +2409,7 @@ select_to_file::~select_to_file() + select_export::~select_export() + { + thd->sent_row_count=row_count; ++ thd->sent_row_count_2= row_count; + } + + +@@ -3318,6 +3442,7 @@ void thd_increment_bytes_sent(ulong length) + if (likely(thd != 0)) + { /* current_thd==0 when close_connection() calls net_send_error() */ + thd->status_var.bytes_sent+= length; ++ thd->bytes_sent+= length; + } + } + +@@ -3325,6 +3450,7 @@ void thd_increment_bytes_sent(ulong length) + void thd_increment_bytes_received(ulong length) + { + current_thd->status_var.bytes_received+= length; ++ current_thd->bytes_received+= length; + } + + +diff --git a/SOURCES/mysql/sql/sql_class.h b/SOURCES/mysql/sql/sql_class.h +index e3a84bf..f01c75f 100644 +--- a/SOURCES/mysql/sql/sql_class.h ++++ b/SOURCES/mysql/sql/sql_class.h +@@ -1582,6 +1582,8 @@ public: + */ + enum enum_server_command command; + uint32 server_id; ++ // Used to save the command, before it is set to COM_SLEEP. ++ enum enum_server_command old_command; + uint32 file_id; // for LOAD DATA INFILE + /* remote (peer) port */ + uint16 peer_port; +@@ -2055,6 +2057,8 @@ public: + */ + enum_tx_isolation tx_isolation; + enum_check_fields count_cuted_fields; ++ ha_rows updated_row_count; ++ ha_rows sent_row_count_2; /* for userstat */ + + DYNAMIC_ARRAY user_var_events; /* For user variables replication */ + MEM_ROOT *user_var_events_alloc; /* Allocate above array elements here */ +@@ -2149,6 +2153,49 @@ public: + */ + LOG_INFO* current_linfo; + NET* slave_net; // network connection from slave -> m. ++ ++ /* ++ Used to update global user stats. The global user stats are updated ++ occasionally with the 'diff' variables. After the update, the 'diff' ++ variables are reset to 0. ++ */ ++ // Time when the current thread connected to MySQL. ++ time_t current_connect_time; ++ // Last time when THD stats were updated in global_user_stats. ++ time_t last_global_update_time; ++ // Busy (non-idle) time for just one command. ++ double busy_time; ++ // Busy time not updated in global_user_stats yet. ++ double diff_total_busy_time; ++ // Cpu (non-idle) time for just one thread. ++ double cpu_time; ++ // Cpu time not updated in global_user_stats yet. ++ double diff_total_cpu_time; ++ /* bytes counting */ ++ ulonglong bytes_received; ++ ulonglong diff_total_bytes_received; ++ ulonglong bytes_sent; ++ ulonglong diff_total_bytes_sent; ++ ulonglong binlog_bytes_written; ++ ulonglong diff_total_binlog_bytes_written; ++ ++ // Number of rows not reflected in global_user_stats yet. ++ ha_rows diff_total_sent_rows, diff_total_updated_rows, diff_total_read_rows; ++ // Number of commands not reflected in global_user_stats yet. ++ ulonglong diff_select_commands, diff_update_commands, diff_other_commands; ++ // Number of transactions not reflected in global_user_stats yet. ++ ulonglong diff_commit_trans, diff_rollback_trans; ++ // Number of connection errors not reflected in global_user_stats yet. ++ ulonglong diff_denied_connections, diff_lost_connections; ++ // Number of db access denied, not reflected in global_user_stats yet. ++ ulonglong diff_access_denied_errors; ++ // Number of queries that return 0 rows ++ ulonglong diff_empty_queries; ++ ++ // Per account query delay in miliseconds. When not 0, sleep this number of ++ // milliseconds before every SQL command. ++ ulonglong query_delay_millis; ++ + /* Used by the sys_var class to store temporary values */ + union + { +@@ -2229,6 +2276,11 @@ public: + alloc_root. + */ + void init_for_queries(); ++ void reset_stats(void); ++ void reset_diff_stats(void); ++ // ran_command is true when this is called immediately after a ++ // command has been run. ++ void update_stats(bool ran_command); + void change_user(void); + void cleanup(void); + void cleanup_after_query(); +@@ -2708,6 +2760,15 @@ public: + } + thd_scheduler scheduler; + ++ /* Returns string as 'IP:port' for the client-side ++ of the connnection represented ++ by 'client' as displayed by SHOW PROCESSLIST. ++ Allocates memory from the heap of ++ this THD and that is not reclaimed ++ immediately, so use sparingly. May return NULL. ++ */ ++ char *get_client_host_port(THD *client); ++ + public: + inline Internal_error_handler *get_internal_handler() + { return m_internal_handler; } +@@ -2908,6 +2969,10 @@ private: + LEX_STRING invoker_host; + }; + ++/* Returns string as 'IP' for the client-side of the connection represented by ++ 'client'. Does not allocate memory. May return "". ++*/ ++const char *get_client_host(THD *client); + + /** A short cut for thd->stmt_da->set_ok_status(). */ + +diff --git a/SOURCES/mysql/sql/sql_connect.cc b/SOURCES/mysql/sql/sql_connect.cc +index a948a50..657bbb9 100644 +--- a/SOURCES/mysql/sql/sql_connect.cc ++++ b/SOURCES/mysql/sql/sql_connect.cc +@@ -57,6 +57,24 @@ + #define MIN_HANDSHAKE_SIZE 6 + #endif /* HAVE_OPENSSL && !EMBEDDED_LIBRARY */ + ++// Increments connection count for user. ++static int increment_connection_count(THD* thd, bool use_lock); ++ ++// Uses the THD to update the global stats by user name and client IP ++void update_global_user_stats(THD* thd, bool create_user, time_t now); ++ ++HASH global_user_stats; ++HASH global_client_stats; ++HASH global_thread_stats; ++// Protects global_user_stats and global_client_stats ++extern mysql_mutex_t LOCK_global_user_client_stats; ++ ++HASH global_table_stats; ++extern mysql_mutex_t LOCK_global_table_stats; ++ ++HASH global_index_stats; ++extern mysql_mutex_t LOCK_global_index_stats; ++ + /* + Get structure for logging connection data for the current user + */ +@@ -114,6 +132,586 @@ end: + + } + ++extern "C" uchar *get_key_user_stats(USER_STATS *user_stats, size_t *length, ++ my_bool not_used __attribute__((unused))) ++{ ++ *length= strlen(user_stats->user); ++ return (uchar*) user_stats->user; ++} ++ ++extern "C" uchar *get_key_thread_stats(THREAD_STATS *thread_stats, size_t *length, ++ my_bool not_used __attribute__((unused))) ++{ ++ *length= sizeof(my_thread_id); ++ return (uchar *) &(thread_stats->id); ++} ++ ++void free_user_stats(USER_STATS* user_stats) ++{ ++ my_free((char *) user_stats); ++} ++ ++void free_thread_stats(THREAD_STATS* thread_stats) ++{ ++ my_free((char *) thread_stats); ++} ++ ++void init_user_stats(USER_STATS *user_stats, ++ const char *user, ++ const char *priv_user, ++ uint total_connections, ++ uint concurrent_connections, ++ time_t connected_time, ++ double busy_time, ++ double cpu_time, ++ ulonglong bytes_received, ++ ulonglong bytes_sent, ++ ulonglong binlog_bytes_written, ++ ha_rows rows_fetched, ++ ha_rows rows_updated, ++ ha_rows rows_read, ++ ulonglong select_commands, ++ ulonglong update_commands, ++ ulonglong other_commands, ++ ulonglong commit_trans, ++ ulonglong rollback_trans, ++ ulonglong denied_connections, ++ ulonglong lost_connections, ++ ulonglong access_denied_errors, ++ ulonglong empty_queries) ++{ ++ DBUG_ENTER("init_user_stats"); ++ DBUG_PRINT("info", ++ ("Add user_stats entry for user %s - priv_user %s", ++ user, priv_user)); ++ strncpy(user_stats->user, user, sizeof(user_stats->user)); ++ strncpy(user_stats->priv_user, priv_user, sizeof(user_stats->priv_user)); ++ ++ user_stats->total_connections= total_connections; ++ user_stats->concurrent_connections= concurrent_connections; ++ user_stats->connected_time= connected_time; ++ user_stats->busy_time= busy_time; ++ user_stats->cpu_time= cpu_time; ++ user_stats->bytes_received= bytes_received; ++ user_stats->bytes_sent= bytes_sent; ++ user_stats->binlog_bytes_written= binlog_bytes_written; ++ user_stats->rows_fetched= rows_fetched; ++ user_stats->rows_updated= rows_updated; ++ user_stats->rows_read= rows_read; ++ user_stats->select_commands= select_commands; ++ user_stats->update_commands= update_commands; ++ user_stats->other_commands= other_commands; ++ user_stats->commit_trans= commit_trans; ++ user_stats->rollback_trans= rollback_trans; ++ user_stats->denied_connections= denied_connections; ++ user_stats->lost_connections= lost_connections; ++ user_stats->access_denied_errors= access_denied_errors; ++ user_stats->empty_queries= empty_queries; ++ DBUG_VOID_RETURN; ++} ++ ++void init_thread_stats(THREAD_STATS *thread_stats, ++ my_thread_id id, ++ uint total_connections, ++ uint concurrent_connections, ++ time_t connected_time, ++ double busy_time, ++ double cpu_time, ++ ulonglong bytes_received, ++ ulonglong bytes_sent, ++ ulonglong binlog_bytes_written, ++ ha_rows rows_fetched, ++ ha_rows rows_updated, ++ ha_rows rows_read, ++ ulonglong select_commands, ++ ulonglong update_commands, ++ ulonglong other_commands, ++ ulonglong commit_trans, ++ ulonglong rollback_trans, ++ ulonglong denied_connections, ++ ulonglong lost_connections, ++ ulonglong access_denied_errors, ++ ulonglong empty_queries) ++{ ++ DBUG_ENTER("init_thread_stats"); ++ DBUG_PRINT("info", ++ ("Add thread_stats entry for thread %lu", ++ id)); ++ thread_stats->id= id; ++ ++ thread_stats->total_connections= total_connections; ++ thread_stats->concurrent_connections= concurrent_connections; ++ thread_stats->connected_time= connected_time; ++ thread_stats->busy_time= busy_time; ++ thread_stats->cpu_time= cpu_time; ++ thread_stats->bytes_received= bytes_received; ++ thread_stats->bytes_sent= bytes_sent; ++ thread_stats->binlog_bytes_written= binlog_bytes_written; ++ thread_stats->rows_fetched= rows_fetched; ++ thread_stats->rows_updated= rows_updated; ++ thread_stats->rows_read= rows_read; ++ thread_stats->select_commands= select_commands; ++ thread_stats->update_commands= update_commands; ++ thread_stats->other_commands= other_commands; ++ thread_stats->commit_trans= commit_trans; ++ thread_stats->rollback_trans= rollback_trans; ++ thread_stats->denied_connections= denied_connections; ++ thread_stats->lost_connections= lost_connections; ++ thread_stats->access_denied_errors= access_denied_errors; ++ thread_stats->empty_queries= empty_queries; ++ DBUG_VOID_RETURN; ++} ++ ++void add_user_stats(USER_STATS *user_stats, ++ uint total_connections, ++ uint concurrent_connections, ++ time_t connected_time, ++ double busy_time, ++ double cpu_time, ++ ulonglong bytes_received, ++ ulonglong bytes_sent, ++ ulonglong binlog_bytes_written, ++ ha_rows rows_fetched, ++ ha_rows rows_updated, ++ ha_rows rows_read, ++ ulonglong select_commands, ++ ulonglong update_commands, ++ ulonglong other_commands, ++ ulonglong commit_trans, ++ ulonglong rollback_trans, ++ ulonglong denied_connections, ++ ulonglong lost_connections, ++ ulonglong access_denied_errors, ++ ulonglong empty_queries) ++{ ++ user_stats->total_connections+= total_connections; ++ user_stats->concurrent_connections+= concurrent_connections; ++ user_stats->connected_time+= connected_time; ++ user_stats->busy_time+= busy_time; ++ user_stats->cpu_time+= cpu_time; ++ user_stats->bytes_received+= bytes_received; ++ user_stats->bytes_sent+= bytes_sent; ++ user_stats->binlog_bytes_written+= binlog_bytes_written; ++ user_stats->rows_fetched+= rows_fetched; ++ user_stats->rows_updated+= rows_updated; ++ user_stats->rows_read+= rows_read; ++ user_stats->select_commands+= select_commands; ++ user_stats->update_commands+= update_commands; ++ user_stats->other_commands+= other_commands; ++ user_stats->commit_trans+= commit_trans; ++ user_stats->rollback_trans+= rollback_trans; ++ user_stats->denied_connections+= denied_connections; ++ user_stats->lost_connections+= lost_connections; ++ user_stats->access_denied_errors+= access_denied_errors; ++ user_stats->empty_queries+= empty_queries; ++} ++ ++void add_thread_stats(THREAD_STATS *thread_stats, ++ uint total_connections, ++ uint concurrent_connections, ++ time_t connected_time, ++ double busy_time, ++ double cpu_time, ++ ulonglong bytes_received, ++ ulonglong bytes_sent, ++ ulonglong binlog_bytes_written, ++ ha_rows rows_fetched, ++ ha_rows rows_updated, ++ ha_rows rows_read, ++ ulonglong select_commands, ++ ulonglong update_commands, ++ ulonglong other_commands, ++ ulonglong commit_trans, ++ ulonglong rollback_trans, ++ ulonglong denied_connections, ++ ulonglong lost_connections, ++ ulonglong access_denied_errors, ++ ulonglong empty_queries) ++{ ++ thread_stats->total_connections+= total_connections; ++ thread_stats->concurrent_connections+= concurrent_connections; ++ thread_stats->connected_time+= connected_time; ++ thread_stats->busy_time+= busy_time; ++ thread_stats->cpu_time+= cpu_time; ++ thread_stats->bytes_received+= bytes_received; ++ thread_stats->bytes_sent+= bytes_sent; ++ thread_stats->binlog_bytes_written+= binlog_bytes_written; ++ thread_stats->rows_fetched+= rows_fetched; ++ thread_stats->rows_updated+= rows_updated; ++ thread_stats->rows_read+= rows_read; ++ thread_stats->select_commands+= select_commands; ++ thread_stats->update_commands+= update_commands; ++ thread_stats->other_commands+= other_commands; ++ thread_stats->commit_trans+= commit_trans; ++ thread_stats->rollback_trans+= rollback_trans; ++ thread_stats->denied_connections+= denied_connections; ++ thread_stats->lost_connections+= lost_connections; ++ thread_stats->access_denied_errors+= access_denied_errors; ++ thread_stats->empty_queries+= empty_queries; ++} ++ ++void init_global_user_stats(void) ++{ ++ if (my_hash_init(&global_user_stats, system_charset_info, max_connections, ++ 0, 0, (my_hash_get_key)get_key_user_stats, ++ (my_hash_free_key)free_user_stats, 0)) { ++ sql_print_error("Initializing global_user_stats failed."); ++ exit(1); ++ } ++} ++ ++void init_global_client_stats(void) ++{ ++ if (my_hash_init(&global_client_stats, system_charset_info, max_connections, ++ 0, 0, (my_hash_get_key)get_key_user_stats, ++ (my_hash_free_key)free_user_stats, 0)) { ++ sql_print_error("Initializing global_client_stats failed."); ++ exit(1); ++ } ++} ++ ++void init_global_thread_stats(void) ++{ ++ if (my_hash_init(&global_thread_stats, &my_charset_bin, max_connections, ++ 0, 0, (my_hash_get_key) get_key_thread_stats, ++ (my_hash_free_key) free_thread_stats, 0)) ++ { ++ sql_print_error("Initializing global_client_stats failed."); ++ exit(1); ++ } ++} ++ ++extern "C" uchar *get_key_table_stats(TABLE_STATS *table_stats, size_t *length, ++ my_bool not_used __attribute__((unused))) ++{ ++ *length= strlen(table_stats->table); ++ return (uchar*) table_stats->table; ++} ++ ++extern "C" void free_table_stats(TABLE_STATS* table_stats) ++{ ++ my_free((char*) table_stats); ++} ++ ++void init_global_table_stats(void) ++{ ++ if (my_hash_init(&global_table_stats, system_charset_info, max_connections, ++ 0, 0, (my_hash_get_key)get_key_table_stats, ++ (my_hash_free_key)free_table_stats, 0)) { ++ sql_print_error("Initializing global_table_stats failed."); ++ exit(1); ++ } ++} ++ ++extern "C" uchar *get_key_index_stats(INDEX_STATS *index_stats, size_t *length, ++ my_bool not_used __attribute__((unused))) ++{ ++ *length= strlen(index_stats->index); ++ return (uchar*) index_stats->index; ++} ++ ++extern "C" void free_index_stats(INDEX_STATS* index_stats) ++{ ++ my_free((char*) index_stats); ++} ++ ++void init_global_index_stats(void) ++{ ++ if (my_hash_init(&global_index_stats, system_charset_info, max_connections, ++ 0, 0, (my_hash_get_key)get_key_index_stats, ++ (my_hash_free_key)free_index_stats, 0)) { ++ sql_print_error("Initializing global_index_stats failed."); ++ exit(1); ++ } ++} ++ ++void free_global_user_stats(void) ++{ ++ my_hash_free(&global_user_stats); ++} ++ ++void free_global_thread_stats(void) ++{ ++ my_hash_free(&global_thread_stats); ++} ++ ++void free_global_table_stats(void) ++{ ++ my_hash_free(&global_table_stats); ++} ++ ++void free_global_index_stats(void) ++{ ++ my_hash_free(&global_index_stats); ++} ++ ++void free_global_client_stats(void) ++{ ++ my_hash_free(&global_client_stats); ++} ++ ++// 'mysql_system_user' is used for when the user is not defined for a THD. ++static char mysql_system_user[] = "#mysql_system#"; ++ ++// Returns 'user' if it's not NULL. Returns 'mysql_system_user' otherwise. ++static char* get_valid_user_string(char* user) { ++ return user ? user : mysql_system_user; ++} ++ ++// Increments the global stats connection count for an entry from ++// global_client_stats or global_user_stats. Returns 0 on success ++// and 1 on error. ++static int increment_count_by_name(const char *name, const char *role_name, ++ HASH *users_or_clients, THD *thd) ++{ ++ USER_STATS* user_stats; ++ ++ if (!(user_stats = (USER_STATS *) my_hash_search(users_or_clients, ++ (uchar*) name, ++ strlen(name)))) ++ { ++ // First connection for this user or client ++ if (!(user_stats = ((USER_STATS *) ++ my_malloc(sizeof(USER_STATS), MYF(MY_WME | MY_ZEROFILL))))) ++ { ++ return 1; // Out of memory ++ } ++ ++ init_user_stats(user_stats, name, role_name, ++ 0, 0, // connections ++ 0, 0, 0, // time ++ 0, 0, 0, // bytes sent, received and written ++ 0, 0, 0, // rows fetched, updated and read ++ 0, 0, 0, // select, update and other commands ++ 0, 0, // commit and rollback trans ++ thd->diff_denied_connections, ++ 0, // lost connections ++ 0, // access denied errors ++ 0); // empty queries ++ ++ if (my_hash_insert(users_or_clients, (uchar *) user_stats)) ++ { ++ my_free((char *) user_stats); ++ return 1; // Out of memory ++ } ++ } ++ user_stats->total_connections++; ++ return 0; ++} ++ ++static int increment_count_by_id(my_thread_id id, ++ HASH *users_or_clients, THD *thd) ++{ ++ THREAD_STATS* thread_stats; ++ ++ if (!(thread_stats = (THREAD_STATS *) my_hash_search(users_or_clients, ++ (uchar*) &id, ++ sizeof(my_thread_id)))) ++ { ++ // First connection for this user or client ++ if (!(thread_stats = ((THREAD_STATS *) ++ my_malloc(sizeof(THREAD_STATS), MYF(MY_WME | MY_ZEROFILL))))) ++ { ++ return 1; // Out of memory ++ } ++ ++ init_thread_stats(thread_stats, id, ++ 0, 0, // connections ++ 0, 0, 0, // time ++ 0, 0, 0, // bytes sent, received and written ++ 0, 0, 0, // rows fetched, updated and read ++ 0, 0, 0, // select, update and other commands ++ 0, 0, // commit and rollback trans ++ thd->diff_denied_connections, ++ 0, // lost connections ++ 0, // access denied errors ++ 0); // empty queries ++ ++ if (my_hash_insert(users_or_clients, (uchar *) thread_stats)) ++ { ++ my_free((char *) thread_stats); ++ return 1; // Out of memory ++ } ++ } ++ thread_stats->total_connections++; ++ return 0; ++} ++ ++/* Increments the global user and client stats connection count. If 'use_lock' ++ is true, LOCK_global_user_client_stats will be locked/unlocked. Returns ++ 0 on success, 1 on error. ++*/ ++static int increment_connection_count(THD* thd, bool use_lock) ++{ ++ char* user_string= get_valid_user_string(thd->main_security_ctx.user); ++ const char* client_string= get_client_host(thd); ++ int return_value= 0; ++ ++ if (!opt_userstat) ++ return return_value; ++ ++ if (use_lock) ++ mysql_mutex_lock(&LOCK_global_user_client_stats); ++ ++ if (increment_count_by_name(user_string, user_string, ++ &global_user_stats, thd)) ++ { ++ return_value= 1; ++ goto end; ++ } ++ if (increment_count_by_name(client_string, ++ user_string, ++ &global_client_stats, thd)) ++ { ++ return_value= 1; ++ goto end; ++ } ++ if (opt_thread_statistics) ++ { ++ if (increment_count_by_id(thd->thread_id, &global_thread_stats, thd)) ++ { ++ return_value= 1; ++ goto end; ++ } ++ } ++ ++end: ++ if (use_lock) ++ mysql_mutex_unlock(&LOCK_global_user_client_stats); ++ return return_value; ++} ++ ++// Used to update the global user and client stats. ++static void update_global_user_stats_with_user(THD* thd, ++ USER_STATS* user_stats, ++ time_t now) ++{ ++ user_stats->connected_time+= now - thd->last_global_update_time; ++//thd->last_global_update_time= now; ++ user_stats->busy_time+= thd->diff_total_busy_time; ++ user_stats->cpu_time+= thd->diff_total_cpu_time; ++ user_stats->bytes_received+= thd->diff_total_bytes_received; ++ user_stats->bytes_sent+= thd->diff_total_bytes_sent; ++ user_stats->binlog_bytes_written+= thd->diff_total_binlog_bytes_written; ++ user_stats->rows_fetched+= thd->diff_total_sent_rows; ++ user_stats->rows_updated+= thd->diff_total_updated_rows; ++ user_stats->rows_read+= thd->diff_total_read_rows; ++ user_stats->select_commands+= thd->diff_select_commands; ++ user_stats->update_commands+= thd->diff_update_commands; ++ user_stats->other_commands+= thd->diff_other_commands; ++ user_stats->commit_trans+= thd->diff_commit_trans; ++ user_stats->rollback_trans+= thd->diff_rollback_trans; ++ user_stats->denied_connections+= thd->diff_denied_connections; ++ user_stats->lost_connections+= thd->diff_lost_connections; ++ user_stats->access_denied_errors+= thd->diff_access_denied_errors; ++ user_stats->empty_queries+= thd->diff_empty_queries; ++} ++ ++static void update_global_thread_stats_with_thread(THD* thd, ++ THREAD_STATS* thread_stats, ++ time_t now) ++{ ++ thread_stats->connected_time+= now - thd->last_global_update_time; ++//thd->last_global_update_time= now; ++ thread_stats->busy_time+= thd->diff_total_busy_time; ++ thread_stats->cpu_time+= thd->diff_total_cpu_time; ++ thread_stats->bytes_received+= thd->diff_total_bytes_received; ++ thread_stats->bytes_sent+= thd->diff_total_bytes_sent; ++ thread_stats->binlog_bytes_written+= thd->diff_total_binlog_bytes_written; ++ thread_stats->rows_fetched+= thd->diff_total_sent_rows; ++ thread_stats->rows_updated+= thd->diff_total_updated_rows; ++ thread_stats->rows_read+= thd->diff_total_read_rows; ++ thread_stats->select_commands+= thd->diff_select_commands; ++ thread_stats->update_commands+= thd->diff_update_commands; ++ thread_stats->other_commands+= thd->diff_other_commands; ++ thread_stats->commit_trans+= thd->diff_commit_trans; ++ thread_stats->rollback_trans+= thd->diff_rollback_trans; ++ thread_stats->denied_connections+= thd->diff_denied_connections; ++ thread_stats->lost_connections+= thd->diff_lost_connections; ++ thread_stats->access_denied_errors+= thd->diff_access_denied_errors; ++ thread_stats->empty_queries+= thd->diff_empty_queries; ++} ++ ++// Updates the global stats of a user or client ++void update_global_user_stats(THD* thd, bool create_user, time_t now) ++{ ++ if (opt_userstat) ++ { ++ char* user_string= get_valid_user_string(thd->main_security_ctx.user); ++ const char* client_string= get_client_host(thd); ++ ++ USER_STATS* user_stats; ++ THREAD_STATS* thread_stats; ++ mysql_mutex_lock(&LOCK_global_user_client_stats); ++ ++ // Update by user name ++ if ((user_stats = (USER_STATS *) my_hash_search(&global_user_stats, ++ (uchar *) user_string, ++ strlen(user_string)))) ++ { ++ // Found user. ++ update_global_user_stats_with_user(thd, user_stats, now); ++ } ++ else ++ { ++ // Create the entry ++ if (create_user) ++ { ++ increment_count_by_name(user_string, user_string, ++ &global_user_stats, thd); ++ } ++ } ++ ++ // Update by client IP ++ if ((user_stats = (USER_STATS *) my_hash_search(&global_client_stats, ++ (uchar *) client_string, ++ strlen(client_string)))) ++ { ++ // Found by client IP ++ update_global_user_stats_with_user(thd, user_stats, now); ++ } ++ else ++ { ++ // Create the entry ++ if (create_user) ++ { ++ increment_count_by_name(client_string, ++ user_string, ++ &global_client_stats, thd); ++ } ++ } ++ ++ if (opt_thread_statistics) ++ { ++ // Update by thread ID ++ if ((thread_stats = (THREAD_STATS *) my_hash_search(&global_thread_stats, ++ (uchar *) &(thd->thread_id), ++ sizeof(my_thread_id)))) ++ { ++ // Found by thread ID ++ update_global_thread_stats_with_thread(thd, thread_stats, now); ++ } ++ else ++ { ++ // Create the entry ++ if (create_user) ++ { ++ increment_count_by_id(thd->thread_id, ++ &global_thread_stats, thd); ++ } ++ } ++ } ++ ++ thd->last_global_update_time = now; ++ thd->reset_diff_stats(); ++ ++ mysql_mutex_unlock(&LOCK_global_user_client_stats); ++ } ++ else ++ { ++ thd->reset_diff_stats(); ++ } ++} + + /* + check if user has already too many connections +@@ -171,6 +769,7 @@ end: + if (error) + { + thd->decrement_user_connections_counter(); ++ statistic_increment(denied_connections, &LOCK_status); + /* + The thread may returned back to the pool and assigned to a user + that doesn't have a limit. Ensure the user is not using resources +@@ -640,11 +1239,18 @@ bool login_connection(THD *thd) + my_sleep(1000); /* must wait after eof() */ + #endif + statistic_increment(aborted_connects,&LOCK_status); ++ thd->diff_denied_connections++; + DBUG_RETURN(1); + } + /* Connect completed, set read/write timeouts back to default */ + my_net_set_read_timeout(net, thd->variables.net_read_timeout); + my_net_set_write_timeout(net, thd->variables.net_write_timeout); ++ ++ thd->reset_stats(); ++ // Updates global user connection stats. ++ if (increment_connection_count(thd, true)) ++ DBUG_RETURN(1); ++ + DBUG_RETURN(0); + } + +@@ -671,6 +1277,7 @@ void end_connection(THD *thd) + if (thd->killed || (net->error && net->vio != 0)) + { + statistic_increment(aborted_threads,&LOCK_status); ++ thd->diff_lost_connections++; + } + + if (net->error && net->vio != 0) +@@ -851,10 +1458,14 @@ void do_handle_one_connection(THD *thd_arg) + for (;;) + { + bool rc; ++ bool create_user= TRUE; + + rc= thd_prepare_connection(thd); + if (rc) ++ { ++ create_user= FALSE; + goto end_thread; ++ } + + while (thd_is_connection_alive(thd)) + { +@@ -866,6 +1477,8 @@ void do_handle_one_connection(THD *thd_arg) + + end_thread: + close_connection(thd); ++ thd->update_stats(false); ++ update_global_user_stats(thd, create_user, time(NULL)); + if (MYSQL_CALLBACK_ELSE(thread_scheduler, end_thread, (thd, 1), 0)) + return; // Probably no-threads + +diff --git a/SOURCES/mysql/sql/sql_delete.cc b/SOURCES/mysql/sql/sql_delete.cc +index 1bbc9af..034b6b6 100644 +--- a/SOURCES/mysql/sql/sql_delete.cc ++++ b/SOURCES/mysql/sql/sql_delete.cc +@@ -417,6 +417,7 @@ cleanup: + my_ok(thd, deleted); + DBUG_PRINT("info",("%ld records deleted",(long) deleted)); + } ++ thd->updated_row_count+= deleted; + DBUG_RETURN(error >= 0 || thd->is_error()); + } + +@@ -1011,6 +1012,7 @@ bool multi_delete::send_eof() + { + ::my_ok(thd, deleted); + } ++ thd->updated_row_count+= deleted; + return 0; + } + +diff --git a/SOURCES/mysql/sql/sql_insert.cc b/SOURCES/mysql/sql/sql_insert.cc +index 0f43277..daa9558 100644 +--- a/SOURCES/mysql/sql/sql_insert.cc ++++ b/SOURCES/mysql/sql/sql_insert.cc +@@ -1070,13 +1070,14 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list, + + if (error) + goto abort; ++ ha_rows row_count; + if (values_list.elements == 1 && (!(thd->variables.option_bits & OPTION_WARNINGS) || + !thd->cuted_fields)) + { +- my_ok(thd, info.copied + info.deleted + ++ row_count= info.copied + info.deleted + + ((thd->client_capabilities & CLIENT_FOUND_ROWS) ? +- info.touched : info.updated), +- id); ++ info.touched : info.updated); ++ my_ok(thd, row_count, id); + } + else + { +@@ -1092,8 +1093,10 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list, + sprintf(buff, ER(ER_INSERT_INFO), (ulong) info.records, + (ulong) (info.deleted + updated), + (ulong) thd->warning_info->statement_warn_count()); +- ::my_ok(thd, info.copied + info.deleted + updated, id, buff); ++ row_count= info.copied + info.deleted + updated; ++ ::my_ok(thd, row_count, id, buff); + } ++ thd->updated_row_count+= row_count; + thd->abort_on_warning= 0; + DBUG_RETURN(FALSE); + +@@ -3546,6 +3549,7 @@ bool select_insert::send_eof() + thd->first_successful_insert_id_in_prev_stmt : + (info.copied ? autoinc_value_of_last_inserted_row : 0)); + ::my_ok(thd, row_count, id, buff); ++ thd->updated_row_count+= row_count; + DBUG_RETURN(0); + } + +diff --git a/SOURCES/mysql/sql/sql_lex.h b/SOURCES/mysql/sql/sql_lex.h +index 59278b8..46ed331 100644 +--- a/SOURCES/mysql/sql/sql_lex.h ++++ b/SOURCES/mysql/sql/sql_lex.h +@@ -192,6 +192,9 @@ enum enum_sql_command { + SQLCOM_SHOW_PROFILE, SQLCOM_SHOW_PROFILES, + SQLCOM_SIGNAL, SQLCOM_RESIGNAL, + SQLCOM_SHOW_RELAYLOG_EVENTS, ++ // TODO(mcallaghan): update status_vars in mysqld to export these ++ SQLCOM_SHOW_USER_STATS, SQLCOM_SHOW_TABLE_STATS, SQLCOM_SHOW_INDEX_STATS, ++ SQLCOM_SHOW_CLIENT_STATS, SQLCOM_SHOW_THREAD_STATS, + /* + When a command is added here, be sure it's also added in mysqld.cc + in "struct show_var_st status_vars[]= {" ... +diff --git a/SOURCES/mysql/sql/sql_parse.cc b/SOURCES/mysql/sql/sql_parse.cc +index f787fe4..1e053db 100644 +--- a/SOURCES/mysql/sql/sql_parse.cc ++++ b/SOURCES/mysql/sql/sql_parse.cc +@@ -115,6 +115,9 @@ + static bool execute_sqlcom_select(THD *thd, TABLE_LIST *all_tables); + static void sql_kill(THD *thd, ulong id, bool only_kill_query); + ++// Uses the THD to update the global stats by user name and client IP ++void update_global_user_stats(THD* thd, bool create_user, time_t now); ++ + const char *any_db="*any*"; // Special symbol for check_access + + const LEX_STRING command_name[]={ +@@ -697,6 +700,12 @@ bool do_command(THD *thd) + */ + thd->clear_error(); // Clear error message + thd->stmt_da->reset_diagnostics_area(); ++ thd->updated_row_count= 0; ++ thd->busy_time= 0; ++ thd->cpu_time= 0; ++ thd->bytes_received= 0; ++ thd->bytes_sent= 0; ++ thd->binlog_bytes_written= 0; + + net_new_transaction(net); + +@@ -882,6 +891,10 @@ bool dispatch_command(enum enum_server_command command, THD *thd, + (char *) thd->security_ctx->host_or_ip); + + thd->command=command; ++ /* To increment the corrent command counter for user stats, 'command' must ++ be saved because it is set to COM_SLEEP at the end of this function. ++ */ ++ thd->old_command= command; + /* + Commands which always take a long time are logged into + the slow log only if opt_log_slow_admin_statements is set. +@@ -1599,6 +1612,13 @@ int prepare_schema_table(THD *thd, LEX *lex, Table_ident *table_ident, + thd->profiling.discard_current_query(); + #endif + break; ++ case SCH_USER_STATS: ++ case SCH_CLIENT_STATS: ++ case SCH_THREAD_STATS: ++ if (check_global_access(thd, SUPER_ACL | PROCESS_ACL)) ++ DBUG_RETURN(1); ++ case SCH_TABLE_STATS: ++ case SCH_INDEX_STATS: + case SCH_OPEN_TABLES: + case SCH_VARIABLES: + case SCH_STATUS: +@@ -1772,6 +1792,7 @@ bool sp_process_definer(THD *thd) + thd->security_ctx->priv_host)) && + check_global_access(thd, SUPER_ACL)) + { ++ thd->diff_access_denied_errors++; + my_error(ER_SPECIFIC_ACCESS_DENIED_ERROR, MYF(0), "SUPER"); + DBUG_RETURN(TRUE); + } +@@ -4811,6 +4832,7 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv, + case ACL_INTERNAL_ACCESS_DENIED: + if (! no_errors) + { ++ thd->diff_access_denied_errors++; + my_error(ER_DBACCESS_DENIED_ERROR, MYF(0), + sctx->priv_user, sctx->priv_host, db); + } +@@ -4861,6 +4883,7 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv, + DBUG_PRINT("error",("No possible access")); + if (!no_errors) + { ++ thd->diff_access_denied_errors++; + if (thd->password == 2) + my_error(ER_ACCESS_DENIED_NO_PASSWORD_ERROR, MYF(0), + sctx->priv_user, +@@ -4975,6 +4998,7 @@ static bool check_show_access(THD *thd, TABLE_LIST *table) + + if (!thd->col_access && check_grant_db(thd, dst_db_name)) + { ++ thd->diff_access_denied_errors++; + my_error(ER_DBACCESS_DENIED_ERROR, MYF(0), + thd->security_ctx->priv_user, + thd->security_ctx->priv_host, +@@ -5245,6 +5269,7 @@ bool check_global_access(THD *thd, ulong want_access) + if ((thd->security_ctx->master_access & want_access)) + return 0; + get_privilege_desc(command, sizeof(command), want_access); ++ thd->diff_access_denied_errors++; + my_error(ER_SPECIFIC_ACCESS_DENIED_ERROR, MYF(0), command); + return 1; + #else +@@ -5611,6 +5636,32 @@ void mysql_parse(THD *thd, char *rawbuf, uint length, + lex_start(thd); + mysql_reset_thd_for_next_command(thd); + ++ int start_time_error= 0; ++ int end_time_error= 0; ++ struct timeval start_time, end_time; ++ double start_usecs= 0; ++ double end_usecs= 0; ++ /* cpu time */ ++ int cputime_error= 0; ++ struct timespec tp; ++ double start_cpu_nsecs= 0; ++ double end_cpu_nsecs= 0; ++ ++ if (opt_userstat) ++ { ++#ifdef HAVE_CLOCK_GETTIME ++ /* get start cputime */ ++ if (!(cputime_error = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp))) ++ start_cpu_nsecs = tp.tv_sec*1000000000.0+tp.tv_nsec; ++#endif ++ ++ // Gets the start time, in order to measure how long this command takes. ++ if (!(start_time_error = gettimeofday(&start_time, NULL))) ++ { ++ start_usecs = start_time.tv_sec * 1000000.0 + start_time.tv_usec; ++ } ++ } ++ + if (query_cache_send_result_to_client(thd, rawbuf, length) <= 0) + { + LEX *lex= thd->lex; +@@ -5681,6 +5732,52 @@ void mysql_parse(THD *thd, char *rawbuf, uint length, + DBUG_ASSERT(thd->change_list.is_empty()); + } + ++ if (opt_userstat) ++ { ++ // Gets the end time. ++ if (!(end_time_error= gettimeofday(&end_time, NULL))) ++ { ++ end_usecs= end_time.tv_sec * 1000000.0 + end_time.tv_usec; ++ } ++ ++ // Calculates the difference between the end and start times. ++ if (start_usecs && end_usecs >= start_usecs && !start_time_error && !end_time_error) ++ { ++ thd->busy_time= (end_usecs - start_usecs) / 1000000; ++ // In case there are bad values, 2629743 is the #seconds in a month. ++ if (thd->busy_time > 2629743) ++ { ++ thd->busy_time= 0; ++ } ++ } ++ else ++ { ++ // end time went back in time, or gettimeofday() failed. ++ thd->busy_time= 0; ++ } ++ ++#ifdef HAVE_CLOCK_GETTIME ++ /* get end cputime */ ++ if (!cputime_error && ++ !(cputime_error = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp))) ++ end_cpu_nsecs = tp.tv_sec*1000000000.0+tp.tv_nsec; ++#endif ++ if (start_cpu_nsecs && !cputime_error) ++ { ++ thd->cpu_time = (end_cpu_nsecs - start_cpu_nsecs) / 1000000000; ++ // In case there are bad values, 2629743 is the #seconds in a month. ++ if (thd->cpu_time > 2629743) ++ { ++ thd->cpu_time = 0; ++ } ++ } ++ else ++ thd->cpu_time = 0; ++ } ++ // Updates THD stats and the global user stats. ++ thd->update_stats(true); ++ update_global_user_stats(thd, true, time(NULL)); ++ + DBUG_VOID_RETURN; + } + +diff --git a/SOURCES/mysql/sql/sql_prepare.cc b/SOURCES/mysql/sql/sql_prepare.cc +index 74279c5..bb53f8f 100644 +--- a/SOURCES/mysql/sql/sql_prepare.cc ++++ b/SOURCES/mysql/sql/sql_prepare.cc +@@ -115,6 +115,9 @@ When one supplies long data for a placeholder: + #include "lock.h" // MYSQL_OPEN_FORCE_SHARED_MDL + #include "transaction.h" // trans_rollback_implicit + ++// Uses the THD to update the global stats by user name and client IP ++void update_global_user_stats(THD* thd, bool create_user, time_t now); ++ + /** + A result class used to send cursor rows using the binary protocol. + */ +@@ -2183,8 +2186,34 @@ void mysqld_stmt_prepare(THD *thd, const char *packet, uint packet_length) + /* First of all clear possible warnings from the previous command */ + mysql_reset_thd_for_next_command(thd); + ++ int start_time_error= 0; ++ int end_time_error= 0; ++ struct timeval start_time, end_time; ++ double start_usecs= 0; ++ double end_usecs= 0; ++ /* cpu time */ ++ int cputime_error= 0; ++ struct timespec tp; ++ double start_cpu_nsecs= 0; ++ double end_cpu_nsecs= 0; ++ ++ if (opt_userstat) ++ { ++#ifdef HAVE_CLOCK_GETTIME ++ /* get start cputime */ ++ if (!(cputime_error= clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp))) ++ start_cpu_nsecs= tp.tv_sec * 1000000000.0 + tp.tv_nsec; ++#endif ++ ++ // Gets the start time, in order to measure how long this command takes. ++ if (!(start_time_error= gettimeofday(&start_time, NULL))) ++ { ++ start_usecs= start_time.tv_sec * 1000000.0 + start_time.tv_usec; ++ } ++ } ++ + if (! (stmt= new Prepared_statement(thd))) +- DBUG_VOID_RETURN; /* out of memory: error is set in Sql_alloc */ ++ goto end; /* out of memory: error is set in Sql_alloc */ + + if (thd->stmt_map.insert(thd, stmt)) + { +@@ -2192,7 +2221,7 @@ void mysqld_stmt_prepare(THD *thd, const char *packet, uint packet_length) + The error is set in the insert. The statement itself + will be also deleted there (this is how the hash works). + */ +- DBUG_VOID_RETURN; ++ goto end; + } + + thd->protocol= &thd->protocol_binary; +@@ -2209,6 +2238,53 @@ void mysqld_stmt_prepare(THD *thd, const char *packet, uint packet_length) + sp_cache_enforce_limit(thd->sp_func_cache, stored_program_cache_size); + + /* check_prepared_statemnt sends the metadata packet in case of success */ ++end: ++ if (opt_userstat) ++ { ++ // Gets the end time. ++ if (!(end_time_error= gettimeofday(&end_time, NULL))) ++ { ++ end_usecs= end_time.tv_sec * 1000000.0 + end_time.tv_usec; ++ } ++ ++ // Calculates the difference between the end and start times. ++ if (start_usecs && end_usecs >= start_usecs && !start_time_error && !end_time_error) ++ { ++ thd->busy_time= (end_usecs - start_usecs) / 1000000; ++ // In case there are bad values, 2629743 is the #seconds in a month. ++ if (thd->busy_time > 2629743) ++ { ++ thd->busy_time= 0; ++ } ++ } ++ else ++ { ++ // end time went back in time, or gettimeofday() failed. ++ thd->busy_time= 0; ++ } ++ ++#ifdef HAVE_CLOCK_GETTIME ++ /* get end cputime */ ++ if (!cputime_error && ++ !(cputime_error= clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp))) ++ end_cpu_nsecs= tp.tv_sec*1000000000.0+tp.tv_nsec; ++#endif ++ if (start_cpu_nsecs && !cputime_error) ++ { ++ thd->cpu_time= (end_cpu_nsecs - start_cpu_nsecs) / 1000000000; ++ // In case there are bad values, 2629743 is the #seconds in a month. ++ if (thd->cpu_time > 2629743) ++ { ++ thd->cpu_time= 0; ++ } ++ } ++ else ++ thd->cpu_time = 0; ++ } ++ // Updates THD stats and the global user stats. ++ thd->update_stats(true); ++ update_global_user_stats(thd, true, time(NULL)); ++ + DBUG_VOID_RETURN; + } + +@@ -2561,12 +2637,38 @@ void mysqld_stmt_execute(THD *thd, char *packet_arg, uint packet_length) + /* First of all clear possible warnings from the previous command */ + mysql_reset_thd_for_next_command(thd); + ++ int start_time_error= 0; ++ int end_time_error= 0; ++ struct timeval start_time, end_time; ++ double start_usecs= 0; ++ double end_usecs= 0; ++ /* cpu time */ ++ int cputime_error= 0; ++ struct timespec tp; ++ double start_cpu_nsecs= 0; ++ double end_cpu_nsecs= 0; ++ ++ if (opt_userstat) ++ { ++#ifdef HAVE_CLOCK_GETTIME ++ /* get start cputime */ ++ if (!(cputime_error = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp))) ++ start_cpu_nsecs = tp.tv_sec*1000000000.0+tp.tv_nsec; ++#endif ++ ++ // Gets the start time, in order to measure how long this command takes. ++ if (!(start_time_error = gettimeofday(&start_time, NULL))) ++ { ++ start_usecs = start_time.tv_sec * 1000000.0 + start_time.tv_usec; ++ } ++ } ++ + if (!(stmt= find_prepared_statement(thd, stmt_id))) + { + char llbuf[22]; + my_error(ER_UNKNOWN_STMT_HANDLER, MYF(0), static_cast(sizeof(llbuf)), + llstr(stmt_id, llbuf), "mysqld_stmt_execute"); +- DBUG_VOID_RETURN; ++ goto end; + } + + #if defined(ENABLED_PROFILING) +@@ -2587,6 +2689,53 @@ void mysqld_stmt_execute(THD *thd, char *packet_arg, uint packet_length) + /* Close connection socket; for use with client testing (Bug#43560). */ + DBUG_EXECUTE_IF("close_conn_after_stmt_execute", vio_close(thd->net.vio);); + ++end: ++ if (opt_userstat) ++ { ++ // Gets the end time. ++ if (!(end_time_error= gettimeofday(&end_time, NULL))) ++ { ++ end_usecs= end_time.tv_sec * 1000000.0 + end_time.tv_usec; ++ } ++ ++ // Calculates the difference between the end and start times. ++ if (start_usecs && end_usecs >= start_usecs && !start_time_error && !end_time_error) ++ { ++ thd->busy_time= (end_usecs - start_usecs) / 1000000; ++ // In case there are bad values, 2629743 is the #seconds in a month. ++ if (thd->busy_time > 2629743) ++ { ++ thd->busy_time= 0; ++ } ++ } ++ else ++ { ++ // end time went back in time, or gettimeofday() failed. ++ thd->busy_time= 0; ++ } ++ ++#ifdef HAVE_CLOCK_GETTIME ++ /* get end cputime */ ++ if (!cputime_error && ++ !(cputime_error= clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp))) ++ end_cpu_nsecs= tp.tv_sec*1000000000.0+tp.tv_nsec; ++#endif ++ if (start_cpu_nsecs && !cputime_error) ++ { ++ thd->cpu_time= (end_cpu_nsecs - start_cpu_nsecs) / 1000000000; ++ // In case there are bad values, 2629743 is the #seconds in a month. ++ if (thd->cpu_time > 2629743) ++ { ++ thd->cpu_time= 0; ++ } ++ } ++ else ++ thd->cpu_time = 0; ++ } ++ // Updates THD stats and the global user stats. ++ thd->update_stats(true); ++ update_global_user_stats(thd, true, time(NULL)); ++ + DBUG_VOID_RETURN; + } + +@@ -2659,20 +2808,47 @@ void mysqld_stmt_fetch(THD *thd, char *packet, uint packet_length) + + /* First of all clear possible warnings from the previous command */ + mysql_reset_thd_for_next_command(thd); ++ ++ int start_time_error= 0; ++ int end_time_error= 0; ++ struct timeval start_time, end_time; ++ double start_usecs= 0; ++ double end_usecs= 0; ++ /* cpu time */ ++ int cputime_error= 0; ++ struct timespec tp; ++ double start_cpu_nsecs= 0; ++ double end_cpu_nsecs= 0; ++ ++ if (opt_userstat) ++ { ++#ifdef HAVE_CLOCK_GETTIME ++ /* get start cputime */ ++ if (!(cputime_error= clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp))) ++ start_cpu_nsecs= tp.tv_sec*1000000000.0+tp.tv_nsec; ++#endif ++ ++ // Gets the start time, in order to measure how long this command takes. ++ if (!(start_time_error= gettimeofday(&start_time, NULL))) ++ { ++ start_usecs= start_time.tv_sec * 1000000.0 + start_time.tv_usec; ++ } ++ } ++ + status_var_increment(thd->status_var.com_stmt_fetch); + if (!(stmt= find_prepared_statement(thd, stmt_id))) + { + char llbuf[22]; + my_error(ER_UNKNOWN_STMT_HANDLER, MYF(0), static_cast(sizeof(llbuf)), + llstr(stmt_id, llbuf), "mysqld_stmt_fetch"); +- DBUG_VOID_RETURN; ++ goto end; + } + + cursor= stmt->cursor; + if (!cursor) + { + my_error(ER_STMT_HAS_NO_OPEN_CURSOR, MYF(0), stmt_id); +- DBUG_VOID_RETURN; ++ goto end; + } + + thd->stmt_arena= stmt; +@@ -2689,6 +2865,52 @@ void mysqld_stmt_fetch(THD *thd, char *packet, uint packet_length) + thd->restore_backup_statement(stmt, &stmt_backup); + thd->stmt_arena= thd; + ++end: ++ if (opt_userstat) ++ { ++ // Gets the end time. ++ if (!(end_time_error = gettimeofday(&end_time, NULL))) ++ { ++ end_usecs = end_time.tv_sec * 1000000.0 + end_time.tv_usec; ++ } ++ ++ // Calculates the difference between the end and start times. ++ if (start_usecs && end_usecs >= start_usecs && !start_time_error && !end_time_error) ++ { ++ thd->busy_time= (end_usecs - start_usecs) / 1000000; ++ // In case there are bad values, 2629743 is the #seconds in a month. ++ if (thd->busy_time > 2629743) ++ { ++ thd->busy_time= 0; ++ } ++ } ++ else ++ { ++ // end time went back in time, or gettimeofday() failed. ++ thd->busy_time= 0; ++ } ++ ++#ifdef HAVE_CLOCK_GETTIME ++ /* get end cputime */ ++ if (!cputime_error && ++ !(cputime_error= clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp))) ++ end_cpu_nsecs= tp.tv_sec*1000000000.0+tp.tv_nsec; ++#endif ++ if (start_cpu_nsecs && !cputime_error) ++ { ++ thd->cpu_time= (end_cpu_nsecs - start_cpu_nsecs) / 1000000000; ++ // In case there are bad values, 2629743 is the #seconds in a month. ++ if (thd->cpu_time > 2629743) ++ { ++ thd->cpu_time= 0; ++ } ++ } else ++ thd->cpu_time= 0; ++ } ++ // Updates THD stats and the global user stats. ++ thd->update_stats(true); ++ update_global_user_stats(thd, true, time(NULL)); ++ + DBUG_VOID_RETURN; + } + +@@ -2719,13 +2941,39 @@ void mysqld_stmt_reset(THD *thd, char *packet) + /* First of all clear possible warnings from the previous command */ + mysql_reset_thd_for_next_command(thd); + ++ int start_time_error= 0; ++ int end_time_error= 0; ++ struct timeval start_time, end_time; ++ double start_usecs= 0; ++ double end_usecs= 0; ++ /* cpu time */ ++ int cputime_error= 0; ++ struct timespec tp; ++ double start_cpu_nsecs= 0; ++ double end_cpu_nsecs= 0; ++ ++ if (opt_userstat) ++ { ++#ifdef HAVE_CLOCK_GETTIME ++ /* get start cputime */ ++ if (!(cputime_error= clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp))) ++ start_cpu_nsecs= tp.tv_sec * 1000000000.0+tp.tv_nsec; ++#endif ++ ++ // Gets the start time, in order to measure how long this command takes. ++ if (!(start_time_error= gettimeofday(&start_time, NULL))) ++ { ++ start_usecs= start_time.tv_sec * 1000000.0 + start_time.tv_usec; ++ } ++ } ++ + status_var_increment(thd->status_var.com_stmt_reset); + if (!(stmt= find_prepared_statement(thd, stmt_id))) + { + char llbuf[22]; + my_error(ER_UNKNOWN_STMT_HANDLER, MYF(0), static_cast(sizeof(llbuf)), + llstr(stmt_id, llbuf), "mysqld_stmt_reset"); +- DBUG_VOID_RETURN; ++ goto end; + } + + stmt->close_cursor(); +@@ -2742,6 +2990,53 @@ void mysqld_stmt_reset(THD *thd, char *packet) + + my_ok(thd); + ++end: ++ if (opt_userstat) ++ { ++ // Gets the end time. ++ if (!(end_time_error = gettimeofday(&end_time, NULL))) ++ { ++ end_usecs = end_time.tv_sec * 1000000.0 + end_time.tv_usec; ++ } ++ ++ // Calculates the difference between the end and start times. ++ if (start_usecs && end_usecs >= start_usecs && !start_time_error && !end_time_error) ++ { ++ thd->busy_time= (end_usecs - start_usecs) / 1000000; ++ // In case there are bad values, 2629743 is the #seconds in a month. ++ if (thd->busy_time > 2629743) ++ { ++ thd->busy_time= 0; ++ } ++ } ++ else ++ { ++ // end time went back in time, or gettimeofday() failed. ++ thd->busy_time= 0; ++ } ++ ++#ifdef HAVE_CLOCK_GETTIME ++ /* get end cputime */ ++ if (!cputime_error && ++ !(cputime_error = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tp))) ++ end_cpu_nsecs = tp.tv_sec*1000000000.0+tp.tv_nsec; ++#endif ++ if (start_cpu_nsecs && !cputime_error) ++ { ++ thd->cpu_time = (end_cpu_nsecs - start_cpu_nsecs) / 1000000000; ++ // In case there are bad values, 2629743 is the #seconds in a month. ++ if (thd->cpu_time > 2629743) ++ { ++ thd->cpu_time= 0; ++ } ++ } ++ else ++ thd->cpu_time= 0; ++ } ++ // Updates THD stats and the global user stats. ++ thd->update_stats(true); ++ update_global_user_stats(thd, true, time(NULL)); ++ + DBUG_VOID_RETURN; + } + +diff --git a/SOURCES/mysql/sql/sql_reload.cc b/SOURCES/mysql/sql/sql_reload.cc +index b0665a9..b551fc8 100644 +--- a/SOURCES/mysql/sql/sql_reload.cc ++++ b/SOURCES/mysql/sql/sql_reload.cc +@@ -321,7 +321,41 @@ bool reload_acl_and_cache(THD *thd, unsigned long options, + } + #endif + if (options & REFRESH_USER_RESOURCES) +- reset_mqh((LEX_USER *) NULL, 0); /* purecov: inspected */ ++ reset_mqh((LEX_USER *) NULL, 0); /* purecov: inspected */ ++ if (options & REFRESH_TABLE_STATS) ++ { ++ mysql_mutex_lock(&LOCK_global_table_stats); ++ free_global_table_stats(); ++ init_global_table_stats(); ++ mysql_mutex_unlock(&LOCK_global_table_stats); ++ } ++ if (options & REFRESH_INDEX_STATS) ++ { ++ mysql_mutex_lock(&LOCK_global_index_stats); ++ free_global_index_stats(); ++ init_global_index_stats(); ++ mysql_mutex_unlock(&LOCK_global_index_stats); ++ } ++ if (options & (REFRESH_USER_STATS | REFRESH_CLIENT_STATS | REFRESH_THREAD_STATS)) ++ { ++ mysql_mutex_lock(&LOCK_global_user_client_stats); ++ if (options & REFRESH_USER_STATS) ++ { ++ free_global_user_stats(); ++ init_global_user_stats(); ++ } ++ if (options & REFRESH_CLIENT_STATS) ++ { ++ free_global_client_stats(); ++ init_global_client_stats(); ++ } ++ if (options & REFRESH_THREAD_STATS) ++ { ++ free_global_thread_stats(); ++ init_global_thread_stats(); ++ } ++ mysql_mutex_unlock(&LOCK_global_user_client_stats); ++ } + if (*write_to_binlog != -1) + *write_to_binlog= tmp_write_to_binlog; + /* +diff --git a/SOURCES/mysql/sql/sql_show.cc b/SOURCES/mysql/sql/sql_show.cc +index b8e8649..ac0d80f 100644 +--- a/SOURCES/mysql/sql/sql_show.cc ++++ b/SOURCES/mysql/sql/sql_show.cc +@@ -113,6 +113,43 @@ append_algorithm(TABLE_LIST *table, String *buff); + + static COND * make_cond_for_info_schema(COND *cond, TABLE_LIST *table); + ++/* ++ * Solaris 10 does not have strsep(). ++ * ++ * based on getToken from http://www.winehq.org/pipermail/wine-patches/2001-November/001322.html ++ * ++*/ ++ ++#ifndef HAVE_STRSEP ++static char* strsep(char** str, const char* delims) ++{ ++ char *token; ++ ++ if (*str == NULL) ++ { ++ /* No more tokens */ ++ return NULL; ++ } ++ ++ token= *str; ++ while (**str != '\0') ++ { ++ if (strchr(delims, **str) != NULL) ++ { ++ **str= '\0'; ++ (*str)++; ++ return token; ++ } ++ (*str)++; ++ } ++ ++ /* There is not another token */ ++ *str= NULL; ++ ++ return token; ++} ++#endif ++ + /*************************************************************************** + ** List all table types supported + ***************************************************************************/ +@@ -799,6 +836,7 @@ bool mysqld_show_create_db(THD *thd, char *dbname, + sctx->priv_user, dbname, 0) | sctx->master_access); + if (!(db_access & DB_ACLS) && check_grant_db(thd,dbname)) + { ++ thd->diff_access_denied_errors++; + my_error(ER_DBACCESS_DENIED_ERROR, MYF(0), + sctx->priv_user, sctx->host_or_ip, dbname); + general_log_print(thd,COM_INIT_DB,ER(ER_DBACCESS_DENIED_ERROR), +@@ -2366,6 +2404,284 @@ end: + DBUG_RETURN(res); + } + ++/* ++ Write result to network for SHOW USER_STATISTICS ++ ++ SYNOPSIS ++ send_user_stats ++ all_user_stats - values to return ++ table - I_S table ++ ++ RETURN ++ 0 - OK ++ 1 - error ++*/ ++int send_user_stats(THD* thd, HASH *all_user_stats, TABLE *table) ++{ ++ DBUG_ENTER("send_user_stats"); ++ for (uint i = 0; i < all_user_stats->records; ++i) ++ { ++ restore_record(table, s->default_values); ++ USER_STATS *user_stats = (USER_STATS *) my_hash_element(all_user_stats, i); ++ table->field[0]->store(user_stats->user, strlen(user_stats->user), system_charset_info); ++ table->field[1]->store((longlong)user_stats->total_connections); ++ table->field[2]->store((longlong)user_stats->concurrent_connections); ++ table->field[3]->store((longlong)user_stats->connected_time); ++ table->field[4]->store((longlong)user_stats->busy_time); ++ table->field[5]->store((longlong)user_stats->cpu_time); ++ table->field[6]->store((longlong)user_stats->bytes_received); ++ table->field[7]->store((longlong)user_stats->bytes_sent); ++ table->field[8]->store((longlong)user_stats->binlog_bytes_written); ++ table->field[9]->store((longlong)user_stats->rows_fetched); ++ table->field[10]->store((longlong)user_stats->rows_updated); ++ table->field[11]->store((longlong)user_stats->rows_read); ++ table->field[12]->store((longlong)user_stats->select_commands); ++ table->field[13]->store((longlong)user_stats->update_commands); ++ table->field[14]->store((longlong)user_stats->other_commands); ++ table->field[15]->store((longlong)user_stats->commit_trans); ++ table->field[16]->store((longlong)user_stats->rollback_trans); ++ table->field[17]->store((longlong)user_stats->denied_connections); ++ table->field[18]->store((longlong)user_stats->lost_connections); ++ table->field[19]->store((longlong)user_stats->access_denied_errors); ++ table->field[20]->store((longlong)user_stats->empty_queries); ++ if (schema_table_store_record(thd, table)) ++ { ++ DBUG_PRINT("error", ("store record error")); ++ DBUG_RETURN(1); ++ } ++ } ++ DBUG_RETURN(0); ++} ++ ++int send_thread_stats(THD* thd, HASH *all_thread_stats, TABLE *table) ++{ ++ DBUG_ENTER("send_thread_stats"); ++ for (uint i = 0; i < all_thread_stats->records; ++i) ++ { ++ restore_record(table, s->default_values); ++ THREAD_STATS *user_stats = (THREAD_STATS *) my_hash_element(all_thread_stats, i); ++ table->field[0]->store((longlong)user_stats->id); ++ table->field[1]->store((longlong)user_stats->total_connections); ++ table->field[2]->store((longlong)user_stats->concurrent_connections); ++ table->field[3]->store((longlong)user_stats->connected_time); ++ table->field[4]->store((longlong)user_stats->busy_time); ++ table->field[5]->store((longlong)user_stats->cpu_time); ++ table->field[6]->store((longlong)user_stats->bytes_received); ++ table->field[7]->store((longlong)user_stats->bytes_sent); ++ table->field[8]->store((longlong)user_stats->binlog_bytes_written); ++ table->field[9]->store((longlong)user_stats->rows_fetched); ++ table->field[10]->store((longlong)user_stats->rows_updated); ++ table->field[11]->store((longlong)user_stats->rows_read); ++ table->field[12]->store((longlong)user_stats->select_commands); ++ table->field[13]->store((longlong)user_stats->update_commands); ++ table->field[14]->store((longlong)user_stats->other_commands); ++ table->field[15]->store((longlong)user_stats->commit_trans); ++ table->field[16]->store((longlong)user_stats->rollback_trans); ++ table->field[17]->store((longlong)user_stats->denied_connections); ++ table->field[18]->store((longlong)user_stats->lost_connections); ++ table->field[19]->store((longlong)user_stats->access_denied_errors); ++ table->field[20]->store((longlong)user_stats->empty_queries); ++ if (schema_table_store_record(thd, table)) ++ { ++ DBUG_PRINT("error", ("store record error")); ++ DBUG_RETURN(1); ++ } ++ } ++ DBUG_RETURN(0); ++} ++ ++/* ++ Process SHOW USER_STATISTICS ++ ++ SYNOPSIS ++ mysqld_show_user_stats ++ thd - current thread ++ wild - limit results to the entry for this user ++ with_roles - when true, display role for mapped users ++ ++ RETURN ++ 0 - OK ++ 1 - error ++*/ ++ ++ ++int fill_schema_user_stats(THD* thd, TABLE_LIST* tables, COND* cond) ++{ ++ TABLE *table= tables->table; ++ DBUG_ENTER("fill_schema_user_stats"); ++ ++ if (check_global_access(thd, SUPER_ACL | PROCESS_ACL)) ++ DBUG_RETURN(1); ++ ++ // Iterates through all the global stats and sends them to the client. ++ // Pattern matching on the client IP is supported. ++ ++ mysql_mutex_lock(&LOCK_global_user_client_stats); ++ int result= send_user_stats(thd, &global_user_stats, table); ++ mysql_mutex_unlock(&LOCK_global_user_client_stats); ++ if (result) ++ goto err; ++ ++ DBUG_PRINT("exit", ("fill_schema_user_stats result is 0")); ++ DBUG_RETURN(0); ++ ++ err: ++ DBUG_PRINT("exit", ("fill_schema_user_stats result is 1")); ++ DBUG_RETURN(1); ++} ++ ++/* ++ Process SHOW CLIENT_STATISTICS ++ ++ SYNOPSIS ++ mysqld_show_client_stats ++ thd - current thread ++ wild - limit results to the entry for this client ++ ++ RETURN ++ 0 - OK ++ 1 - error ++*/ ++ ++ ++int fill_schema_client_stats(THD* thd, TABLE_LIST* tables, COND* cond) ++{ ++ TABLE *table= tables->table; ++ DBUG_ENTER("fill_schema_client_stats"); ++ ++ if (check_global_access(thd, SUPER_ACL | PROCESS_ACL)) ++ DBUG_RETURN(1); ++ ++ // Iterates through all the global stats and sends them to the client. ++ // Pattern matching on the client IP is supported. ++ ++ mysql_mutex_lock(&LOCK_global_user_client_stats); ++ int result= send_user_stats(thd, &global_client_stats, table); ++ mysql_mutex_unlock(&LOCK_global_user_client_stats); ++ if (result) ++ goto err; ++ ++ DBUG_PRINT("exit", ("mysqld_show_client_stats result is 0")); ++ DBUG_RETURN(0); ++ ++ err: ++ DBUG_PRINT("exit", ("mysqld_show_client_stats result is 1")); ++ DBUG_RETURN(1); ++} ++ ++int fill_schema_thread_stats(THD* thd, TABLE_LIST* tables, COND* cond) ++{ ++ TABLE *table= tables->table; ++ DBUG_ENTER("fill_schema_thread_stats"); ++ ++ if (check_global_access(thd, SUPER_ACL | PROCESS_ACL)) ++ DBUG_RETURN(1); ++ ++ // Iterates through all the global stats and sends them to the client. ++ // Pattern matching on the client IP is supported. ++ ++ mysql_mutex_lock(&LOCK_global_user_client_stats); ++ int result= send_thread_stats(thd, &global_thread_stats, table); ++ mysql_mutex_unlock(&LOCK_global_user_client_stats); ++ if (result) ++ goto err; ++ ++ DBUG_PRINT("exit", ("mysqld_show_thread_stats result is 0")); ++ DBUG_RETURN(0); ++ ++ err: ++ DBUG_PRINT("exit", ("mysqld_show_thread_stats result is 1")); ++ DBUG_RETURN(1); ++} ++ ++// Sends the global table stats back to the client. ++int fill_schema_table_stats(THD* thd, TABLE_LIST* tables, COND* cond) ++{ ++ TABLE *table= tables->table; ++ DBUG_ENTER("fill_schema_table_stats"); ++ char *table_full_name, *table_schema; ++ ++ mysql_mutex_lock(&LOCK_global_table_stats); ++ for (uint i = 0; i < global_table_stats.records; ++i) ++ { ++ restore_record(table, s->default_values); ++ TABLE_STATS *table_stats = ++ (TABLE_STATS *) my_hash_element(&global_table_stats, i); ++ ++ table_full_name= thd->strdup(table_stats->table); ++ table_schema= strsep(&table_full_name, "."); ++ ++ TABLE_LIST tmp_table; ++ bzero((char *) &tmp_table,sizeof(tmp_table)); ++ tmp_table.table_name= table_full_name; ++ tmp_table.db= table_schema; ++ tmp_table.grant.privilege= 0; ++ if (check_access(thd, SELECT_ACL, tmp_table.db, ++ &tmp_table.grant.privilege, 0, 0, ++ is_infoschema_db(table_schema)) || ++ check_grant(thd, SELECT_ACL, &tmp_table, 1, UINT_MAX, 1)) ++ continue; ++ ++ table->field[0]->store(table_schema, strlen(table_schema), system_charset_info); ++ table->field[1]->store(table_full_name, strlen(table_full_name), system_charset_info); ++ table->field[2]->store((longlong)table_stats->rows_read, TRUE); ++ table->field[3]->store((longlong)table_stats->rows_changed, TRUE); ++ table->field[4]->store((longlong)table_stats->rows_changed_x_indexes, TRUE); ++ ++ if (schema_table_store_record(thd, table)) ++ { ++ mysql_mutex_unlock(&LOCK_global_table_stats); ++ DBUG_RETURN(1); ++ } ++ } ++ mysql_mutex_unlock(&LOCK_global_table_stats); ++ DBUG_RETURN(0); ++} ++ ++// Sends the global index stats back to the client. ++int fill_schema_index_stats(THD* thd, TABLE_LIST* tables, COND* cond) ++{ ++ TABLE *table= tables->table; ++ DBUG_ENTER("fill_schema_index_stats"); ++ char *index_full_name, *table_schema, *table_name; ++ ++ mysql_mutex_lock(&LOCK_global_index_stats); ++ for (uint i = 0; i < global_index_stats.records; ++i) ++ { ++ restore_record(table, s->default_values); ++ INDEX_STATS *index_stats = ++ (INDEX_STATS *) my_hash_element(&global_index_stats, i); ++ ++ index_full_name= thd->strdup(index_stats->index); ++ table_schema= strsep(&index_full_name, "."); ++ table_name= strsep(&index_full_name, "."); ++ ++ TABLE_LIST tmp_table; ++ bzero((char *) &tmp_table,sizeof(tmp_table)); ++ tmp_table.table_name= table_name; ++ tmp_table.db= table_schema; ++ tmp_table.grant.privilege= 0; ++ if (check_access(thd, SELECT_ACL, tmp_table.db, ++ &tmp_table.grant.privilege, 0, 0, ++ is_infoschema_db(table_schema)) || ++ check_grant(thd, SELECT_ACL, &tmp_table, 1, UINT_MAX, 1)) ++ continue; ++ ++ table->field[0]->store(table_schema, strlen(table_schema), system_charset_info); ++ table->field[1]->store(table_name, strlen(table_name), system_charset_info); ++ table->field[2]->store(index_full_name, strlen(index_full_name), system_charset_info); ++ table->field[3]->store((longlong)index_stats->rows_read, TRUE); ++ ++ if (schema_table_store_record(thd, table)) ++ { ++ mysql_mutex_unlock(&LOCK_global_index_stats); ++ DBUG_RETURN(1); ++ } ++ } ++ mysql_mutex_unlock(&LOCK_global_index_stats); ++ DBUG_RETURN(0); ++} ++ + + /* collect status for all running threads */ + +@@ -7501,6 +7817,104 @@ ST_FIELD_INFO variables_fields_info[]= + }; + + ++ST_FIELD_INFO user_stats_fields_info[]= ++{ ++ {"USER", USERNAME_LENGTH, MYSQL_TYPE_STRING, 0, 0, "User", SKIP_OPEN_TABLE}, ++ {"TOTAL_CONNECTIONS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Total_connections", SKIP_OPEN_TABLE}, ++ {"CONCURRENT_CONNECTIONS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Concurrent_connections", SKIP_OPEN_TABLE}, ++ {"CONNECTED_TIME", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Connected_time", SKIP_OPEN_TABLE}, ++ {"BUSY_TIME", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Busy_time", SKIP_OPEN_TABLE}, ++ {"CPU_TIME", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Cpu_time", SKIP_OPEN_TABLE}, ++ {"BYTES_RECEIVED", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Bytes_received", SKIP_OPEN_TABLE}, ++ {"BYTES_SENT", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Bytes_sent", SKIP_OPEN_TABLE}, ++ {"BINLOG_BYTES_WRITTEN", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Binlog_bytes_written", SKIP_OPEN_TABLE}, ++ {"ROWS_FETCHED", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Rows_fetched", SKIP_OPEN_TABLE}, ++ {"ROWS_UPDATED", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Rows_updated", SKIP_OPEN_TABLE}, ++ {"TABLE_ROWS_READ", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Table_rows_read", SKIP_OPEN_TABLE}, ++ {"SELECT_COMMANDS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Select_commands", SKIP_OPEN_TABLE}, ++ {"UPDATE_COMMANDS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Update_commands", SKIP_OPEN_TABLE}, ++ {"OTHER_COMMANDS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Other_commands", SKIP_OPEN_TABLE}, ++ {"COMMIT_TRANSACTIONS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Commit_transactions", SKIP_OPEN_TABLE}, ++ {"ROLLBACK_TRANSACTIONS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Rollback_transactions", SKIP_OPEN_TABLE}, ++ {"DENIED_CONNECTIONS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Denied_connections", SKIP_OPEN_TABLE}, ++ {"LOST_CONNECTIONS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Lost_connections", SKIP_OPEN_TABLE}, ++ {"ACCESS_DENIED", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Access_denied", SKIP_OPEN_TABLE}, ++ {"EMPTY_QUERIES", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Empty_queries", SKIP_OPEN_TABLE}, ++ {0, 0, MYSQL_TYPE_STRING, 0, 0, 0, 0} ++}; ++ ++ST_FIELD_INFO client_stats_fields_info[]= ++{ ++ {"CLIENT", LIST_PROCESS_HOST_LEN, MYSQL_TYPE_STRING, 0, 0, "Client", SKIP_OPEN_TABLE}, ++ {"TOTAL_CONNECTIONS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Total_connections", SKIP_OPEN_TABLE}, ++ {"CONCURRENT_CONNECTIONS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Concurrent_connections", SKIP_OPEN_TABLE}, ++ {"CONNECTED_TIME", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Connected_time", SKIP_OPEN_TABLE}, ++ {"BUSY_TIME", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Busy_time", SKIP_OPEN_TABLE}, ++ {"CPU_TIME", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Cpu_time", SKIP_OPEN_TABLE}, ++ {"BYTES_RECEIVED", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Bytes_received", SKIP_OPEN_TABLE}, ++ {"BYTES_SENT", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Bytes_sent", SKIP_OPEN_TABLE}, ++ {"BINLOG_BYTES_WRITTEN", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Binlog_bytes_written", SKIP_OPEN_TABLE}, ++ {"ROWS_FETCHED", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Rows_fetched", SKIP_OPEN_TABLE}, ++ {"ROWS_UPDATED", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Rows_updated", SKIP_OPEN_TABLE}, ++ {"TABLE_ROWS_READ", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Table_rows_read", SKIP_OPEN_TABLE}, ++ {"SELECT_COMMANDS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Select_commands", SKIP_OPEN_TABLE}, ++ {"UPDATE_COMMANDS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Update_commands", SKIP_OPEN_TABLE}, ++ {"OTHER_COMMANDS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Other_commands", SKIP_OPEN_TABLE}, ++ {"COMMIT_TRANSACTIONS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Commit_transactions", SKIP_OPEN_TABLE}, ++ {"ROLLBACK_TRANSACTIONS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Rollback_transactions", SKIP_OPEN_TABLE}, ++ {"DENIED_CONNECTIONS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Denied_connections", SKIP_OPEN_TABLE}, ++ {"LOST_CONNECTIONS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Lost_connections", SKIP_OPEN_TABLE}, ++ {"ACCESS_DENIED", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Access_denied", SKIP_OPEN_TABLE}, ++ {"EMPTY_QUERIES", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Empty_queries", SKIP_OPEN_TABLE}, ++ {0, 0, MYSQL_TYPE_STRING, 0, 0, 0, 0} ++}; ++ ++ST_FIELD_INFO thread_stats_fields_info[]= ++{ ++ {"THREAD_ID", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Thread_id", SKIP_OPEN_TABLE}, ++ {"TOTAL_CONNECTIONS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Total_connections", SKIP_OPEN_TABLE}, ++ {"CONCURRENT_CONNECTIONS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Concurrent_connections", SKIP_OPEN_TABLE}, ++ {"CONNECTED_TIME", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Connected_time", SKIP_OPEN_TABLE}, ++ {"BUSY_TIME", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Busy_time", SKIP_OPEN_TABLE}, ++ {"CPU_TIME", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Cpu_time", SKIP_OPEN_TABLE}, ++ {"BYTES_RECEIVED", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Bytes_received", SKIP_OPEN_TABLE}, ++ {"BYTES_SENT", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Bytes_sent", SKIP_OPEN_TABLE}, ++ {"BINLOG_BYTES_WRITTEN", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Binlog_bytes_written", SKIP_OPEN_TABLE}, ++ {"ROWS_FETCHED", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Rows_fetched", SKIP_OPEN_TABLE}, ++ {"ROWS_UPDATED", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Rows_updated", SKIP_OPEN_TABLE}, ++ {"TABLE_ROWS_READ", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Table_rows_read", SKIP_OPEN_TABLE}, ++ {"SELECT_COMMANDS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Select_commands", SKIP_OPEN_TABLE}, ++ {"UPDATE_COMMANDS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Update_commands", SKIP_OPEN_TABLE}, ++ {"OTHER_COMMANDS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Other_commands", SKIP_OPEN_TABLE}, ++ {"COMMIT_TRANSACTIONS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Commit_transactions", SKIP_OPEN_TABLE}, ++ {"ROLLBACK_TRANSACTIONS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Rollback_transactions", SKIP_OPEN_TABLE}, ++ {"DENIED_CONNECTIONS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Denied_connections", SKIP_OPEN_TABLE}, ++ {"LOST_CONNECTIONS", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Lost_connections", SKIP_OPEN_TABLE}, ++ {"ACCESS_DENIED", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Access_denied", SKIP_OPEN_TABLE}, ++ {"EMPTY_QUERIES", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Empty_queries", SKIP_OPEN_TABLE}, ++ {0, 0, MYSQL_TYPE_STRING, 0, 0, 0, 0} ++}; ++ ++ST_FIELD_INFO table_stats_fields_info[]= ++{ ++ {"TABLE_SCHEMA", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, "Table_schema", SKIP_OPEN_TABLE}, ++ {"TABLE_NAME", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, "Table_name", SKIP_OPEN_TABLE}, ++ {"ROWS_READ", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Rows_read", SKIP_OPEN_TABLE}, ++ {"ROWS_CHANGED", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Rows_changed", SKIP_OPEN_TABLE}, ++ {"ROWS_CHANGED_X_INDEXES", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Rows_changed_x_#indexes", SKIP_OPEN_TABLE}, ++ {0, 0, MYSQL_TYPE_STRING, 0, 0, 0, 0} ++}; ++ ++ST_FIELD_INFO index_stats_fields_info[]= ++{ ++ {"TABLE_SCHEMA", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, "Table_schema", SKIP_OPEN_TABLE}, ++ {"TABLE_NAME", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, "Table_name", SKIP_OPEN_TABLE}, ++ {"INDEX_NAME", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, "Index_name", SKIP_OPEN_TABLE}, ++ {"ROWS_READ", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, "Rows_read", SKIP_OPEN_TABLE}, ++ {0, 0, MYSQL_TYPE_STRING, 0, 0, 0, 0} ++}; ++ ++ + ST_FIELD_INFO processlist_fields_info[]= + { + {"ID", 4, MYSQL_TYPE_LONGLONG, 0, 0, "Id", SKIP_OPEN_TABLE}, +@@ -7680,6 +8094,8 @@ ST_SCHEMA_TABLE schema_tables[]= + { + {"CHARACTER_SETS", charsets_fields_info, create_schema_table, + fill_schema_charsets, make_character_sets_old_format, 0, -1, -1, 0, 0}, ++ {"CLIENT_STATISTICS", client_stats_fields_info, create_schema_table, ++ fill_schema_client_stats, make_old_format, 0, -1, -1, 0, 0}, + {"COLLATIONS", collation_fields_info, create_schema_table, + fill_schema_collation, make_old_format, 0, -1, -1, 0, 0}, + {"COLLATION_CHARACTER_SET_APPLICABILITY", coll_charset_app_fields_info, +@@ -7689,6 +8105,8 @@ ST_SCHEMA_TABLE schema_tables[]= + OPTIMIZE_I_S_TABLE|OPEN_VIEW_FULL}, + {"COLUMN_PRIVILEGES", column_privileges_fields_info, create_schema_table, + fill_schema_column_privileges, 0, 0, -1, -1, 0, 0}, ++ {"INDEX_STATISTICS", index_stats_fields_info, create_schema_table, ++ fill_schema_index_stats, make_old_format, 0, -1, -1, 0, 0}, + {"ENGINES", engines_fields_info, create_schema_table, + fill_schema_engines, make_old_format, 0, -1, -1, 0, 0}, + #ifdef HAVE_EVENT_SCHEDULER +@@ -7751,11 +8169,17 @@ ST_SCHEMA_TABLE schema_tables[]= + get_all_tables, make_table_names_old_format, 0, 1, 2, 1, 0}, + {"TABLE_PRIVILEGES", table_privileges_fields_info, create_schema_table, + fill_schema_table_privileges, 0, 0, -1, -1, 0, 0}, ++ {"TABLE_STATISTICS", table_stats_fields_info, create_schema_table, ++ fill_schema_table_stats, make_old_format, 0, -1, -1, 0, 0}, ++ {"THREAD_STATISTICS", thread_stats_fields_info, create_schema_table, ++ fill_schema_thread_stats, make_old_format, 0, -1, -1, 0, 0}, + {"TRIGGERS", triggers_fields_info, create_schema_table, + get_all_tables, make_old_format, get_schema_triggers_record, 5, 6, 0, + OPEN_TRIGGER_ONLY|OPTIMIZE_I_S_TABLE}, + {"USER_PRIVILEGES", user_privileges_fields_info, create_schema_table, + fill_schema_user_privileges, 0, 0, -1, -1, 0, 0}, ++ {"USER_STATISTICS", user_stats_fields_info, create_schema_table, ++ fill_schema_user_stats, make_old_format, 0, -1, -1, 0, 0}, + {"VARIABLES", variables_fields_info, create_schema_table, fill_variables, + make_old_format, 0, 0, -1, 1, 0}, + {"VIEWS", view_fields_info, create_schema_table, +diff --git a/SOURCES/mysql/sql/sql_update.cc b/SOURCES/mysql/sql/sql_update.cc +index a29d474..2fc7bee 100644 +--- a/SOURCES/mysql/sql/sql_update.cc ++++ b/SOURCES/mysql/sql/sql_update.cc +@@ -924,8 +924,10 @@ int mysql_update(THD *thd, + my_snprintf(buff, sizeof(buff), ER(ER_UPDATE_INFO), (ulong) found, + (ulong) updated, + (ulong) thd->warning_info->statement_warn_count()); +- my_ok(thd, (thd->client_capabilities & CLIENT_FOUND_ROWS) ? found : updated, +- id, buff); ++ ha_rows row_count= ++ (thd->client_capabilities & CLIENT_FOUND_ROWS) ? found : updated; ++ my_ok(thd, row_count, id, buff); ++ thd->updated_row_count += row_count; + DBUG_PRINT("info",("%ld records updated", (long) updated)); + } + thd->count_cuted_fields= CHECK_FIELD_IGNORE; /* calc cuted fields */ +@@ -2282,7 +2284,9 @@ bool multi_update::send_eof() + thd->first_successful_insert_id_in_prev_stmt : 0; + my_snprintf(buff, sizeof(buff), ER(ER_UPDATE_INFO), + (ulong) found, (ulong) updated, (ulong) thd->cuted_fields); +- ::my_ok(thd, (thd->client_capabilities & CLIENT_FOUND_ROWS) ? found : updated, +- id, buff); ++ ha_rows row_count= ++ (thd->client_capabilities & CLIENT_FOUND_ROWS) ? found : updated; ++ ::my_ok(thd, row_count, id, buff); ++ thd->updated_row_count+= row_count; + DBUG_RETURN(FALSE); + } +diff --git a/SOURCES/mysql/sql/sql_yacc.yy b/SOURCES/mysql/sql/sql_yacc.yy +index 13c547c..8613722 100644 +--- a/SOURCES/mysql/sql/sql_yacc.yy ++++ b/SOURCES/mysql/sql/sql_yacc.yy +@@ -866,6 +866,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); + %token CIPHER_SYM + %token CLASS_ORIGIN_SYM /* SQL-2003-N */ + %token CLIENT_SYM ++%token CLIENT_STATS_SYM + %token CLOSE_SYM /* SQL-2003-R */ + %token COALESCE /* SQL-2003-N */ + %token CODE_SYM +@@ -1019,6 +1020,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); + %token IMPORT + %token INDEXES + %token INDEX_SYM ++%token INDEX_STATS_SYM + %token INFILE + %token INITIAL_SIZE_SYM + %token INNER_SYM /* SQL-2003-R */ +@@ -1314,6 +1316,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); + %token TABLESPACE + %token TABLE_REF_PRIORITY + %token TABLE_SYM /* SQL-2003-R */ ++%token TABLE_STATS_SYM + %token TABLE_CHECKSUM_SYM + %token TABLE_NAME_SYM /* SQL-2003-N */ + %token TEMPORARY /* SQL-2003-N */ +@@ -1323,6 +1326,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); + %token TEXT_SYM + %token THAN_SYM + %token THEN_SYM /* SQL-2003-R */ ++%token THREAD_STATS_SYM + %token TIMESTAMP /* SQL-2003-R */ + %token TIMESTAMP_ADD + %token TIMESTAMP_DIFF +@@ -1360,6 +1364,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); + %token UPGRADE_SYM + %token USAGE /* SQL-2003-N */ + %token USER /* SQL-2003-R */ ++%token USER_STATS_SYM + %token USE_FRM + %token USE_SYM + %token USING /* SQL-2003-R */ +@@ -11196,6 +11201,41 @@ show_param: + { + Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; + } ++ | CLIENT_STATS_SYM wild_and_where ++ { ++ LEX *lex= Lex; ++ Lex->sql_command= SQLCOM_SELECT; ++ if (prepare_schema_table(YYTHD, lex, 0, SCH_CLIENT_STATS)) ++ MYSQL_YYABORT; ++ } ++ | USER_STATS_SYM wild_and_where ++ { ++ LEX *lex= Lex; ++ lex->sql_command= SQLCOM_SELECT; ++ if (prepare_schema_table(YYTHD, lex, 0, SCH_USER_STATS)) ++ MYSQL_YYABORT; ++ } ++ | THREAD_STATS_SYM wild_and_where ++ { ++ LEX *lex= Lex; ++ Lex->sql_command= SQLCOM_SELECT; ++ if (prepare_schema_table(YYTHD, lex, 0, SCH_THREAD_STATS)) ++ MYSQL_YYABORT; ++ } ++ | TABLE_STATS_SYM wild_and_where ++ { ++ LEX *lex= Lex; ++ lex->sql_command= SQLCOM_SELECT; ++ if (prepare_schema_table(YYTHD, lex, 0, SCH_TABLE_STATS)) ++ MYSQL_YYABORT; ++ } ++ | INDEX_STATS_SYM wild_and_where ++ { ++ LEX *lex= Lex; ++ lex->sql_command= SQLCOM_SELECT; ++ if (prepare_schema_table(YYTHD, lex, 0, SCH_INDEX_STATS)) ++ MYSQL_YYABORT; ++ } + | CREATE PROCEDURE_SYM sp_name + { + LEX *lex= Lex; +@@ -11438,6 +11478,16 @@ flush_option: + Lex->type|= REFRESH_SLAVE; + Lex->reset_slave_info.all= false; + } ++ | CLIENT_STATS_SYM ++ { Lex->type|= REFRESH_CLIENT_STATS; } ++ | USER_STATS_SYM ++ { Lex->type|= REFRESH_USER_STATS; } ++ | THREAD_STATS_SYM ++ { Lex->type|= REFRESH_THREAD_STATS; } ++ | TABLE_STATS_SYM ++ { Lex->type|= REFRESH_TABLE_STATS; } ++ | INDEX_STATS_SYM ++ { Lex->type|= REFRESH_INDEX_STATS; } + | MASTER_SYM + { Lex->type|= REFRESH_MASTER; } + | DES_KEY_FILE +@@ -12589,6 +12639,7 @@ keyword_sp: + | CHAIN_SYM {} + | CHANGED {} + | CIPHER_SYM {} ++ | CLIENT_STATS_SYM {} + | CLIENT_SYM {} + | CLASS_ORIGIN_SYM {} + | COALESCE {} +@@ -12657,6 +12708,7 @@ keyword_sp: + | HOSTS_SYM {} + | HOUR_SYM {} + | IDENTIFIED_SYM {} ++ | INDEX_STATS_SYM {} + | IGNORE_SERVER_IDS_SYM {} + | INVOKER_SYM {} + | IMPORT {} +@@ -12807,6 +12859,7 @@ keyword_sp: + | SUSPEND_SYM {} + | SWAPS_SYM {} + | SWITCHES_SYM {} ++ | TABLE_STATS_SYM {} + | TABLE_NAME_SYM {} + | TABLES {} + | TABLE_CHECKSUM_SYM {} +@@ -12832,6 +12885,7 @@ keyword_sp: + | UNKNOWN_SYM {} + | UNTIL_SYM {} + | USER {} ++ | USER_STATS_SYM {} + | USE_FRM {} + | VARIABLES {} + | VIEW_SYM {} +diff --git a/SOURCES/mysql/sql/structs.h b/SOURCES/mysql/sql/structs.h +index 8ac855a..af9ce47 100644 +--- a/SOURCES/mysql/sql/structs.h ++++ b/SOURCES/mysql/sql/structs.h +@@ -25,6 +25,7 @@ + #include "my_time.h" /* enum_mysql_timestamp_type */ + #include "thr_lock.h" /* thr_lock_type */ + #include "my_base.h" /* ha_rows, ha_key_alg */ ++#include "mysql_com.h" + + struct TABLE; + class Field; +@@ -218,6 +219,171 @@ typedef struct user_conn { + USER_RESOURCES user_resources; + } USER_CONN; + ++typedef struct st_user_stats { ++ char user[max(USERNAME_LENGTH, LIST_PROCESS_HOST_LEN) + 1]; ++ // Account name the user is mapped to when this is a user from mapped_user. ++ // Otherwise, the same value as user. ++ char priv_user[max(USERNAME_LENGTH, LIST_PROCESS_HOST_LEN) + 1]; ++ uint total_connections; ++ uint concurrent_connections; ++ time_t connected_time; // in seconds ++ double busy_time; // in seconds ++ double cpu_time; // in seconds ++ ulonglong bytes_received; ++ ulonglong bytes_sent; ++ ulonglong binlog_bytes_written; ++ ha_rows rows_fetched, rows_updated, rows_read; ++ ulonglong select_commands, update_commands, other_commands; ++ ulonglong commit_trans, rollback_trans; ++ ulonglong denied_connections, lost_connections; ++ ulonglong access_denied_errors; ++ ulonglong empty_queries; ++} USER_STATS; ++ ++/* Lookup function for my_hash tables with USER_STATS entries */ ++extern "C" uchar *get_key_user_stats(USER_STATS *user_stats, size_t *length, ++ my_bool not_used __attribute__((unused))); ++ ++/* Free all memory for a my_hash table with USER_STATS entries */ ++extern void free_user_stats(USER_STATS* user_stats); ++ ++/* Intialize an instance of USER_STATS */ ++extern void ++init_user_stats(USER_STATS *user_stats, ++ const char *user, ++ const char *priv_user, ++ uint total_connections, ++ uint concurrent_connections, ++ time_t connected_time, ++ double busy_time, ++ double cpu_time, ++ ulonglong bytes_received, ++ ulonglong bytes_sent, ++ ulonglong binlog_bytes_written, ++ ha_rows rows_fetched, ++ ha_rows rows_updated, ++ ha_rows rows_read, ++ ulonglong select_commands, ++ ulonglong update_commands, ++ ulonglong other_commands, ++ ulonglong commit_trans, ++ ulonglong rollback_trans, ++ ulonglong denied_connections, ++ ulonglong lost_connections, ++ ulonglong access_denied_errors, ++ ulonglong empty_queries); ++ ++/* Increment values of an instance of USER_STATS */ ++extern void ++add_user_stats(USER_STATS *user_stats, ++ uint total_connections, ++ uint concurrent_connections, ++ time_t connected_time, ++ double busy_time, ++ double cpu_time, ++ ulonglong bytes_received, ++ ulonglong bytes_sent, ++ ulonglong binlog_bytes_written, ++ ha_rows rows_fetched, ++ ha_rows rows_updated, ++ ha_rows rows_read, ++ ulonglong select_commands, ++ ulonglong update_commands, ++ ulonglong other_commands, ++ ulonglong commit_trans, ++ ulonglong rollback_trans, ++ ulonglong denied_connections, ++ ulonglong lost_connections, ++ ulonglong access_denied_errors, ++ ulonglong empty_queries); ++ ++typedef struct st_thread_stats { ++ my_thread_id id; ++ uint total_connections; ++ uint concurrent_connections; ++ time_t connected_time; // in seconds ++ double busy_time; // in seconds ++ double cpu_time; // in seconds ++ ulonglong bytes_received; ++ ulonglong bytes_sent; ++ ulonglong binlog_bytes_written; ++ ha_rows rows_fetched, rows_updated, rows_read; ++ ulonglong select_commands, update_commands, other_commands; ++ ulonglong commit_trans, rollback_trans; ++ ulonglong denied_connections, lost_connections; ++ ulonglong access_denied_errors; ++ ulonglong empty_queries; ++} THREAD_STATS; ++ ++/* Lookup function for my_hash tables with THREAD_STATS entries */ ++extern "C" uchar *get_key_thread_stats(THREAD_STATS *thread_stats, size_t *length, ++ my_bool not_used __attribute__((unused))); ++ ++/* Free all memory for a my_hash table with THREAD_STATS entries */ ++extern void free_thread_stats(THREAD_STATS* thread_stats); ++ ++/* Intialize an instance of THREAD_STATS */ ++extern void ++init_thread_stats(THREAD_STATS *thread_stats, ++ my_thread_id id, ++ uint total_connections, ++ uint concurrent_connections, ++ time_t connected_time, ++ double busy_time, ++ double cpu_time, ++ ulonglong bytes_received, ++ ulonglong bytes_sent, ++ ulonglong binlog_bytes_written, ++ ha_rows rows_fetched, ++ ha_rows rows_updated, ++ ha_rows rows_read, ++ ulonglong select_commands, ++ ulonglong update_commands, ++ ulonglong other_commands, ++ ulonglong commit_trans, ++ ulonglong rollback_trans, ++ ulonglong denied_connections, ++ ulonglong lost_connections, ++ ulonglong access_denied_errors, ++ ulonglong empty_queries); ++ ++/* Increment values of an instance of THREAD_STATS */ ++extern void ++add_thread_stats(THREAD_STATS *thread_stats, ++ uint total_connections, ++ uint concurrent_connections, ++ time_t connected_time, ++ double busy_time, ++ double cpu_time, ++ ulonglong bytes_received, ++ ulonglong bytes_sent, ++ ulonglong binlog_bytes_written, ++ ha_rows rows_fetched, ++ ha_rows rows_updated, ++ ha_rows rows_read, ++ ulonglong select_commands, ++ ulonglong update_commands, ++ ulonglong other_commands, ++ ulonglong commit_trans, ++ ulonglong rollback_trans, ++ ulonglong denied_connections, ++ ulonglong lost_connections, ++ ulonglong access_denied_errors, ++ ulonglong empty_queries); ++ ++typedef struct st_table_stats { ++ char table[NAME_LEN * 2 + 2]; // [db] + '.' + [table] + '\0' ++ ulonglong rows_read, rows_changed; ++ ulonglong rows_changed_x_indexes; ++ /* Stores enum db_type, but forward declarations cannot be done */ ++ int engine_type; ++} TABLE_STATS; ++ ++typedef struct st_index_stats { ++ char index[NAME_LEN * 3 + 3]; // [db] + '.' + [table] + '.' + [index] + '\0' ++ ulonglong rows_read; ++} INDEX_STATS; ++ + /* Bits in form->update */ + #define REG_MAKE_DUPP 1 /* Make a copy of record when read */ + #define REG_NEW_RECORD 2 /* Write a new record if not found */ +diff --git a/SOURCES/mysql/sql/sys_vars.cc b/SOURCES/mysql/sql/sys_vars.cc +index 1d0f969..864a389 100644 +--- a/SOURCES/mysql/sql/sys_vars.cc ++++ b/SOURCES/mysql/sql/sys_vars.cc +@@ -1692,6 +1692,17 @@ static Sys_var_mybool Sys_readonly( + NO_MUTEX_GUARD, NOT_IN_BINLOG, + ON_CHECK(check_read_only), ON_UPDATE(fix_read_only)); + ++static Sys_var_mybool Sys_userstat( ++ "userstat", ++ "Control USER_STATISTICS, CLIENT_STATISTICS, THREAD_STATISTICS, " ++ "INDEX_STATISTICS and TABLE_STATISTICS running", ++ GLOBAL_VAR(opt_userstat), CMD_LINE(OPT_ARG), DEFAULT(FALSE)); ++ ++static Sys_var_mybool Sys_thread_statistics( ++ "thread_statistics", ++ "Control TABLE_STATISTICS running, when userstat is enabled", ++ GLOBAL_VAR(opt_thread_statistics), CMD_LINE(OPT_ARG), DEFAULT(FALSE)); ++ + // Small lower limit to be able to test MRR + static Sys_var_ulong Sys_read_rnd_buff_size( + "read_rnd_buffer_size", +diff --git a/SOURCES/mysql/storage/myisam/ha_myisam.cc b/SOURCES/mysql/storage/myisam/ha_myisam.cc +index 72a29cd..df1cbbe 100644 +--- a/SOURCES/mysql/storage/myisam/ha_myisam.cc ++++ b/SOURCES/mysql/storage/myisam/ha_myisam.cc +@@ -812,6 +812,7 @@ int ha_myisam::close(void) + + int ha_myisam::write_row(uchar *buf) + { ++ int error; + ha_statistic_increment(&SSV::ha_write_count); + + /* If we have a timestamp column, update it to the current time */ +@@ -824,11 +825,13 @@ int ha_myisam::write_row(uchar *buf) + */ + if (table->next_number_field && buf == table->record[0]) + { +- int error; + if ((error= update_auto_increment())) + return error; + } +- return mi_write(file,buf); ++ error=mi_write(file,buf); ++ if (!error) ++ rows_changed++; ++ return error; + } + + int ha_myisam::check(THD* thd, HA_CHECK_OPT* check_opt) +@@ -1595,16 +1598,24 @@ bool ha_myisam::is_crashed() const + + int ha_myisam::update_row(const uchar *old_data, uchar *new_data) + { ++ int error; + ha_statistic_increment(&SSV::ha_update_count); + if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_UPDATE) + table->timestamp_field->set_time(); +- return mi_update(file,old_data,new_data); ++ error=mi_update(file,old_data,new_data); ++ if (!error) ++ rows_changed++; ++ return error; + } + + int ha_myisam::delete_row(const uchar *buf) + { ++ int error; + ha_statistic_increment(&SSV::ha_delete_count); +- return mi_delete(file,buf); ++ error=mi_delete(file,buf); ++ if (!error) ++ rows_changed++; ++ return error; + } + + int ha_myisam::index_read_map(uchar *buf, const uchar *key, +@@ -1616,6 +1627,14 @@ int ha_myisam::index_read_map(uchar *buf, const uchar *key, + ha_statistic_increment(&SSV::ha_read_key_count); + int error=mi_rkey(file, buf, active_index, key, keypart_map, find_flag); + table->status=error ? STATUS_NOT_FOUND: 0; ++ if (!error) ++ { ++ rows_read++; ++ ++ int inx = (active_index == MAX_KEY) ? file->lastinx : active_index; ++ if (inx >= 0 && inx < MAX_KEY) ++ index_rows_read[inx]++; ++ } + MYSQL_INDEX_READ_ROW_DONE(error); + return error; + } +@@ -1628,6 +1647,14 @@ int ha_myisam::index_read_idx_map(uchar *buf, uint index, const uchar *key, + ha_statistic_increment(&SSV::ha_read_key_count); + int error=mi_rkey(file, buf, index, key, keypart_map, find_flag); + table->status=error ? STATUS_NOT_FOUND: 0; ++ if (!error) ++ { ++ rows_read++; ++ ++ int inx = index; ++ if (inx >= 0 && inx < MAX_KEY) ++ index_rows_read[inx]++; ++ } + MYSQL_INDEX_READ_ROW_DONE(error); + return error; + } +@@ -1642,6 +1669,14 @@ int ha_myisam::index_read_last_map(uchar *buf, const uchar *key, + int error=mi_rkey(file, buf, active_index, key, keypart_map, + HA_READ_PREFIX_LAST); + table->status=error ? STATUS_NOT_FOUND: 0; ++ if (!error) ++ { ++ rows_read++; ++ ++ int inx = (active_index == MAX_KEY) ? file->lastinx : active_index; ++ if (inx >= 0 && inx < MAX_KEY) ++ index_rows_read[inx]++; ++ } + MYSQL_INDEX_READ_ROW_DONE(error); + DBUG_RETURN(error); + } +@@ -1653,6 +1688,13 @@ int ha_myisam::index_next(uchar *buf) + ha_statistic_increment(&SSV::ha_read_next_count); + int error=mi_rnext(file,buf,active_index); + table->status=error ? STATUS_NOT_FOUND: 0; ++ if (!error) { ++ rows_read++; ++ ++ int inx = (active_index == MAX_KEY) ? file->lastinx : active_index; ++ if (inx >= 0 && inx < MAX_KEY) ++ index_rows_read[inx]++; ++ } + MYSQL_INDEX_READ_ROW_DONE(error); + return error; + } +@@ -1664,6 +1706,13 @@ int ha_myisam::index_prev(uchar *buf) + ha_statistic_increment(&SSV::ha_read_prev_count); + int error=mi_rprev(file,buf, active_index); + table->status=error ? STATUS_NOT_FOUND: 0; ++ if (!error) { ++ rows_read++; ++ ++ int inx = (active_index == MAX_KEY) ? file->lastinx : active_index; ++ if (inx >= 0 && inx < MAX_KEY) ++ index_rows_read[inx]++; ++ } + MYSQL_INDEX_READ_ROW_DONE(error); + return error; + } +@@ -1675,6 +1724,14 @@ int ha_myisam::index_first(uchar *buf) + ha_statistic_increment(&SSV::ha_read_first_count); + int error=mi_rfirst(file, buf, active_index); + table->status=error ? STATUS_NOT_FOUND: 0; ++ if (!error) ++ { ++ rows_read++; ++ ++ int inx = (active_index == MAX_KEY) ? file->lastinx : active_index; ++ if (inx >= 0 && inx < MAX_KEY) ++ index_rows_read[inx]++; ++ } + MYSQL_INDEX_READ_ROW_DONE(error); + return error; + } +@@ -1686,6 +1743,14 @@ int ha_myisam::index_last(uchar *buf) + ha_statistic_increment(&SSV::ha_read_last_count); + int error=mi_rlast(file, buf, active_index); + table->status=error ? STATUS_NOT_FOUND: 0; ++ if (!error) ++ { ++ rows_read++; ++ ++ int inx = (active_index == MAX_KEY) ? file->lastinx : active_index; ++ if (inx >= 0 && inx < MAX_KEY) ++ index_rows_read[inx]++; ++ } + MYSQL_INDEX_READ_ROW_DONE(error); + return error; + } +@@ -1703,6 +1768,14 @@ int ha_myisam::index_next_same(uchar *buf, + error= mi_rnext_same(file,buf); + } while (error == HA_ERR_RECORD_DELETED); + table->status=error ? STATUS_NOT_FOUND: 0; ++ if (!error) ++ { ++ rows_read++; ++ ++ int inx = (active_index == MAX_KEY) ? file->lastinx : active_index; ++ if (inx >= 0 && inx < MAX_KEY) ++ index_rows_read[inx]++; ++ } + MYSQL_INDEX_READ_ROW_DONE(error); + return error; + } +@@ -1722,6 +1795,8 @@ int ha_myisam::rnd_next(uchar *buf) + ha_statistic_increment(&SSV::ha_read_rnd_next_count); + int error=mi_scan(file, buf); + table->status=error ? STATUS_NOT_FOUND: 0; ++ if (!error) ++ rows_read++; + MYSQL_READ_ROW_DONE(error); + return error; + } +@@ -1738,6 +1813,8 @@ int ha_myisam::rnd_pos(uchar *buf, uchar *pos) + ha_statistic_increment(&SSV::ha_read_rnd_count); + int error=mi_rrnd(file, buf, my_get_ptr(pos,ref_length)); + table->status=error ? STATUS_NOT_FOUND: 0; ++ if (!error) ++ rows_read++; + MYSQL_READ_ROW_DONE(error); + return error; + } +-- +1.8.3.4 + diff --git a/mysql55/0003_1-Clean-up-stale-pid-files-in-datadir-when-stopping-to.patch b/mysql55/0003_1-Clean-up-stale-pid-files-in-datadir-when-stopping-to.patch new file mode 100644 index 0000000..16d59ea --- /dev/null +++ b/mysql55/0003_1-Clean-up-stale-pid-files-in-datadir-when-stopping-to.patch @@ -0,0 +1,47 @@ +diff --git a/support-files/mysql.server.sh b/support-files/mysql.server.sh +index eeeab2a..5e4feb9 100644 +--- a/support-files/mysql.server.sh ++++ b/support-files/mysql.server.sh +@@ -225,6 +225,31 @@ wait_for_pid () { + fi + } + ++clean_up_stale_pid_files(){ ++ ++ # Clean up any stale pid files in $datadir ++ if [ -d "$datadir" ] ++ then ++ ++ PID_FILE_PATT="$datadir/*.pid" ++ PID_FILE_LIST=`ls -1 $PID_FILE_PATT 2>/dev/null` ++ ++ for item in $PID_FILE_LIST; ++ do ++ # Clean up empty pid file ++ [ ! -s $item ] && rm -f $item && continue ++ ++ # Clean up invalid/stale pid file ++ pidnum=$(cat $item); ++ process_found=$(pstree -p $pidnum 2> /dev/null) ++ [ -z "$process_found" ] && rm -f $item ++ done ++ fi ++ ++ return 0 ++} ++ ++ + # Get arguments from the my.cnf file, + # the only group, which is read from now on is [mysqld] + if test -x ./bin/my_print_defaults +@@ -323,6 +348,10 @@ case "$mode" in + ;; + + 'stop') ++ ++ # Clean up any stale pid files in $datadir ++ clean_up_stale_pid_files ++ + # Stop daemon. We use a signal here to avoid having to know the + # root password. + diff --git a/mysql55/0005-Use-accessors-and-fix-type-errors.patch b/mysql55/0005-Use-accessors-and-fix-type-errors.patch new file mode 100644 index 0000000..9a54b35 --- /dev/null +++ b/mysql55/0005-Use-accessors-and-fix-type-errors.patch @@ -0,0 +1,49 @@ +From 208a9b5094bd780ea3368d968223ed21403e1e9e Mon Sep 17 00:00:00 2001 +From: Rikus Goodell +Date: Fri, 20 Sep 2013 11:23:51 -0500 +Subject: [PATCH 5/6] Use accessors and fix type errors. + +Update the CloudLinux patch to use accessors instead of accessing +the class variables directly. This is necessary because the variables +have become private. + +A type error has also been corrected by converting a String to a +C string in two spots. +--- + SOURCES/mysql/sql/sql_class.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/SOURCES/mysql/sql/sql_class.cc b/SOURCES/mysql/sql/sql_class.cc +index 99db9ab..f000199 100644 +--- a/SOURCES/mysql/sql/sql_class.cc ++++ b/SOURCES/mysql/sql/sql_class.cc +@@ -2119,7 +2119,7 @@ char *THD::get_client_host_port(THD *client) + Security_context *client_sctx= client->security_ctx; + char *client_host= NULL; + +- if (client->peer_port && (client_sctx->host || client_sctx->ip) && ++ if (client->peer_port && (client_sctx->get_host() || client_sctx->get_ip()) && + security_ctx->host_or_ip[0]) + { + if ((client_host= (char *) this->alloc(LIST_PROCESS_HOST_LEN+1))) +@@ -2129,7 +2129,7 @@ char *THD::get_client_host_port(THD *client) + else + client_host= this->strdup(client_sctx->host_or_ip[0] ? + client_sctx->host_or_ip : +- client_sctx->host ? client_sctx->host : ""); ++ client_sctx->get_host() ? client_sctx->get_host()->c_ptr_safe() : ""); + + return client_host; + } +@@ -2138,7 +2138,7 @@ const char *get_client_host(THD *client) + { + return client->security_ctx->host_or_ip[0] ? + client->security_ctx->host_or_ip : +- client->security_ctx->host ? client->security_ctx->host : ""; ++ client->security_ctx->get_host() ? client->security_ctx->get_host()->c_ptr_safe() : ""; + } + + struct Item_change_record: public ilink +-- +1.8.3.4 + diff --git a/mysql55/README.mysql-docs b/mysql55/README.mysql-docs new file mode 100644 index 0000000..dd894a7 --- /dev/null +++ b/mysql55/README.mysql-docs @@ -0,0 +1,4 @@ +The official MySQL documentation is not freely redistributable, so we cannot +include it in RHEL or Fedora. You can find it on-line at + +http://dev.mysql.com/doc/ diff --git a/mysql55/README.mysql-license b/mysql55/README.mysql-license new file mode 100644 index 0000000..1282653 --- /dev/null +++ b/mysql55/README.mysql-license @@ -0,0 +1,6 @@ +MySQL is distributed under GPL v2, but there are some licensing exceptions +that allow the client libraries to be linked with a non-GPL application, +so long as the application is under a license approved by Oracle. +For details see + +http://www.mysql.com/about/legal/licensing/foss-exception/ diff --git a/mysql55/filter-requires-mysql.sh b/mysql55/filter-requires-mysql.sh new file mode 100755 index 0000000..bce04c6 --- /dev/null +++ b/mysql55/filter-requires-mysql.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +/usr/lib/rpm/perl.req $* | \ + grep -v -e "perl(th" \ + -e "perl(lib::mtr" -e "perl(lib::v1/mtr" -e "perl(mtr" diff --git a/mysql55/libmysql.version b/mysql55/libmysql.version new file mode 100644 index 0000000..35dbc64 --- /dev/null +++ b/mysql55/libmysql.version @@ -0,0 +1,150 @@ +# symbols exported from mysql 5.1 +libmysqlclient_16 { + global: + _fini; + _init; + my_init; + myodbc_remove_escape; + mysql_affected_rows; + mysql_autocommit; + mysql_change_user; + mysql_character_set_name; + mysql_close; + mysql_commit; + mysql_data_seek; + mysql_debug; + mysql_dump_debug_info; + mysql_embedded; + mysql_eof; + mysql_errno; + mysql_error; + mysql_escape_string; + mysql_fetch_field; + mysql_fetch_field_direct; + mysql_fetch_fields; + mysql_fetch_lengths; + mysql_fetch_row; + mysql_field_count; + mysql_field_seek; + mysql_field_tell; + mysql_free_result; + mysql_get_character_set_info; + mysql_get_client_info; + mysql_get_client_version; + mysql_get_host_info; + mysql_get_parameters; + mysql_get_proto_info; + mysql_get_server_info; + mysql_get_server_version; + mysql_get_ssl_cipher; + mysql_hex_string; + mysql_info; + mysql_init; + mysql_insert_id; + mysql_kill; + mysql_list_dbs; + mysql_list_fields; + mysql_list_processes; + mysql_list_tables; + mysql_more_results; + mysql_next_result; + mysql_num_fields; + mysql_num_rows; + mysql_options; + mysql_ping; + mysql_query; + mysql_read_query_result; + mysql_real_connect; + mysql_real_escape_string; + mysql_real_query; + mysql_refresh; + mysql_rollback; + mysql_row_seek; + mysql_row_tell; + mysql_select_db; + mysql_send_query; + mysql_server_end; + mysql_server_init; + mysql_set_character_set; + mysql_set_local_infile_default; + mysql_set_local_infile_handler; + mysql_set_server_option; + mysql_shutdown; + mysql_sqlstate; + mysql_ssl_set; + mysql_stat; + mysql_stmt_affected_rows; + mysql_stmt_attr_get; + mysql_stmt_attr_set; + mysql_stmt_bind_param; + mysql_stmt_bind_result; + mysql_stmt_close; + mysql_stmt_data_seek; + mysql_stmt_errno; + mysql_stmt_error; + mysql_stmt_execute; + mysql_stmt_fetch; + mysql_stmt_fetch_column; + mysql_stmt_field_count; + mysql_stmt_free_result; + mysql_stmt_init; + mysql_stmt_insert_id; + mysql_stmt_num_rows; + mysql_stmt_param_count; + mysql_stmt_param_metadata; + mysql_stmt_prepare; + mysql_stmt_reset; + mysql_stmt_result_metadata; + mysql_stmt_row_seek; + mysql_stmt_row_tell; + mysql_stmt_send_long_data; + mysql_stmt_sqlstate; + mysql_stmt_store_result; + mysql_store_result; + mysql_thread_end; + mysql_thread_id; + mysql_thread_init; + mysql_thread_safe; + mysql_use_result; + mysql_warning_count; +# These are documented in Paul DuBois' MySQL book, so we treat them as part +# of the de-facto API. + free_defaults; + handle_options; + load_defaults; + my_print_help; +# This isn't really documented anywhere, but it seems to be part of the +# de-facto API as well. We're not going to export the deprecated version +# make_scrambled_password, however. + my_make_scrambled_password; +# This really shouldn't be exported, but some applications use it as a +# workaround for inadequate threading support; see bug #846602 + THR_KEY_mysys; + local: + *; +}; +# symbols added in mysql 5.5 +libmysqlclient_18 { + global: + mysql_client_find_plugin; + mysql_client_register_plugin; + mysql_load_plugin; + mysql_load_plugin_v; + mysql_plugin_options; + mysql_stmt_next_result; +# +# Ideally the following symbols wouldn't be exported, but various applications +# require them. We limit the namespace damage by prefixing mysql_ +# (see mysql-dubious-exports.patch), which means the symbols are not present +# in libmysqlclient_16. +# +# mysql-connector-odbc requires these + mysql_default_charset_info; + mysql_get_charset; + mysql_get_charset_by_csname; + mysql_net_realloc; +# PHP's mysqli.so requires this (via the ER() macro) + mysql_client_errors; +# mydumper requires this (added by remi) + my_net_read; +}; diff --git a/mysql55/max_connection2_mysql_5_5_30_b404.patch b/mysql55/max_connection2_mysql_5_5_30_b404.patch new file mode 100644 index 0000000..63ad376 --- /dev/null +++ b/mysql55/max_connection2_mysql_5_5_30_b404.patch @@ -0,0 +1,1669 @@ +diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt +index b2b64a0..6acfb34 100644 +--- a/include/CMakeLists.txt ++++ b/include/CMakeLists.txt +@@ -54,6 +54,7 @@ SET(HEADERS + m_ctype.h + my_attribute.h + my_compiler.h ++ governor.h + ${HEADERS_GEN_CONFIGURE} + ) + +diff --git a/include/governor.h b/include/governor.h +new file mode 100644 +index 0000000..7ee5698 +--- /dev/null ++++ b/include/governor.h +@@ -0,0 +1,14 @@ ++/* ++ * governor_pthread_wrapper.h ++ * ++ * Created on: Sep 26, 2012 ++ * Author: alexey ++*/ ++ ++#ifndef GOVERNOR_PTHREAD_WRAPPER_H_ ++#define GOVERNOR_PTHREAD_WRAPPER_H_ ++ ++#include ++ ++ ++#endif /* GOVERNOR_PTHREAD_WRAPPER_H_ */ +diff --git a/include/my_pthread.h b/include/my_pthread.h +index e521564..a45ad34 100644 +--- a/include/my_pthread.h ++++ b/include/my_pthread.h +@@ -192,6 +192,7 @@ int pthread_cancel(pthread_t thread); + #include + #undef sigwait + #endif ++#include + #include + #ifndef _REENTRANT + #define _REENTRANT +@@ -497,6 +498,13 @@ typedef struct st_safe_mutex_info_t + } safe_mutex_info_t; + #endif /* SAFE_MUTEX_DETECT_DESTROY */ + ++int put_in_lve(char *user); ++void lve_thr_exit(); ++void governor_setlve_mysql_thread_info(pid_t thread_id); ++void governor_detroy_mysql_thread_info(); ++__attribute__((noinline)) void my_release_slot(); ++__attribute__((noinline)) void my_reserve_slot(); ++ + int safe_mutex_init(safe_mutex_t *mp, const pthread_mutexattr_t *attr, + const char *file, uint line); + int safe_mutex_lock(safe_mutex_t *mp, my_bool try_lock, const char *file, uint line); +@@ -512,6 +520,8 @@ void safe_mutex_end(FILE *file); + + /* Wrappers if safe mutex is actually used */ + #ifdef SAFE_MUTEX ++ ++ + #undef pthread_mutex_init + #undef pthread_mutex_lock + #undef pthread_mutex_unlock +@@ -565,12 +575,22 @@ int my_pthread_fastmutex_lock(my_pthread_fastmutex_t *mp); + #undef pthread_cond_timedwait + #undef pthread_mutex_trylock + #define pthread_mutex_init(A,B) my_pthread_fastmutex_init((A),(B)) +-#define pthread_mutex_lock(A) my_pthread_fastmutex_lock(A) +-#define pthread_mutex_unlock(A) pthread_mutex_unlock(&(A)->mutex) ++ ++int put_in_lve(char *user); ++void lve_thr_exit(); ++void governor_setlve_mysql_thread_info(pid_t thread_id); ++void governor_detroy_mysql_thread_info(); ++__attribute__ ((noinline)) int my_pthread_lvemutex_unlock(pthread_mutex_t *mutex); ++__attribute__ ((noinline)) int my_pthread_lvemutex_lock(my_pthread_fastmutex_t *mp); ++__attribute__ ((noinline)) int my_pthread_lvemutex_trylock(pthread_mutex_t *mutex); ++__attribute__((noinline)) void my_release_slot(); ++__attribute__((noinline)) void my_reserve_slot(); ++#define pthread_mutex_lock(A) my_pthread_lvemutex_lock(A) ++#define pthread_mutex_unlock(A) my_pthread_lvemutex_unlock(&(A)->mutex) ++#define pthread_mutex_trylock(A) my_pthread_lvemutex_trylock(&(A)->mutex) + #define pthread_mutex_destroy(A) pthread_mutex_destroy(&(A)->mutex) + #define pthread_cond_wait(A,B) pthread_cond_wait((A),&(B)->mutex) + #define pthread_cond_timedwait(A,B,C) pthread_cond_timedwait((A),&(B)->mutex,(C)) +-#define pthread_mutex_trylock(A) pthread_mutex_trylock(&(A)->mutex) + #define pthread_mutex_t my_pthread_fastmutex_t + #endif /* defined(MY_PTHREAD_FASTMUTEX) && !defined(SAFE_MUTEX) */ + +diff --git a/max_connection2_mysql_5_5_30_b403.patch b/max_connection2_mysql_5_5_30_b403.patch +new file mode 100644 +index 0000000..8eba89d +diff --git a/mysys/thr_mutex.c b/mysys/thr_mutex.c +index 4d05139..4c8cec2 100644 +--- a/mysys/thr_mutex.c ++++ b/mysys/thr_mutex.c +@@ -25,12 +25,49 @@ + #include "my_static.h" + #include + ++void * (*governor_load_lve_library)() = NULL; ++int (*governor_init_lve)() = NULL; ++void (*governor_destroy_lve)() = NULL; ++int (*governor_enter_lve)(uint32_t *, char *) = NULL; ++void (*governor_lve_exit)(uint32_t *) = NULL; ++int (*governor_enter_lve_light)(uint32_t *) = NULL; ++void (*governor_lve_exit_null)() = NULL; ++int (*governor_lve_enter_pid)(pid_t) = NULL; ++ ++void governor_setlve_mysql_thread_info(pid_t thread_id) { ++ thread_id = 0; ++ return; ++} ++ ++__attribute__((noinline)) int put_in_lve(char *user) { ++ user = NULL; ++ return 0; ++} ++ ++__attribute__((noinline)) void lve_thr_exit() { ++ return; ++} ++ ++void governor_detroy_mysql_thread_info(){ ++ return; ++} ++ ++__attribute__((noinline)) void my_release_slot(){ ++ return; ++} ++ ++__attribute__((noinline)) void my_reserve_slot(){ ++ return; ++} ++ ++ + #ifndef DO_NOT_REMOVE_THREAD_WRAPPERS + /* Remove wrappers */ + #undef pthread_mutex_t + #undef pthread_mutex_init + #undef pthread_mutex_lock + #undef pthread_mutex_unlock ++#undef pthread_mutex_trylock + #undef pthread_mutex_destroy + #undef pthread_cond_wait + #undef pthread_cond_timedwait +@@ -399,6 +436,8 @@ void safe_mutex_end(FILE *file __attribute__((unused))) + + #if defined(MY_PTHREAD_FASTMUTEX) && !defined(SAFE_MUTEX) + ++#include ++ + #include "mysys_priv.h" + #include "my_static.h" + #include +@@ -492,6 +531,298 @@ int my_pthread_fastmutex_lock(my_pthread_fastmutex_t *mp) + return pthread_mutex_lock(&mp->mutex); + } + ++void * (*governor_load_lve_library)() = NULL; ++int (*governor_init_lve)() = NULL; ++void (*governor_destroy_lve)() = NULL; ++int (*governor_enter_lve)(uint32_t *, char *) = NULL; ++void (*governor_lve_exit)(uint32_t *) = NULL; ++int (*governor_enter_lve_light)(uint32_t *) = NULL; ++void (*governor_lve_exit_null)() = NULL; ++int (*governor_lve_enter_pid)(pid_t) = NULL; ++ ++extern CHARSET_INFO my_charset_latin1_bin; ++CHARSET_INFO governor_charset_bin; ++ ++__thread uint32_t lve_cookie = 0; ++ ++pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; ++ ++typedef struct __mysql_mutex { ++ pid_t *key; ++ int is_in_lve; ++ int is_in_mutex; ++ int put_in_lve; ++} mysql_mutex; ++ ++static HASH *mysql_lve_mutex_governor = NULL; ++ ++__thread mysql_mutex *mysql_lve_mutex_governor_ptr = 0; ++ ++pthread_mutex_t mtx_mysql_lve_mutex_governor_ptr = PTHREAD_MUTEX_INITIALIZER; ++ ++void governor_value_destroyed(mysql_mutex *data) { ++ free(data); ++} ++ ++uchar *governor_get_key_table_mutex(mysql_mutex *table_mutex, size_t *length, ++ my_bool not_used __attribute__((unused))) { ++ *length = sizeof(table_mutex->key); ++ return (uchar*) table_mutex->key; ++} ++ ++/* +++ * RETURN +++ * < 0 s < t +++ * 0 s == t +++ * > 0 s > t +++ */ ++int governor_my_strnncoll_8bit_bin(CHARSET_INFO * cs __attribute__((unused)), const uchar *s, ++ size_t slen, const uchar *t, size_t tlen, my_bool t_is_prefix) { ++ int res = 0; ++ pid_t s1 = (pid_t)s, t1 = (pid_t)t; ++ if (s1 < t1) ++ res = -1; ++ else if (s1 == t1) ++ res = 0; ++ else ++ res = 1; ++ return res; ++} ++ ++void governor_hash_sort_8bit_bin(CHARSET_INFO *cs __attribute__((unused)), ++ const uchar *key, size_t len, ++ ulong *nr1, ulong *nr2) ++{ ++ return; ++} ++ ++HASH *governor_create_hash_table() { ++ mysql_lve_mutex_governor = (HASH *) calloc(1, sizeof(HASH)); ++ if (mysql_lve_mutex_governor) { ++ memcpy(&governor_charset_bin, &my_charset_latin1_bin, ++ sizeof(CHARSET_INFO)); ++ governor_charset_bin.coll->strnncoll = governor_my_strnncoll_8bit_bin; ++ governor_charset_bin.coll->hash_sort = governor_hash_sort_8bit_bin; ++ if (my_hash_init(mysql_lve_mutex_governor, &governor_charset_bin, 500, 0, ++ 0, (my_hash_get_key) governor_get_key_table_mutex, ++ (my_hash_free_key) governor_value_destroyed, 0)) { ++ mysql_lve_mutex_governor = NULL; ++ } ++ } ++ return mysql_lve_mutex_governor; ++} ++ ++int governor_add_mysql_thread_info() { ++ pid_t *buf = NULL; ++ pthread_mutex_lock(&mtx_mysql_lve_mutex_governor_ptr); ++ mysql_mutex *mm = NULL; ++ if (!mysql_lve_mutex_governor) { ++ mysql_lve_mutex_governor = governor_create_hash_table(); ++ if (!mysql_lve_mutex_governor){ ++ pthread_mutex_unlock(&mtx_mysql_lve_mutex_governor_ptr); ++ return -1; ++ } ++ } ++ buf = (pid_t *)syscall(__NR_gettid); ++ mm = (mysql_mutex *) my_hash_search(mysql_lve_mutex_governor, ++ (uchar *) buf, sizeof(buf)); ++ if (!mm) { ++ mm = (mysql_mutex *) calloc(1, sizeof(mysql_mutex)); ++ if (!mm) ++ return -1; ++ mm->key = (pid_t *)syscall(__NR_gettid); ++ if (my_hash_insert(mysql_lve_mutex_governor, (uchar *) mm)) { ++ free(mm); ++ pthread_mutex_unlock(&mtx_mysql_lve_mutex_governor_ptr); ++ return -1; ++ } ++ } ++ pthread_mutex_unlock(&mtx_mysql_lve_mutex_governor_ptr); ++ mysql_lve_mutex_governor_ptr = mm; ++ return 0; ++} ++ ++void governor_remove_mysql_thread_info() { ++ pid_t *buf = NULL; ++ pthread_mutex_lock(&mtx_mysql_lve_mutex_governor_ptr); ++ mysql_mutex *mm = NULL; ++ if (mysql_lve_mutex_governor) { ++ buf = (pid_t *)syscall(__NR_gettid); ++ mm = (mysql_mutex *) my_hash_search(mysql_lve_mutex_governor, ++ (uchar *) buf, sizeof(buf)); ++ if (mm) ++ my_hash_delete(mysql_lve_mutex_governor, (uchar *) mm); ++ } ++ pthread_mutex_unlock(&mtx_mysql_lve_mutex_governor_ptr); ++ mysql_lve_mutex_governor_ptr = NULL; ++} ++ ++void governor_setlve_mysql_thread_info(pid_t thread_id) { ++ pid_t *buf = NULL; ++ pthread_mutex_lock(&mtx_mysql_lve_mutex_governor_ptr); ++ mysql_mutex *mm = NULL; ++ if (mysql_lve_mutex_governor) { ++ buf = (pid_t *)thread_id; ++ mm = (mysql_mutex *) my_hash_search(mysql_lve_mutex_governor, ++ (uchar *) buf, sizeof(buf)); ++ if (mm) { ++ if (!mm->is_in_lve) { ++ mm->put_in_lve = 1; ++ //if (mm->is_in_mutex) { ++ // mm->put_in_lve = 1; ++ //} else { ++ // mm->put_in_lve = 1; ++ // governor_lve_enter_pid(thread_id); ++ //} ++ } ++ } ++ } ++ pthread_mutex_unlock(&mtx_mysql_lve_mutex_governor_ptr); ++} ++ ++void governor_detroy_mysql_thread_info() { ++ if (mysql_lve_mutex_governor) { ++ pthread_mutex_lock(&mtx_mysql_lve_mutex_governor_ptr); ++ my_hash_free(mysql_lve_mutex_governor); ++ free(mysql_lve_mutex_governor); ++ pthread_mutex_unlock(&mtx_mysql_lve_mutex_governor_ptr); ++ } ++} ++ ++__attribute__((noinline)) int put_in_lve(char *user) { ++ if (governor_add_mysql_thread_info()<0) return -1; ++ if (mysql_lve_mutex_governor_ptr) { ++ if (!governor_enter_lve(&lve_cookie, user)) { ++ mysql_lve_mutex_governor_ptr->is_in_lve = 1; ++ } ++ mysql_lve_mutex_governor_ptr->is_in_mutex = 0; ++ } ++ return 0; ++} ++ ++__attribute__((noinline)) void lve_thr_exit() { ++ if (mysql_lve_mutex_governor_ptr && mysql_lve_mutex_governor_ptr->is_in_lve ++ == 1) { ++ governor_lve_exit(&lve_cookie); ++ mysql_lve_mutex_governor_ptr->is_in_lve = 0; ++ } ++ governor_remove_mysql_thread_info(); ++} ++ ++__attribute__((noinline)) int my_pthread_lvemutex_lock(my_pthread_fastmutex_t *mp) { ++ if (mysql_lve_mutex_governor_ptr) { ++ if (mysql_lve_mutex_governor_ptr->is_in_lve == 1) { ++ governor_lve_exit(&lve_cookie); ++ mysql_lve_mutex_governor_ptr->is_in_lve = 2; ++ } else if (mysql_lve_mutex_governor_ptr->is_in_lve > 1) { ++ mysql_lve_mutex_governor_ptr->is_in_lve++; ++ } /*else if (mysql_lve_mutex_governor_ptr->put_in_lve ++ && !mysql_lve_mutex_governor_ptr->is_in_mutex) { ++ //governor_lve_exit_null(); ++ mysql_lve_mutex_governor_ptr->put_in_lve = 0; ++ mysql_lve_mutex_governor_ptr->is_in_lve = 2; ++ }*/ ++ mysql_lve_mutex_governor_ptr->is_in_mutex++; ++ } ++ return my_pthread_fastmutex_lock(mp); ++} ++ ++__attribute__((noinline)) int my_pthread_lvemutex_trylock(pthread_mutex_t *mutex) { ++ if (mysql_lve_mutex_governor_ptr) { ++ if (mysql_lve_mutex_governor_ptr->is_in_lve == 1) { ++ governor_lve_exit(&lve_cookie); ++ } ++ } ++ int ret = pthread_mutex_trylock(mutex); ++ if (mysql_lve_mutex_governor_ptr) { ++ if (ret != EBUSY){ ++ if (mysql_lve_mutex_governor_ptr->is_in_lve == 1) { ++ mysql_lve_mutex_governor_ptr->is_in_lve = 2; ++ } else if (mysql_lve_mutex_governor_ptr->is_in_lve > 1) { ++ mysql_lve_mutex_governor_ptr->is_in_lve++; ++ } ++ mysql_lve_mutex_governor_ptr->is_in_mutex++; ++ } else { ++ if (mysql_lve_mutex_governor_ptr->is_in_lve == 1){ ++ if (!governor_enter_lve_light(&lve_cookie)) { ++ mysql_lve_mutex_governor_ptr->is_in_lve = 1; ++ } else { ++ mysql_lve_mutex_governor_ptr->is_in_lve = 0; ++ } ++ } ++ } ++ } ++ return ret; ++} ++ ++ ++__attribute__((noinline)) int my_pthread_lvemutex_unlock( ++ pthread_mutex_t *mutex) { ++ int ret = pthread_mutex_unlock(mutex); ++ if (mysql_lve_mutex_governor_ptr) { ++ if ((mysql_lve_mutex_governor_ptr->is_in_lve == 2) ++ && governor_enter_lve_light) { ++ if (!governor_enter_lve_light(&lve_cookie)) { ++ mysql_lve_mutex_governor_ptr->is_in_lve = 1; ++ } ++ } else if (mysql_lve_mutex_governor_ptr->is_in_lve > 2) { ++ mysql_lve_mutex_governor_ptr->is_in_lve--; ++ } ++ mysql_lve_mutex_governor_ptr->is_in_mutex--; ++ /*if (mysql_lve_mutex_governor_ptr->put_in_lve ++ && !mysql_lve_mutex_governor_ptr->is_in_mutex) { ++ if (governor_enter_lve_light && !governor_enter_lve_light( ++ &lve_cookie)) { ++ mysql_lve_mutex_governor_ptr->is_in_lve = 1; ++ mysql_lve_mutex_governor_ptr->put_in_lve = 0; ++ } ++ }*/ ++ } ++ return ret; ++} ++ ++__attribute__((noinline)) void my_reserve_slot() { ++ if (mysql_lve_mutex_governor_ptr) { ++ if (mysql_lve_mutex_governor_ptr->is_in_lve == 1) { ++ governor_lve_exit(&lve_cookie); ++ mysql_lve_mutex_governor_ptr->is_in_lve = 2; ++ } else if (mysql_lve_mutex_governor_ptr->is_in_lve > 1) { ++ mysql_lve_mutex_governor_ptr->is_in_lve++; ++ } /*else if (mysql_lve_mutex_governor_ptr->put_in_lve ++ && !mysql_lve_mutex_governor_ptr->is_in_mutex) { ++ //governor_lve_exit_null(); ++ mysql_lve_mutex_governor_ptr->put_in_lve = 0; ++ mysql_lve_mutex_governor_ptr->is_in_lve = 2; ++ }*/ ++ mysql_lve_mutex_governor_ptr->is_in_mutex++; ++ } ++ return; ++} ++ ++__attribute__((noinline)) void my_release_slot() { ++ if (mysql_lve_mutex_governor_ptr) { ++ if ((mysql_lve_mutex_governor_ptr->is_in_lve == 2) ++ && governor_enter_lve_light) { ++ if (!governor_enter_lve_light(&lve_cookie)) { ++ mysql_lve_mutex_governor_ptr->is_in_lve = 1; ++ } ++ } else if (mysql_lve_mutex_governor_ptr->is_in_lve > 2) { ++ mysql_lve_mutex_governor_ptr->is_in_lve--; ++ } ++ mysql_lve_mutex_governor_ptr->is_in_mutex--; ++ /*if (mysql_lve_mutex_governor_ptr->put_in_lve ++ && !mysql_lve_mutex_governor_ptr->is_in_mutex) { ++ if (governor_enter_lve_light && !governor_enter_lve_light( ++ &lve_cookie)) { ++ mysql_lve_mutex_governor_ptr->is_in_lve = 1; ++ mysql_lve_mutex_governor_ptr->put_in_lve = 0; ++ } ++ }*/ ++ } ++ return; ++} ++ ++ + + void fastmutex_global_init(void) + { +@@ -501,3 +832,45 @@ void fastmutex_global_init(void) + } + + #endif /* defined(MY_PTHREAD_FASTMUTEX) && !defined(SAFE_MUTEX) */ ++ ++#if !defined(MY_PTHREAD_FASTMUTEX) && !defined(SAFE_MUTEX) ++ ++#include ++ ++void * (*governor_load_lve_library)() = NULL; ++int (*governor_init_lve)() = NULL; ++void (*governor_destroy_lve)() = NULL; ++int (*governor_enter_lve)(uint32_t *, char *) = NULL; ++void (*governor_lve_exit)(uint32_t *) = NULL; ++int (*governor_enter_lve_light)(uint32_t *) = NULL; ++void (*governor_lve_exit_null)() = NULL; ++int (*governor_lve_enter_pid)(pid_t) = NULL; ++ ++void governor_setlve_mysql_thread_info(pid_t thread_id) { ++ thread_id = 0; ++ return; ++} ++ ++__attribute__((noinline)) int put_in_lve(char *user) { ++ user = NULL; ++ return 0; ++} ++ ++__attribute__((noinline)) void lve_thr_exit() { ++ return; ++} ++ ++void governor_detroy_mysql_thread_info(){ ++ return; ++} ++ ++__attribute__((noinline)) void my_release_slot(){ ++ return; ++} ++ ++__attribute__((noinline)) void my_reserve_slot(){ ++ return; ++} ++ ++ ++#endif +diff --git a/sql/lex.h b/sql/lex.h +index 9e90725..33e6d12 100644 +--- a/sql/lex.h ++++ b/sql/lex.h +@@ -191,6 +191,10 @@ static SYMBOL symbols[] = { + { "ELSE", SYM(ELSE)}, + { "ELSEIF", SYM(ELSEIF_SYM)}, + { "ENABLE", SYM(ENABLE_SYM)}, ++ { "ENABLE_GOVERNOR", SYM(ENABLE_GOVERNOR_SYM)}, ++ { "ENABLE_GOVERNOR_RECON", SYM(ENABLE_GOVERNOR_RECONN_SYM)}, ++ { "ENABLE_GOVERNOR_LVE", SYM(ENABLE_GOVERNOR_LVE_SYM)}, ++ { "ENABLE_GOVERNOR_RECON_LVE", SYM(ENABLE_GOVERNOR_RECONN_LVE_SYM)}, + { "ENCLOSED", SYM(ENCLOSED)}, + { "END", SYM(END)}, + { "ENDS", SYM(ENDS_SYM)}, +@@ -316,6 +320,7 @@ static SYMBOL symbols[] = { + { "LONGTEXT", SYM(LONGTEXT)}, + { "LOOP", SYM(LOOP_SYM)}, + { "LOW_PRIORITY", SYM(LOW_PRIORITY)}, ++ { "LVECMD", SYM(LVECMD_SYM)}, + { "MASTER", SYM(MASTER_SYM)}, + { "MASTER_CONNECT_RETRY", SYM(MASTER_CONNECT_RETRY_SYM)}, + { "MASTER_HOST", SYM(MASTER_HOST_SYM)}, +diff --git a/sql/mysqld.cc b/sql/mysqld.cc +index 9df9436..ee14dff 100644 +--- a/sql/mysqld.cc ++++ b/sql/mysqld.cc +@@ -69,6 +69,9 @@ + #include "debug_sync.h" + #include "sql_callback.h" + ++#include ++#include ++ + #ifdef WITH_PERFSCHEMA_STORAGE_ENGINE + #include "../storage/perfschema/pfs_server.h" + #endif /* WITH_PERFSCHEMA_STORAGE_ENGINE */ +@@ -186,6 +189,10 @@ typedef fp_except fp_except_t; + # endif + #endif + ++#ifndef GETTID ++pid_t gettid(void) {return syscall(__NR_gettid);} ++#endif ++ + extern "C" my_bool reopen_fstreams(const char *filename, + FILE *outstream, FILE *errstream); + +@@ -245,6 +252,28 @@ inline void setup_fpu() + + } /* cplusplus */ + ++#ifdef __cplusplus ++extern "C" { ++#endif /* __cplusplus */ ++extern void * (*governor_load_lve_library)(); ++extern int (*governor_init_lve)(); ++extern void (*governor_destroy_lve)(); ++extern int (*governor_enter_lve)(uint32_t *, char *); ++extern int (*governor_enter_lve_light)(uint32_t *); ++extern void (*governor_lve_exit)(uint32_t *); ++extern void (*governor_lve_exit_null)(); ++extern int (*governor_lve_enter_pid)(pid_t); ++#ifdef __cplusplus ++} ++#endif ++ ++volatile int governor_get_command = 0; ++int (*connect_to_server)() = NULL; ++int (*send_info_begin)(char *) = NULL; ++int (*send_info_end)(char *) = NULL; ++int (*close_sock)() = NULL; ++void * governor_library_handle = NULL; ++ + #define MYSQL_KILL_SIGNAL SIGTERM + + #include // For thr_setconcurency() +@@ -1513,6 +1542,20 @@ void clean_up(bool print_message) + free_global_thread_stats(); + free_global_table_stats(); + free_global_index_stats(); ++ ++ governor_detroy_mysql_thread_info(); ++ ++ if(governor_destroy_lve){ ++ governor_destroy_lve(); ++ } ++ ++ if(close_sock){ ++ (*close_sock)(); ++ } ++ if (governor_library_handle) { ++ dlclose(governor_library_handle); ++ } ++ + #ifdef HAVE_REPLICATION + end_slave_list(); + #endif +@@ -2982,6 +3025,10 @@ SHOW_VAR com_status_vars[]= { + {"drop_user", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_DROP_USER]), SHOW_LONG_STATUS}, + {"drop_view", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_DROP_VIEW]), SHOW_LONG_STATUS}, + {"empty_query", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_EMPTY_QUERY]), SHOW_LONG_STATUS}, ++ {"enable_governor", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_ENABLE_GOVERNOR]), SHOW_LONG_STATUS}, ++ {"enable_governor_reconn",(char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_ENABLE_RECONN_GOVERNOR]), SHOW_LONG_STATUS}, ++ {"enable_governor_lve", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_ENABLE_GOVERNOR_LVE]), SHOW_LONG_STATUS}, ++ {"enable_governor_reconn_lve",(char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_ENABLE_RECONN_GOVERNOR_LVE]), SHOW_LONG_STATUS}, + {"execute_sql", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_EXECUTE]), SHOW_LONG_STATUS}, + {"flush", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_FLUSH]), SHOW_LONG_STATUS}, + {"grant", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_GRANT]), SHOW_LONG_STATUS}, +@@ -2995,6 +3042,7 @@ SHOW_VAR com_status_vars[]= { + {"kill", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_KILL]), SHOW_LONG_STATUS}, + {"load", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_LOAD]), SHOW_LONG_STATUS}, + {"lock_tables", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_LOCK_TABLES]), SHOW_LONG_STATUS}, ++ {"lvecmd", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_LVECMD]), SHOW_LONG_STATUS}, + {"optimize", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_OPTIMIZE]), SHOW_LONG_STATUS}, + {"preload_keys", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_PRELOAD_KEYS]), SHOW_LONG_STATUS}, + {"prepare_sql", (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_PREPARE]), SHOW_LONG_STATUS}, +@@ -6525,6 +6573,7 @@ SHOW_VAR status_vars[]= { + {"Delayed_errors", (char*) &delayed_insert_errors, SHOW_LONG}, + {"Delayed_insert_threads", (char*) &delayed_insert_threads, SHOW_LONG_NOFLUSH}, + {"Delayed_writes", (char*) &delayed_insert_writes, SHOW_LONG}, ++ {"Enable_governor", (char*) &governor_get_command, SHOW_INT}, + {"Flush_commands", (char*) &refresh_version, SHOW_LONG_NOFLUSH}, + {"Handler_commit", (char*) offsetof(STATUS_VAR, ha_commit_count), SHOW_LONG_STATUS}, + {"Handler_delete", (char*) offsetof(STATUS_VAR, ha_delete_count), SHOW_LONG_STATUS}, +@@ -6749,6 +6798,25 @@ To see what values a running MySQL server is using, type\n\ + } + #endif /*!EMBEDDED_LIBRARY*/ + ++void governor_set_fn_ptr_to_null(){ ++ governor_load_lve_library = NULL; ++ governor_init_lve = NULL; ++ governor_destroy_lve = NULL; ++ governor_enter_lve = NULL; ++ governor_lve_exit = NULL; ++ governor_enter_lve_light = NULL; ++ governor_lve_exit_null = NULL; ++ governor_lve_enter_pid = NULL; ++} ++ ++void governor_set_fn2_ptr_to_null(){ ++ connect_to_server = NULL; ++ send_info_begin = NULL; ++ send_info_end = NULL; ++ close_sock = NULL; ++} ++ ++ + /** + Initialize MySQL global variables to default values. + +@@ -6946,6 +7014,115 @@ static int mysql_init_variables(void) + tmpenv = DEFAULT_MYSQL_HOME; + (void) strmake(mysql_home, tmpenv, sizeof(mysql_home)-1); + #endif ++ ++ ++ ++ governor_get_command = 0; ++ connect_to_server = NULL; ++ send_info_begin = NULL; ++ send_info_end = NULL; ++ close_sock = NULL; ++ governor_library_handle = NULL; ++ ++ char *error_dl = NULL; ++ governor_library_handle = dlopen("libgovernor.so", RTLD_LAZY); ++ if (governor_library_handle) { ++ sql_print_information("libgovernor.so found"); ++ while(1){ ++ connect_to_server = (int (*)())dlsym(governor_library_handle, "connect_to_server"); ++ if ((error_dl = dlerror()) != NULL){ ++ governor_set_fn2_ptr_to_null(); ++ break; ++ } ++ send_info_begin = (int (*)(char *))dlsym(governor_library_handle, "send_info_begin"); ++ if ((error_dl = dlerror()) != NULL){ ++ governor_set_fn2_ptr_to_null(); ++ break; ++ } ++ send_info_end = (int (*)(char *))dlsym(governor_library_handle, "send_info_end"); ++ if ((error_dl = dlerror()) != NULL){ ++ governor_set_fn2_ptr_to_null(); ++ break; ++ } ++ close_sock = (int (*)())dlsym(governor_library_handle, "close_sock"); ++ if ((error_dl = dlerror()) != NULL){ ++ governor_set_fn2_ptr_to_null(); ++ break; ++ } ++ sql_print_information("All governors functions found too"); ++ break; ++ } ++ } else { ++ sql_print_information("libgovernor.so not found"); ++ } ++ if(connect_to_server){ ++ if(!(*connect_to_server)()){ ++ sql_print_information("Governor connected"); ++ } else { ++ sql_print_error("Governor not connected"); ++ } ++ } ++ if (governor_library_handle){ ++ ++ while(1){ ++ governor_load_lve_library = (void * (*)())dlsym(governor_library_handle, "governor_load_lve_library"); ++ if ((error_dl = dlerror()) != NULL){ ++ governor_set_fn_ptr_to_null(); ++ break; ++ } ++ governor_init_lve = (int (*)())dlsym(governor_library_handle, "governor_init_lve"); ++ if ((error_dl = dlerror()) != NULL){ ++ governor_set_fn_ptr_to_null(); ++ break; ++ } ++ governor_destroy_lve = (void (*)())dlsym(governor_library_handle, "governor_destroy_lve"); ++ if ((error_dl = dlerror()) != NULL){ ++ governor_set_fn_ptr_to_null(); ++ break; ++ } ++ governor_enter_lve = (int (*)(uint32_t *, char *))dlsym(governor_library_handle, "governor_enter_lve"); ++ if ((error_dl = dlerror()) != NULL){ ++ governor_set_fn_ptr_to_null(); ++ break; ++ } ++ ++ governor_lve_exit = (void (*)(uint32_t *))dlsym(governor_library_handle, "governor_lve_exit"); ++ if ((error_dl = dlerror()) != NULL){ ++ governor_set_fn_ptr_to_null(); ++ break; ++ } ++ ++ governor_enter_lve_light = (int (*)(uint32_t *))dlsym(governor_library_handle, "governor_enter_lve_light"); ++ if ((error_dl = dlerror()) != NULL){ ++ governor_set_fn_ptr_to_null(); ++ break; ++ } ++ ++ governor_lve_exit_null = (void (*)(void))dlsym(governor_library_handle, "governor_lve_exit_null"); ++ if ((error_dl = dlerror()) != NULL){ ++ governor_set_fn_ptr_to_null(); ++ break; ++ } ++ ++ governor_lve_enter_pid = (int (*)(pid_t))dlsym(governor_library_handle, "governor_lve_enter_pid"); ++ if ((error_dl = dlerror()) != NULL){ ++ governor_set_fn_ptr_to_null(); ++ break; ++ } ++ ++ sql_print_information("All governors lve functions found too"); ++ break; ++ } ++ ++ } ++ ++ if(governor_load_lve_library){ ++ if(!governor_load_lve_library()){ ++ sql_print_information("Can't get LVE functions"); ++ } ++ } ++ ++ + return 0; + } + +@@ -7471,6 +7648,7 @@ static void set_server_version(void) + #endif + if (opt_log || opt_slow_log || opt_bin_log) + strmov(end, "-log"); // This may slow down system ++ end= strmov(end, "-cll-lve"); + } + + +@@ -7737,8 +7915,8 @@ static void delete_pid_file(myf flags) + File file; + if (opt_bootstrap || + !pid_file_created || +- !(file= mysql_file_open(key_file_pid, pidfile_name, +- O_RDONLY, flags))) ++ ((file= mysql_file_open(key_file_pid, pidfile_name, ++ O_RDONLY, flags))<0)) + return; + + /* Make sure that the pid file was created by the same process. */ +diff --git a/sql/mysqld.h b/sql/mysqld.h +index 959c9d6..9fa02bf 100644 +--- a/sql/mysqld.h ++++ b/sql/mysqld.h +@@ -16,6 +16,8 @@ + #ifndef MYSQLD_INCLUDED + #define MYSQLD_INCLUDED + ++#include ++ + #include "my_global.h" /* MYSQL_PLUGIN_IMPORT, FN_REFLEN, FN_EXTLEN */ + #include "sql_bitmap.h" /* Bitmap */ + #include "my_decimal.h" /* my_decimal */ +@@ -138,6 +140,14 @@ extern ulong opt_tc_log_size, tc_log_max_pages_used, tc_log_page_size; + extern ulong tc_log_page_waits; + extern my_bool relay_log_purge, opt_innodb_safe_binlog, opt_innodb; + extern my_bool relay_log_recovery; ++ ++extern volatile int governor_get_command; ++extern int (*connect_to_server)(); ++extern int (*send_info_begin)(char *); ++extern int (*send_info_end)(char *); ++extern int (*close_sock)(); ++extern void * governor_library_handle; ++ + extern uint test_flags,select_errors,ha_open_options; + extern uint protocol_version, mysqld_port, dropping_tables; + extern ulong delay_key_write_options; +@@ -477,6 +487,14 @@ void free_global_index_stats(void); + void free_global_client_stats(void); + void free_global_thread_stats(void); + ++extern "C" pid_t gettid(void); ++ ++void set_governor_variable(); ++void set_governor_variable_reconn(); ++void set_governor_variable_lve(); ++void set_governor_variable_reconn_lve(); ++ ++ + /* + TODO: Replace this with an inline function. + */ +diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc +index fdd9b10..51d6129 100644 +--- a/sql/sql_acl.cc ++++ b/sql/sql_acl.cc +@@ -903,7 +903,7 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables) + { + /* Starting from 5.0.3 we have max_user_connections field */ + ptr= get_field(thd->mem_root, table->field[next_field++]); +- user.user_resource.user_conn= ptr ? atoi(ptr) : 0; ++ user.user_resource.user_conn= ptr ? atoll(ptr) : 0; + } + + if (table->s->fields >= 41) +@@ -9584,10 +9584,7 @@ acl_authenticate(THD *thd, uint connect_errors, uint com_change_user_pkt_len) + } + + /* Don't allow the user to connect if he has done too many queries */ +- if ((acl_user->user_resource.questions || acl_user->user_resource.updates || +- acl_user->user_resource.conn_per_hour || +- acl_user->user_resource.user_conn || +- global_system_variables.max_user_connections) && ++ if ( + get_or_create_user_conn(thd, + (opt_old_style_user_limits ? sctx->user : sctx->priv_user), + (opt_old_style_user_limits ? sctx->host_or_ip : sctx->priv_host), +diff --git a/sql/sql_class.cc b/sql/sql_class.cc +index 1afcf23..8bd9167 100644 +--- a/sql/sql_class.cc ++++ b/sql/sql_class.cc +@@ -809,6 +809,8 @@ THD::THD() + { + ulong tmp; + ++ thread_tid_cll = 0; ++ + mdl_context.init(this); + /* + Pass nominal parameters to init_alloc_root only to ensure that +@@ -1340,6 +1342,7 @@ void THD::update_stats(bool ran_command) + + void THD::init_for_queries() + { ++ thread_tid_cll = gettid(); + set_time(); + ha_enable_transaction(this,TRUE); + +diff --git a/sql/sql_class.h b/sql/sql_class.h +index b555b98..8e946fd 100644 +--- a/sql/sql_class.h ++++ b/sql/sql_class.h +@@ -2006,6 +2006,7 @@ public: + ulong statement_id_counter; + ulong rand_saved_seed1, rand_saved_seed2; + pthread_t real_id; /* For debugging */ ++ pid_t thread_tid_cll; + my_thread_id thread_id; + uint tmp_table; + uint server_status,open_options; +@@ -3745,6 +3746,7 @@ inline bool add_group_to_list(THD *thd, Item *item, bool asc) + + #endif /* MYSQL_SERVER */ + ++ + /** + The meat of thd_proc_info(THD*, char*), a macro that packs the last + three calling-info parameters. +diff --git a/sql/sql_connect.cc b/sql/sql_connect.cc +index 12493be..28a2b31 100644 +--- a/sql/sql_connect.cc ++++ b/sql/sql_connect.cc +@@ -81,6 +81,10 @@ extern mysql_mutex_t LOCK_global_index_stats; + #ifndef NO_EMBEDDED_ACCESS_CHECKS + static HASH hash_user_connections; + ++int is_root_access(char *user_name){ ++ return !strcmp(user_name,"root")||!strcmp(user_name,"mysql"); ++} ++ + int get_or_create_user_conn(THD *thd, const char *user, + const char *host, + const USER_RESOURCES *mqh) +@@ -735,6 +739,16 @@ int check_for_max_user_connections(THD *thd, const USER_CONN *uc) + DBUG_ENTER("check_for_max_user_connections"); + + mysql_mutex_lock(&LOCK_user_conn); ++ ++ ++ ++ if (((uc->user_resources.user_conn==(uint)~0) || (global_system_variables.max_user_connections == (uint)~0)) && !is_root_access(uc->user)) ++ { ++ my_error(ER_TOO_MANY_USER_CONNECTIONS, MYF(0), uc->user); ++ error=1; ++ goto end; ++ } ++ + if (global_system_variables.max_user_connections && + !uc->user_resources.user_conn && + global_system_variables.max_user_connections < (uint) uc->connections) +@@ -1373,6 +1387,7 @@ void prepare_new_connection_state(THD* thd) + pthread_handler_t handle_one_connection(void *arg) + { + THD *thd= (THD*) arg; ++ thd->thread_tid_cll = gettid(); + + mysql_thread_set_psi_id(thd->thread_id); + +diff --git a/sql/sql_lex.h b/sql/sql_lex.h +index d16166a..00eee9a 100644 +--- a/sql/sql_lex.h ++++ b/sql/sql_lex.h +@@ -193,7 +193,8 @@ enum enum_sql_command { + SQLCOM_SHOW_RELAYLOG_EVENTS, + // TODO(mcallaghan): update status_vars in mysqld to export these + SQLCOM_SHOW_USER_STATS, SQLCOM_SHOW_TABLE_STATS, SQLCOM_SHOW_INDEX_STATS, +- SQLCOM_SHOW_CLIENT_STATS, SQLCOM_SHOW_THREAD_STATS, ++ SQLCOM_SHOW_CLIENT_STATS, SQLCOM_SHOW_THREAD_STATS, SQLCOM_ENABLE_GOVERNOR, SQLCOM_ENABLE_RECONN_GOVERNOR, ++ SQLCOM_ENABLE_GOVERNOR_LVE, SQLCOM_ENABLE_RECONN_GOVERNOR_LVE, SQLCOM_LVECMD, + /* + When a command is added here, be sure it's also added in mysqld.cc + in "struct show_var_st status_vars[]= {" ... +diff --git a/sql/sql_list.cc b/sql/sql_list.cc +index 99aeccd..d8bea45 100644 +--- a/sql/sql_list.cc ++++ b/sql/sql_list.cc +@@ -39,6 +39,14 @@ void free_list(I_List *list) + } + + ++void free_list(I_List *list) ++{ ++ i_thd *tmp; ++ while ((tmp= list->get())) ++ delete tmp; ++} ++ ++ + base_list::base_list(const base_list &rhs, MEM_ROOT *mem_root) + { + if (rhs.elements) +diff --git a/sql/sql_list.h b/sql/sql_list.h +index bdbe381..dea32d2 100644 +--- a/sql/sql_list.h ++++ b/sql/sql_list.h +@@ -570,6 +570,15 @@ public: + i_string(const char* s) : ptr(s) {} + }; + ++/* DB_GOVERNOR ADDITIONS */ ++class i_thd: public ilink ++{ ++ public: ++ THD* ptr; ++ i_thd():ptr(0) { } ++ i_thd(THD* s) : ptr(s) {} ++}; ++ + /* needed for linked list of two strings for replicate-rewrite-db */ + class i_string_pair: public ilink + { +@@ -723,5 +732,6 @@ list_copy_and_replace_each_value(List &list, MEM_ROOT *mem_root) + + void free_list(I_List *list); + void free_list(I_List *list); ++void free_list(I_List *list); + + #endif // INCLUDES_MYSQL_SQL_LIST_H +diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc +index 8e2841c..d4e8345 100644 +--- a/sql/sql_parse.cc ++++ b/sql/sql_parse.cc +@@ -13,6 +13,7 @@ + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + ++#define HAVE_CLOCK_GETTIME 1 + #define MYSQL_LEX 1 + #include "my_global.h" + #include "sql_priv.h" +@@ -95,6 +96,21 @@ + #include "probes_mysql.h" + #include "set_var.h" + ++#ifdef __cplusplus ++extern "C" { ++#endif /* __cplusplus */ ++ ++extern void * (*governor_load_lve_library)(); ++extern int (*governor_init_lve)(); ++extern void (*governor_destroy_lve)(); ++extern int (*governor_enter_lve)(uint32_t *, char *); ++extern int (*governor_enter_lve_light)(uint32_t *); ++extern void (*governor_lve_exit)(uint32_t *); ++ ++#ifdef __cplusplus ++} ++#endif ++ + #define FLAGSTR(V,F) ((V)&(F)?#F" ":"") + + /** +@@ -114,6 +130,8 @@ + + static bool execute_sqlcom_select(THD *thd, TABLE_LIST *all_tables); + static void sql_kill(THD *thd, ulong id, bool only_kill_query); ++static void sql_kill_user(THD *thd, char *user, bool only_kill_query); ++static void sql_kill_user_lve(THD *thd, char *user, bool only_kill_query); + + // Uses the THD to update the global stats by user name and client IP + void update_global_user_stats(THD* thd, bool create_user, time_t now); +@@ -170,6 +188,52 @@ inline bool all_tables_not_ok(THD *thd, TABLE_LIST *tables) + } + #endif + ++void set_governor_variable(){ ++ governor_get_command = 1; ++} ++ ++void set_governor_variable_reconn(){ ++ governor_get_command = 1; ++ if(close_sock){ ++ (*close_sock)(); ++ } ++ if(connect_to_server){ ++ if(!(*connect_to_server)()){ ++ sql_print_information("Governor reconnected"); ++ } else { ++ sql_print_error("Governor not reconnected. Failed connection"); ++ } ++ } ++} ++ ++void set_governor_variable_lve(){ ++ if(!governor_get_command){ ++ if(governor_init_lve){ ++ if(governor_init_lve()){ ++ sql_print_error("Governor LVE initialization error"); ++ } ++ } ++ } ++ governor_get_command = 2; ++} ++ ++void set_governor_variable_reconn_lve(){ ++ set_governor_variable_reconn(); ++ governor_get_command = 2; ++ if(governor_init_lve){ ++ if(governor_init_lve()){ ++ sql_print_error("Governor LVE initialization error"); ++ } ++ } ++} ++ ++ ++my_bool chek_governors_avaliable_command(THD *thd){ ++ return (thd->lex->sql_command!=SQLCOM_ENABLE_GOVERNOR&&thd->lex->sql_command!=SQLCOM_ENABLE_RECONN_GOVERNOR ++ &&thd->lex->sql_command!=SQLCOM_ENABLE_GOVERNOR_LVE&&thd->lex->sql_command!=SQLCOM_ENABLE_RECONN_GOVERNOR_LVE)&& ++ (thd->security_ctx && thd->security_ctx->user && thd->security_ctx->user[0]); ++} ++ + + static bool some_non_temp_table_to_be_updated(THD *thd, TABLE_LIST *tables) + { +@@ -3717,9 +3781,42 @@ end_with_restore_list: + MYF(0)); + goto error; + } +- sql_kill(thd, (ulong)it->val_int(), lex->type & ONLY_KILL_QUERY); ++ if(it->type()==Item::STRING_ITEM){ ++ sql_kill_user(thd, it->val_str(0)->c_ptr(), lex->type & ONLY_KILL_QUERY); ++ } else { ++ sql_kill(thd, (ulong)it->val_int(), lex->type & ONLY_KILL_QUERY); ++ } ++ + break; + } ++ case SQLCOM_LVECMD: ++ { ++ Item *it= (Item *)lex->value_list.head(); ++ ++ if (lex->table_or_sp_used()) ++ { ++ my_error(ER_NOT_SUPPORTED_YET, MYF(0), "Usage of subqueries or stored " ++ "function calls as part of this statement"); ++ break; ++ } ++ ++ if ((!it->fixed && it->fix_fields(lex->thd, &it)) || it->check_cols(1)) ++ { ++ my_message(ER_SET_CONSTANTS_ONLY, ER(ER_SET_CONSTANTS_ONLY), ++ MYF(0)); ++ goto error; ++ } ++ ++ if(it->type()==Item::STRING_ITEM){ ++ sql_kill_user_lve(thd, it->val_str(0)->c_ptr(), lex->type & ONLY_KILL_QUERY); ++ } else { ++ my_error(ER_NOT_SUPPORTED_YET, MYF(0), "LVE by thread ID is not supported yet"); ++ } ++ ++ ++ break; ++ } ++ + #ifndef NO_EMBEDDED_ACCESS_CHECKS + case SQLCOM_SHOW_GRANTS: + { +@@ -5626,6 +5723,17 @@ void mysql_parse(THD *thd, char *rawbuf, uint length, + } + } + ++ if(send_info_begin&&governor_get_command&&chek_governors_avaliable_command(thd)){ ++ (*send_info_begin)(thd->security_ctx->user); ++ } ++ ++/* if(governor_enter_lve && (governor_get_command==2) && chek_governors_avaliable_command(thd)){ ++ if(thd->security_ctx && thd->security_ctx->user && thd->security_ctx->user[0]) ++ governor_enter_lve(&cookie, thd->security_ctx->user); ++ }*/ ++ ++ ++ + if (query_cache_send_result_to_client(thd, rawbuf, length) <= 0) + { + LEX *lex= thd->lex; +@@ -5674,8 +5782,13 @@ void mysql_parse(THD *thd, char *rawbuf, uint length, + &thd->security_ctx->priv_user[0], + (char *) thd->security_ctx->host_or_ip, + 0); +- ++ if(governor_enter_lve && (governor_get_command==2) && chek_governors_avaliable_command(thd)){ ++ if(put_in_lve(thd->security_ctx->user)<0){ ++ my_error(ER_GET_ERRNO, MYF(0), "Can't enter into LVE"); ++ } ++ } + error= mysql_execute_command(thd); ++ lve_thr_exit(); + MYSQL_QUERY_EXEC_DONE(error); + } + } +@@ -5696,6 +5809,14 @@ void mysql_parse(THD *thd, char *rawbuf, uint length, + DBUG_ASSERT(thd->change_list.is_empty()); + } + ++/* if(governor_lve_exit && (governor_get_command==2) && cookie &&chek_governors_avaliable_command(thd)){ ++ governor_lve_exit(&cookie); ++ }*/ ++ ++ if(send_info_end&&governor_get_command&&chek_governors_avaliable_command(thd)){ ++ (*send_info_end)(thd->security_ctx->user); ++ } ++ + if (opt_userstat) + { + // Gets the end time. +@@ -6614,6 +6735,24 @@ void sql_kill(THD *thd, ulong id, bool only_kill_query) + my_error(error, MYF(0), id); + } + ++static void sql_kill_user(THD *thd, char *user, bool only_kill_query) ++{ ++ uint error; ++ if (!(error= kill_user_thread(thd, user, only_kill_query))){ ++ if (! thd->killed) my_ok(thd); ++ } else ++ my_error(error, MYF(0), user); ++} ++ ++void sql_kill_user_lve(THD *thd, char *user, bool only_kill_query) ++{ ++ uint error; ++ if (!(error= kill_user_thread_lve(thd, user, only_kill_query))) ++ my_ok(thd); ++ else ++ my_error(error, MYF(0), user); ++} ++ + + /** If pointer is not a null pointer, append filename to it. */ + +@@ -7529,3 +7668,107 @@ merge_charset_and_collation(CHARSET_INFO *cs, CHARSET_INFO *cl) + } + return cs; + } ++ ++ ++uint kill_user_thread(THD *thd, char *user, bool only_kill_query) ++{ ++ THD *tmp; ++ uint error=0; ++ DBUG_ENTER("kill_user_thread"); ++ DBUG_PRINT("enter", ("id=%s only_kill=%d", !user?"nop":user, only_kill_query)); ++ i_thd *thd_tmp; ++ I_List threads_tmp; ++ threads_tmp.empty(); ++ mysql_mutex_lock(&LOCK_thread_count); // For unlink from list ++ I_List_iterator it(threads); ++ while ((tmp=it++)) ++ { ++ if (tmp->command == COM_DAEMON) ++ continue; ++ if((tmp)&&(user)&&(tmp->get_user_connect())&&(tmp->get_user_connect()->user)){ ++ if (!strncmp(tmp->get_user_connect()->user,user,16)) ++ { ++ mysql_mutex_lock(&tmp->LOCK_thd_data); // Lock from delete ++ thd_tmp = new i_thd(tmp); ++ if (thd_tmp) threads_tmp.append(thd_tmp); ++ else mysql_mutex_unlock(&tmp->LOCK_thd_data); ++ } ++ } ++ } ++ mysql_mutex_unlock(&LOCK_thread_count); ++ ++ if(!threads_tmp.is_empty()) ++ { ++ I_List_iterator it_tmp(threads_tmp); ++ while ((thd_tmp=it_tmp++)){ ++ tmp=thd_tmp->ptr; ++ ++ if ((tmp)&&((thd->security_ctx->master_access & SUPER_ACL) || ++ thd->security_ctx->user_matches(tmp->security_ctx))) ++ { ++ tmp->awake(only_kill_query ? THD::KILL_QUERY : THD::KILL_CONNECTION); ++ error=0; ++ } ++ else ++ error=ER_KILL_DENIED_ERROR; ++ mysql_mutex_unlock(&tmp->LOCK_thd_data); ++ } ++ free_list(&threads_tmp); ++ threads_tmp.empty(); ++ } ++ DBUG_PRINT("exit", ("%d", error)); ++ DBUG_RETURN(error); ++} ++ ++uint kill_user_thread_lve(THD *thd, char *user, bool only_kill_query) ++{ ++ ++ DBUG_ENTER("kill_user_thread_lve"); ++ THD *tmp; ++ i_thd *thd_tmp; ++ I_List threads_tmp; ++ threads_tmp.empty(); ++ uint error=0;//ER_NO_SUCH_THREAD_USER; ++ mysql_mutex_lock(&LOCK_thread_count); // For unlink from list ++ I_List_iterator it(threads); ++ while ((tmp=it++)) ++ { ++ if((tmp)&&(user)&&(tmp->get_user_connect())&&(tmp->get_user_connect()->user)){ ++ if (!strncmp(tmp->get_user_connect()->user,user,16)) ++ { ++ mysql_mutex_lock(&tmp->LOCK_thd_data); // Lock from delete ++ thd_tmp = new i_thd(tmp); ++ if (thd_tmp) threads_tmp.append(thd_tmp); ++ else mysql_mutex_unlock(&tmp->LOCK_thd_data); ++ } ++ } ++ } ++ mysql_mutex_unlock(&LOCK_thread_count); ++ ++ if(!threads_tmp.is_empty()){ ++ I_List_iterator it_tmp(threads_tmp); ++ while ((thd_tmp=it_tmp++)){ ++ tmp=thd_tmp->ptr; ++ if ((tmp)&&((thd->security_ctx->master_access & SUPER_ACL) || ++ thd->security_ctx->user_matches(tmp->security_ctx))) ++ { ++ if(tmp->thread_tid_cll){ ++ governor_setlve_mysql_thread_info(tmp->thread_tid_cll); ++ } ++ } else { ++ error=ER_KILL_DENIED_ERROR; ++ } ++ mysql_mutex_unlock(&tmp->LOCK_thd_data); ++ ++ } ++ free_list(&threads_tmp); ++ threads_tmp.empty(); ++ } ++ ++ DBUG_RETURN(error); ++ ++} ++ ++ ++ ++ +diff --git a/sql/sql_parse.h b/sql/sql_parse.h +index 9a55174..b2871fd 100644 +--- a/sql/sql_parse.h ++++ b/sql/sql_parse.h +@@ -50,6 +50,8 @@ bool parse_sql(THD *thd, + Parser_state *parser_state, + Object_creation_ctx *creation_ctx); + ++uint kill_user_thread(THD *thd, char *user, bool only_kill_query); ++uint kill_user_thread_lve(THD *thd, char *user, bool only_kill_query); + uint kill_one_thread(THD *thd, ulong id, bool only_kill_query); + + void free_items(Item *item); +diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc +index 06a89c0..39fe9c7 100644 +--- a/sql/sql_prepare.cc ++++ b/sql/sql_prepare.cc +@@ -2086,6 +2086,7 @@ static bool check_prepared_statement(Prepared_statement *stmt) + case SQLCOM_GRANT: + case SQLCOM_REVOKE: + case SQLCOM_KILL: ++ case SQLCOM_LVECMD: + break; + + case SQLCOM_PREPARE: +diff --git a/sql/sql_select.cc b/sql/sql_select.cc +index 181fa6e..14cb51f 100644 +--- a/sql/sql_select.cc ++++ b/sql/sql_select.cc +@@ -11284,6 +11284,7 @@ bool create_myisam_from_heap(THD *thd, TABLE *table, TMP_TABLE_PARAM *param, + + save_proc_info=thd->proc_info; + thd_proc_info(thd, "converting HEAP to MyISAM"); ++ my_reserve_slot(); + + if (create_myisam_tmp_table(&new_table, param, + thd->lex->select_lex.options | thd->variables.option_bits, +@@ -11350,10 +11351,12 @@ bool create_myisam_from_heap(THD *thd, TABLE *table, TMP_TABLE_PARAM *param, + if (save_proc_info) + thd_proc_info(thd, (!strcmp(save_proc_info,"Copying to tmp table") ? + "Copying to tmp table on disk" : save_proc_info)); ++ my_release_slot(); + DBUG_RETURN(0); + + err: + DBUG_PRINT("error",("Got error: %d",write_err)); ++ my_release_slot(); + table->file->print_error(write_err, MYF(0)); + (void) table->file->ha_rnd_end(); + (void) new_table.file->close(); +diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy +index af19762..f64f29c 100644 +--- a/sql/sql_yacc.yy ++++ b/sql/sql_yacc.yy +@@ -946,6 +946,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); + %token ELSE /* SQL-2003-R */ + %token ELSEIF_SYM + %token ENABLE_SYM ++%token ENABLE_GOVERNOR_SYM ++%token ENABLE_GOVERNOR_RECONN_SYM ++%token ENABLE_GOVERNOR_LVE_SYM ++%token ENABLE_GOVERNOR_RECONN_LVE_SYM + %token ENCLOSED + %token END /* SQL-2003-R */ + %token ENDS_SYM +@@ -1074,6 +1078,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); + %token LOOP_SYM + %token LOW_PRIORITY + %token LT /* OPERATOR */ ++%token LVECMD_SYM + %token MASTER_CONNECT_RETRY_SYM + %token MASTER_HOST_SYM + %token MASTER_LOG_FILE_SYM +@@ -1559,7 +1564,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); + reset purge begin commit rollback savepoint release + slave master_def master_defs master_file_def slave_until_opts + repair analyze check start checksum +- field_list field_list_item field_spec kill column_def key_def ++ field_list field_list_item field_spec kill lvecmd column_def key_def + keycache_list keycache_list_or_parts assign_to_keycache + assign_to_keycache_parts + preload_list preload_list_or_parts preload_keys preload_keys_parts +@@ -1728,6 +1733,10 @@ statement: + | describe + | do + | drop ++ | enable_governor ++ | enable_governor_reconn ++ | enable_governor_lve ++ | enable_governor_reconn_lve + | execute + | flush + | grant +@@ -1738,6 +1747,7 @@ statement: + | kill + | load + | lock ++ | lvecmd + | optimize + | keycache + | partition_entry +@@ -7053,6 +7063,21 @@ mi_check_type: + | CHANGED { Lex->check_opt.flags|= T_CHECK_ONLY_CHANGED; } + | FOR_SYM UPGRADE_SYM { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; } + ; ++ ++lvecmd: ++ LVECMD_SYM lvecmd_option expr ++ { ++ LEX *lex=Lex; ++ lex->value_list.empty(); ++ lex->value_list.push_front($3); ++ lex->sql_command= SQLCOM_LVECMD; ++ } ++ ; ++ ++lvecmd_option: ++ /* empty */ { Lex->type= ONLY_KILL_QUERY; } ++ ; ++ + + optimize: + OPTIMIZE opt_no_write_to_binlog table_or_tables +@@ -10894,6 +10919,41 @@ opt_profile_args: + } + ; + ++enable_governor: ++ ENABLE_GOVERNOR_SYM ++ { ++ LEX *lex= Lex; ++ lex->sql_command= SQLCOM_ENABLE_GOVERNOR; ++ set_governor_variable(); ++ } ++ ; ++ ++enable_governor_reconn: ++ ENABLE_GOVERNOR_RECONN_SYM ++ { ++ LEX *lex= Lex; ++ lex->sql_command= SQLCOM_ENABLE_RECONN_GOVERNOR; ++ set_governor_variable_reconn(); ++ } ++ ; ++enable_governor_lve: ++ ENABLE_GOVERNOR_LVE_SYM ++ { ++ LEX *lex= Lex; ++ lex->sql_command= SQLCOM_ENABLE_GOVERNOR_LVE; ++ set_governor_variable_lve(); ++ } ++ ; ++ ++enable_governor_reconn_lve: ++ ENABLE_GOVERNOR_RECONN_LVE_SYM ++ { ++ LEX *lex= Lex; ++ lex->sql_command= SQLCOM_ENABLE_RECONN_GOVERNOR_LVE; ++ set_governor_variable_reconn_lve(); ++ } ++ ; ++ + /* Show things */ + + show: +diff --git a/storage/innobase/include/os0file.h b/storage/innobase/include/os0file.h +index 8ef0906..f3d3b98 100644 +--- a/storage/innobase/include/os0file.h ++++ b/storage/innobase/include/os0file.h +@@ -204,8 +204,9 @@ used to register actual file read, write and flush */ + # define register_pfs_file_open_begin(state, locker, key, op, name, \ + src_file, src_line) \ + do { \ ++ my_reserve_slot(); \ + if (PSI_server) { \ +- locker = PSI_server->get_thread_file_name_locker( \ ++ locker = PSI_server->get_thread_file_name_locker( \ + state, key, op, name, &locker); \ + if (locker) { \ + PSI_server->start_file_open_wait( \ +@@ -220,11 +221,13 @@ do { \ + PSI_server->end_file_open_wait_and_bind_to_descriptor( \ + locker, file); \ + } \ ++ my_release_slot(); \ + } while (0) + + # define register_pfs_file_io_begin(state, locker, file, count, op, \ + src_file, src_line) \ + do { \ ++ my_reserve_slot(); \ + if (PSI_server) { \ + locker = PSI_server->get_thread_file_descriptor_locker( \ + state, file, op); \ +@@ -240,6 +243,7 @@ do { \ + if (locker) { \ + PSI_server->end_file_wait(locker, count); \ + } \ ++ my_release_slot(); \ + } while (0) + #endif /* UNIV_PFS_IO */ + +diff --git a/storage/innobase/os/os0file.c b/storage/innobase/os/os0file.c +index db777f0..77ab113 100644 +--- a/storage/innobase/os/os0file.c ++++ b/storage/innobase/os/os0file.c +@@ -3752,6 +3752,7 @@ os_aio_array_reserve_slot( + offset */ + ulint len) /*!< in: length of the block to read or write */ + { ++ my_reserve_slot(); + os_aio_slot_t* slot = NULL; + #ifdef WIN_ASYNC_IO + OVERLAPPED* control; +@@ -3895,6 +3896,7 @@ os_aio_array_free_slot( + os_aio_array_t* array, /*!< in: aio array */ + os_aio_slot_t* slot) /*!< in: pointer to slot */ + { ++ my_release_slot(); + ut_ad(array); + ut_ad(slot); + +diff --git a/storage/innobase/srv/srv0srv.c b/storage/innobase/srv/srv0srv.c +index 5872ff2..d3a949e 100644 +--- a/storage/innobase/srv/srv0srv.c ++++ b/storage/innobase/srv/srv0srv.c +@@ -1144,6 +1144,7 @@ srv_conc_enter_innodb( + ibool has_slept = FALSE; + srv_conc_slot_t* slot = NULL; + ulint i; ++ my_reserve_slot(); + + #ifdef UNIV_SYNC_DEBUG + ut_ad(!sync_thread_levels_nonempty_trx(trx->has_search_latch)); +@@ -1158,7 +1159,6 @@ srv_conc_enter_innodb( + + return; + } +- + /* If trx has 'free tickets' to enter the engine left, then use one + such ticket */ + +@@ -1311,6 +1311,7 @@ srv_conc_force_enter_innodb( + trx_t* trx) /*!< in: transaction object associated with the + thread */ + { ++ my_reserve_slot(); + #ifdef UNIV_SYNC_DEBUG + ut_ad(!sync_thread_levels_nonempty_trx(trx->has_search_latch)); + #endif /* UNIV_SYNC_DEBUG */ +@@ -1342,6 +1343,7 @@ srv_conc_force_exit_innodb( + thread */ + { + srv_conc_slot_t* slot = NULL; ++ my_release_slot(); + + if (trx->mysql_thd != NULL + && thd_is_replication_slave_thread(trx->mysql_thd)) { +@@ -1401,6 +1403,7 @@ srv_conc_exit_innodb( + trx_t* trx) /*!< in: transaction object associated with the + thread */ + { ++ my_release_slot(); + #ifdef UNIV_SYNC_DEBUG + ut_ad(!sync_thread_levels_nonempty_trx(trx->has_search_latch)); + #endif /* UNIV_SYNC_DEBUG */ +diff --git a/support-files/mysql.server.sh b/support-files/mysql.server.sh +index b5115a5..f955e50 100644 +--- a/support-files/mysql.server.sh ++++ b/support-files/mysql.server.sh +@@ -59,6 +59,33 @@ lock_file_path="$lockdir/mysql" + + # The following variables are only set for letting mysql.server find things. + ++cpu_limit= ++io_limit= ++ ++get_limit(){ ++ if [ -e /usr/sbin/lvectl ]; then ++ LVE_VER=`/usr/sbin/lvectl --lve-version` ++ if [ "$LVE_VER" == "4" ]; then ++ io_limit=`/usr/sbin/lvectl limits 3 | awk 'NR == 2' | awk '{print $6}'` ++ else ++ io_limit=`/usr/sbin/lvectl limits 3 | awk 'NR == 2' | awk '{print $8}'` ++ fi ++ cpu_limit=`/usr/sbin/lvectl limits 3 | awk 'NR == 2' | awk '{print $2}'` ++ fi ++} ++ ++set_big_limit(){ ++ if [ -e /usr/sbin/lvectl ]; then ++ /usr/sbin/lvectl set 3 --cpu=100 --io=0 --save-all-parameters ++ fi ++} ++ ++set_old_limit(){ ++ if [ -e /usr/sbin/lvectl ]; then ++ /usr/sbin/lvectl set 3 --cpu=$cpu_limit --io=$io_limit --save-all-parameters ++ fi ++} ++ + # Set some defaults + mysqld_pid_file_path= + if test -z "$basedir" +@@ -298,6 +325,11 @@ case "$mode" in + 'stop') + # Stop daemon. We use a signal here to avoid having to know the + # root password. ++ ++ get_limit ++ set_big_limit ++ sleep 2 ++ + + if test -s "$mysqld_pid_file_path" + then +@@ -319,10 +351,12 @@ case "$mode" in + then + rm -f "$lock_file_path" + fi ++ set_old_limit + exit $return_value + else + log_failure_msg "MySQL server PID file could not be found!" + fi ++ set_old_limit + ;; + + 'restart') +@@ -337,14 +371,19 @@ case "$mode" in + ;; + + 'reload'|'force-reload') ++ get_limit ++ set_big_limit ++ sleep 2 + if test -s "$mysqld_pid_file_path" ; then + read mysqld_pid < "$mysqld_pid_file_path" + kill -HUP $mysqld_pid && log_success_msg "Reloading service MySQL" + touch "$mysqld_pid_file_path" + else + log_failure_msg "MySQL PID file could not be found!" ++ set_old_limit + exit 1 + fi ++ set_old_limit + ;; + 'status') + # First, check to see if pid file exists diff --git a/mysql55/my.cnf b/mysql55/my.cnf new file mode 100644 index 0000000..8219d8b --- /dev/null +++ b/mysql55/my.cnf @@ -0,0 +1,33 @@ +[mysqld] +datadir=/var/lib/mysql +socket=/var/lib/mysql/mysql.sock + +# Disabling symbolic-links is recommended to prevent assorted security risks +symbolic-links=0 + +# Settings user and group are ignored when systemd is used (fedora >= 15). +# If you need to run mysqld under a different user or group, +# customize your systemd unit file for mysqld according to the +# instructions in http://fedoraproject.org/wiki/Systemd +user=mysql + +# Semisynchronous Replication +# http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html +# uncomment next line on MASTER +;plugin-load=rpl_semi_sync_master=semisync_master.so +# uncomment next line on SLAVE +;plugin-load=rpl_semi_sync_slave=semisync_slave.so + +# Others options for Semisynchronous Replication +;rpl_semi_sync_master_enabled=1 +;rpl_semi_sync_master_timeout=10 +;rpl_semi_sync_slave_enabled=1 + +# http://dev.mysql.com/doc/refman/5.5/en/performance-schema.html +;performance_schema + + +[mysqld_safe] +log-error=/var/log/mysqld.log +pid-file=/var/run/mysqld/mysqld.pid + diff --git a/mysql55/my_config.h b/mysql55/my_config.h new file mode 100644 index 0000000..435a126 --- /dev/null +++ b/mysql55/my_config.h @@ -0,0 +1,29 @@ +/* + * Kluge to support multilib installation of both 32- and 64-bit RPMS: + * we need to arrange that header files that appear in both RPMs are + * identical. Hence, this file is architecture-independent and calls + * in an arch-dependent file that will appear in just one RPM. + * + * To avoid breaking arches not explicitly supported by Red Hat, we + * use this indirection file *only* on known multilib arches. + * + * Note: this may well fail if user tries to use gcc's -I- option. + * But that option is deprecated anyway. + */ +#if defined(__x86_64__) +#include "my_config_x86_64.h" +#elif defined(__i386__) +#include "my_config_i386.h" +#elif defined(__ppc64__) || defined(__powerpc64__) +#include "my_config_ppc64.h" +#elif defined(__ppc__) || defined(__powerpc__) +#include "my_config_ppc.h" +#elif defined(__s390x__) +#include "my_config_s390x.h" +#elif defined(__s390__) +#include "my_config_s390.h" +#elif defined(__sparc__) && defined(__arch64__) +#include "my_config_sparc64.h" +#elif defined(__sparc__) +#include "my_config_sparc.h" +#endif diff --git a/mysql55/mysql-chain-certs.patch b/mysql55/mysql-chain-certs.patch new file mode 100644 index 0000000..164c22e --- /dev/null +++ b/mysql55/mysql-chain-certs.patch @@ -0,0 +1,41 @@ +Fix things so that chains of certificates work in the server and client +certificate files. + +This only really works for OpenSSL-based builds, as yassl is unable to read +multiple certificates from a file. The patch below to yassl/src/ssl.cpp +doesn't fix that, but just arranges that the viosslfactories.c patch won't +have any ill effects in a yassl build. Since we don't use yassl in Red Hat/ +Fedora builds, I'm not feeling motivated to try to fix yassl for this. + +See RH bug #598656. Filed upstream at http://bugs.mysql.com/bug.php?id=54158 + + +diff -Naur mysql-5.5.28.orig/extra/yassl/src/ssl.cpp mysql-5.5.28/extra/yassl/src/ssl.cpp +--- mysql-5.5.28.orig/extra/yassl/src/ssl.cpp 2012-08-29 04:50:46.000000000 -0400 ++++ mysql-5.5.28/extra/yassl/src/ssl.cpp 2012-09-29 12:45:19.682287214 -0400 +@@ -1627,10 +1627,10 @@ + } + + +- int SSL_CTX_use_certificate_chain_file(SSL_CTX*, const char*) ++ int SSL_CTX_use_certificate_chain_file(SSL_CTX* ctx, const char* file) + { +- // TDOD: +- return SSL_SUCCESS; ++ // For the moment, treat like use_certificate_file ++ return read_file(ctx, file, SSL_FILETYPE_PEM, Cert); + } + + +diff -Naur mysql-5.5.28.orig/vio/viosslfactories.c mysql-5.5.28/vio/viosslfactories.c +--- mysql-5.5.28.orig/vio/viosslfactories.c 2012-08-29 04:50:46.000000000 -0400 ++++ mysql-5.5.28/vio/viosslfactories.c 2012-09-29 12:46:35.124975585 -0400 +@@ -106,7 +106,7 @@ + key_file= cert_file; + + if (cert_file && +- SSL_CTX_use_certificate_file(ctx, cert_file, SSL_FILETYPE_PEM) <= 0) ++ SSL_CTX_use_certificate_chain_file(ctx, cert_file) <= 0) + { + *error= SSL_INITERR_CERT; + DBUG_PRINT("error",("%s from file '%s'", sslGetErrString(*error), cert_file)); diff --git a/mysql55/mysql-cipherspec.patch b/mysql55/mysql-cipherspec.patch new file mode 100644 index 0000000..5210055 --- /dev/null +++ b/mysql55/mysql-cipherspec.patch @@ -0,0 +1,115 @@ +Some test items assume the default SSL cipher is DHE-RSA-AES256-SHA, +which is no longer the case as of openssl 1.0.1. +This patch enhances connect command by an option to specify a cipher +and tests are adjusted to specify the expected cipher explicitly. +Upstream bug report: http://bugs.mysql.com/bug.php?id=64461 + +diff -up mysql-5.5.28/client/mysqltest.cc.p18 mysql-5.5.28/client/mysqltest.cc +--- mysql-5.5.28/client/mysqltest.cc.p18 2012-08-29 10:50:46.000000000 +0200 ++++ mysql-5.5.28/client/mysqltest.cc 2012-12-06 14:25:46.370001422 +0100 +@@ -5458,6 +5458,7 @@ void do_connect(struct st_command *comma + my_bool con_ssl= 0, con_compress= 0; + my_bool con_pipe= 0, con_shm= 0, con_cleartext_enable= 0; + struct st_connection* con_slot; ++ char *con_cipher=NULL; + + static DYNAMIC_STRING ds_connection_name; + static DYNAMIC_STRING ds_host; +@@ -5548,6 +5549,8 @@ void do_connect(struct st_command *comma + con_shm= 1; + else if (!strncmp(con_options, "CLEARTEXT", 9)) + con_cleartext_enable= 1; ++ else if (!strncmp(con_options, "CIPHER:", 7)) ++ con_cipher = con_options + 7; + else + die("Illegal option to connect: %.*s", + (int) (end - con_options), con_options); +@@ -5595,8 +5598,11 @@ void do_connect(struct st_command *comma + if (con_ssl) + { + #if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) ++ /* default cipher */ ++ if (con_cipher == NULL && opt_ssl_cipher != NULL) ++ con_cipher = opt_ssl_cipher; + mysql_ssl_set(&con_slot->mysql, opt_ssl_key, opt_ssl_cert, opt_ssl_ca, +- opt_ssl_capath, opt_ssl_cipher); ++ opt_ssl_capath, con_cipher); + #if MYSQL_VERSION_ID >= 50000 + /* Turn on ssl_verify_server_cert only if host is "localhost" */ + opt_ssl_verify_server_cert= !strcmp(ds_host.str, "localhost"); +diff -up mysql-5.5.28/mysql-test/t/openssl_1.test.p18 mysql-5.5.28/mysql-test/t/openssl_1.test +--- mysql-5.5.28/mysql-test/t/openssl_1.test.p18 2012-08-29 10:50:47.000000000 +0200 ++++ mysql-5.5.28/mysql-test/t/openssl_1.test 2012-12-06 14:25:46.371001424 +0100 +@@ -20,13 +20,13 @@ grant select on test.* to ssl_user4@loca + grant select on test.* to ssl_user5@localhost require cipher "DHE-RSA-AES256-SHA" AND SUBJECT "xxx"; + flush privileges; + +-connect (con1,localhost,ssl_user1,,,,,SSL); +-connect (con2,localhost,ssl_user2,,,,,SSL); +-connect (con3,localhost,ssl_user3,,,,,SSL); +-connect (con4,localhost,ssl_user4,,,,,SSL); ++connect (con1,localhost,ssl_user1,,,,,SSL CIPHER:DHE-RSA-AES256-SHA); ++connect (con2,localhost,ssl_user2,,,,,SSL CIPHER:DHE-RSA-AES256-SHA); ++connect (con3,localhost,ssl_user3,,,,,SSL CIPHER:DHE-RSA-AES256-SHA); ++connect (con4,localhost,ssl_user4,,,,,SSL CIPHER:DHE-RSA-AES256-SHA); + --replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT + --error ER_ACCESS_DENIED_ERROR +-connect (con5,localhost,ssl_user5,,,,,SSL); ++connect (con5,localhost,ssl_user5,,,,,SSL CIPHER:DHE-RSA-AES256-SHA); + + connection con1; + # Check ssl turned on +@@ -125,7 +125,7 @@ drop table t1; + # verification of servers certificate by setting both ca certificate + # and ca path to NULL + # +---exec $MYSQL --ssl --ssl-key=$MYSQL_TEST_DIR/std_data/client-key.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/client-cert.pem -e "SHOW STATUS LIKE 'ssl_Cipher'" 2>&1 ++--exec $MYSQL --ssl --ssl-key=$MYSQL_TEST_DIR/std_data/client-key.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/client-cert.pem --ssl-cipher=DHE-RSA-AES256-SHA -e "SHOW STATUS LIKE 'ssl_Cipher'" 2>&1 + --echo End of 5.0 tests + + # +@@ -250,7 +250,7 @@ select 'is still running; no cipher requ + + GRANT SELECT ON test.* TO bug42158@localhost REQUIRE X509; + FLUSH PRIVILEGES; +-connect(con1,localhost,bug42158,,,,,SSL); ++connect(con1,localhost,bug42158,,,,,SSL CIPHER:DHE-RSA-AES256-SHA); + SHOW STATUS LIKE 'Ssl_cipher'; + disconnect con1; + connection default; +diff -up mysql-5.5.28/mysql-test/t/ssl_8k_key.test.p18 mysql-5.5.28/mysql-test/t/ssl_8k_key.test +--- mysql-5.5.28/mysql-test/t/ssl_8k_key.test.p18 2012-08-29 10:50:47.000000000 +0200 ++++ mysql-5.5.28/mysql-test/t/ssl_8k_key.test 2012-12-06 14:25:46.371001424 +0100 +@@ -2,7 +2,7 @@ + # + # Bug#29784 YaSSL assertion failure when reading 8k key. + # +---exec $MYSQL --ssl --ssl-key=$MYSQL_TEST_DIR/std_data/client-key.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/client-cert.pem -e "SHOW STATUS LIKE 'ssl_Cipher'" 2>&1 ++--exec $MYSQL --ssl --ssl-key=$MYSQL_TEST_DIR/std_data/client-key.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/client-cert.pem --ssl-cipher=DHE-RSA-AES256-SHA -e "SHOW STATUS LIKE 'ssl_Cipher'" 2>&1 + + ## This test file is for testing encrypted communication only, not other + ## encryption routines that the SSL library happens to provide! +diff -up mysql-5.5.28/mysql-test/t/ssl_compress.test.p18 mysql-5.5.28/mysql-test/t/ssl_compress.test +--- mysql-5.5.28/mysql-test/t/ssl_compress.test.p18 2012-08-29 10:50:47.000000000 +0200 ++++ mysql-5.5.28/mysql-test/t/ssl_compress.test 2012-12-06 14:25:46.371001424 +0100 +@@ -7,7 +7,7 @@ + # Save the initial number of concurrent sessions + --source include/count_sessions.inc + +-connect (ssl_compress_con,localhost,root,,,,,SSL COMPRESS); ++connect (ssl_compress_con,localhost,root,,,,,SSL COMPRESS CIPHER:DHE-RSA-AES256-SHA); + + # Check ssl turned on + SHOW STATUS LIKE 'Ssl_cipher'; +diff -up mysql-5.5.28/mysql-test/t/ssl.test.p18 mysql-5.5.28/mysql-test/t/ssl.test +--- mysql-5.5.28/mysql-test/t/ssl.test.p18 2012-08-29 10:50:47.000000000 +0200 ++++ mysql-5.5.28/mysql-test/t/ssl.test 2012-12-06 14:25:46.371001424 +0100 +@@ -6,7 +6,7 @@ + # Save the initial number of concurrent sessions + --source include/count_sessions.inc + +-connect (ssl_con,localhost,root,,,,,SSL); ++connect (ssl_con,localhost,root,,,,,SSL CIPHER:DHE-RSA-AES256-SHA); + + # Check ssl turned on + SHOW STATUS LIKE 'Ssl_cipher'; diff --git a/mysql55/mysql-dh1024.patch b/mysql55/mysql-dh1024.patch new file mode 100644 index 0000000..620ee0b --- /dev/null +++ b/mysql55/mysql-dh1024.patch @@ -0,0 +1,63 @@ +Change the DH key length from 512 to 1024 bits to meet minimum requirements +of FIPS 140-2. (In principle we could use the larger size only when FIPS +mode is on, but it doesn't seem worth the trouble.) + +The new parameter value was generated using "openssl dhparam -C 1024". + + +diff -Naur mysql-5.5.28.orig/vio/viosslfactories.c mysql-5.5.28/vio/viosslfactories.c +--- mysql-5.5.28.orig/vio/viosslfactories.c 2012-08-29 04:50:46.000000000 -0400 ++++ mysql-5.5.28/vio/viosslfactories.c 2012-11-15 11:19:38.575701435 -0500 +@@ -20,27 +20,32 @@ + static my_bool ssl_algorithms_added = FALSE; + static my_bool ssl_error_strings_loaded= FALSE; + +-static unsigned char dh512_p[]= ++static unsigned char dh1024_p[]= + { +- 0xDA,0x58,0x3C,0x16,0xD9,0x85,0x22,0x89,0xD0,0xE4,0xAF,0x75, +- 0x6F,0x4C,0xCA,0x92,0xDD,0x4B,0xE5,0x33,0xB8,0x04,0xFB,0x0F, +- 0xED,0x94,0xEF,0x9C,0x8A,0x44,0x03,0xED,0x57,0x46,0x50,0xD3, +- 0x69,0x99,0xDB,0x29,0xD7,0x76,0x27,0x6B,0xA2,0xD3,0xD4,0x12, +- 0xE2,0x18,0xF4,0xDD,0x1E,0x08,0x4C,0xF6,0xD8,0x00,0x3E,0x7C, +- 0x47,0x74,0xE8,0x33, ++ 0xBF,0x5C,0xFA,0xD1,0xDD,0xBB,0xB3,0x0A,0x58,0x29,0x05,0xF5, ++ 0x7D,0x64,0xB2,0xE1,0xCE,0xE8,0xE0,0xE1,0x7A,0xB6,0xBC,0x5B, ++ 0x21,0x56,0xDF,0x2C,0x82,0x60,0xDC,0x31,0xCA,0x1E,0x02,0xFE, ++ 0xC4,0xE7,0x24,0x63,0x31,0xE4,0x67,0x1C,0x0B,0xFF,0x86,0x12, ++ 0x0D,0x2E,0xE6,0x35,0x0A,0x07,0x4F,0xE7,0x3F,0xDE,0xFE,0xF0, ++ 0x13,0x1C,0xA2,0x2B,0xF4,0xEE,0x2C,0x90,0x10,0x57,0x6B,0x2B, ++ 0xB9,0x1E,0x1B,0x47,0xB0,0x25,0xBF,0x45,0x86,0xDA,0x87,0x35, ++ 0x2C,0xF5,0x6A,0x41,0xA2,0x57,0xD8,0x16,0x5E,0x82,0x91,0x99, ++ 0x33,0xA0,0x8B,0x9D,0x34,0xCE,0x03,0x01,0x80,0x32,0x07,0x3B, ++ 0xF2,0x93,0xFC,0x3A,0x25,0xEC,0xB3,0xED,0x5C,0x4E,0x57,0xF2, ++ 0x3C,0x2E,0x0D,0xB1,0x59,0xA2,0x08,0x93, + }; + +-static unsigned char dh512_g[]={ ++static unsigned char dh1024_g[]={ + 0x02, + }; + +-static DH *get_dh512(void) ++static DH *get_dh1024(void) + { + DH *dh; + if ((dh=DH_new())) + { +- dh->p=BN_bin2bn(dh512_p,sizeof(dh512_p),NULL); +- dh->g=BN_bin2bn(dh512_g,sizeof(dh512_g),NULL); ++ dh->p=BN_bin2bn(dh1024_p,sizeof(dh1024_p),NULL); ++ dh->g=BN_bin2bn(dh1024_g,sizeof(dh1024_g),NULL); + if (! dh->p || ! dh->g) + { + DH_free(dh); +@@ -255,7 +260,7 @@ + } + + /* DH stuff */ +- dh=get_dh512(); ++ dh=get_dh1024(); + SSL_CTX_set_tmp_dh(ssl_fd->ssl_context, dh); + DH_free(dh); + diff --git a/mysql55/mysql-dubious-exports.patch b/mysql55/mysql-dubious-exports.patch new file mode 100644 index 0000000..4a88d1d --- /dev/null +++ b/mysql55/mysql-dubious-exports.patch @@ -0,0 +1,169 @@ +Prefix mysql_ to the real names of several symbols that have to be exported +from libmysqlclient because mysql-connector-odbc and/or PHP depend on them. +This limits the intrusion on application namespace. + +Also, remove all traces of make_scrambled_password and +make_scrambled_password_323, so that references to these functions draw +compile-time warnings, per a suggestion from Paul Howarth in bug #690346. +It doesn't seem worth trying to get rid of all the internal symbols exposed +by mysql.h, but these two are relatively easy to get rid of. + + +diff -up mysql-5.5.28/client/mysqladmin.cc.p8 mysql-5.5.28/client/mysqladmin.cc +--- mysql-5.5.28/client/mysqladmin.cc.p8 2012-08-29 10:50:46.000000000 +0200 ++++ mysql-5.5.28/client/mysqladmin.cc 2012-12-06 14:16:14.598520859 +0100 +@@ -21,6 +21,7 @@ + #include /* because of signal() */ + #include + #include ++#include /* my_make_scrambled_password_323, my_make_scrambled_password */ + #include + #include /* ORACLE_WELCOME_COPYRIGHT_NOTICE */ + +@@ -989,9 +990,9 @@ static int execute_commands(MYSQL *mysql + } + } + if (old) +- make_scrambled_password_323(crypted_pw, typed_password); ++ my_make_scrambled_password_323(crypted_pw, typed_password, strlen(typed_password)); + else +- make_scrambled_password(crypted_pw, typed_password); ++ my_make_scrambled_password(crypted_pw, typed_password, strlen(typed_password)); + } + else + crypted_pw[0]=0; /* No password */ +diff -up mysql-5.5.28/include/errmsg.h.p8 mysql-5.5.28/include/errmsg.h +--- mysql-5.5.28/include/errmsg.h.p8 2012-08-29 10:50:46.000000000 +0200 ++++ mysql-5.5.28/include/errmsg.h 2012-12-06 14:16:14.598520859 +0100 +@@ -24,6 +24,7 @@ extern "C" { + #endif + void init_client_errs(void); + void finish_client_errs(void); ++#define client_errors mysql_client_errors /* namespace sanity */ + extern const char *client_errors[]; /* Error messages */ + #ifdef __cplusplus + } +diff -up mysql-5.5.28/include/mysql_com.h.p8 mysql-5.5.28/include/mysql_com.h +--- mysql-5.5.28/include/mysql_com.h.p8 2012-08-29 10:50:46.000000000 +0200 ++++ mysql-5.5.28/include/mysql_com.h 2012-12-06 14:16:14.599520860 +0100 +@@ -452,6 +452,7 @@ my_bool my_net_init(NET *net, Vio* vio); + void my_net_local_init(NET *net); + void net_end(NET *net); + void net_clear(NET *net, my_bool clear_buffer); ++#define net_realloc mysql_net_realloc /* namespace sanity */ + my_bool net_realloc(NET *net, size_t length); + my_bool net_flush(NET *net); + my_bool my_net_write(NET *net,const unsigned char *packet, size_t len); +@@ -533,14 +534,12 @@ double my_rnd(struct rand_struct *); + void create_random_string(char *to, unsigned int length, struct rand_struct *rand_st); + + void hash_password(unsigned long *to, const char *password, unsigned int password_len); +-void make_scrambled_password_323(char *to, const char *password); + void scramble_323(char *to, const char *message, const char *password); + my_bool check_scramble_323(const unsigned char *reply, const char *message, + unsigned long *salt); + void get_salt_from_password_323(unsigned long *res, const char *password); + void make_password_from_salt_323(char *to, const unsigned long *salt); + +-void make_scrambled_password(char *to, const char *password); + void scramble(char *to, const char *message, const char *password); + my_bool check_scramble(const unsigned char *reply, const char *message, + const unsigned char *hash_stage2); +diff -up mysql-5.5.28/include/mysql.h.pp.p8 mysql-5.5.28/include/mysql.h.pp +--- mysql-5.5.28/include/mysql.h.pp.p8 2012-08-29 10:50:46.000000000 +0200 ++++ mysql-5.5.28/include/mysql.h.pp 2012-12-06 14:16:14.598520859 +0100 +@@ -86,7 +86,7 @@ my_bool my_net_init(NET *net, Vio* vio); + void my_net_local_init(NET *net); + void net_end(NET *net); + void net_clear(NET *net, my_bool clear_buffer); +-my_bool net_realloc(NET *net, size_t length); ++my_bool mysql_net_realloc(NET *net, size_t length); + my_bool net_flush(NET *net); + my_bool my_net_write(NET *net,const unsigned char *packet, size_t len); + my_bool net_write_command(NET *net,unsigned char command, +@@ -128,13 +128,11 @@ void randominit(struct rand_struct *, un + double my_rnd(struct rand_struct *); + void create_random_string(char *to, unsigned int length, struct rand_struct *rand_st); + void hash_password(unsigned long *to, const char *password, unsigned int password_len); +-void make_scrambled_password_323(char *to, const char *password); + void scramble_323(char *to, const char *message, const char *password); + my_bool check_scramble_323(const unsigned char *reply, const char *message, + unsigned long *salt); + void get_salt_from_password_323(unsigned long *res, const char *password); + void make_password_from_salt_323(char *to, const unsigned long *salt); +-void make_scrambled_password(char *to, const char *password); + void scramble(char *to, const char *message, const char *password); + my_bool check_scramble(const unsigned char *reply, const char *message, + const unsigned char *hash_stage2); +diff -up mysql-5.5.28/include/my_sys.h.p8 mysql-5.5.28/include/my_sys.h +--- mysql-5.5.28/include/my_sys.h.p8 2012-12-06 14:09:15.218170154 +0100 ++++ mysql-5.5.28/include/my_sys.h 2012-12-06 14:16:14.598520859 +0100 +@@ -218,6 +218,7 @@ extern uint my_large_page_size; + + /* charsets */ + #define MY_ALL_CHARSETS_SIZE 2048 ++#define default_charset_info mysql_default_charset_info /* namespace sanity */ + extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *default_charset_info; + extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *all_charsets[MY_ALL_CHARSETS_SIZE]; + extern CHARSET_INFO compiled_charsets[]; +@@ -895,6 +896,9 @@ extern uint get_charset_number(const cha + extern uint get_collation_number(const char *name); + extern const char *get_charset_name(uint cs_number); + ++#define get_charset mysql_get_charset /* namespace sanity */ ++#define get_charset_by_csname mysql_get_charset_by_csname ++ + extern CHARSET_INFO *get_charset(uint cs_number, myf flags); + extern CHARSET_INFO *get_charset_by_name(const char *cs_name, myf flags); + extern CHARSET_INFO *get_charset_by_csname(const char *cs_name, +diff -up mysql-5.5.28/sql/password.c.p8 mysql-5.5.28/sql/password.c +--- mysql-5.5.28/sql/password.c.p8 2012-08-29 10:50:46.000000000 +0200 ++++ mysql-5.5.28/sql/password.c 2012-12-06 14:16:14.599520860 +0100 +@@ -155,23 +155,6 @@ void my_make_scrambled_password_323(char + + + /* +- Wrapper around my_make_scrambled_password_323() to maintain client lib ABI +- compatibility. +- In server code usage of my_make_scrambled_password_323() is preferred to +- avoid strlen(). +- SYNOPSIS +- make_scrambled_password_323() +- to OUT store scrambled password here +- password IN NULL-terminated string with user-supplied password +-*/ +- +-void make_scrambled_password_323(char *to, const char *password) +-{ +- my_make_scrambled_password_323(to, password, strlen(password)); +-} +- +- +-/* + Scramble string with password. + Used in pre 4.1 authentication phase. + SYNOPSIS +@@ -434,23 +417,6 @@ void my_make_scrambled_password(char *to + + + /* +- Wrapper around my_make_scrambled_password() to maintain client lib ABI +- compatibility. +- In server code usage of my_make_scrambled_password() is preferred to +- avoid strlen(). +- SYNOPSIS +- make_scrambled_password() +- buf OUT buffer of size 2*SHA1_HASH_SIZE + 2 to store hex string +- password IN NULL-terminated password string +-*/ +- +-void make_scrambled_password(char *to, const char *password) +-{ +- my_make_scrambled_password(to, password, strlen(password)); +-} +- +- +-/* + Produce an obscure octet sequence from password and random + string, recieved from the server. This sequence corresponds to the + password, but password can not be easily restored from it. The sequence diff --git a/mysql55/mysql-embedded-check.c b/mysql55/mysql-embedded-check.c new file mode 100644 index 0000000..8bf8ca5 --- /dev/null +++ b/mysql55/mysql-embedded-check.c @@ -0,0 +1,26 @@ +/* simple test program to see if we can link the embedded server library */ + +#include +#include +#include + +#include "mysql.h" + +MYSQL *mysql; + +static char *server_options[] = \ + { "mysql_test", "--defaults-file=my.cnf", NULL }; +int num_elements = (sizeof(server_options) / sizeof(char *)) - 1; + +static char *server_groups[] = { "libmysqld_server", + "libmysqld_client", NULL }; + +int main(int argc, char **argv) +{ + mysql_library_init(num_elements, server_options, server_groups); + mysql = mysql_init(NULL); + mysql_close(mysql); + mysql_library_end(); + + return 0; +} diff --git a/mysql55/mysql-errno.patch b/mysql55/mysql-errno.patch new file mode 100644 index 0000000..ce9d7a1 --- /dev/null +++ b/mysql55/mysql-errno.patch @@ -0,0 +1,21 @@ +"extern int errno" is just a really bad idea. + + +diff -up mysql-5.5.28/include/my_sys.h.p1 mysql-5.5.28/include/my_sys.h +--- mysql-5.5.28/include/my_sys.h.p1 2012-08-29 10:50:46.000000000 +0200 ++++ mysql-5.5.28/include/my_sys.h 2012-12-06 14:09:15.218170154 +0100 +@@ -197,13 +197,8 @@ extern void my_large_free(uchar *ptr); + #define my_afree(PTR) my_free(PTR) + #endif /* HAVE_ALLOCA */ + +-#ifndef errno /* did we already get it? */ +-#ifdef HAVE_ERRNO_AS_DEFINE + #include /* errno is a define */ +-#else +-extern int errno; /* declare errno */ +-#endif +-#endif /* #ifndef errno */ ++ + extern char *home_dir; /* Home directory for user */ + extern const char *my_progname; /* program-name (printed in errors) */ + extern char curr_dir[]; /* Current directory for user */ diff --git a/mysql55/mysql-expired-certs.patch b/mysql55/mysql-expired-certs.patch new file mode 100644 index 0000000..acd3a78 --- /dev/null +++ b/mysql55/mysql-expired-certs.patch @@ -0,0 +1,555 @@ +Upstream insists on generating SSL testing certificates with relatively short +lifespan, which has repeatedly caused problems (ie, one day the regression +tests suddenly stop working). Replace them with certificates with 20-year +lifespan. We should periodically regenerate these, too, but at least not +very often. + + +diff -Naur mysql-5.1.50.orig/mysql-test/std_data/cacert.pem mysql-5.1.50/mysql-test/std_data/cacert.pem +--- mysql-5.1.50.orig/mysql-test/std_data/cacert.pem 2010-08-03 13:55:04.000000000 -0400 ++++ mysql-5.1.50/mysql-test/std_data/cacert.pem 2010-08-27 23:42:05.751428144 -0400 +@@ -1,17 +1,22 @@ + -----BEGIN CERTIFICATE----- +-MIICrTCCAhagAwIBAgIJAMI7xZKjhrDbMA0GCSqGSIb3DQEBBAUAMEQxCzAJBgNV ++MIIDsjCCApqgAwIBAgIJAL5YrUwfPSWVMA0GCSqGSIb3DQEBBQUAMEQxCzAJBgNV + BAYTAlNFMRAwDgYDVQQIEwdVcHBzYWxhMRAwDgYDVQQHEwdVcHBzYWxhMREwDwYD +-VQQKEwhNeVNRTCBBQjAeFw0xMDAxMjkxMTQ3MTBaFw0xNTAxMjgxMTQ3MTBaMEQx ++VQQKEwhNeVNRTCBBQjAeFw0xMDAxMjkwNTU5NTNaFw0xNTAxMjgwNTU5NTNaMEQx + CzAJBgNVBAYTAlNFMRAwDgYDVQQIEwdVcHBzYWxhMRAwDgYDVQQHEwdVcHBzYWxh +-MREwDwYDVQQKEwhNeVNRTCBBQjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA +-wQYsOEfrN4ESP3FjsI8cghE+tZVuyK2gck61lwieVxjgFMtBd65mI5a1y9pmlOI1 +-yM4SB2Ppqcuw7/e1CdV1y7lvHrGNt5yqEHbN4QX1gvsN8TQauP/2WILturk4R4Hq +-rKg0ZySu7f1Xhl0ed9a48LpaEHD17IcxWEGMMJwAxF0CAwEAAaOBpjCBozAMBgNV +-HRMEBTADAQH/MB0GA1UdDgQWBBSvktYQ0ahLnyxyVKqty+WpBbBrDTB0BgNVHSME +-bTBrgBSvktYQ0ahLnyxyVKqty+WpBbBrDaFIpEYwRDELMAkGA1UEBhMCU0UxEDAO +-BgNVBAgTB1VwcHNhbGExEDAOBgNVBAcTB1VwcHNhbGExETAPBgNVBAoTCE15U1FM +-IEFCggkAwjvFkqOGsNswDQYJKoZIhvcNAQEEBQADgYEAdKN1PjwMHAKG2Ww1145g +-JQGBnKxSFOUaoSvkBi/4ntTM+ysnViWh7WvxyWjR9zU9arfr7aqsDeQxm0XDOqzj +-AQ/cQIla2/Li8tXyfc06bisH/IHRaSc2zWqioTKbEwMdVOdrvq4a8V8ic3xYyIWn +-7F4WeS07J8LKardSvM0+hOA= ++MREwDwYDVQQKEwhNeVNRTCBBQjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ++ggEBAL6kNN4peX7uhK9rb06W/QbPEpVuejmdWdl2PqMshP/eSuXXw7kwVgfpxx9R ++vC000CKQQSG9MCoZjtqPnFRsetmWLZgApRpEalGXTXJqq9sEbCfoFizg94U8G7d2 ++u5XJjLVmcG34ru36KoBgVx1zeH1puBAf8dOzrE4L7Y+ZQBFzFohjh8C2LqWC4nM5 ++qsLmOkDWMipGqYU5DvkKjIbTbwTyRNRgZHWSPfVDDPUIUOsY4BGUp2DpgeGY9aEv ++lIs57Ev9JqlIUCV65lOhhDkG+xwmkHKHA+ECEU9cALI8+uXbh48MB9XpMOuk408X ++/lX89aZwD0/G9kmObVGnE2G+H5UCAwEAAaOBpjCBozAdBgNVHQ4EFgQUsft+d7VA ++jWgRftkR5cPG2k2sUbAwdAYDVR0jBG0wa4AUsft+d7VAjWgRftkR5cPG2k2sUbCh ++SKRGMEQxCzAJBgNVBAYTAlNFMRAwDgYDVQQIEwdVcHBzYWxhMRAwDgYDVQQHEwdV ++cHBzYWxhMREwDwYDVQQKEwhNeVNRTCBBQoIJAL5YrUwfPSWVMAwGA1UdEwQFMAMB ++Af8wDQYJKoZIhvcNAQEFBQADggEBALRUOAmdL8R8sl1y8kiEiFgDatdXK5RDqWai ++8yZChfmwTIToHhmQsOEshJe2e8hky3huUj+33VyXjINoMbebIwMuXPwEkbJal8RZ ++nSJmF0jN1Qz7J/jFffwK9xmejWZJx49Kt2+Qwrwp6kDeq9TLFqQOoVczgyJPYsTL ++NAOib5WqTud3XWvCwxrhqmWu7JZq6sp1fomP/uunprb8y2miWfLESZN2mKAhm44Q ++Lws867LT8v2lskEjq2dT1LutD5+R66XcdjgSr0uDziDs64jZwCD6ea94hVFM7ej0 ++ZOXYeSEZJ56FjUxu632e9fY8NyMh30yKjjmQf1mM9PuGJvdvsWU= + -----END CERTIFICATE----- +diff -Naur mysql-5.1.50.orig/mysql-test/std_data/client-cert.pem mysql-5.1.50/mysql-test/std_data/client-cert.pem +--- mysql-5.1.50.orig/mysql-test/std_data/client-cert.pem 2010-08-03 13:55:04.000000000 -0400 ++++ mysql-5.1.50/mysql-test/std_data/client-cert.pem 2010-08-27 23:42:05.752428395 -0400 +@@ -1,46 +1,69 @@ + Certificate: + Data: +- Version: 1 (0x0) +- Serial Number: 1048577 (0x100001) +- Signature Algorithm: md5WithRSAEncryption ++ Version: 3 (0x2) ++ Serial Number: 6 (0x6) ++ Signature Algorithm: sha1WithRSAEncryption + Issuer: C=SE, ST=Uppsala, L=Uppsala, O=MySQL AB + Validity +- Not Before: Jan 29 11:50:22 2010 GMT +- Not After : Jan 28 11:50:22 2015 GMT ++ Not Before: Feb 20 03:03:26 2010 GMT ++ Not After : Sep 3 03:03:26 2030 GMT + Subject: C=SE, ST=Uppsala, O=MySQL AB + Subject Public Key Info: + Public Key Algorithm: rsaEncryption +- Public-Key: (1024 bit) +- Modulus: +- 00:cc:9a:37:49:13:66:dc:cf:e3:0b:13:a1:23:ed: +- 78:db:4e:bd:11:f6:8c:0d:76:f9:a3:32:56:9a:f8: +- a1:21:6a:55:4e:4d:3f:e6:67:9d:26:99:b2:cd:a4: +- 9a:d2:2b:59:5c:d7:8a:d3:60:68:f8:18:bd:c5:be: +- 15:e1:2a:3c:a3:d4:61:cb:f5:11:94:17:81:81:f7: +- 87:8c:f6:6a:d2:ee:d8:e6:77:f6:62:66:4d:2e:16: +- 8d:08:81:4a:c9:c6:4b:31:e5:b9:c7:8a:84:96:48: +- a7:47:8c:0d:26:90:56:4e:e6:a5:6e:8c:b3:f2:9f: +- fc:3d:78:9b:49:6e:86:83:77 ++ RSA Public Key: (1024 bit) ++ Modulus (1024 bit): ++ 00:c2:e7:20:cf:89:59:2f:67:cb:4c:9f:e8:11:f2: ++ 23:e5:f1:b1:ee:3f:66:5f:c3:f5:fd:1e:31:ee:8f: ++ 4c:2a:bd:c0:4a:a5:9f:c8:44:d5:77:8f:15:1b:4d: ++ 78:6e:b2:a2:48:a5:24:33:05:40:02:b3:c1:87:8d: ++ 59:3c:1a:07:aa:86:f0:04:e1:9c:20:4b:22:32:c4: ++ 51:9e:40:e4:31:c3:57:f5:98:bf:2e:b1:fd:2c:56: ++ bf:49:d9:9b:e7:17:cc:95:5f:b5:08:19:5e:9d:df: ++ 65:22:39:2c:48:fb:69:96:31:7a:35:4d:de:60:b4: ++ c1:60:19:5f:96:56:7e:55:19 + Exponent: 65537 (0x10001) +- Signature Algorithm: md5WithRSAEncryption +- 5e:1f:a3:53:5f:24:13:1c:f8:28:32:b0:7f:69:69:f3:0e:c0: +- 34:87:10:03:7d:da:15:8b:bd:19:b8:1a:56:31:e7:85:49:81: +- c9:7f:45:20:74:3e:89:c0:e0:26:84:51:cc:04:16:ce:69:99: +- 01:e1:26:99:b3:e3:f5:bd:ec:5f:a0:84:e4:38:da:75:78:7b: +- 89:9c:d2:cd:60:95:20:ba:8e:e3:7c:e6:df:76:3a:7c:89:77: +- 02:94:86:11:3a:c4:61:7d:6f:71:83:21:8a:17:fb:17:e2:ee: +- 02:6b:61:c1:b4:52:63:d7:d8:46:b2:c5:9c:6f:38:91:8a:35: +- 32:0b ++ X509v3 extensions: ++ X509v3 Basic Constraints: ++ CA:FALSE ++ X509v3 Subject Key Identifier: ++ 8D:10:67:91:33:76:9C:02:E5:78:5D:D8:C5:EF:25:96:B2:D7:FA:1F ++ X509v3 Authority Key Identifier: ++ keyid:B1:FB:7E:77:B5:40:8D:68:11:7E:D9:11:E5:C3:C6:DA:4D:AC:51:B0 ++ DirName:/C=SE/ST=Uppsala/L=Uppsala/O=MySQL AB ++ serial:BE:58:AD:4C:1F:3D:25:95 ++ ++ Signature Algorithm: sha1WithRSAEncryption ++ a9:88:10:3e:5d:2a:47:29:c8:03:27:7a:31:5a:8e:10:03:bc: ++ b5:4e:37:1d:12:7b:eb:5f:50:71:70:b1:a3:8e:93:0e:77:17: ++ 6c:47:b6:c9:a4:4d:2a:c4:38:f0:61:55:b2:7f:28:ba:06:79: ++ ee:67:11:7d:d4:c9:7f:0a:18:c8:c1:cb:d0:2c:f9:63:0f:bb: ++ 45:ca:de:ea:bb:ac:00:01:52:48:36:2b:07:2b:c8:46:c7:b1: ++ 21:81:bd:77:39:e7:4c:39:aa:bd:ac:60:d8:a7:bf:cf:14:98: ++ 4a:0b:a1:40:55:06:8d:6f:35:a9:39:a0:71:a9:97:ba:7c:73: ++ 3c:41:ba:c5:1c:11:4b:2b:43:1d:2d:ba:7b:5f:14:b5:3d:64: ++ 62:15:36:b4:16:bd:78:c8:43:8d:f9:1c:a5:d2:ac:a1:58:74: ++ e1:99:de:ad:04:19:43:a8:bd:0a:fd:19:9b:50:44:46:6d:18: ++ 55:4d:bf:b4:5b:a4:93:62:c7:64:91:6c:54:34:d1:f8:f3:ff: ++ 12:6d:5f:85:e7:35:9e:5c:42:81:5e:fb:c8:bb:44:51:98:b2: ++ ef:1b:9f:5a:22:77:28:7d:da:fb:08:c2:94:9a:0f:42:08:93: ++ 54:10:1e:ad:f2:4f:fc:62:98:51:e9:9b:b9:3a:93:d9:e4:1f: ++ 1d:c4:76:d0 + -----BEGIN CERTIFICATE----- +-MIIB5zCCAVACAxAAATANBgkqhkiG9w0BAQQFADBEMQswCQYDVQQGEwJTRTEQMA4G +-A1UECBMHVXBwc2FsYTEQMA4GA1UEBxMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwg +-QUIwHhcNMTAwMTI5MTE1MDIyWhcNMTUwMTI4MTE1MDIyWjAyMQswCQYDVQQGEwJT +-RTEQMA4GA1UECBMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwgQUIwgZ8wDQYJKoZI +-hvcNAQEBBQADgY0AMIGJAoGBAMyaN0kTZtzP4wsToSPteNtOvRH2jA12+aMyVpr4 +-oSFqVU5NP+ZnnSaZss2kmtIrWVzXitNgaPgYvcW+FeEqPKPUYcv1EZQXgYH3h4z2 +-atLu2OZ39mJmTS4WjQiBSsnGSzHluceKhJZIp0eMDSaQVk7mpW6Ms/Kf/D14m0lu +-hoN3AgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAXh+jU18kExz4KDKwf2lp8w7ANIcQ +-A33aFYu9GbgaVjHnhUmByX9FIHQ+icDgJoRRzAQWzmmZAeEmmbPj9b3sX6CE5Dja +-dXh7iZzSzWCVILqO43zm33Y6fIl3ApSGETrEYX1vcYMhihf7F+LuAmthwbRSY9fY +-RrLFnG84kYo1Mgs= ++MIIDETCCAfmgAwIBAgIBBjANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJTRTEQ ++MA4GA1UECBMHVXBwc2FsYTEQMA4GA1UEBxMHVXBwc2FsYTERMA8GA1UEChMITXlT ++UUwgQUIwHhcNMTAwMjIwMDMwMzI2WhcNMzAwOTAzMDMwMzI2WjAyMQswCQYDVQQG ++EwJTRTEQMA4GA1UECBMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwgQUIwgZ8wDQYJ ++KoZIhvcNAQEBBQADgY0AMIGJAoGBAMLnIM+JWS9ny0yf6BHyI+Xxse4/Zl/D9f0e ++Me6PTCq9wEqln8hE1XePFRtNeG6yokilJDMFQAKzwYeNWTwaB6qG8AThnCBLIjLE ++UZ5A5DHDV/WYvy6x/SxWv0nZm+cXzJVftQgZXp3fZSI5LEj7aZYxejVN3mC0wWAZ ++X5ZWflUZAgMBAAGjgaMwgaAwCQYDVR0TBAIwADAdBgNVHQ4EFgQUjRBnkTN2nALl ++eF3Yxe8llrLX+h8wdAYDVR0jBG0wa4AUsft+d7VAjWgRftkR5cPG2k2sUbChSKRG ++MEQxCzAJBgNVBAYTAlNFMRAwDgYDVQQIEwdVcHBzYWxhMRAwDgYDVQQHEwdVcHBz ++YWxhMREwDwYDVQQKEwhNeVNRTCBBQoIJAL5YrUwfPSWVMA0GCSqGSIb3DQEBBQUA ++A4IBAQCpiBA+XSpHKcgDJ3oxWo4QA7y1TjcdEnvrX1BxcLGjjpMOdxdsR7bJpE0q ++xDjwYVWyfyi6BnnuZxF91Ml/ChjIwcvQLPljD7tFyt7qu6wAAVJINisHK8hGx7Eh ++gb13OedMOaq9rGDYp7/PFJhKC6FAVQaNbzWpOaBxqZe6fHM8QbrFHBFLK0MdLbp7 ++XxS1PWRiFTa0Fr14yEON+Ryl0qyhWHThmd6tBBlDqL0K/RmbUERGbRhVTb+0W6ST ++YsdkkWxUNNH48/8SbV+F5zWeXEKBXvvIu0RRmLLvG59aIncofdr7CMKUmg9CCJNU ++EB6t8k/8YphR6Zu5OpPZ5B8dxHbQ + -----END CERTIFICATE----- +diff -Naur mysql-5.1.50.orig/mysql-test/std_data/client-key.pem mysql-5.1.50/mysql-test/std_data/client-key.pem +--- mysql-5.1.50.orig/mysql-test/std_data/client-key.pem 2010-08-03 13:55:05.000000000 -0400 ++++ mysql-5.1.50/mysql-test/std_data/client-key.pem 2010-08-27 23:42:05.752428395 -0400 +@@ -1,15 +1,15 @@ + -----BEGIN RSA PRIVATE KEY----- +-MIICXQIBAAKBgQDMmjdJE2bcz+MLE6Ej7XjbTr0R9owNdvmjMlaa+KEhalVOTT/m +-Z50mmbLNpJrSK1lc14rTYGj4GL3FvhXhKjyj1GHL9RGUF4GB94eM9mrS7tjmd/Zi +-Zk0uFo0IgUrJxksx5bnHioSWSKdHjA0mkFZO5qVujLPyn/w9eJtJboaDdwIDAQAB +-AoGASqk/4We2En+93y3jkIO4pXafIe3w/3zZ7caRue1ehx4RUQh5d+95djuB9u7J +-HEZ7TpjM7QNyao5EueL6gvbxt0LXFvqAMni7yM9tt/HUYtHHPqYiRtUny9bKYFTm +-l8szCCMal/wD9GZU9ByHDNHm7tHUMyMhARNTYSgx+SERFmECQQD/6jJocC4SXf6f +-T3LqimWR02lbJ7qCoDgRglsUXh0zjrG+IIiAyE+QOCCx1GMe3Uw6bsIuYwdHT6as +-WcdPs04xAkEAzKulvEvLVvN5zfa/DTYRTV7jh6aDleOxjsD5oN/oJXoACnPzVuUL +-qQQMNtuAXm6Q1QItrRxpQsSKbY0UQka6JwJBAOSgoNoG5lIIYTKIMvzwGV+XBLeo +-HYsXgh+6Wo4uql3mLErUG78ZtWL9kc/tE4R+ZdyKGLaCR/1gXmH5bwN4B/ECQEBb +-uUH8k3REG4kojesZlVc+/00ojzgS4UKCa/yqa9VdB6ZBz8MDQydinnShkTwgiGpy +-xOoqhO753o2UT0qH8wECQQC99IEJWUnwvExVMkLaZH5NjAFJkb22sjkmuT11tAgU +-RQgOMoDOm6driojnOnDWOkx1r1Gy9NgMLooduja4v6cx ++MIICWwIBAAKBgQDC5yDPiVkvZ8tMn+gR8iPl8bHuP2Zfw/X9HjHuj0wqvcBKpZ/I ++RNV3jxUbTXhusqJIpSQzBUACs8GHjVk8GgeqhvAE4ZwgSyIyxFGeQOQxw1f1mL8u ++sf0sVr9J2ZvnF8yVX7UIGV6d32UiOSxI+2mWMXo1Td5gtMFgGV+WVn5VGQIDAQAB ++AoGARXcXLKDpVooJ3W+IyQyiWsw//IhANpWjUOm4JiyQmxMyO+i4ACr4Yjpu7WI5 ++MEseqAGj20NdwxjKO0PXsCIe5LmrGZ+SI8+CSERFOWXWRtCWz7y7SG30i1k6suvM ++mwqWom0tJLwn93uA1lm/WSwKQwUrJRahRQd3EaZqrl7DP5kCQQD/8gbuYAT5pxQe ++ULLGM0RvEsXxDYbEDxNbY5wrBazfklBwpumxZpFl6jEAT++7Kh2Ns3A7kB1oUNlA ++FPYr+dYPAkEAwvHEwRtoyUr8jqoqVVJWI76CDmBjEOzVeMKW97ztqbs2LxZW8dYI ++iOh/myFGpdoUwgu0U8w9MmXcj3ZeZCYKVwJALyQ+AJPw9qa+fuLwOq9gsHCtwrty ++EhSQxSlwrz/pWniRll439vPkXfgntF4E0t1r+hiN2Hqv3/HcQgBaYzkuIwJAG023 ++bACFxaOuCeFFepvEms8E8jSHy4gQQhCnCl24v8wLw76SQN7kZSCDNtwLRBFuVNtE ++z3PMonFn2eQPRmGZkwJAP1c1BHprMQx/ruafdscROILv3JrH40C1bR6KVVBKt1dK ++Qpnpgi7hK5rUQjDF8k3bn9ugTt06jyeHe/QhAml0kg== + -----END RSA PRIVATE KEY----- +diff -Naur mysql-5.1.50.orig/mysql-test/std_data/server-cert.pem mysql-5.1.50/mysql-test/std_data/server-cert.pem +--- mysql-5.1.50.orig/mysql-test/std_data/server-cert.pem 2010-08-03 13:55:08.000000000 -0400 ++++ mysql-5.1.50/mysql-test/std_data/server-cert.pem 2010-08-27 23:42:05.753428361 -0400 +@@ -1,41 +1,69 @@ + Certificate: + Data: +- Version: 1 (0x0) +- Serial Number: 1048578 (0x100002) +- Signature Algorithm: md5WithRSAEncryption ++ Version: 3 (0x2) ++ Serial Number: 4 (0x4) ++ Signature Algorithm: sha1WithRSAEncryption + Issuer: C=SE, ST=Uppsala, L=Uppsala, O=MySQL AB + Validity +- Not Before: Jan 29 11:56:49 2010 GMT +- Not After : Jan 28 11:56:49 2015 GMT ++ Not Before: Feb 20 02:55:06 2010 GMT ++ Not After : Sep 3 02:55:06 2030 GMT + Subject: C=SE, ST=Uppsala, O=MySQL AB, CN=localhost + Subject Public Key Info: + Public Key Algorithm: rsaEncryption +- Public-Key: (512 bit) +- Modulus: +- 00:cd:e4:87:51:9d:72:11:a0:d1:fa:f3:92:8b:13: +- 1c:eb:f7:e2:9a:2f:72:a8:d6:65:48:d1:69:af:1b: +- c0:4c:13:e5:60:60:51:41:e9:ab:a6:bc:13:bb:0c: +- 5e:32:7c:d9:6c:9e:cd:05:24:84:78:db:80:91:2e: +- d8:88:2b:c2:ed ++ RSA Public Key: (1024 bit) ++ Modulus (1024 bit): ++ 00:e3:7d:4f:c2:23:77:a9:3a:2c:d2:69:59:a0:2f: ++ 4e:d1:51:4c:ae:8d:f5:17:cc:ce:58:9c:83:4f:0b: ++ a3:bb:29:a2:b8:1d:3e:1b:04:f9:a9:3e:e2:61:d0: ++ e6:7b:b9:7c:12:d8:1f:86:c9:53:b5:04:dd:df:26: ++ e9:c0:2b:de:4a:96:2e:f3:23:6f:79:6d:a9:d2:4e: ++ 17:af:2f:de:8b:68:44:ae:de:a3:e2:c4:37:1c:04: ++ ad:73:4b:85:f9:83:ac:fe:b7:c1:54:47:2e:96:d4: ++ 31:96:85:94:69:d6:5a:63:24:04:99:89:19:1d:56: ++ 8a:d1:77:aa:87:fb:38:cd:b7 + Exponent: 65537 (0x10001) +- Signature Algorithm: md5WithRSAEncryption +- 73:ce:9c:6e:39:46:b4:14:be:da:3f:f3:1b:ba:90:bc:23:43: +- d7:82:2a:70:4e:a6:d9:5a:65:5c:b7:df:71:df:75:77:c5:80: +- a4:af:fa:d2:59:e2:fd:c9:9c:f0:98:95:8e:69:a9:8c:7c:d8: +- 6f:48:d2:e3:36:e0:cd:ff:3f:d1:a5:e6:ab:75:09:c4:50:10: +- c4:96:dd:bf:3b:de:32:46:da:ca:4a:f1:d6:52:8a:33:2f:ab: +- f5:2e:70:3f:d4:9c:be:00:c8:03:f9:39:8a:df:5b:70:3c:40: +- ef:03:be:7c:3d:1d:32:32:f3:51:81:e2:83:30:6e:3d:38:9b: +- fb:3c ++ X509v3 extensions: ++ X509v3 Basic Constraints: ++ CA:FALSE ++ X509v3 Subject Key Identifier: ++ CC:8C:71:40:D0:0F:BF:D1:99:79:3F:1B:E9:10:76:19:67:36:0F:A3 ++ X509v3 Authority Key Identifier: ++ keyid:B1:FB:7E:77:B5:40:8D:68:11:7E:D9:11:E5:C3:C6:DA:4D:AC:51:B0 ++ DirName:/C=SE/ST=Uppsala/L=Uppsala/O=MySQL AB ++ serial:BE:58:AD:4C:1F:3D:25:95 ++ ++ Signature Algorithm: sha1WithRSAEncryption ++ 6f:ad:5e:59:fa:84:3a:be:e2:72:b1:e8:66:2a:4e:f8:73:19: ++ 11:06:11:92:78:56:3e:d6:e8:68:29:90:8b:59:d2:fe:aa:ae: ++ 25:59:c7:e9:99:bb:4a:06:43:dd:40:bd:cb:f4:ae:79:95:7d: ++ 8e:90:ef:58:d2:a8:fc:bf:07:f3:37:b2:9b:bd:da:e6:8c:56: ++ dd:5e:c6:4a:70:7c:3e:3d:a1:e8:35:06:b8:a7:7b:ac:26:85: ++ 54:5d:09:a2:7b:77:b4:17:7f:72:31:cb:ff:cc:67:6d:e6:3e: ++ c6:dc:96:eb:4a:0a:ae:e9:48:ae:8a:e0:d6:73:57:6e:32:4c: ++ 00:dc:28:da:55:b3:9f:9f:d8:98:cc:d9:f1:b6:b3:14:67:2e: ++ a1:47:1e:51:11:cf:70:9f:31:8f:ba:59:29:f2:d0:88:0b:e2: ++ 51:6b:f8:31:ed:6d:ac:00:5e:d3:78:4c:95:97:02:cc:74:2b: ++ 3b:c6:28:e6:2a:c3:30:99:35:b4:4d:31:46:d4:90:f2:47:ed: ++ 64:85:1a:75:2a:72:0a:2f:c6:3a:2f:d2:ac:6b:31:cc:e5:a8: ++ 07:c2:d6:22:f3:c6:0f:bf:67:d9:d6:b2:79:cd:48:b5:c3:e0: ++ e3:18:7f:b5:74:c9:43:19:fb:c4:93:29:ca:cc:90:2b:1b:6f: ++ 45:f6:25:f9 + -----BEGIN CERTIFICATE----- +-MIIBtzCCASACAxAAAjANBgkqhkiG9w0BAQQFADBEMQswCQYDVQQGEwJTRTEQMA4G +-A1UECBMHVXBwc2FsYTEQMA4GA1UEBxMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwg +-QUIwHhcNMTAwMTI5MTE1NjQ5WhcNMTUwMTI4MTE1NjQ5WjBGMQswCQYDVQQGEwJT +-RTEQMA4GA1UECBMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwgQUIxEjAQBgNVBAMT +-CWxvY2FsaG9zdDBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDN5IdRnXIRoNH685KL +-Exzr9+KaL3Ko1mVI0WmvG8BME+VgYFFB6aumvBO7DF4yfNlsns0FJIR424CRLtiI +-K8LtAgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAc86cbjlGtBS+2j/zG7qQvCND14Iq +-cE6m2VplXLffcd91d8WApK/60lni/cmc8JiVjmmpjHzYb0jS4zbgzf8/0aXmq3UJ +-xFAQxJbdvzveMkbaykrx1lKKMy+r9S5wP9ScvgDIA/k5it9bcDxA7wO+fD0dMjLz +-UYHigzBuPTib+zw= ++MIIDJTCCAg2gAwIBAgIBBDANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJTRTEQ ++MA4GA1UECBMHVXBwc2FsYTEQMA4GA1UEBxMHVXBwc2FsYTERMA8GA1UEChMITXlT ++UUwgQUIwHhcNMTAwMjIwMDI1NTA2WhcNMzAwOTAzMDI1NTA2WjBGMQswCQYDVQQG ++EwJTRTEQMA4GA1UECBMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwgQUIxEjAQBgNV ++BAMTCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA431PwiN3 ++qTos0mlZoC9O0VFMro31F8zOWJyDTwujuymiuB0+GwT5qT7iYdDme7l8EtgfhslT ++tQTd3ybpwCveSpYu8yNveW2p0k4Xry/ei2hErt6j4sQ3HAStc0uF+YOs/rfBVEcu ++ltQxloWUadZaYyQEmYkZHVaK0Xeqh/s4zbcCAwEAAaOBozCBoDAJBgNVHRMEAjAA ++MB0GA1UdDgQWBBTMjHFA0A+/0Zl5PxvpEHYZZzYPozB0BgNVHSMEbTBrgBSx+353 ++tUCNaBF+2RHlw8baTaxRsKFIpEYwRDELMAkGA1UEBhMCU0UxEDAOBgNVBAgTB1Vw ++cHNhbGExEDAOBgNVBAcTB1VwcHNhbGExETAPBgNVBAoTCE15U1FMIEFCggkAvlit ++TB89JZUwDQYJKoZIhvcNAQEFBQADggEBAG+tXln6hDq+4nKx6GYqTvhzGREGEZJ4 ++Vj7W6GgpkItZ0v6qriVZx+mZu0oGQ91Avcv0rnmVfY6Q71jSqPy/B/M3spu92uaM ++Vt1exkpwfD49oeg1Brine6wmhVRdCaJ7d7QXf3Ixy//MZ23mPsbclutKCq7pSK6K ++4NZzV24yTADcKNpVs5+f2JjM2fG2sxRnLqFHHlERz3CfMY+6WSny0IgL4lFr+DHt ++bawAXtN4TJWXAsx0KzvGKOYqwzCZNbRNMUbUkPJH7WSFGnUqcgovxjov0qxrMczl ++qAfC1iLzxg+/Z9nWsnnNSLXD4OMYf7V0yUMZ+8STKcrMkCsbb0X2Jfk= + -----END CERTIFICATE----- +diff -Naur mysql-5.1.50.orig/mysql-test/std_data/server-key.pem mysql-5.1.50/mysql-test/std_data/server-key.pem +--- mysql-5.1.50.orig/mysql-test/std_data/server-key.pem 2010-08-03 13:55:08.000000000 -0400 ++++ mysql-5.1.50/mysql-test/std_data/server-key.pem 2010-08-27 23:42:05.754428433 -0400 +@@ -1,9 +1,15 @@ + -----BEGIN RSA PRIVATE KEY----- +-MIIBOwIBAAJBAM3kh1GdchGg0frzkosTHOv34povcqjWZUjRaa8bwEwT5WBgUUHp +-q6a8E7sMXjJ82WyezQUkhHjbgJEu2Igrwu0CAwEAAQJBAJuwhFbF3NzRpBbEmnqJ +-4GPa1UJMQMLFJF+04tqj/HxJcAIVhOJhGmmtYNw1yjz/ZsPnfJCMz4eFOtdjvGtf +-peECIQDmFFg2WLvYo+2m9w9V7z4ZIkg7ixYkI/ObUUctfZkPOQIhAOUWnrvjFrAX +-bIvYT/YR50+3ZDLEc51XxNgJnWqWYl1VAiEAnTOFWgyivFC1DgF8PvDp8u5TgCt2 +-A1d1GMgd490O+TECIC/WMl0/hTxOF9930vKqOGf//o9PUGkZq8QE9fcM4gtlAiAE +-iOcFpnLjtWj57jrhuw214ucnB5rklkQQe+AtcARNkg== ++MIICXgIBAAKBgQDjfU/CI3epOizSaVmgL07RUUyujfUXzM5YnINPC6O7KaK4HT4b ++BPmpPuJh0OZ7uXwS2B+GyVO1BN3fJunAK95Kli7zI295banSThevL96LaESu3qPi ++xDccBK1zS4X5g6z+t8FURy6W1DGWhZRp1lpjJASZiRkdVorRd6qH+zjNtwIDAQAB ++AoGAUb0o91y/FjMs/72S0pes/lDz+JRRSGfyjKxQEgrgndNsADOhqRu0iTdrKDJj ++XnlbN3ooecnFJfnFrvTQcJhSmlS30j6VrBw6LXpCBK3dvjYgJ9LOne7WK+dF1+vS ++FMQtsP04C56Sxy6HJDpMyWJ6oS3Bu169ygG2AxKo+Fk+E6ECQQD38w/MzmrARz2Z ++AGeEPDUnVZPYgtmXkmks95S0/2jSoLhmgpvJimzxwpYwVG/BG8dSDVuTDu5kp05D ++3bZIp3EzAkEA6uAwJsCZPtHXlWU3wYZJsA697rUNjPaCQOIaZ/lnh5RUHTmUiw1h ++Oj/VORqKB0kXqcDfawwLjZEvh1Xli+H5bQJBANTmhw2TvEPnp/OFTl1UGUvyBmXl ++TRMB639qAu07VfVtfYi/4ya1zn/0VmOfTOoigQ5qW9Q1AOu6YNCTQl62L9MCQQDc ++YfEsW2kvNYxYJHoVfuBjbuGuOnn1e1Oqd70ZND59S6NFLMMBWlORaVWzWACNZ3rp ++kAzSj6HDeqgjD2jsQONdAkEAt7S1YHUn8F760bRn4AnAto2TVOYdArtTP/wYjd4o ++9rJREO/d8AYkYJ96APLvF0SZ4n3t1pLwQRsKKN8ZGTmzLA== + -----END RSA PRIVATE KEY----- +diff -Naur mysql-5.1.50.orig/mysql-test/std_data/server8k-cert.pem mysql-5.1.50/mysql-test/std_data/server8k-cert.pem +--- mysql-5.1.50.orig/mysql-test/std_data/server8k-cert.pem 2010-08-03 13:55:08.000000000 -0400 ++++ mysql-5.1.50/mysql-test/std_data/server8k-cert.pem 2010-08-27 23:43:00.005366270 -0400 +@@ -1,51 +1,69 @@ ++Certificate: ++ Data: ++ Version: 3 (0x2) ++ Serial Number: 5 (0x5) ++ Signature Algorithm: sha1WithRSAEncryption ++ Issuer: C=SE, ST=Uppsala, L=Uppsala, O=MySQL AB ++ Validity ++ Not Before: Feb 20 03:00:54 2010 GMT ++ Not After : Sep 3 03:00:54 2030 GMT ++ Subject: C=SE, ST=Uppsala, O=MySQL AB, CN=server ++ Subject Public Key Info: ++ Public Key Algorithm: rsaEncryption ++ RSA Public Key: (1024 bit) ++ Modulus (1024 bit): ++ 00:c5:da:44:95:06:77:16:21:af:a0:c4:3c:e9:f8: ++ 1d:2d:95:f9:63:90:8c:3f:86:ba:77:76:4a:52:4b: ++ 6b:af:29:f5:1c:aa:d4:3f:3e:42:9f:6d:46:ba:86: ++ 90:b1:2d:cc:db:c6:33:15:a3:f4:af:53:33:4f:a1: ++ 56:d1:aa:3b:26:10:f7:64:b5:f9:bf:1b:b1:47:8e: ++ cc:a6:d6:0d:aa:4a:77:e3:a3:63:9d:2a:dc:65:f4: ++ 7f:91:17:38:2d:d6:cd:4e:8d:53:52:97:6e:87:fc: ++ 64:60:a6:a1:00:ac:96:6c:e4:42:94:75:17:46:6f: ++ 91:b5:dd:06:47:ed:05:e3:db ++ Exponent: 65537 (0x10001) ++ X509v3 extensions: ++ X509v3 Basic Constraints: ++ CA:FALSE ++ X509v3 Subject Key Identifier: ++ 6E:60:3F:29:13:60:99:ED:0C:F7:15:B5:DB:7B:1C:FB:6F:60:19:ED ++ X509v3 Authority Key Identifier: ++ keyid:B1:FB:7E:77:B5:40:8D:68:11:7E:D9:11:E5:C3:C6:DA:4D:AC:51:B0 ++ DirName:/C=SE/ST=Uppsala/L=Uppsala/O=MySQL AB ++ serial:BE:58:AD:4C:1F:3D:25:95 ++ ++ Signature Algorithm: sha1WithRSAEncryption ++ 63:2e:0f:07:14:06:cf:74:90:3d:37:42:f2:48:70:60:21:bc: ++ 34:52:31:f1:87:70:d2:b2:fb:ff:13:38:dc:f0:5e:43:d7:ee: ++ a7:c7:1f:ac:aa:d2:8c:4f:fa:3c:4c:73:f6:b6:c2:0c:a0:ea: ++ a2:c9:e2:73:61:c3:2e:78:40:0f:2a:d3:63:50:9b:b8:f9:89: ++ 40:ed:98:08:97:c3:07:24:17:34:b5:78:89:0a:bb:83:4c:e2: ++ 5c:2e:13:d6:21:30:ad:30:48:b5:70:12:ff:4a:6f:42:f0:f8: ++ 9f:b1:4b:bd:89:2b:f0:9d:e2:49:2b:35:69:18:1f:76:40:b4: ++ 76:bd:cb:dd:27:2f:c0:c1:e2:33:3e:6e:df:68:54:19:92:8a: ++ bb:13:9c:cf:d6:17:56:da:bf:0d:64:70:3a:45:b7:aa:5f:e3: ++ f5:96:ae:34:f2:17:37:27:d0:4b:e8:30:4a:c0:02:42:e2:d2: ++ 30:eb:eb:c7:d7:ec:d8:df:5c:43:58:e2:6f:b7:58:54:0d:c4: ++ 01:71:2d:59:8f:44:c7:a1:6c:0b:41:28:fa:b7:63:a7:68:d3: ++ 4f:c3:0f:17:9e:b2:32:50:e6:0b:87:3d:e2:39:47:c0:d8:0a: ++ 3b:f6:af:50:68:0f:9d:ef:6e:34:0d:3a:07:94:f8:a4:d7:24: ++ 86:32:d3:b4 + -----BEGIN CERTIFICATE----- +-MIIJFDCCBPwCAQEwDQYJKoZIhvcNAQEEBQAwTjELMAkGA1UEBhMCU0UxEDAOBgNV +-BAgTB1VwcHNhbGExETAPBgNVBAoTCE15U1FMIEFCMQ0wCwYDVQQLEwRUZXN0MQsw +-CQYDVQQDEwJDQTAeFw0xMDA3MjgxNDA3MjhaFw0xODEwMTQxNDA3MjhaMFIxCzAJ +-BgNVBAYTAlNFMRAwDgYDVQQIEwdVcHBzYWxhMREwDwYDVQQKEwhNeVNRTCBBQjEN +-MAsGA1UECxMEVGVzdDEPMA0GA1UEAxMGc2VydmVyMIIEIjANBgkqhkiG9w0BAQEF +-AAOCBA8AMIIECgKCBAEA6h3v1OWb9I9U/Z8diBu/xYGS8NCTD3ZESboHxVI2qSEC +-PgxNNcG8Lh0ktQdgYcOe64MnDTZX0Bibm47hoDldrAlTSffFxQhylqBBoXxDF+Lr +-hXIqCz7K0PsK+bYusL9ezJ7PETDnCT7oy95q4GXbKsutbNsm9if4ZE41gs2KnoU2 +-DA7kvMmkKojrMIL4+BqTXA20LLo0iSbgvUTvpSJw4u96BeyzMNnxK2wP5vvTtUo5 +-hACbfU87YjaSKs+q2VXCzfyYGZk1L1xk5GUI0bP+jutf1dDzNttW2/q2Nf5rxx09 +-Gh/GwmOnEk1O7cOZ8VQCsOHirIM39NuSARsY6Y3G5XM4k2W4nxyR/RtdG9bvs/33 +-aGsZ5V5yp7WSs8s9HHwaCPSsUiLKckQ7uA0TTRgbeweMrrLKovG57jsbBBB8pQD4 +-PRd31qgxCdstWXHiWwRyI8vOLWENPXPFqA/rJwwqNdWTogy38aqVXxGYR8PIwjA2 +-OaIwFjwGZcsPNLqw6bgAN8O2UBqZHWiMF8mi7brvioDvAIufZuqa2SqT/At45H83 +-psQ6R4FsxZt6SAK7EsdPo8OYTrY1i4iPZd/eKhnEu2srEZgsKRwY5H1mvDH5fWCc +-HSFu07sWmlmK6Or65Fsa0IaKLJiQDVVETd6xrI0wkM4AOcbKDrS7aywJ426dopbs +-+LFdt4N0cdII4gBgJAfLuuA2yrDXRq4P6cgpVMy0R+0dEYE8zzm8zf1a+Ud273LS +-9+LB+LJKwqbW8nOPBoiekimIKfJYoOA4+C/mAjsYl1sVjjEhXJAs9S9L2UvnUk1P +-sZi4UKHI6eAIEl7VM1sQ4GbdZ0px2dF2Ax7pGkhD+DLpYyYkCprharKZdmuUNLUd +-NhXxi/HSEiE+Uy+o8RIzmH7LuROl/ZgnfHjJEiBLt2qPvwrwYd4c3XuXWs4YsWfV +-JTt8Mx2ihgVcdGy9//shCSmgJwR1oWrhgC10AEL2fKeRnYUal1i+IxFPp7nb8uwx +-UADgR0cY4A3qR/JP489QFIcxBTVs65De+Bq3ecnujk6yeGpD9iptonq4Y8uNZMc1 +-kOE7GiFGwR4EufT5SEMh+tUkjth2r+842vmZZuxrVQaohDiATmIJA07W51zKH+nQ +-uw4qVKnAhPaDLCLc7YMIH9JcmkeQX0nf8/S2O2WYDH8glVDi5hfW08tCmV647vRY +-nTIywUTO0lFpz7M+VyMNaJ6yXU6biBV5hLAI8C5ldr/SWI789W2+ebBaJ9gfK+PT +-trohFSK37GcoSH4V6qSLJHCBASEsiddqHIHMLJZRYD+B6J3tLhjVUM43u+MEGbFT +-d33ZDke/WzLTExWkaOv36e67gDBmgDuj9yroq3wGfwIDAQABMA0GCSqGSIb3DQEB +-BAUAA4IEAQCc9RBhRbuWlmRZPZkqIdi5/+enyjoMmOa6ryJPxFSP8D2jrlHgQsk1 +-+GsJmPFT3rwWfoGAQu/aeSX4sp8OhKVJtqNA6MJrGYnZIMolgYa1wZPbkjJsdEfi +-UsZdIB0n2+KA0xwEdGPdkGCfNPBtOg557DkcyEvsIZ9ELp4Pp2XzWRhyFGasJZc4 +-YwgD/3K2rpOPZoMkBKeKqV19j41OfLKGBVyuaqzitbu9+KT4RU1ibr2a+UuFCwdT +-oqyN7bfWXjcjXOMkxCsOmLfKmqQxs7TEOVrYPTdYjamDxLy/e5g5FgoCxGY8iil0 +-+YFLZyH6eEx/Os9DlG/M3O1MeRD9U97CdsphbDVZIDyWw5xeX8qQHJe0KSprAgiG +-TLhTZHeyrKujQCQS1oFFmNy4gSqXt0j1/6/9T80j6HeyjiiYEaEQK9YLTAjRoA7W +-VN8wtHI5F3RlNOVQEJks/bjdlpLL3VhaWtfewGh/mXRGcow84cgcsejMexmhreHm +-JfTUl9+X1IFFxGq2/606A9ROQ7kN/s4rXu7/TiMODXI/kZijoWd2SCc7Z0YWoNo7 +-IRKkmZtrsflJbObEuK2Jk59uqzSxyQOBId8qtbPo8qJJyHGV5GCp34g4x67BxJBo +-h1iyVMamBAS5Ip1ejghuROrB8Hit8NhAZApXju62btJeXLX+mQayXb/wC/IXNJJD +-83tXiLfZgs6GzLAq7+KW/64sZSvj87CPiNtxkvjchAvyr+fhbBXCrf4rlOjJE6SH +-Je2/Jon7uqijncARGLBeYUT0Aa6k1slpXuSKxDNt7EIkP21kDZ5/OJ0Y1u587KVB +-dEhuDgNf2/8ij7gAQBwBoZMe1DrwddrxgLLBlyHpAZetNYFZNT+Cs/OlpqI0Jm59 +-kK9pX0BY4AGOd23XM3K/uLawdmf67kkftim7aVaqXFHPiWsJVtlzmidKvNSmbmZe +-dOmMXp6PBoqcdusFVUS7vjd3KAes5wUX/CaTyOOPRu0LMSnpwEnaL76IC9x4Jd6d +-7QqY/OFTjpPH8nP57LwouiT6MgSUCWGaOkPuBJ9w9sENSbbINpgJJ42iAe2kE+R7 +-qEIvf/2ETCTseeQUqm2nWiSPLkNagEh6kojmEoKrGyrv3YjrSXSOY1a70tDVy43+ +-ueQDQzNZm3Q7inpke2ZKvWyY0LQmLzP2te+tnNBcdLyKJx7emPRTuMUlEdK7cLbt +-V3Sy9IKtyAXqqd66fPFj4NhJygyncj8M6CSqhG5L0GhDbkA8UJ8yK/gfKm3h5xe2 +-utULK5VMtAhQt6cVahO59A9t/OI17y45bmlIgdlEQISzVFe9ZbIUJW44zBfPx74k +-/w8pMRr8gEuRqpL2WdJiKGG6lhMHLVFo ++MIIDIjCCAgqgAwIBAgIBBTANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJTRTEQ ++MA4GA1UECBMHVXBwc2FsYTEQMA4GA1UEBxMHVXBwc2FsYTERMA8GA1UEChMITXlT ++UUwgQUIwHhcNMTAwMjIwMDMwMDU0WhcNMzAwOTAzMDMwMDU0WjBDMQswCQYDVQQG ++EwJTRTEQMA4GA1UECBMHVXBwc2FsYTERMA8GA1UEChMITXlTUUwgQUIxDzANBgNV ++BAMTBnNlcnZlcjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAxdpElQZ3FiGv ++oMQ86fgdLZX5Y5CMP4a6d3ZKUktrryn1HKrUPz5Cn21GuoaQsS3M28YzFaP0r1Mz ++T6FW0ao7JhD3ZLX5vxuxR47MptYNqkp346NjnSrcZfR/kRc4LdbNTo1TUpduh/xk ++YKahAKyWbORClHUXRm+Rtd0GR+0F49sCAwEAAaOBozCBoDAJBgNVHRMEAjAAMB0G ++A1UdDgQWBBRuYD8pE2CZ7Qz3FbXbexz7b2AZ7TB0BgNVHSMEbTBrgBSx+353tUCN ++aBF+2RHlw8baTaxRsKFIpEYwRDELMAkGA1UEBhMCU0UxEDAOBgNVBAgTB1VwcHNh ++bGExEDAOBgNVBAcTB1VwcHNhbGExETAPBgNVBAoTCE15U1FMIEFCggkAvlitTB89 ++JZUwDQYJKoZIhvcNAQEFBQADggEBAGMuDwcUBs90kD03QvJIcGAhvDRSMfGHcNKy +++/8TONzwXkPX7qfHH6yq0oxP+jxMc/a2wgyg6qLJ4nNhwy54QA8q02NQm7j5iUDt ++mAiXwwckFzS1eIkKu4NM4lwuE9YhMK0wSLVwEv9Kb0Lw+J+xS72JK/Cd4kkrNWkY ++H3ZAtHa9y90nL8DB4jM+bt9oVBmSirsTnM/WF1bavw1kcDpFt6pf4/WWrjTyFzcn ++0EvoMErAAkLi0jDr68fX7NjfXENY4m+3WFQNxAFxLVmPRMehbAtBKPq3Y6do00/D ++DxeesjJQ5guHPeI5R8DYCjv2r1BoD53vbjQNOgeU+KTXJIYy07Q= + -----END CERTIFICATE----- +diff -Naur mysql-5.1.50.orig/mysql-test/std_data/server8k-key.pem mysql-5.1.50/mysql-test/std_data/server8k-key.pem +--- mysql-5.1.50.orig/mysql-test/std_data/server8k-key.pem 2010-08-03 13:55:08.000000000 -0400 ++++ mysql-5.1.50/mysql-test/std_data/server8k-key.pem 2010-08-27 23:43:10.165365998 -0400 +@@ -1,99 +1,15 @@ + -----BEGIN RSA PRIVATE KEY----- +-MIISKQIBAAKCBAEA6h3v1OWb9I9U/Z8diBu/xYGS8NCTD3ZESboHxVI2qSECPgxN +-NcG8Lh0ktQdgYcOe64MnDTZX0Bibm47hoDldrAlTSffFxQhylqBBoXxDF+LrhXIq +-Cz7K0PsK+bYusL9ezJ7PETDnCT7oy95q4GXbKsutbNsm9if4ZE41gs2KnoU2DA7k +-vMmkKojrMIL4+BqTXA20LLo0iSbgvUTvpSJw4u96BeyzMNnxK2wP5vvTtUo5hACb +-fU87YjaSKs+q2VXCzfyYGZk1L1xk5GUI0bP+jutf1dDzNttW2/q2Nf5rxx09Gh/G +-wmOnEk1O7cOZ8VQCsOHirIM39NuSARsY6Y3G5XM4k2W4nxyR/RtdG9bvs/33aGsZ +-5V5yp7WSs8s9HHwaCPSsUiLKckQ7uA0TTRgbeweMrrLKovG57jsbBBB8pQD4PRd3 +-1qgxCdstWXHiWwRyI8vOLWENPXPFqA/rJwwqNdWTogy38aqVXxGYR8PIwjA2OaIw +-FjwGZcsPNLqw6bgAN8O2UBqZHWiMF8mi7brvioDvAIufZuqa2SqT/At45H83psQ6 +-R4FsxZt6SAK7EsdPo8OYTrY1i4iPZd/eKhnEu2srEZgsKRwY5H1mvDH5fWCcHSFu +-07sWmlmK6Or65Fsa0IaKLJiQDVVETd6xrI0wkM4AOcbKDrS7aywJ426dopbs+LFd +-t4N0cdII4gBgJAfLuuA2yrDXRq4P6cgpVMy0R+0dEYE8zzm8zf1a+Ud273LS9+LB +-+LJKwqbW8nOPBoiekimIKfJYoOA4+C/mAjsYl1sVjjEhXJAs9S9L2UvnUk1PsZi4 +-UKHI6eAIEl7VM1sQ4GbdZ0px2dF2Ax7pGkhD+DLpYyYkCprharKZdmuUNLUdNhXx +-i/HSEiE+Uy+o8RIzmH7LuROl/ZgnfHjJEiBLt2qPvwrwYd4c3XuXWs4YsWfVJTt8 +-Mx2ihgVcdGy9//shCSmgJwR1oWrhgC10AEL2fKeRnYUal1i+IxFPp7nb8uwxUADg +-R0cY4A3qR/JP489QFIcxBTVs65De+Bq3ecnujk6yeGpD9iptonq4Y8uNZMc1kOE7 +-GiFGwR4EufT5SEMh+tUkjth2r+842vmZZuxrVQaohDiATmIJA07W51zKH+nQuw4q +-VKnAhPaDLCLc7YMIH9JcmkeQX0nf8/S2O2WYDH8glVDi5hfW08tCmV647vRYnTIy +-wUTO0lFpz7M+VyMNaJ6yXU6biBV5hLAI8C5ldr/SWI789W2+ebBaJ9gfK+PTtroh +-FSK37GcoSH4V6qSLJHCBASEsiddqHIHMLJZRYD+B6J3tLhjVUM43u+MEGbFTd33Z +-Dke/WzLTExWkaOv36e67gDBmgDuj9yroq3wGfwIDAQABAoIEAQCSt6YoZqigz/50 +-XvYT6Uf6T6S1lBDFXNmY1qOuDkLBJTWRiwYMDViQEaWCaZgGTKDYeT3M8uR/Phyu +-lRFi5vCEMufmcAeZ3hxptw7KU+R8ILJ207/zgit6YglTys9h5txTIack39+6FJmx +-wbZ64HpETJZnpMO6+fuZaMXyLjuT8mmXjvHcOgXOvjWeFkZOveDhjJkAesUXuqyX +-EI+ajoXuQiPXeKonkD2qd7NTjzfy4gw/ZF4NXs0ZVJeviqtIPo2xp33udOw2vRFh +-bMvlF4cNLAbIKYVyOG0ruOfd2I7Unsc/CvD1u5vlRVuUd8OO0JZLIZR7hlRX+A58 +-8O1g2H/wJZAsF1BnLnFzDGYCX2WjCCK3Zn85FkKGRa0lTdYDduad/C/N3Y2/pHFE +-e7U/2D7IkEei59tD2HcsDBB3MJnckkn/hyiL9qWcxqWZ61vurE+XjU6tc6fnfhk9 +-pJQ6yU3epPU7Vfsk0UGA7bbgKpsyzyH8Zl76YC2mN2ZVJjZekfhY+ibT9odEPdOl +-yLB5iXA6/WhKkDWaOqZGOH+7MblWgT9wHINlcn+nKzOr00JHl26ac6aMlXXi9vbe +-4jgJbFK1HYlFIndyX/BdqRTsFemDoDrVqrEYsaONoVYDd9c5qrqYOeh34DhOksQW +-hNwWBfmMlfzgOGtCYhMeK+AajqTtUbMYQA6qp47KJd/Oa5Dvi3ZCpvZh3Ll5iIau +-rqCtmojsWCqmpWSu7P+Wu4+O3XkUMPdQUuQ5rJFESEBB3yEJcxqk/RItTcKNElNC +-PASrPrMD9cli7S/pJ+frbhu1Gna1ArXzXQE9pMozPaBpjCig7+15R0lL3pmOKO6e +-WK3dgSwrnW6TQdLPlSD4lbRoiIdTHVBczztDeUqVvFiV3/cuaEi1nvaVdAYLqjuL +-ogK4HwE/FQ54S0ijAsP52n25usoH6OTU3bSd/7NTp0vZCy3yf10x7HUdsh2DvhRO +-3+TSK5t0yz0Nt7hNwcI6pLmWUIYcZgpFc/WsiiGscTfhy8rh3kRHI8ylGq53KNF+ +-yCVmjqnBRWs91ArxmeF1ctX2t3w5p7gf65hJWqoX/2DiSi5FBsr6HLxa5sUi4wRZ +-136aCNt5Wu7w+AzPDbQW6qKUGSyfHJAw4JZasZcaZLise5IWb1ks0DtFbWWdT3ux +-8r2AM7IO1WopnekrYCnx/aBvBAv4NjWozVA517ztVttPERt3AGb4nm387nYt5R2U +-NO2GBWcDyT8JQLKmffE1AkWolCR1GsvcNLQfLCbnNppgsnsLE/viTG4mq1wjnd8O +-2Q8nH1SVTuyGFREMp/zsiAEaGfdd0hI2r1J7OdNPBBCtmhITsy9ZYHqm5vrGvy3s +-vi2GuB2RAoICAQD/oWUsg4eTJxHifTJLz/tVSTXnw7DhfbFVa1K1rUV63/MRQAFW +-pabN4T6Yfp3CpdRkljCA8KPJZj7euwhm4OEg1ulpOouA+cfWlE9RFE8wyOK5SYwM +-k+nk31P9MUC866pZg/ghzBGDub91OW1+ZGEtqnLI/n/LhiAIWt0hJvgZclTc1cAL +-xffHVlFwoSyNl/nc3ueZCC95nOLst2XcuxZLLbOFtZCmDYsp49q/Jn6EFjn4Ge2o +-qp38z6eZgDMP1F4lb9nDqXPHfUSt2jxKlmpfXS+IPKdba67+EjhbtmUYzaR4EoPI +-zh+o6SrVWT6Yve7KGiYv06fuRz1m/lLQO/Arbd9ntSjgn+ZEXGOkbhnHUX3DJ4ny +-/6XEGB9NLQjern4uNTn0AaV+uvhncapFMaIBnVfq0Cw8eog0136PBYRaVX7T44j5 +-HwIyGXWtYGA/SzDEQoksD0Y/T61BEGnLZaKeavNd82WwFvcYHZtE0J4aQGjCEE7N +-+nijzCy+j5ETmme9KJvQHpEyXP3N4RBko1eWvyTwFZDdIXtoa6TTEI51lm+FXJ/b +-Y+BzMr6KRo29FB+7//1ptUoMvn5hzL0PwOv2ZSTQuoG5hLDEbxWXLNhd1VHcfznF +-3EZHwfD2F8aGQ3kz+fkMTNfK955KorDrmLgvmV9eZZ5yQxGZrs5H5YfKpwKCAgEA +-6nSUbzfSdVFUH89NM5FmEJgkD06vqCgHl2mpyF+VmDGcay4K06eA4QbRO5kns13+ +-n6PcBl/YVW/rNE8iFi+WxfqUpAjdR1HlShvTuTRVqtFTfuN8XhbYU6VMjKyuE0kd +-LKe3KRdwubjVNhXRZLBknU+3Y/4hnIR7mcE3/M5Zv5hjb7XnwWg/SzxV9WojCKiu +-vQ7cXhH5/o7EuKcl1d6vueGhWsRylCG9RimwgViR2H7zD9kpkOc0nNym9cSpb0Gv +-Lui4cf/fVwIt2HfNEGBjbM/83e2MH6b8Xp1fFAy0aXCdRtOo4LVOzJVAxn5dERMX +-4JJ4d5cSFbssDN1bITOKzuytfBqRIQGNkOfizgQNWUiaFI0MhEN/icymjm1ybOIh +-Gc9tzqKI4wP2X9g+u3+Oof1QaBcZ4UbZEU9ITN87Pa6XVJmpNx7A81BafWoEPFeE +-ahoO4XDwlHZazDuSlOseEShxXcVwaIiqySy7OBEPBVuYdEd2Qw/z3JTx9Kw8MKnf +-hu+ar5tz5dPnJIsvLeYCcJDe/K6loiZuHTtPbWEy9p6It7qubQNPBvTSBN5eVDKc +-Q2bTQNCx8SAAA9C5gJiwWoQKsXJzbRFRY77P9JjuGpua3YJ2nYBHEJmF+fp1R33c +-uHIyMphPMkKC4GC3/43kkMr6tck8kZbXGSYsLsBr2GkCggIBAJvvrjILQianzKcm +-zAmnI6AQ+ssYesvyyrxaraeZvSqJdlLtgmOCxVANuQt5IW9djUSWwZvGL4Np1aw0 +-15k6UNqhftzsE7FnrVneOsww4WXXBUcV8FKz4Bf3i9qFswILmGzmrfSf8YczRfGS +-SJKzVPxwX3jwlrBmbx/pnb7dcLbFIbNcyLvl1ZJJu4BDMVRmgssTRp/5eExtQZg4 +-//A4SA8wH7TO3yAMXvn8vrGgH8kfbdlEp88d1SYk3g4rP/rGB3A63NIYikIEzmJn +-ICQ3wUfPJnGq3kRMWgEuyCZaCy2oNE3yrWVPJ8z3/2MJ/79ZDVNHxEeki2o1FuW+ +-+nGAPq+fZIp03iy4HdVRro7dgugtc9QaSHJtNId8V4vSjviX5Oz3FxUb9AJst58S +-nVV8Q2FMxBa/SlzSOkhRtCg2q1gXkzhaMnIVUleRZFGQ2uWBToxKMjcoUifIyN1J +-z999bkfI4hBLq5pRSAXz+YVu5SMKa10GaawIwJLat+i+1zboF6QyI2o/Wz8nrsNq +-KX/ajFGu5C94WFgsVoWKNI90KBLe48Ssje9c68waBlV/WHMg1YLvU3yqVDOV+K5c +-IHB9tPMnG+AgBYZPxSzuvnLrrkj/GeKx0WI7TrvzOLRGKJo6irMEJ8IzFegASRUq +-TVZKYQDYRG7m+lKlSxU+pyMAh2c9AoICAE4kavCip1eIssQjYLTGSkFPo/0iGbOv +-G9CgXAE3snFWX67tWphupKrbjdMSWcQTmPD2OTg6q6zWL4twsIi6dcMooHAHsFC7 +-//LyUV/SDJdxSyXohiQJ8zH1zwy35RDydnHSuF5OvLh53T44iWDI1dAEqLgAFI3J +-LjTxzEpLMGiGTuYFt+ejai0WQAQayvBw4ESM9m+4CB2K0hBFTXv5y5HlnNTW0uWC +-VUZUUMrbjUieDz8B/zOXi9aYSGFzmZFGUDAPSqJcSMEELemPDF7f8WNr8vi42tIV +-4tlaFD1nep4F9bWMiCXU6B2RxVQi+7vcJEIqL1KUnGd3ydfD00K+ng4Xnj7Vz/cz +-QE7CqrpFaXmPlCMzW6+dm51/AyhHXDLkL2od05hiXcNkJ7KMLWRqwExHVIxM3shR +-x7lYNl3ArUsCrNd6m4aOjnrKFk7kjeLavHxskPccoGKrC9o0JMfTkWLgmuBJFQ0S +-N/HzIbcvIFWF0Ms4ojb50yp6ziXhXfJOO/0KUQEki71XIhvw89mVZszDzD5lqzjf +-HCZMBU4MbmL6NdEevFIDH0zPPkx3HPNtJt3kIJbit9wI8VhUMe+ldGnGxpWb8tKw +-SfM3vrHkYr+lizk26XfXMFhdAuVtT7dzQKSNEyP/1a2Hs307Xzgiv8JulJ8QIkrX +-/nsYWPOAGLG5AoICABmdW9Ppkvuhb1AEcjTWb+XCyopoBc6vit/uQWD9uO+CeX7a +-cfzq+iH01CAjyVMc4E1JDc5Lpi106U+GRGcAAaPJB2Sp5NznoxaOVrb71blu4Q4x +-bNjtKM/P/DXpO+yJYoOPdKtaSDhtnfNDM7H/jztJ3XIrOltKA7CcRDohbBWIx8Q0 +-0uEpvfFpZZBco3yVmjP0RLgIVYn/ZDj9wGhSvFWIJ5vv6GXmtDrcHGMLxcfv7t76 +-UVcMW/Yy4mYJRCzGOrWagyVijJ6MTVNciqadWcH1KcbB3EGoMFYMn61or2qJABPM +-xz89IlhnROU1Re3X/QRx5t86cw6oa+FqrWMOhSs31I0dNWSuS/xDympG27YIYSDd +-mv5seT78GjFmMJC5pPOLoXsbTPB0HpsX2/UL/w/eRAfilTOef/Cf9VE5MP/C2YR7 +-NBxUU7/+21D6WvdtBTcZbrXWGroAo8zPP+PwX0+c6WoAvqDJvCPndp8xZhSgEJN/ +-0kScptezi8n3ZHI95EA9U5mAHxHz0IhDDVzWw/z1f1SBPxKVX3+By3zaa3lrD2ch +-cHq7nBkX72veEevnHUY8Z2rHE2G2jdmRfOtwm4sjL0VBV9fRRoxzJWRduKyeOtDL +-EhhBhUoTrT48UnfW9hxnbNLB9P/hh+UJu9HrS2uAwHoGE1+8gcyundupGDBn ++MIICXgIBAAKBgQDF2kSVBncWIa+gxDzp+B0tlfljkIw/hrp3dkpSS2uvKfUcqtQ/ ++PkKfbUa6hpCxLczbxjMVo/SvUzNPoVbRqjsmEPdktfm/G7FHjsym1g2qSnfjo2Od ++Ktxl9H+RFzgt1s1OjVNSl26H/GRgpqEArJZs5EKUdRdGb5G13QZH7QXj2wIDAQAB ++AoGBAJLCjh7Q9eLnx+QDzH9s+Q/IcH4nSbERmh1lFEopAc6j29qQ6PGkmDy0DUPs ++70VOCOh5A4mo3aZzm9sUfVb24/nRtmyTP/AtMuIVGCsUqzI28dJRGvRlY0aSQG/C ++ILqMP69kiMNGBvuyEIiJhisOmMvDFEp7HrrXHJM9qcc217DpAkEA4nzJ9yyy2e4O ++r6/D711hdfcU/F+ktXw+pL77kSSdTABUap92Uv2RL36UA4q5h8RNvq/GrzMNm6Ye ++u2IMvBCiTQJBAN+iRbiMJCSitTg5YVMluVbT87co7jbTqk7LN1ujyIFEklm4xlHG ++DLJNgEoDR7QJtAkL++FyogC4zsQsey5voscCQQCp54trTbDuI9QIoAaQrrDKWgz4 ++NpfNPeOQm2UFQT5vIWAyjGWrZGViB8bp0UvVOcJI5nxaOiZfOYOcdrWu75uRAkAn ++67zMc9/j1lPJRJz2Dc7nDBD+ikTz7pcBV897AWLCiK4jbBOi91q+3YzgKXO8VNsZ ++nlUJasA2psbqSBJ5OJ5zAkEA2UxoMju54hASjT54Z92IzraVw4Vo8CYwOcw5fr7z +++m5xg1mmWdLBclmZ+WjARzDuTHIW6u/WCxNGg42AykWzfw== + -----END RSA PRIVATE KEY----- diff --git a/mysql55/mysql-file-contents.patch b/mysql55/mysql-file-contents.patch new file mode 100644 index 0000000..73c680d --- /dev/null +++ b/mysql55/mysql-file-contents.patch @@ -0,0 +1,27 @@ +Upstream chooses to install INFO_SRC and INFO_BIN into the docs dir, which +breaks at least two packaging commandments, so we put them into $libdir +instead. That means we have to hack the file_contents regression test +to know about this. + +Recommendation they change is at http://bugs.mysql.com/bug.php?id=61425 + + +diff -Naur mysql-5.5.21.orig/mysql-test/t/file_contents.test mysql-5.5.21/mysql-test/t/file_contents.test +--- mysql-5.5.21.orig/mysql-test/t/file_contents.test 2012-01-31 06:28:15.000000000 -0500 ++++ mysql-5.5.21/mysql-test/t/file_contents.test 2012-02-27 17:18:57.716087918 -0500 +@@ -31,6 +31,15 @@ + } else { + # RedHat: version number in directory name + $dir_docs = glob "$dir_docs/MySQL-server*"; ++ ++ # All the above is entirely wacko, because these files are not docs; ++ # they should be kept in libdir instead. mtr does not provide a nice ++ # way to find libdir though, so we have to kluge it like this: ++ if (-d "/usr/lib64/mysql") { ++ $dir_docs = "/usr/lib64/mysql"; ++ } else { ++ $dir_docs = "/usr/lib/mysql"; ++ } + } + } else { + # tar.gz package, Windows, or developer work (in BZR) diff --git a/mysql55/mysql-governor-embedded-exclude-5_5_28.patch b/mysql55/mysql-governor-embedded-exclude-5_5_28.patch new file mode 100644 index 0000000..7c45c4d --- /dev/null +++ b/mysql55/mysql-governor-embedded-exclude-5_5_28.patch @@ -0,0 +1,119 @@ +diff -ruN mysql-5.5.28/sql/mysqld.cc mysql-5.5.28-new/sql/mysqld.cc +--- mysql-5.5.28/sql/mysqld.cc 2012-11-21 08:50:42.000000000 -0500 ++++ mysql-5.5.28-new/sql/mysqld.cc 2012-11-21 08:39:57.000000000 -0500 +@@ -1536,11 +1536,13 @@ + my_free(opt_bin_logname); + bitmap_free(&temp_pool); + free_max_user_conn(); ++#ifndef EMBEDDED_LIBRARY + free_global_user_stats(); + free_global_client_stats(); + free_global_thread_stats(); + free_global_table_stats(); + free_global_index_stats(); ++#endif + + if(governor_destroy_lve){ + governor_destroy_lve(); +@@ -4023,9 +4025,11 @@ + if (!DEFAULT_ERRMSGS[0][0]) + unireg_abort(1); + ++#ifndef EMBEDDED_LIBRARY + /* We have to initialize the storage engines before CSV logging */ + init_global_table_stats(); + init_global_index_stats(); ++#endif + + if (ha_init()) + { +@@ -4163,9 +4167,11 @@ + + init_max_user_conn(); + init_update_queries(); ++#ifndef EMBEDDED_LIBRARY + init_global_user_stats(); + init_global_client_stats(); + init_global_thread_stats(); ++#endif + DBUG_RETURN(0); + } + +diff -ruN mysql-5.5.28/sql/sql_parse.cc mysql-5.5.28-new/sql/sql_parse.cc +--- mysql-5.5.28/sql/sql_parse.cc 2012-11-21 08:50:42.000000000 -0500 ++++ mysql-5.5.28-new/sql/sql_parse.cc 2012-11-21 08:40:35.000000000 -0500 +@@ -5830,7 +5830,9 @@ + } + // Updates THD stats and the global user stats. + thd->update_stats(true); ++#ifndef EMBEDDED_LIBRARY + update_global_user_stats(thd, true, time(NULL)); ++#endif + + DBUG_VOID_RETURN; + } +diff -ruN mysql-5.5.28/sql/sql_prepare.cc mysql-5.5.28-new/sql/sql_prepare.cc +--- mysql-5.5.28/sql/sql_prepare.cc 2012-11-21 08:50:28.000000000 -0500 ++++ mysql-5.5.28-new/sql/sql_prepare.cc 2012-11-21 08:41:50.000000000 -0500 +@@ -2281,7 +2281,9 @@ + } + // Updates THD stats and the global user stats. + thd->update_stats(true); ++#ifndef EMBEDDED_LIBRARY + update_global_user_stats(thd, true, time(NULL)); ++#endif + + DBUG_VOID_RETURN; + } +@@ -2732,7 +2734,10 @@ + } + // Updates THD stats and the global user stats. + thd->update_stats(true); ++#ifndef EMBEDDED_LIBRARY + update_global_user_stats(thd, true, time(NULL)); ++#endif ++ + + DBUG_VOID_RETURN; + } +@@ -2907,7 +2912,10 @@ + } + // Updates THD stats and the global user stats. + thd->update_stats(true); ++#ifndef EMBEDDED_LIBRARY + update_global_user_stats(thd, true, time(NULL)); ++#endif ++ + + DBUG_VOID_RETURN; + } +@@ -3033,7 +3041,9 @@ + } + // Updates THD stats and the global user stats. + thd->update_stats(true); ++#ifndef EMBEDDED_LIBRARY + update_global_user_stats(thd, true, time(NULL)); ++#endif + + DBUG_VOID_RETURN; + } +diff -ruN mysql-5.5.28/sql/sql_reload.cc mysql-5.5.28-new/sql/sql_reload.cc +--- mysql-5.5.28/sql/sql_reload.cc 2012-11-21 08:50:28.000000000 -0500 ++++ mysql-5.5.28-new/sql/sql_reload.cc 2012-11-21 08:48:06.000000000 -0500 +@@ -322,6 +322,8 @@ + #endif + if (options & REFRESH_USER_RESOURCES) + reset_mqh((LEX_USER *) NULL, 0); /* purecov: inspected */ ++ ++#ifndef EMBEDDED_LIBRARY + if (options & REFRESH_TABLE_STATS) + { + mysql_mutex_lock(&LOCK_global_table_stats); +@@ -356,6 +358,7 @@ + } + mysql_mutex_unlock(&LOCK_global_user_client_stats); + } ++#endif + if (*write_to_binlog != -1) + *write_to_binlog= tmp_write_to_binlog; + /* diff --git a/mysql55/mysql-install-test.patch b/mysql55/mysql-install-test.patch new file mode 100644 index 0000000..a31a280 --- /dev/null +++ b/mysql55/mysql-install-test.patch @@ -0,0 +1,52 @@ +Improve the documentation that will be installed in the mysql-test RPM. + + +diff -Naur mysql-5.5.20.orig/mysql-test/README mysql-5.5.20/mysql-test/README +--- mysql-5.5.20.orig/mysql-test/README 2011-12-16 14:52:05.000000000 -0500 ++++ mysql-5.5.20/mysql-test/README 2012-02-10 17:06:19.531082253 -0500 +@@ -1,14 +1,26 @@ + This directory contains a test suite for the MySQL daemon. To run +-the currently existing test cases, simply execute ./mysql-test-run in +-this directory. It will fire up the newly built mysqld and test it. ++the currently existing test cases, execute ./mysql-test-run in ++this directory. + +-Note that you do not have to have to do "make install", and you could +-actually have a co-existing MySQL installation. The tests will not +-conflict with it. +- +-All tests must pass. If one or more of them fail on your system, please +-read the following manual section for instructions on how to report the +-problem: ++For use in Red Hat distributions, you should run the script as user mysql, ++so the best bet is something like ++ cd /usr/share/mysql-test ++ sudo -u mysql ./mysql-test-run --skip-test-list=rh-skipped-tests.list ++This will use the installed mysql executables, but will run a private copy ++of the server process (using data files within /usr/share/mysql-test), ++so you need not start the mysqld service beforehand. ++ ++The "--skip-test-list=rh-skipped-tests.list" option excludes tests that are ++known to fail on one or more Red-Hat-supported platforms. You can omit it ++if you want to check whether such failures occur for you. Documentation ++about the reasons for omitting such tests can be found in the file ++rh-skipped-tests.list. ++ ++To clean up afterwards, remove the created "var" subdirectory, eg ++ sudo -u mysql rm -rf /usr/share/mysql-test/var ++ ++If one or more tests fail on your system, please read the following manual ++section for instructions on how to report the problem: + + http://dev.mysql.com/doc/mysql/en/mysql-test-suite.html + +@@ -25,7 +37,8 @@ + + With no test cases named on the command line, mysql-test-run falls back + to the normal "non-extern" behavior. The reason for this is that some +-tests cannot run with an external server. ++tests cannot run with an external server (because they need to control the ++options with which the server is started). + + + You can create your own test cases. To create a test case, create a new diff --git a/mysql55/mysql-logrotate.patch b/mysql55/mysql-logrotate.patch new file mode 100644 index 0000000..f76237d --- /dev/null +++ b/mysql55/mysql-logrotate.patch @@ -0,0 +1,66 @@ +Adjust the mysql-log-rotate script in several ways: + +* Use the correct log file pathname for Red Hat installations. +* Enable creation of the log file by logrotate (needed since + /var/log/ isn't writable by mysql user); and set the same 640 + permissions we normally use. +* Comment out the actual rotation commands, so that user must edit + the file to enable rotation. This is unfortunate, but the fact + that the script will probably fail without manual configuration + (to set a root password) means that we can't really have it turned + on by default. Fortunately, in most configurations the log file + is low-volume and so rotation is not critical functionality. + +See discussions at RH bugs 799735, 547007 + + +diff -Naur mysql-5.5.22.orig/support-files/mysql-log-rotate.sh mysql-5.5.22/support-files/mysql-log-rotate.sh +--- mysql-5.5.22.orig/support-files/mysql-log-rotate.sh 2012-03-02 14:44:46.000000000 -0500 ++++ mysql-5.5.22/support-files/mysql-log-rotate.sh 2012-03-23 22:33:29.092043705 -0400 +@@ -3,7 +3,7 @@ + # in the [safe_mysqld] section as follows: + # + # [safe_mysqld] +-# err-log=@localstatedir@/mysqld.log ++# err-log=/var/log/mysqld.log + # + # If the root user has a password you have to create a + # /root/.my.cnf configuration file with the following +@@ -18,19 +18,21 @@ + # ATTENTION: This /root/.my.cnf should be readable ONLY + # for root ! + +-@localstatedir@/mysqld.log { +- # create 600 mysql mysql +- notifempty +- daily +- rotate 3 +- missingok +- compress +- postrotate +- # just if mysqld is really running +- if test -x @bindir@/mysqladmin && \ +- @bindir@/mysqladmin ping &>/dev/null +- then +- @bindir@/mysqladmin flush-logs +- fi +- endscript +-} ++# Then, un-comment the following lines to enable rotation of mysql's log file: ++ ++#/var/log/mysqld.log { ++# create 640 mysql mysql ++# notifempty ++# daily ++# rotate 3 ++# missingok ++# compress ++# postrotate ++# # just if mysqld is really running ++# if test -x @bindir@/mysqladmin && \ ++# @bindir@/mysqladmin ping &>/dev/null ++# then ++# @bindir@/mysqladmin flush-logs ++# fi ++# endscript ++#} diff --git a/mysql55/mysql-netdevname.patch b/mysql55/mysql-netdevname.patch new file mode 100644 index 0000000..af17f13 --- /dev/null +++ b/mysql55/mysql-netdevname.patch @@ -0,0 +1,59 @@ +diff -up mysql-5.5.15/mysys/my_gethwaddr.c.netdevname mysql-5.5.15/mysys/my_gethwaddr.c +--- mysql-5.5.15/mysys/my_gethwaddr.c.netdevname 2011-07-13 21:09:02.000000000 +0200 ++++ mysql-5.5.15/mysys/my_gethwaddr.c 2011-11-01 12:32:35.356119715 +0100 +@@ -68,28 +68,47 @@ err: + #include + #include + ++#define MAX_IFS 64 ++ + my_bool my_gethwaddr(uchar *to) + { + int fd, res= 1; + struct ifreq ifr; + char zero_array[ETHER_ADDR_LEN] = {0}; ++ struct ifconf ifc; ++ struct ifreq ifs[MAX_IFS], *ifri, *ifend; + + fd = socket(AF_INET, SOCK_DGRAM, 0); + if (fd < 0) + goto err; + +- bzero(&ifr, sizeof(ifr)); +- strnmov(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name) - 1); ++ ifc.ifc_len = sizeof(ifs); ++ ifc.ifc_req = ifs; ++ if (ioctl(fd, SIOCGIFCONF, &ifc) < 0) ++ { ++ close(fd); ++ goto err; ++ } ++ ++ memcpy(to, zero_array, ETHER_ADDR_LEN); + +- do ++ ifend = ifs + (ifc.ifc_len / sizeof(struct ifreq)); ++ for (ifri = ifc.ifc_req; ifri < ifend; ifri++) + { +- if (ioctl(fd, SIOCGIFHWADDR, &ifr) >= 0) ++ if (ifri->ifr_addr.sa_family == AF_INET) + { +- memcpy(to, &ifr.ifr_hwaddr.sa_data, ETHER_ADDR_LEN); +- res= memcmp(to, zero_array, ETHER_ADDR_LEN) ? 0 : 1; ++ bzero(&ifr, sizeof(ifr)); ++ strncpy(ifr.ifr_name, ifri->ifr_name, sizeof(ifr.ifr_name)); ++ ++ /* Get HW address */ ++ if (ioctl(fd, SIOCGIFHWADDR, &ifr) >= 0) ++ { ++ memcpy(to, &ifr.ifr_hwaddr.sa_data, ETHER_ADDR_LEN); ++ if (!(res= memcmp(to, zero_array, ETHER_ADDR_LEN) ? 0 : 1)) ++ break; ++ } + } +- } while (res && (errno == 0 || errno == ENODEV) && ifr.ifr_name[3]++ < '6'); +- ++ } + close(fd); + err: + return res; diff --git a/mysql55/mysql-openssl.patch b/mysql55/mysql-openssl.patch new file mode 100644 index 0000000..bcdc1d2 --- /dev/null +++ b/mysql55/mysql-openssl.patch @@ -0,0 +1,13 @@ +--- mysql-5.5.31/vio/viossl.c~ 2013-03-25 14:14:58.000000000 +0100 ++++ mysql-5.5.31/vio/viossl.c 2013-04-18 16:58:38.552557538 +0200 +@@ -172,8 +172,10 @@ + SSL_SESSION_set_timeout(SSL_get_session(ssl), timeout); + SSL_set_fd(ssl, vio->sd); + #ifndef HAVE_YASSL ++#ifdef SSL_OP_NO_COMPRESSION + SSL_set_options(ssl, SSL_OP_NO_COMPRESSION); + #endif ++#endif + + if ((r= connect_accept_func(ssl)) < 1) + { diff --git a/mysql55/mysql-plugin-bool.patch b/mysql55/mysql-plugin-bool.patch new file mode 100644 index 0000000..abea580 --- /dev/null +++ b/mysql55/mysql-plugin-bool.patch @@ -0,0 +1,42 @@ +Fix plugin boolean variables to receive the value "1", not "-1", when they +are set to 1. Aside from being bizarre, the existing behavior is unportable: +machines where char is unsigned print "255" instead. Filed upstream at +http://bugs.mysql.com/bug.php?id=59905 + + +diff -up mysql-5.5.28/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_enabled_basic.result.p10 mysql-5.5.28/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_enabled_basic.result +--- mysql-5.5.28/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_enabled_basic.result.p10 2012-08-29 10:50:47.000000000 +0200 ++++ mysql-5.5.28/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_enabled_basic.result 2012-12-06 14:20:53.078755855 +0100 +@@ -45,7 +45,7 @@ set session rpl_semi_sync_master_enabled + ERROR HY000: Variable 'rpl_semi_sync_master_enabled' is a GLOBAL variable and should be set with SET GLOBAL + select @@global.rpl_semi_sync_master_enabled; + @@global.rpl_semi_sync_master_enabled +--1 ++1 + select @@session.rpl_semi_sync_master_enabled; + ERROR HY000: Variable 'rpl_semi_sync_master_enabled' is a GLOBAL variable + show global variables like 'rpl_semi_sync_master_enabled'; +diff -up mysql-5.5.28/mysql-test/suite/sys_vars/r/rpl_semi_sync_slave_enabled_basic.result.p10 mysql-5.5.28/mysql-test/suite/sys_vars/r/rpl_semi_sync_slave_enabled_basic.result +--- mysql-5.5.28/mysql-test/suite/sys_vars/r/rpl_semi_sync_slave_enabled_basic.result.p10 2012-08-29 10:50:47.000000000 +0200 ++++ mysql-5.5.28/mysql-test/suite/sys_vars/r/rpl_semi_sync_slave_enabled_basic.result 2012-12-06 14:20:53.078755855 +0100 +@@ -45,7 +45,7 @@ set session rpl_semi_sync_slave_enabled= + ERROR HY000: Variable 'rpl_semi_sync_slave_enabled' is a GLOBAL variable and should be set with SET GLOBAL + select @@global.rpl_semi_sync_slave_enabled; + @@global.rpl_semi_sync_slave_enabled +--1 ++1 + select @@session.rpl_semi_sync_slave_enabled; + ERROR HY000: Variable 'rpl_semi_sync_slave_enabled' is a GLOBAL variable + show global variables like 'rpl_semi_sync_slave_enabled'; +diff -up mysql-5.5.28/sql/sql_plugin.cc.p10 mysql-5.5.28/sql/sql_plugin.cc +--- mysql-5.5.28/sql/sql_plugin.cc.p10 2012-08-29 10:50:46.000000000 +0200 ++++ mysql-5.5.28/sql/sql_plugin.cc 2012-12-06 14:20:53.078755855 +0100 +@@ -2094,7 +2094,7 @@ static int check_func_bool(THD *thd, str + goto err; + result= (int) tmp; + } +- *(my_bool *) save= -result; ++ *(my_bool *) save= result ? true : false; + return 0; + err: + return 1; diff --git a/mysql55/mysql-plugin-test.patch b/mysql55/mysql-plugin-test.patch new file mode 100644 index 0000000..10cc791 --- /dev/null +++ b/mysql55/mysql-plugin-test.patch @@ -0,0 +1,96 @@ +mysql_plugin.test fails when run in mysql-test RPM, though the build-time +regression test is OK. This patch is from the pre-existing upstream bug +report, except we also fix the part that tries to scribble on the +read-only-to-us plugin directory. + +rhbz #789530, upstream at http://bugs.mysql.com/bug.php?id=62907 + + +diff -up mysql-5.5.21/mysql-test/t/mysql_plugin-master.opt.plugin mysql-5.5.21/mysql-test/t/mysql_plugin-master.opt +--- mysql-5.5.21/mysql-test/t/mysql_plugin-master.opt.plugin 2012-01-31 12:28:15.000000000 +0100 ++++ mysql-5.5.21/mysql-test/t/mysql_plugin-master.opt 2012-03-14 16:54:19.060951822 +0100 +@@ -1 +1 @@ +---plugin-dir=$DAEMONEXAMPLE_DIR ++--plugin-dir=$MYSQLTEST_VARDIR/plugin +diff -up mysql-5.5.31/mysql-test/t/mysql_plugin.test.plugin mysql-5.5.31/mysql-test/t/mysql_plugin.test +--- mysql-5.5.31/mysql-test/t/mysql_plugin.test.test 2013-03-25 14:14:58.000000000 +0100 ++++ mysql-5.5.31/mysql-test/t/mysql_plugin.test 2013-04-18 14:43:15.747052348 +0200 +@@ -25,8 +25,10 @@ + # Add the datadir, basedir, plugin_dir to the bootstrap command + let $MYSQLD_DATADIR= `select @@datadir`; + let $MYSQL_BASEDIR= `select @@basedir`; ++let $MYSQLD_TMP_BASEDIR= $MYSQLTEST_VARDIR/tmp; + let $MYSQL_ERRMSG_BASEDIR=`select @@lc_messages_dir`; + let $PLUGIN_DIR=`select @@plugin_dir`; ++let $PLUGIN_BASEDIR=$DAEMONEXAMPLE_DIR; + + --disable_abort_on_error + +@@ -51,10 +53,11 @@ use File::Basename; + { + print FILE "let \$DAEMONEXAMPLE_DIR= $not_found;\n"; + } +- if ((!-e $plugindir_ini) || (!-r $plugindir_ini)) +- { +- print FILE "let \$PLUGIN_DIR= $not_found;\n"; +- } ++# This test doesn't work because $ENV{PLUGIN_DIR} is empty ++# if ((!-e $plugindir_ini) || (!-r $plugindir_ini)) ++# { ++# print FILE "let \$PLUGIN_DIR= $not_found;\n"; ++# } + close FILE; + EOF + +@@ -66,10 +69,14 @@ remove_file $MYSQL_TMP_DIR/mysqld.inc; + # mysql version, so errmsg.sys will be copied to "basedir/share", we create + # and remove this structure. + +---mkdir $MYSQLD_BASEDIR/share +---mkdir $MYSQLD_BASEDIR/share/mysql +---copy_file $MYSQL_ERRMSG_BASEDIR/english/errmsg.sys $MYSQLD_BASEDIR/share/errmsg.sys +---copy_file $MYSQL_ERRMSG_BASEDIR/english/errmsg.sys $MYSQLD_BASEDIR/share/mysql/errmsg.sys ++--mkdir $MYSQLD_TMP_BASEDIR/share ++--mkdir $MYSQLD_TMP_BASEDIR/share/mysql ++--mkdir $PLUGIN_DIR ++--copy_file $MYSQL_ERRMSG_BASEDIR/english/errmsg.sys $MYSQLD_TMP_BASEDIR/share/errmsg.sys ++--copy_file $MYSQL_ERRMSG_BASEDIR/english/errmsg.sys $MYSQLD_TMP_BASEDIR/share/mysql/errmsg.sys ++--copy_file $PLUGIN_BASEDIR/libdaemon_example.so $PLUGIN_DIR/libdaemon_example.so ++--copy_file $PLUGIN_BASEDIR/daemon_example.ini $PLUGIN_DIR/daemon_example.ini ++ + + # The mysql_plugin tool now accepts --my-print-defaults which points to the + # executable my_print_defaults.exe we can get this path from the variable +@@ -100,7 +107,7 @@ if ($PLUGIN_DIR == '') + + # Build client command for reuse. + +-let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN --datadir=$MYSQLD_DATADIR --basedir=$MYSQLD_BASEDIR --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; ++let $MYSQL_PLUGIN_CMD= $MYSQL_PLUGIN --datadir=$MYSQLD_DATADIR --basedir=$MYSQLD_TMP_BASEDIR --plugin-dir=$PLUGIN_DIR --mysqld=$MYSQLD_BASEDIR --my-print-defaults=$MYSQL_MY_PRINT_DEFAULTS_BASEDIR; + + --echo # + --echo # Ensure the plugin isn't loaded. +@@ -184,7 +191,7 @@ SELECT * FROM mysql.plugin WHERE dl like + # we must copy the example daemon to a new location renaming it. + + let $DAEMON_RELOAD = lib$DAEMONEXAMPLE; +---copy_file $PLUGIN_DIR/$DAEMONEXAMPLE $PLUGIN_DIR/$DAEMON_RELOAD ++--copy_file $PLUGIN_BASEDIR/$DAEMONEXAMPLE $PLUGIN_DIR/$DAEMON_RELOAD + --copy_file include/libdaemon_example.ini $PLUGIN_DIR/libdaemon_example.ini + + # Now reload it and see that it is a different name. +@@ -361,8 +368,11 @@ replace_result $MYSQL_PLUGIN mysql_plugi + --remove_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect + + # Cleanup the share folder in the binary path. +---remove_file $MYSQLD_BASEDIR/share/errmsg.sys +---rmdir $MYSQLD_BASEDIR/share/mysql +---rmdir $MYSQLD_BASEDIR/share ++--remove_file $PLUGIN_DIR/daemon_example.ini ++--remove_file $PLUGIN_DIR/libdaemon_example.so ++--rmdir $PLUGIN_DIR ++--remove_file $MYSQLD_TMP_BASEDIR/share/errmsg.sys ++--rmdir $MYSQLD_TMP_BASEDIR/share/mysql ++--rmdir $MYSQLD_TMP_BASEDIR/share + + --enable_abort_on_error diff --git a/mysql55/mysql-s390-tsc.patch b/mysql55/mysql-s390-tsc.patch new file mode 100644 index 0000000..f995266 --- /dev/null +++ b/mysql55/mysql-s390-tsc.patch @@ -0,0 +1,41 @@ +Support s390/s390x in performance schema's cycle-counting functions. +Filed upstream at http://bugs.mysql.com/bug.php?id=59953 + + +diff -up mysql-5.5.28/include/my_rdtsc.h.p11 mysql-5.5.28/include/my_rdtsc.h +--- mysql-5.5.28/include/my_rdtsc.h.p11 2012-08-29 10:50:46.000000000 +0200 ++++ mysql-5.5.28/include/my_rdtsc.h 2012-12-06 14:22:13.651823354 +0100 +@@ -125,6 +125,7 @@ C_MODE_END + #define MY_TIMER_ROUTINE_MACH_ABSOLUTE_TIME 25 + #define MY_TIMER_ROUTINE_GETSYSTEMTIMEASFILETIME 26 + #define MY_TIMER_ROUTINE_ASM_SUNPRO_X86_64 27 ++#define MY_TIMER_ROUTINE_ASM_S390 28 + + #endif + +diff -up mysql-5.5.28/mysys/my_rdtsc.c.p11 mysql-5.5.28/mysys/my_rdtsc.c +--- mysql-5.5.28/mysys/my_rdtsc.c.p11 2012-08-29 10:50:46.000000000 +0200 ++++ mysql-5.5.28/mysys/my_rdtsc.c 2012-12-06 14:22:13.672823375 +0100 +@@ -224,6 +224,13 @@ ulonglong my_timer_cycles(void) + clock_gettime(CLOCK_SGI_CYCLE, &tp); + return (ulonglong) tp.tv_sec * 1000000000 + (ulonglong) tp.tv_nsec; + } ++#elif defined(__GNUC__) && defined(__s390__) ++ /* covers both s390 and s390x */ ++ { ++ ulonglong result; ++ __asm__ __volatile__ ("stck %0" : "=Q" (result) : : "cc"); ++ return result; ++ } + #elif defined(HAVE_SYS_TIMES_H) && defined(HAVE_GETHRTIME) + /* gethrtime may appear as either cycle or nanosecond counter */ + return (ulonglong) gethrtime(); +@@ -533,6 +540,8 @@ void my_timer_init(MY_TIMER_INFO *mti) + mti->cycles.routine= MY_TIMER_ROUTINE_ASM_GCC_SPARC32; + #elif defined(__sgi) && defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_SGI_CYCLE) + mti->cycles.routine= MY_TIMER_ROUTINE_SGI_CYCLE; ++#elif defined(__GNUC__) && defined(__s390__) ++ mti->cycles.routine= MY_TIMER_ROUTINE_ASM_S390; + #elif defined(HAVE_SYS_TIMES_H) && defined(HAVE_GETHRTIME) + mti->cycles.routine= MY_TIMER_ROUTINE_GETHRTIME; + #else diff --git a/mysql55/mysql-stack-guard.patch b/mysql55/mysql-stack-guard.patch new file mode 100644 index 0000000..c01c1a7 --- /dev/null +++ b/mysql55/mysql-stack-guard.patch @@ -0,0 +1,139 @@ +mysql is not accounting for the "guard page" when setting thread stack size +requests. This is fatal on PPC systems, which may use guard pages as large +as 64K. This patch also documents the IA64 situation a bit better. + +Note: there are quite a few other setstacksize calls besides the two in +mysqld.cc; is it important to fix any of the others? + +Filed upstream at http://bugs.mysql.com/bug.php?id=35019 + + +diff -up mysql-5.5.28/sql/mysqld.cc.p5 mysql-5.5.28/sql/mysqld.cc +--- mysql-5.5.28/sql/mysqld.cc.p5 2012-08-29 10:50:46.000000000 +0200 ++++ mysql-5.5.28/sql/mysqld.cc 2012-12-06 14:13:59.765407494 +0100 +@@ -2599,6 +2599,70 @@ static void init_signals(void) + } + + ++/* pthread_attr_setstacksize without so much platform-dependency */ ++/* returns the actual stack size if possible */ ++static size_t my_setstacksize(pthread_attr_t *attr, size_t stacksize) ++{ ++ size_t guard_size = 0; ++ ++#if defined(__ia64__) || defined(__ia64) ++ /* ++ On IA64, half of the requested stack size is used for "normal stack" ++ and half for "register stack". The space measured by check_stack_overrun ++ is the "normal stack", so double the request to make sure we have the ++ caller-expected amount of normal stack. ++ ++ NOTE: there is no guarantee that the register stack can't grow faster ++ than normal stack, so it's very unclear that we won't dump core due to ++ stack overrun despite check_stack_overrun's efforts. Experimentation ++ shows that in the execution_constants test, the register stack grows ++ less than half as fast as normal stack, but perhaps other scenarios are ++ less forgiving. If it turns out that more space is needed for the ++ register stack, that could be forced (rather inefficiently) by using a ++ multiplier higher than 2 here. ++ */ ++ stacksize *= 2; ++#endif ++ ++ /* ++ On many machines, the "guard space" is subtracted from the requested ++ stack size, and that space is quite large on some platforms. So add ++ it to our request, if we can find out what it is. ++ ++ FIXME: autoconfiscate use of pthread_attr_getguardsize ++ */ ++ if (pthread_attr_getguardsize(attr, &guard_size)) ++ guard_size = 0; /* if can't find it out, treat as 0 */ ++ ++ pthread_attr_setstacksize(attr, stacksize + guard_size); ++ ++ /* Retrieve actual stack size if possible */ ++#ifdef HAVE_PTHREAD_ATTR_GETSTACKSIZE ++ { ++ size_t real_stack_size= 0; ++ /* We must ignore real_stack_size = 0 as Solaris 2.9 can return 0 here */ ++ if (pthread_attr_getstacksize(attr, &real_stack_size) == 0 && ++ real_stack_size > guard_size) ++ { ++ real_stack_size -= guard_size; ++ if (real_stack_size < stacksize) ++ { ++ if (global_system_variables.log_warnings) ++ sql_print_warning("Asked for %ld thread stack, but got %ld", ++ (long) stacksize, (long) real_stack_size); ++ stacksize= real_stack_size; ++ } ++ } ++ } ++#endif ++ ++#if defined(__ia64__) || defined(__ia64) ++ stacksize /= 2; ++#endif ++ return stacksize; ++} ++ ++ + static void start_signal_handler(void) + { + int error; +@@ -2609,15 +2673,7 @@ static void start_signal_handler(void) + #if !defined(HAVE_DEC_3_2_THREADS) + pthread_attr_setscope(&thr_attr,PTHREAD_SCOPE_SYSTEM); + (void) pthread_attr_setdetachstate(&thr_attr,PTHREAD_CREATE_DETACHED); +-#if defined(__ia64__) || defined(__ia64) +- /* +- Peculiar things with ia64 platforms - it seems we only have half the +- stack size in reality, so we have to double it here +- */ +- pthread_attr_setstacksize(&thr_attr,my_thread_stack_size*2); +-#else +- pthread_attr_setstacksize(&thr_attr,my_thread_stack_size); +-#endif ++ (void) my_setstacksize(&thr_attr,my_thread_stack_size); + #endif + + mysql_mutex_lock(&LOCK_thread_count); +@@ -4398,36 +4454,8 @@ int mysqld_main(int argc, char **argv) + unireg_abort(1); // Will do exit + + init_signals(); +-#if defined(__ia64__) || defined(__ia64) +- /* +- Peculiar things with ia64 platforms - it seems we only have half the +- stack size in reality, so we have to double it here +- */ +- pthread_attr_setstacksize(&connection_attrib,my_thread_stack_size*2); +-#else +- pthread_attr_setstacksize(&connection_attrib,my_thread_stack_size); +-#endif + #ifdef HAVE_PTHREAD_ATTR_GETSTACKSIZE +- { +- /* Retrieve used stack size; Needed for checking stack overflows */ +- size_t stack_size= 0; +- pthread_attr_getstacksize(&connection_attrib, &stack_size); +-#if defined(__ia64__) || defined(__ia64) +- stack_size/= 2; +-#endif +- /* We must check if stack_size = 0 as Solaris 2.9 can return 0 here */ +- if (stack_size && stack_size < my_thread_stack_size) +- { +- if (global_system_variables.log_warnings) +- sql_print_warning("Asked for %lu thread stack, but got %ld", +- my_thread_stack_size, (long) stack_size); +-#if defined(__ia64__) || defined(__ia64) +- my_thread_stack_size= stack_size*2; +-#else +- my_thread_stack_size= stack_size; +-#endif +- } +- } ++ my_thread_stack_size = my_setstacksize(&connection_attrib,my_thread_stack_size); + #endif + + (void) thr_setconcurrency(concurrency); // 10 by default diff --git a/mysql55/mysql-string-overflow.patch b/mysql55/mysql-string-overflow.patch new file mode 100644 index 0000000..eaa40f6 --- /dev/null +++ b/mysql55/mysql-string-overflow.patch @@ -0,0 +1,57 @@ +These issues were found by Coverity static analysis tool, for more info +see messages by particular fixes (messages belong to 5.1.61). + +Filed upstream at http://bugs.mysql.com/bug.php?id=64631 + + +Error: BUFFER_SIZE_WARNING: +/builddir/build/BUILD/mysql-5.1.61/sql/sql_prepare.cc:2749: buffer_size_warning: Calling strncpy with a maximum size argument of 512 bytes on destination array "this->stmt->last_error" of size 512 bytes might leave the destination string unterminated. + +diff -up mysql-5.5.28/sql/sql_prepare.cc.p20 mysql-5.5.28/sql/sql_prepare.cc +--- mysql-5.5.28/sql/sql_prepare.cc.p20 2012-08-29 10:50:46.000000000 +0200 ++++ mysql-5.5.28/sql/sql_prepare.cc 2012-12-06 14:27:28.647087401 +0100 +@@ -2879,7 +2879,7 @@ void mysql_stmt_get_longdata(THD *thd, c + { + stmt->state= Query_arena::STMT_ERROR; + stmt->last_errno= thd->stmt_da->sql_errno(); +- strncpy(stmt->last_error, thd->stmt_da->message(), MYSQL_ERRMSG_SIZE); ++ strncpy(stmt->last_error, thd->stmt_da->message(), sizeof(stmt->last_error)-1); + } + thd->stmt_da= save_stmt_da; + thd->warning_info= save_warinig_info; + + +Error: STRING_OVERFLOW: +/builddir/build/BUILD/mysql-5.1.61/sql/sql_trigger.cc:2194: fixed_size_dest: You might overrun the 512 byte fixed-size string "this->m_parse_error_message" by copying "error_message" without checking the length. +/builddir/build/BUILD/mysql-5.1.61/sql/sql_trigger.cc:2194: parameter_as_source: Note: This defect has an elevated risk because the source argument is a parameter of the current function. + +diff -up mysql-5.5.28/sql/sql_trigger.cc.p20 mysql-5.5.28/sql/sql_trigger.cc +--- mysql-5.5.28/sql/sql_trigger.cc.p20 2012-08-29 10:50:46.000000000 +0200 ++++ mysql-5.5.28/sql/sql_trigger.cc 2012-12-06 14:27:28.648087398 +0100 +@@ -2260,7 +2260,7 @@ void Table_triggers_list::mark_fields_us + void Table_triggers_list::set_parse_error_message(char *error_message) + { + m_has_unparseable_trigger= true; +- strcpy(m_parse_error_message, error_message); ++ strncpy(m_parse_error_message, error_message, sizeof(m_parse_error_message)-1); + } + + + + +Error: STRING_OVERFLOW: +/builddir/build/BUILD/mysql-5.1.61/storage/innodb_plugin/handler/ha_innodb.cc:6544: fixed_size_dest: You might overrun the 512 byte fixed-size string "name2" by copying "name" without checking the length. +/builddir/build/BUILD/mysql-5.1.61/storage/innodb_plugin/handler/ha_innodb.cc:6544: parameter_as_source: Note: This defect has an elevated risk because the source argument is a parameter of the current function. + +diff -up mysql-5.5.28/storage/innobase/handler/ha_innodb.cc.p20 mysql-5.5.28/storage/innobase/handler/ha_innodb.cc +--- mysql-5.5.28/storage/innobase/handler/ha_innodb.cc.p20 2012-08-29 10:50:46.000000000 +0200 ++++ mysql-5.5.28/storage/innobase/handler/ha_innodb.cc 2012-12-06 14:27:28.653087416 +0100 +@@ -7054,7 +7054,7 @@ ha_innobase::create( + + ut_a(strlen(name) < sizeof(name2)); + +- strcpy(name2, name); ++ strncpy(name2, name, sizeof(name2)-1); + + normalize_table_name(norm_name, name2); + diff --git a/mysql55/mysql-strmov.patch b/mysql55/mysql-strmov.patch new file mode 100644 index 0000000..2a78619 --- /dev/null +++ b/mysql55/mysql-strmov.patch @@ -0,0 +1,34 @@ +Remove overly optimistic definition of strmov() as stpcpy(). + +mysql uses this macro with overlapping source and destination strings, +which is verboten per spec, and fails on some Red Hat platforms. +Deleting the definition is sufficient to make it fall back to a +byte-at-a-time copy loop, which should consistently give the +expected behavior. + +Note: the particular case that prompted this patch is reported and fixed +at http://bugs.mysql.com/bug.php?id=48864. However, my faith in upstream's +ability to detect this type of error is low, and I also see little evidence +of any real performance gain from optimizing these calls. So I'm keeping +this patch. + + +diff -up mysql-5.5.28/include/m_string.h.p2 mysql-5.5.28/include/m_string.h +--- mysql-5.5.28/include/m_string.h.p2 2012-08-29 10:50:46.000000000 +0200 ++++ mysql-5.5.28/include/m_string.h 2012-12-06 14:12:31.225333542 +0100 +@@ -77,15 +77,6 @@ extern "C" { + extern void *(*my_str_malloc)(size_t); + extern void (*my_str_free)(void *); + +-#if defined(HAVE_STPCPY) && MY_GNUC_PREREQ(3, 4) && !defined(__INTEL_COMPILER) +-#define strmov(A,B) __builtin_stpcpy((A),(B)) +-#elif defined(HAVE_STPCPY) +-#define strmov(A,B) stpcpy((A),(B)) +-#ifndef stpcpy +-extern char *stpcpy(char *, const char *); /* For AIX with gcc 2.95.3 */ +-#endif +-#endif +- + /* Declared in int2str() */ + extern char _dig_vec_upper[]; + extern char _dig_vec_lower[]; diff --git a/mysql55/mysql-va-list.patch b/mysql55/mysql-va-list.patch new file mode 100644 index 0000000..552457c --- /dev/null +++ b/mysql55/mysql-va-list.patch @@ -0,0 +1,55 @@ +Fix unportable usage associated with va_list arguments. Passing "0" to +a va_list argument only works if va_list is an integer or pointer type, +which is not required by the C spec, and is not true on ARM for instance. +Per bug #744707. + + +diff -up mysql-5.5.28/sql-common/client_plugin.c.p12 mysql-5.5.28/sql-common/client_plugin.c +--- mysql-5.5.28/sql-common/client_plugin.c.p12 2012-08-29 10:50:46.000000000 +0200 ++++ mysql-5.5.28/sql-common/client_plugin.c 2012-12-06 14:22:54.494857607 +0100 +@@ -233,11 +233,13 @@ int mysql_client_plugin_init() + { + MYSQL mysql; + struct st_mysql_client_plugin **builtin; ++ va_list unused; + + if (initialized) + return 0; + + bzero(&mysql, sizeof(mysql)); /* dummy mysql for set_mysql_extended_error */ ++ bzero(&unused, sizeof(unused)); /* suppress uninitialized-value warnings */ + + pthread_mutex_init(&LOCK_load_client_plugin, MY_MUTEX_INIT_SLOW); + init_alloc_root(&mem_root, 128, 128); +@@ -249,7 +251,7 @@ int mysql_client_plugin_init() + pthread_mutex_lock(&LOCK_load_client_plugin); + + for (builtin= mysql_client_builtins; *builtin; builtin++) +- add_plugin(&mysql, *builtin, 0, 0, 0); ++ add_plugin(&mysql, *builtin, 0, 0, unused); + + pthread_mutex_unlock(&LOCK_load_client_plugin); + +@@ -293,9 +295,13 @@ struct st_mysql_client_plugin * + mysql_client_register_plugin(MYSQL *mysql, + struct st_mysql_client_plugin *plugin) + { ++ va_list unused; ++ + if (is_not_initialized(mysql, plugin->name)) + return NULL; + ++ bzero(&unused, sizeof(unused)); /* suppress uninitialized-value warnings */ ++ + pthread_mutex_lock(&LOCK_load_client_plugin); + + /* make sure the plugin wasn't loaded meanwhile */ +@@ -307,7 +313,7 @@ mysql_client_register_plugin(MYSQL *mysq + plugin= NULL; + } + else +- plugin= add_plugin(mysql, plugin, 0, 0, 0); ++ plugin= add_plugin(mysql, plugin, 0, 0, unused); + + pthread_mutex_unlock(&LOCK_load_client_plugin); + return plugin; diff --git a/mysql55/mysql-versioning.patch b/mysql55/mysql-versioning.patch new file mode 100644 index 0000000..6374b6c --- /dev/null +++ b/mysql55/mysql-versioning.patch @@ -0,0 +1,18 @@ +The symbol versioning solution for libmysqlclient in mysql 5.1 was pretty +awful (export everything) and as of 5.5.8 the cmake build scripts have +forgotten the issue entirely. So we now maintain our own list of exported +symbols and jam it into the build with this hack. + + +diff -up mysql-5.5.28/libmysql/CMakeLists.txt.p7 mysql-5.5.28/libmysql/CMakeLists.txt +--- mysql-5.5.28/libmysql/CMakeLists.txt.p7 2012-08-29 10:50:46.000000000 +0200 ++++ mysql-5.5.28/libmysql/CMakeLists.txt 2012-12-06 14:15:03.905461517 +0100 +@@ -209,7 +209,7 @@ IF(NOT DISABLE_SHARED) + SET(libmysql_link_flags) + ENDIF() + SET_TARGET_PROPERTIES(libmysql PROPERTIES LINK_FLAGS +- "${libmysql_link_flags} ${LINK_FLAG_NO_UNDEFINED}") ++ "${libmysql_link_flags} -Wl,--version-script=libmysql.version ${LINK_FLAG_NO_UNDEFINED}") + ENDIF() + # clean direct output needs to be set several targets have the same name + #(mysqlclient in this case) diff --git a/mysql55/mysql.init b/mysql55/mysql.init new file mode 100644 index 0000000..a421a4d --- /dev/null +++ b/mysql55/mysql.init @@ -0,0 +1,237 @@ +#!/bin/sh +# +# mysqld This shell script takes care of starting and stopping +# the MySQL subsystem (mysqld). +# +# chkconfig: - 64 36 +# description: MySQL database server. +# processname: mysqld +# config: /etc/mysql55/my.cnf +# pidfile: /var/run/mysqld/mysqld.pid +### BEGIN INIT INFO +# Provides: mysqld +# Required-Start: $local_fs $remote_fs $network $named $syslog $time +# Required-Stop: $local_fs $remote_fs $network $named $syslog $time +# Short-Description: start and stop MySQL server +# Description: MySQL database server +### END INIT INFO + +# Source function library. +. /etc/rc.d/init.d/functions + +# Source networking configuration. +. /etc/sysconfig/network + + +exec="/usr/bin/mysqld_safe" +prog="mysqld" + +# Set timeouts here so they can be overridden from /etc/sysconfig/mysqld +STARTTIMEOUT=120 +STOPTIMEOUT=60 +MYOPTIONS= + +[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog + +lockfile=/var/lock/subsys/$prog + + +# extract value of a MySQL option from config files +# Usage: get_mysql_option SECTION VARNAME DEFAULT +# result is returned in $result +# We use my_print_defaults which prints all options from multiple files, +# with the more specific ones later; hence take the last match. +get_mysql_option(){ + result=`/usr/bin/my_print_defaults "$1" | sed -n "s/^--$2=//p" | tail -n 1` + if [ -z "$result" ]; then + # not found, use default + result="$3" + fi +} + +get_mysql_option mysqld datadir "/var/lib/mysql" +datadir="$result" +get_mysql_option mysqld socket "$datadir/mysql.sock" +socketfile="$result" +get_mysql_option mysqld_safe log-error "/var/log/mysqld.log" +errlogfile="$result" +get_mysql_option mysqld_safe pid-file "/var/run/mysqld/mysqld.pid" +mypidfile="$result" + + +start(){ + [ -x $exec ] || exit 5 + # check to see if it's already running + RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1` + if [ $? = 0 ]; then + # already running, do nothing + action $"Starting $prog: " /bin/true + ret=0 + elif echo "$RESPONSE" | grep -q "Access denied for user" + then + # already running, do nothing + action $"Starting $prog: " /bin/true + ret=0 + else + # prepare for start + touch "$errlogfile" + chown mysql:mysql "$errlogfile" + chmod 0640 "$errlogfile" + [ -x /sbin/restorecon ] && /sbin/restorecon "$errlogfile" + if [ ! -d "$datadir/mysql" ] ; then + # First, make sure $datadir is there with correct permissions + if [ ! -e "$datadir" -a ! -h "$datadir" ] + then + mkdir -p "$datadir" || exit 1 + fi + chown mysql:mysql "$datadir" + chmod 0755 "$datadir" + [ -x /sbin/restorecon ] && /sbin/restorecon "$datadir" + # Now create the database + action $"Initializing MySQL database: " /usr/bin/mysql_install_db --datadir="$datadir" --user=mysql + ret=$? + chown -R mysql:mysql "$datadir" + if [ $ret -ne 0 ] ; then + return $ret + fi + fi + chown mysql:mysql "$datadir" + chmod 0755 "$datadir" + # If startsos + if [ "$1" = "sos" ] ; then + MYOPTIONS="$MYOPTIONS --skip-grant-tables --skip-networking" + fi + # Pass all the options determined above, to ensure consistent behavior. + # In many cases mysqld_safe would arrive at the same conclusions anyway + # but we need to be sure. (An exception is that we don't force the + # log-error setting, since this script doesn't really depend on that, + # and some users might prefer to configure logging to syslog.) + # Note: set --basedir to prevent probes that might trigger SELinux + # alarms, per bug #547485 + $exec --datadir="$datadir" --socket="$socketfile" \ + --pid-file="$mypidfile" \ + $MYOPTIONS \ + --basedir=/usr --user=mysql >/dev/null 2>&1 & + safe_pid=$! + # Spin for a maximum of N seconds waiting for the server to come up; + # exit the loop immediately if mysqld_safe process disappears. + # Rather than assuming we know a valid username, accept an "access + # denied" response as meaning the server is functioning. + ret=0 + TIMEOUT="$STARTTIMEOUT" + while [ $TIMEOUT -gt 0 ]; do + RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1` + mret=$? + if [ $mret -eq 0 ]; then + break + fi + # exit codes 1, 11 (EXIT_CANNOT_CONNECT_TO_SERVICE) are expected, + # anything else suggests a configuration error + if [ $mret -ne 1 -a $mret -ne 11 ]; then + echo "$RESPONSE" + echo "Cannot check for MySQL Daemon startup because of mysqladmin failure." + ret=1 + break + fi + echo "$RESPONSE" | grep -q "Access denied for user" && break + if ! /bin/kill -0 $safe_pid 2>/dev/null; then + echo "MySQL Daemon failed to start." + ret=1 + break + fi + sleep 1 + let TIMEOUT=${TIMEOUT}-1 + done + if [ $TIMEOUT -eq 0 ]; then + echo "Timeout error occurred trying to start MySQL Daemon." + ret=1 + fi + if [ $ret -eq 0 ]; then + action $"Starting $prog: " /bin/true + touch $lockfile + else + action $"Starting $prog: " /bin/false + fi + fi + return $ret +} + +stop(){ + if [ ! -f "$mypidfile" ]; then + # not running; per LSB standards this is "ok" + action $"Stopping $prog: " /bin/true + return 0 + fi + MYSQLPID=`cat "$mypidfile"` + if [ -n "$MYSQLPID" ]; then + /bin/kill "$MYSQLPID" >/dev/null 2>&1 + ret=$? + if [ $ret -eq 0 ]; then + TIMEOUT="$STOPTIMEOUT" + while [ $TIMEOUT -gt 0 ]; do + /bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break + sleep 1 + let TIMEOUT=${TIMEOUT}-1 + done + if [ $TIMEOUT -eq 0 ]; then + echo "Timeout error occurred trying to stop MySQL Daemon." + ret=1 + action $"Stopping $prog: " /bin/false + else + rm -f $lockfile + rm -f "$socketfile" + action $"Stopping $prog: " /bin/true + fi + else + action $"Stopping $prog: " /bin/false + fi + else + # failed to read pidfile, probably insufficient permissions + action $"Stopping $prog: " /bin/false + ret=4 + fi + return $ret +} + +restart(){ + stop + start +} + +condrestart(){ + [ -e $lockfile ] && restart || : +} + + +# See how we were called. +case "$1" in + start) + start + ;; + startsos) + start sos + ;; + stop) + stop + ;; + status) + status $prog + ;; + restart) + restart + ;; + condrestart|try-restart) + condrestart + ;; + reload) + exit 3 + ;; + force-reload) + restart + ;; + *) + echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|startsos}" + exit 2 +esac + +exit $? diff --git a/mysql55/mysql.spec b/mysql55/mysql.spec new file mode 100644 index 0000000..60c9026 --- /dev/null +++ b/mysql55/mysql.spec @@ -0,0 +1,1368 @@ +%define _default_patch_fuzz 2 +%define _hardened_build 1 + +%if 0%{?fedora} >= 15 || 0%{?rhel} >= 7 +%global with_systemd 1 +%else +%global with_systemd 0 +%endif +%if 0%{?fedora} >= 12 || 0%{?rhel} >= 6 +%global with_dtrace 1 +%else +%global with_dtrace 0 +%endif + +# tmp test +#%global with_dtrace 0 + +%global realname mysql + +Name: mysql55 +Version: 5.5.62 +Release: 3%{dist} + +Summary: MySQL client programs and shared libraries +Group: Applications/Databases +URL: http://www.mysql.com +# exceptions allow client libraries to be linked with most open source SW, +# not only GPL code. See README.mysql-license +License: GPLv2 with exceptions + +# Regression tests take a long time, you can skip 'em with this +%{!?runselftest:%global runselftest 0} + +# Upstream has a mirror redirector for downloads, so the URL is hard to +# represent statically. You can get the tarball by following a link from +# http://dev.mysql.com/downloads/mysql/ +Source0: mysql-%{version}.tar.gz +# The upstream tarball includes non-free documentation that we cannot ship. +# To remove the non-free documentation, run this script after downloading +# the tarball into the current directory: +# ./generate-tarball.sh $VERSION +# Source1: generate-tarball.sh not used for remi repo +Source1: mysql.sysconfig +Source2: mysql.init +Source3: my.cnf +Source4: scriptstub.c +Source5: my_config.h +Source6: README.mysql-docs +Source7: README.mysql-license +Source8: libmysql.version +Source9: mysql-embedded-check.c +Source10: mysql.tmpfiles.d +# systemd files +Source11: mysqld.service +Source12: mysqld-prepare-db-dir +Source13: mysqld-wait-ready +Source14: rh-skipped-tests-base.list +Source15: rh-skipped-tests-arm.list +# Working around perl dependency checking bug in rpm FTTB. Remove later. +Source999: filter-requires-mysql.sh + +Source1000: openssl.pc + +# Comments for these patches are in the patch files. +Patch1: mysql-errno.patch +Patch2: mysql-strmov.patch +Patch3: mysql-install-test.patch +Patch4: mysql-expired-certs.patch +Patch5: mysql-stack-guard.patch +Patch6: mysql-chain-certs.patch +Patch7: mysql-versioning.patch +Patch8: mysql-dubious-exports.patch +Patch10: mysql-plugin-bool.patch +Patch11: mysql-s390-tsc.patch +Patch14: mysql-va-list.patch +Patch15: mysql-netdevname.patch +Patch16: mysql-logrotate.patch +Patch17: mysql-plugin-test.patch +Patch18: mysql-cipherspec.patch +Patch19: mysql-file-contents.patch +Patch20: mysql-string-overflow.patch +Patch21: mysql-dh1024.patch +# http://bugs.mysql.com/68999 +Patch22: mysql-openssl.patch + +#Cloudlinux governor patches +Patch1000: 0001-Cloud-Linux-userstat.patch +Patch1001: max_connection2_mysql_5_5_30_b404.patch +Patch1002: mysql-governor-embedded-exclude-5_5_28.patch +Patch1003: 0003_1-Clean-up-stale-pid-files-in-datadir-when-stopping-to.patch +Patch1005: 0005-Use-accessors-and-fix-type-errors.patch + + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root +BuildRequires: gperf, bison +BuildRequires: perl, readline-devel +BuildRequires: openssl-devel +%if 0%{?rhel} > 8 +BuildRequires: compat-openssl10-devel +%endif +BuildRequires: gcc-c++, cmake, ncurses-devel, zlib-devel, libaio-devel +%if %{with_dtrace} +BuildRequires: systemtap-sdt-devel >= 1.3 +%endif +# make test requires time and ps +BuildRequires: time procps +# Socket and Time::HiRes are needed to run regression tests +BuildRequires: perl(Socket), perl(Time::HiRes) +%if %{with_systemd} +BuildRequires: systemd-units +%endif + +Requires: grep, coreutils +Requires: real-%{realname}-libs%{?_isa} = %{version}-%{release} +Requires: bash + +# Community obsoletes +Provides: MySQL MySQL-community mysql-client MySQL-client +Provides: mysql MySQL +Obsoletes: MySQL-community < %{version}-%{release} +Obsoletes: mysql-client < %{version}-%{release}, mysql-perl < %{version}-%{release} +Obsoletes: MySQL-client < %{version}-%{release} +Obsoletes: mysql < %{version}-%{release}, MySQL < %{version}-%{release} +Obsoletes: MySQL-storage-cluster MySQL-management-cluster MySQL-tools-cluster MySQL-extra-cluster +Obsoletes: MySQL-cluster-storage-community MySQL-cluster-management-community MySQL-cluster-tools-community MySQL-cluster-tools-extras +Obsoletes: MySQL-storage-cluster < %{version}-%{release} +Obsoletes: MySQL-management-cluster < %{version}-%{release} +Obsoletes: MySQL-tools-cluster < %{version}-%{release} +Obsoletes: MySQL-extra-cluster < %{version}-%{release} + +Conflicts: mysql <= 5.6, mariadb <= 5.6, MariaDB <= 5.6 + + + +# We can use real- prefix to distinguish from other MySQL implementations +# like MariaDB unambiguously +Provides: real-%{realname} = %{version}-%{release} +Provides: real-%{realname}%{?_isa} = %{version}-%{release} + +# MySQL (with caps) is upstream's spelling of their own RPMs for mysql +#Conflicts: MySQL + +# mysql-cluster used to be built from this SRPM, but no more +Obsoletes: mysql-cluster < 5.1.44 +# Virtual provides present in upstream's RPM (used by some app) +Provides: mysql-client = %{version}-%{release} + +# When rpm 4.9 is universal, this could be cleaned up: +%global __perl_requires %{SOURCE999} +%global __perllib_requires %{SOURCE999} + +# By default, patch(1) creates backup files when chunks apply with offsets. +# Turn that off to ensure such files don't get included in RPMs (cf bz#884755). +%global _default_patch_flags --no-backup-if-mismatch + +%description +MySQL is a multi-user, multi-threaded SQL database server. MySQL is a +client/server implementation consisting of a server daemon (mysqld) +and many different client programs and libraries. The base package +contains the standard MySQL client programs and generic MySQL files. + +%package libs + +Summary: The shared libraries required for MySQL clients +Group: Applications/Databases +Requires: /sbin/ldconfig +%if 0%{?rhel} == 6 +Requires: mysqlclient16 +%endif +Provides: mysqlclient18 +Obsoletes: mysqlclient18 < %{version}-%{release} +Obsoletes: compat-mysql55 <= %{version} +Provides: real-%{realname}-libs = %{version}-%{release} +Provides: real-%{realname}-libs%{?_isa} = %{version}-%{release} + +# Community obsoletes +Obsoletes: compat-MySQL55 <= %{version} +Provides: MySQL-shared-community +Obsoletes: MySQL-shared-community +Provides: mysql-libs MySQL-libs +Obsoletes: mysql-libs < %{version}-%{release}, MySQL-libs < %{version}-%{release} +#Conflicts: mysql-libs <= 5.6, mariadb-libs <= 5.6, MariaDB-shared <= 5.6 + +%if 0%{?rhel} == 5 +# EL-5 mysql 5.0.x have no mysql/mysql-libs +# This circular dep. should make update simpler +Requires: %{name}%{?_isa} = %{version}-%{release} +%endif + +%description libs +The mysql-libs package provides the essential shared libraries for any +MySQL client program or interface. You will need to install this package +to use any other MySQL package or any clients that need to connect to a +MySQL server. + +%package server + +Summary: The MySQL server and related files +Group: Applications/Databases +Requires: real-%{realname}%{?_isa} = %{version}-%{release} +Requires: real-%{realname}-libs%{?_isa} = %{version}-%{release} +Requires: coreutils +Requires(pre): /usr/sbin/useradd +Requires(post): chkconfig +Requires(preun): chkconfig +%if %{with_systemd} +# We require this to be present for %%{_prefix}/lib/tmpfiles.d +Requires: systemd-units +# Make sure it's there when scriptlets run, too +Requires(post): systemd-units +Requires(preun): systemd-units +Requires(postun): systemd-units +# This is actually needed for the %%triggerun script but Requires(triggerun) +# is not valid. We can use %%post because this particular %%triggerun script +# should fire just after this package is installed. +Requires(post): systemd-sysv +%else +# This is for /sbin/service +Requires(preun): initscripts +Requires(postun): initscripts +%endif +# mysqlhotcopy needs DBI/DBD support +Requires: perl-DBI, perl-DBD-MySQL +Provides: real-%{realname}-server = %{version}-%{release} +Provides: real-%{realname}-server%{?_isa} = %{version}-%{release} +# Community Obsoletes +Provides: MySQL-server MySQL-server-community +Obsoletes: MySQL-server MySQL-server-community +Provides: mysql-server MySQL-server +Obsoletes: mysql-server < %{version}-%{release}, MySQL-server < %{version}-%{release} +Conflicts: mysql-server <= 5.6, mariadb-server <= 5.6, MySQL-server%{?_isa} <= 5.6 + + +%description server +MySQL is a multi-user, multi-threaded SQL database server. MySQL is a +client/server implementation consisting of a server daemon (mysqld) +and many different client programs and libraries. This package contains +the MySQL server and some accompanying files and directories. + +%package devel + +Summary: Files for development of MySQL applications +Group: Applications/Databases +Requires: real-%{realname}%{?_isa} = %{version}-%{release} +Requires: real-%{realname}-libs%{?_isa} = %{version}-%{release} +%if 0%{?rhel} <= 8 +Requires: openssl-devel%{?_isa} +%else +Requires: compat-openssl10-devel +%endif +Provides: real-%{realname}-devel = %{version}-%{release} +Provides: real-%{realname}-devel%{?_isa} = %{version}-%{release} +Provides: mysqlclient18-devel = %{version}-%{release} +# Community Obsoletes +Provides: MySQL-devel MySQL-devel-community mysql-devel MySQL-devel +Obsoletes: MySQL-devel < %{version}-%{release}, MySQL-devel-community < %{version}-%{release}, mysql-devel < %{version}-%{release}, MySQL-devel < %{version}-%{release} + +Conflicts: pkgconfig(mysqlclient) > 5.6 +Conflicts: pkgconfig(mariadb) > 5.6 + +%description devel +MySQL is a multi-user, multi-threaded SQL database server. This +package contains the libraries and header files that are needed for +developing MySQL client applications. + +%package embedded + +Summary: MySQL as an embeddable library +Group: Applications/Databases +Provides: real-%{realname}-embedded = %{version}-%{release} +Provides: real-%{realname}-embedded%{?_isa} = %{version}-%{release} + +%description embedded +MySQL is a multi-user, multi-threaded SQL database server. This +package contains a version of the MySQL server that can be embedded +into a client application instead of running as a separate process. + +%package embedded-devel + +Summary: Development files for MySQL as an embeddable library +Group: Applications/Databases +Requires: real-%{realname}-embedded%{?_isa} = %{version}-%{release} +Requires: real-%{realname}-devel%{?_isa} = %{version}-%{release} +Provides: real-%{realname}-embedded-devel = %{version}-%{release} +Provides: real-%{realname}-embedded-devel%{?_isa} = %{version}-%{release} + +%description embedded-devel +MySQL is a multi-user, multi-threaded SQL database server. This +package contains files needed for developing and testing with +the embedded version of the MySQL server. + +%package bench + +Summary: MySQL benchmark scripts and data +Group: Applications/Databases +Requires: real-%{realname}%{?_isa} = %{version}-%{release} +Provides: real-%{realname}-bench = %{version}-%{release} +Provides: real-%{realname}-bench%{?_isa} = %{version}-%{release} + +# Community obsoletes +Obsoletes: MySQL-bench < %{version}-%{release}, mysql-bench < %{version}-%{release}, MySQL-bench < %{version}-%{release} +Provides: MySQL-bench mysql-bench MySQL-bench + + +%description bench +MySQL is a multi-user, multi-threaded SQL database server. This +package contains benchmark scripts and data for use when benchmarking +MySQL. + +%package test + +Summary: The test suite distributed with MySQL +Group: Applications/Databases +Requires: real-%{realname}%{?_isa} = %{version}-%{release} +Requires: real-%{realname}-libs%{?_isa} = %{version}-%{release} +Requires: real-%{realname}-server%{?_isa} = %{version}-%{release} +Provides: real-%{realname}-test = %{version}-%{release} +Provides: real-%{realname}-test%{?_isa} = %{version}-%{release} + +#community obsoletes +Obsoletes: MySQL-test < %{version}-%{release}, MySQL-test-community < %{version}-%{release}, mysql-test < %{version}-%{release} +Provides: MySQL-test MySQL-test-community mysql-test MySQL-test + +%description test +MySQL is a multi-user, multi-threaded SQL database server. This +package contains the regression test suite distributed with +the MySQL sources. + +%prep +%setup -q -n mysql-%{version} + +# Can't provide this file (by licence) +rm -f Docs/mysql.info + + +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +#%patch4 -p1 +%patch5 -p1 +%patch6 -p1 +%patch7 -p1 +%patch8 -p1 +%patch10 -p1 +%patch11 -p1 +%patch14 -p1 +%patch15 -p1 +%patch16 -p1 +%patch17 -p1 +%patch18 -p1 +%patch19 -p1 +%patch20 -p1 +#%patch21 -p1 +#%patch22 -p1 + +# Cloudlinux governor and userstats patches +%patch1000 -p3 +%patch1001 -p1 +%patch1002 -p1 +%patch1003 -p1 +%patch1005 -p3 +rm -f sql/sql_yacc.cc sql/sql_yacc.h + + +# workaround for upstream bug #56342 +rm -f mysql-test/t/ssl_8k_key-master.opt + +# upstream has fallen down badly on symbol versioning, do it ourselves +cp %{SOURCE8} libmysql/libmysql.version + +# generate a list of tests that fail, but are not disabled by upstream +cat %{SOURCE14} > mysql-test/rh-skipped-tests.list +# disable some tests failing on ARM architectures +%ifarch %{arm} +cat %{SOURCE15} >> mysql-test/rh-skipped-tests.list +%endif + +%build + +# fail quickly and obviously if user tries to build as root +%if %runselftest + if [ x"`id -u`" = x0 ]; then + echo "mysql's regression tests fail if run as root." + echo "If you really need to build the RPM as root, use" + echo "--define='runselftest 0' to skip the regression tests." + exit 1 + fi +%endif + + +CFLAGS="%{optflags} -I%{_includedir}/openssl10 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE" +# MySQL 4.1.10 definitely doesn't work under strict aliasing; also, +# gcc 4.1 breaks MySQL 5.0.16 without -fwrapv +CFLAGS="$CFLAGS -fno-strict-aliasing -fwrapv" +%if 0%{?rhel} >= 8 +CFLAGS="$CFLAGS -fno-omit-frame-pointer -fno-use-linker-plugin" +%endif +# force PIC mode so that we can build libmysqld.so +CFLAGS="$CFLAGS -fPIC" +# gcc seems to have some bugs on sparc as of 4.4.1, back off optimization +# submitted as bz #529298 +%ifarch sparc sparcv9 sparc64 +CFLAGS=`echo $CFLAGS| sed -e "s|-O2|-O1|g" ` +%endif +CXXFLAGS="$CFLAGS -std=c++11" +export CFLAGS CXXFLAGS + +export LDFLAGS="-L%{_libdir}/openssl10 -lssl -lcrypto ${LDFLAGS}" + +# The INSTALL_xxx macros have to be specified relative to CMAKE_INSTALL_PREFIX +# so we can't use %%{_datadir} and so forth here. + +cmake . -DBUILD_CONFIG=mysql_release \ + -DCOMPILATION_COMMENT="Legacy MySQL Community Server (GPL) by Raven" \ + -DFEATURE_SET="community" \ + -DINSTALL_LAYOUT=RPM \ + -DCMAKE_INSTALL_PREFIX="%{_prefix}" \ + -DSYSCONFDIR=%{_sysconfdir}/mysql55 \ + -DINSTALL_INCLUDEDIR=include/mysql \ + -DINSTALL_INFODIR=share/info \ + -DINSTALL_LIBDIR="%{_lib}/mysql55" \ + -DINSTALL_MANDIR=share/man \ + -DINSTALL_MYSQLSHAREDIR=share/mysql \ + -DINSTALL_MYSQLTESTDIR=share/mysql-test \ + -DINSTALL_PLUGINDIR="%{_lib}/mysql55/plugin" \ + -DINSTALL_SBINDIR=libexec \ + -DINSTALL_SCRIPTDIR=bin \ + -DINSTALL_SQLBENCHDIR=share \ + -DINSTALL_SUPPORTFILESDIR=share/mysql \ +%if 0%{?rhel} >= 9 + -DOPENSSL_INCLUDE_DIR=%{_includedir}/openssl10 \ + -DOPENSSL_CRYPTO_LIBRARY=%{_libdir}/openssl10/libcrypto.so \ + -DOPENSSL_SSL_LIBRARY=%{_libdir}/openssl10/libssl.so \ +%endif + -DMYSQL_DATADIR="/var/lib/mysql" \ + -DMYSQL_UNIX_ADDR="/var/lib/mysql/mysql.sock" \ + -DENABLED_LOCAL_INFILE=ON \ +%if %{with_dtrace} + -DENABLE_DTRACE=ON \ +%endif + -DWITH_EMBEDDED_SERVER=ON \ + -DWITH_READLINE=ON \ + -DWITH_SSL=system \ + -DWITH_ZLIB=system + +gcc $CFLAGS $LDFLAGS -o scriptstub "-DLIBDIR=\"%{_libdir}/mysql55\"" %{SOURCE4} + +make %{?_smp_mflags} VERBOSE=1 + +# regular build will make libmysqld.a but not libmysqld.so :-( +mkdir libmysqld/work +cd libmysqld/work +ar -x ../libmysqld.a +# these result in missing dependencies: (filed upstream as bug 59104) +rm -f sql_binlog.cc.o rpl_utility.cc.o +gcc $CFLAGS $LDFLAGS -shared -Wl,-soname,libmysqld.so.0 -o libmysqld.so.0.0.1 \ + *.o \ +%if %{with_dtrace} + ../../probes_mysql.o \ +%endif + -lpthread -laio -lcrypt -lssl -lcrypto -lz -lrt -lstdc++ -ldl -lm -lc +# # this is to check that we built a complete library +# cp %{SOURCE9} . +# ln -s libmysqld.so.0.0.1 libmysqld.so.0 +# gcc -I../../include $CFLAGS mysql-embedded-check.c libmysqld.so.0 +# LD_LIBRARY_PATH=. ldd ./a.out +# cd ../.. + +%if %runselftest + # hack to let 32- and 64-bit tests run concurrently on same build machine + case `uname -m` in + ppc64 | s390x | x86_64 | sparc64 ) + MTR_BUILD_THREAD=7 + ;; + *) + MTR_BUILD_THREAD=11 + ;; + esac + export MTR_BUILD_THREAD + + # Sometine, test fails because of this lib. + LD_LIBRARY_PATH=$PWD/libservices + export LD_LIBRARY_PATH + + make test + + # The cmake build scripts don't provide any simple way to control the + # options for mysql-test-run, so ignore the make target and just call it + # manually. Nonstandard options chosen are: + # --force to continue tests after a failure + # no retries please + # test SSL with --ssl + # skip tests that are listed in rh-skipped-tests.list + # avoid redundant test runs with --binlog-format=mixed + # increase timeouts to prevent unwanted failures during mass rebuilds + ( + cd mysql-test + perl ./mysql-test-run.pl --force --retry=0 --ssl \ + --skip-test-list=rh-skipped-tests.list \ + --mysqld=--binlog-format=mixed \ + --suite-timeout=720 --testcase-timeout=30 --suite=main + # cmake build scripts will install the var cruft if left alone :-( + rm -rf var + ) +%endif + +%install +rm -rf $RPM_BUILD_ROOT + +make DESTDIR=$RPM_BUILD_ROOT install + +# List the installed tree for RPM package maintenance purposes. +find $RPM_BUILD_ROOT -print | sed "s|^$RPM_BUILD_ROOT||" | sort > ROOTFILES + +# multilib header hacks +# we only apply this to known Red Hat multilib arches, per bug #181335 +case `uname -i` in + i386 | x86_64 | ppc | ppc64 | s390 | s390x | sparc | sparc64 ) + mv $RPM_BUILD_ROOT/usr/include/mysql/my_config.h $RPM_BUILD_ROOT/usr/include/mysql/my_config_`uname -i`.h + install -m 644 %{SOURCE5} $RPM_BUILD_ROOT/usr/include/mysql/ + ;; + *) + ;; +esac + +# cmake generates some completely wacko references to -lprobes_mysql when +# building with dtrace support. Haven't found where to shut that off, +# so resort to this blunt instrument. While at it, let's not reference +# libmysqlclient_r anymore either. +sed -e 's/-lprobes_mysql//' -e 's/-lmysqlclient_r/-lmysqlclient/' \ + ${RPM_BUILD_ROOT}%{_bindir}/mysql_config >mysql_config.tmp +cp -f mysql_config.tmp ${RPM_BUILD_ROOT}%{_bindir}/mysql_config +chmod 755 ${RPM_BUILD_ROOT}%{_bindir}/mysql_config + +# install INFO_SRC, INFO_BIN into libdir (upstream thinks these are doc files, +# but that's pretty wacko --- see also mysql-file-contents.patch) +install -m 644 Docs/INFO_SRC ${RPM_BUILD_ROOT}%{_libdir}/mysql55/ +install -m 644 Docs/INFO_BIN ${RPM_BUILD_ROOT}%{_libdir}/mysql55/ + +mkdir -p $RPM_BUILD_ROOT/var/log +touch $RPM_BUILD_ROOT/var/log/mysqld.log + +mkdir -p $RPM_BUILD_ROOT/var/run/mysqld +install -m 0755 -d $RPM_BUILD_ROOT/var/lib/mysql + +mkdir -p $RPM_BUILD_ROOT/etc/mysql55 +install -m 0644 %{SOURCE3} $RPM_BUILD_ROOT/etc/mysql55/my.cnf +%if %{with_systemd} +sed -i -e '/user=mysql/d' $RPM_BUILD_ROOT/etc/mysql55/my.cnf +%endif + +%if %{with_systemd} +# install systemd unit files and scripts for handling server startup +mkdir -p ${RPM_BUILD_ROOT}%{_unitdir} +install -m 644 %{SOURCE11} ${RPM_BUILD_ROOT}%{_unitdir}/ +%if 0%{?fedora} == 15 +# PrivateTmp only work on fedora >= 16 +sed -i -e '/PrivateTmp/s/true/false/' ${RPM_BUILD_ROOT}%{_unitdir}/mysqld.service +%endif +install -m 755 %{SOURCE12} ${RPM_BUILD_ROOT}%{_libexecdir}/ +install -m 755 %{SOURCE13} ${RPM_BUILD_ROOT}%{_libexecdir}/ + +mkdir -p $RPM_BUILD_ROOT%{_prefix}/lib/tmpfiles.d +install -m 0644 %{SOURCE10} $RPM_BUILD_ROOT%{_prefix}/lib/tmpfiles.d/mysql.conf + +%else +mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d +install -m 0755 %{SOURCE2} $RPM_BUILD_ROOT/etc/rc.d/init.d/mysqld + +# sysconfig is only provided by remi +mkdir -p $RPM_BUILD_ROOT/etc/sysconfig +install -m 0644 %{SOURCE1} $RPM_BUILD_ROOT/etc/sysconfig/mysqld +%endif + +# Fix funny permissions that cmake build scripts apply to config files +chmod 644 ${RPM_BUILD_ROOT}%{_datadir}/mysql/config.*.ini + +# Fix scripts for multilib safety +mv ${RPM_BUILD_ROOT}%{_bindir}/mysqlbug ${RPM_BUILD_ROOT}%{_libdir}/mysql55/mysqlbug +install -m 0755 scriptstub ${RPM_BUILD_ROOT}%{_bindir}/mysqlbug +mv ${RPM_BUILD_ROOT}%{_bindir}/mysql_config ${RPM_BUILD_ROOT}%{_libdir}/mysql55/mysql_config +install -m 0755 scriptstub ${RPM_BUILD_ROOT}%{_bindir}/mysql_config + +# Remove libmysqld.a, install libmysqld.so +rm -f ${RPM_BUILD_ROOT}%{_libdir}/mysql55/libmysqld.a +install -m 0755 libmysqld/work/libmysqld.so.0.0.1 ${RPM_BUILD_ROOT}%{_libdir}/mysql55/libmysqld.so.0.0.1 +ln -s libmysqld.so.0.0.1 ${RPM_BUILD_ROOT}%{_libdir}/mysql55/libmysqld.so.0 +ln -s libmysqld.so.0 ${RPM_BUILD_ROOT}%{_libdir}/mysql55/libmysqld.so + +# libmysqlclient_r is no more. Upstream tries to replace it with symlinks +# but that really doesn't work (wrong soname in particular). We'll keep +# just the devel libmysqlclient_r.so link, so that rebuilding without any +# source change is enough to get rid of dependency on libmysqlclient_r. +rm -f ${RPM_BUILD_ROOT}%{_libdir}/mysql55/libmysqlclient_r.so* +ln -s libmysqlclient.so ${RPM_BUILD_ROOT}%{_libdir}/mysql55/libmysqlclient_r.so + +# mysql-test includes one executable that doesn't belong under /usr/share, +# so move it and provide a symlink +mv ${RPM_BUILD_ROOT}%{_datadir}/mysql-test/lib/My/SafeProcess/my_safe_process ${RPM_BUILD_ROOT}%{_bindir} +ln -s ../../../../../bin/my_safe_process ${RPM_BUILD_ROOT}%{_datadir}/mysql-test/lib/My/SafeProcess/my_safe_process + +# Remove files that %%doc will install in preferred location +rm -f ${RPM_BUILD_ROOT}/usr/COPYING +rm -f ${RPM_BUILD_ROOT}/usr/README + +# Remove files we don't want installed at all +rm -f ${RPM_BUILD_ROOT}/usr/INSTALL-BINARY +rm -f ${RPM_BUILD_ROOT}/usr/docs/ChangeLog +rm -f ${RPM_BUILD_ROOT}/usr/data/mysql/.empty +rm -f ${RPM_BUILD_ROOT}/usr/data/test/.empty + +rm -f ${RPM_BUILD_ROOT}%{_datadir}/mysql/solaris/* + +# should move this to /etc/ ? +rm -f ${RPM_BUILD_ROOT}%{_bindir}/mysqlaccess.conf +rm -f ${RPM_BUILD_ROOT}%{_bindir}/mysql_embedded +rm -f ${RPM_BUILD_ROOT}%{_libdir}/mysql55/*.a +rm -f ${RPM_BUILD_ROOT}%{_datadir}/mysql/binary-configure +rm -f ${RPM_BUILD_ROOT}%{_datadir}/mysql/magic +rm -f ${RPM_BUILD_ROOT}%{_datadir}/mysql/ndb-config-2-node.ini +rm -f ${RPM_BUILD_ROOT}%{_datadir}/mysql/mysql.server +rm -f ${RPM_BUILD_ROOT}%{_datadir}/mysql/mysqld_multi.server +rm -f ${RPM_BUILD_ROOT}%{_mandir}/man1/comp_err.1* +rm -f ${RPM_BUILD_ROOT}%{_mandir}/man1/mysql-stress-test.pl.1* +rm -f ${RPM_BUILD_ROOT}%{_mandir}/man1/mysql-test-run.pl.1* + +# put logrotate script where it needs to be +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d +mv ${RPM_BUILD_ROOT}%{_datadir}/mysql/mysql-log-rotate $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/mysqld +chmod 644 $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/mysqld + +mkdir -p $RPM_BUILD_ROOT/etc/ld.so.conf.d +echo "%{_libdir}/mysql55" > $RPM_BUILD_ROOT/etc/ld.so.conf.d/%{name}-%{_arch}.conf + +# copy additional docs into build tree so %%doc will find them +cp %{SOURCE6} README.mysql-docs +cp %{SOURCE7} README.mysql-license + +# install the list of skipped tests to be available for user runs +install -m 0644 mysql-test/rh-skipped-tests.list ${RPM_BUILD_ROOT}%{_datadir}/mysql-test + +# Fix scripts for multilib safety +#mv ${RPM_BUILD_ROOT}%{_bindir}/mysql_config ${RPM_BUILD_ROOT}%{_libdir}/mysql/mysql_config +#touch ${RPM_BUILD_ROOT}%{_bindir}/mysql_config + +%clean +rm -rf $RPM_BUILD_ROOT + + +%pre server +/usr/sbin/groupadd -g 27 -o -r mysql >/dev/null 2>&1 || : +%if 0%{?fedora} >= 10 || 0%{?rhel} >= 6 +/usr/sbin/useradd -M -N -g mysql -o -r -d /var/lib/mysql -s /bin/bash \ + -c "MySQL Server" -u 27 mysql >/dev/null 2>&1 || : +%else +# -N options used on Fedora not available on fedora <= 8 and EL <= 5 +/usr/sbin/useradd -M -g mysql -o -r -d /var/lib/mysql -s /bin/bash \ + -c "MySQL Server" -u 27 mysql >/dev/null 2>&1 || : +%endif + +%post devel +%{_sbindir}/update-alternatives --install %{_bindir}/mysql_config \ + mysql_config %{_libdir}/mysql55/mysql_config %{__isa_bits} + +%post libs +/sbin/ldconfig + +%post server +if grep -q skip-bdb /etc/mysql55//my.cnf; then + /usr/bin/perl -p -i -e "s[^skip-bdb][#skip-bdb]gi" /etc/mysql55/my.cnf +fi + +datadir=/var/lib/mysql +socketfile="$datadir/mysql.sock" +mypidfile=/var/run/mysqld/mysqld.pid +errorlogfile=/var/log/mysqld.log + +start_nonsecure() { + /etc/init.d/mysqld stop || : + + # we just want to disable any ^set-variable stuff + if grep -q ^set-variable /etc/mysql55/my.cnf; then + timestamp=$(/bin/date +%m%d%y-%H%M) + cp /etc/mysql55/my.cnf /etc/mysql55/my.cnf-original-$timestamp + /usr/bin/perl -p -i -e "s[^set-variable][#set-variable]gi" /etc/mysql55/my.cnf + /usr/bin/perl -p -i -e "s[^record_buffer][read_buffer_size]gi" /etc/mysql55/my.cnf + /usr/bin/perl -p -i -e "s[^innodb_buffer_pool_read_ahead_rnd][innodb_buffer_pool_read_ahead]gi" /etc/mysql55/my.cnf + /usr/bin/perl -p -i -e "s[^innodb_buffer_pool_read_ahead_seq][innodb_buffer_pool_read_ahead_evicted]gi" /etc/mysql55/my.cnf + fi + # end + + /usr/bin/mysqld_safe --datadir="$datadir" --socket="$socketfile" \ + --log-error="$errlogfile" --pid-file="$mypidfile" \ + --user=mysql --skip-grant-tables >/dev/null 2>&1 & + + STARTTIMEOUT=120 + while [ $STARTTIMEOUT -gt 0 ]; do + if /usr/bin/mysqladmin ping 2>/dev/null; then break; fi + sleep 1 + STARTTIMEOUT=`expr $STARTTIMEOUT - 1` + done +} +run_upgrade() { + start_nonsecure + + # black magic 1: mysqlupgrade does not actually able to upgrade + # InnoDB tables, as REPAIR TABLE do not work on them. + # So they need to be re-created. + # OPTIMIZE TABLE does not work on them as well, but does re-creation + # instead. But we actually want to re-create them! + tmpfile=$(/bin/mktemp) + + no_repair="The storage engine for the table doesn't support repair" + /usr/bin/mysql_upgrade | grep -B1 "$no_repair" | grep -v "$no_repair" | sed -e "s/^\(.*\)$/OPTIMIZE TABLE \\1;/" 2>&1 > $tmpfile + + # black magic 2: after mysql_upgrade, mysqld --skip-grant table + # suddenly wants to authenticate us again.. + + start_nonsecure + /usr/bin/mysql < $tmpfile + rm -f $tmpfile + /etc/init.d/mysqld stop || : + /etc/init.d/mysqld start || : + +} + + +%if 0%{?systemd_post:1} +%systemd_post mysqld.service +%else +if [ $1 = 1 ]; then + # Initial installation +%if %{with_systemd} + /bin/systemctl daemon-reload >/dev/null 2>&1 || : +%else + /sbin/chkconfig --add mysqld +%endif +fi +%endif +/bin/chmod 0755 /var/lib/mysql +/bin/touch /var/log/mysqld.log + +# Handle upgrading from SysV initscript to native systemd unit. +# We can tell if a SysV version of mysql was previously installed by +# checking to see if the initscript is present. +%triggerun server -- mysql-server +%if %{with_systemd} +if [ -f /etc/rc.d/init.d/mysqld ]; then + # Save the current service runlevel info + # User must manually run systemd-sysv-convert --apply mysqld + # to migrate them to systemd targets + /usr/bin/systemd-sysv-convert --save mysqld >/dev/null 2>&1 || : + + # Run these because the SysV package being removed won't do them + /sbin/chkconfig --del mysqld >/dev/null 2>&1 || : + /bin/systemctl try-restart mysqld.service >/dev/null 2>&1 || : +fi +%endif + +%preun server +%if 0%{?systemd_preun:1} +%systemd_preun mysqld.service +%else +if [ $1 = 0 ]; then + # Package removal, not upgrade +%if %{with_systemd} + /bin/systemctl --no-reload disable mysqld.service >/dev/null 2>&1 || : + /bin/systemctl stop mysqld.service >/dev/null 2>&1 || : +%else + /sbin/service mysqld stop >/dev/null 2>&1 + /sbin/chkconfig --del mysqld +%endif +fi +%endif + +%postun libs +if [ $1 = 0 ] ; then + /sbin/ldconfig +fi + +%postun server +%if 0%{?systemd_postun_with_restart:1} +%systemd_postun_with_restart mysqld.service +%else +%if %{with_systemd} +/bin/systemctl daemon-reload >/dev/null 2>&1 || : +if [ $1 -ge 1 ]; then + # Package upgrade, not uninstall + /bin/systemctl try-restart mysqld.service >/dev/null 2>&1 || : +fi +%else +if [ $1 -ge 1 ]; then + /sbin/service mysqld condrestart >/dev/null 2>&1 || : +fi +%endif +%endif + +%postun devel +if [ $1 -eq 0 ] ; then + %{_sbindir}/update-alternatives --remove mysql_config %{_libdir}/mysql55/mysql_config +fi + +%files +%defattr(-,root,root) +%doc README COPYING README.mysql-license +%doc README.mysql-docs +%doc Docs + +%{_bindir}/msql2mysql +%{_bindir}/mysql +#{_bindir}/mysql_config +%{_bindir}/mysql_find_rows +%{_bindir}/mysql_waitpid +%{_bindir}/mysqlaccess +%{_bindir}/mysqladmin +%{_bindir}/mysqlbinlog +%{_bindir}/mysqlcheck +%{_bindir}/mysqldump +%{_bindir}/mysqlimport +%{_bindir}/mysqlshow +%{_bindir}/mysqlslap +%{_bindir}/my_print_defaults + +%{_mandir}/man1/mysql.1* +%{_mandir}/man1/mysql_config.1* +%{_mandir}/man1/mysql_find_rows.1* +%{_mandir}/man1/mysql_waitpid.1* +%{_mandir}/man1/mysqlaccess.1* +%{_mandir}/man1/mysqladmin.1* +%{_mandir}/man1/mysqldump.1* +%{_mandir}/man1/mysqlshow.1* +%{_mandir}/man1/mysqlslap.1* +%{_mandir}/man1/my_print_defaults.1* + +%{_libdir}/mysql55/mysql_config + +%files libs +%defattr(-,root,root) +%doc README COPYING README.mysql-license +# although the default my.cnf contains only server settings, we put it in the +# libs package because it can be used for client settings too. +%config(noreplace) /etc/mysql55/my.cnf +%dir %{_libdir}/mysql55 +%{_libdir}/mysql55/libmysqlclient.so.18* +/etc/ld.so.conf.d/* + +%dir %{_datadir}/mysql + + +%files server +%defattr(-,root,root) +%doc support-files/*.cnf + +%{_bindir}/myisamchk +%{_bindir}/myisam_ftdump +%{_bindir}/myisamlog +%{_bindir}/myisampack +%{_bindir}/mysql_convert_table_format +%{_bindir}/mysql_fix_extensions +%{_bindir}/mysql_install_db +%{_bindir}/mysql_plugin +%{_bindir}/mysql_secure_installation +%{_bindir}/mysql_setpermission +%{_bindir}/mysql_tzinfo_to_sql +%{_bindir}/mysql_upgrade +%{_bindir}/mysql_zap +%{_bindir}/mysqlbug +%{_bindir}/mysqldumpslow +%{_bindir}/mysqld_multi +%{_bindir}/mysqld_safe +%{_bindir}/mysqlhotcopy +%{_bindir}/mysqltest +%{_bindir}/innochecksum +%{_bindir}/perror +%{_bindir}/replace +%{_bindir}/resolve_stack_dump +%{_bindir}/resolveip + +%{_libexecdir}/mysqld + +%{_libdir}/mysql55/INFO_SRC +%{_libdir}/mysql55/INFO_BIN + +%{_libdir}/mysql55/mysqlbug + +%{_libdir}/mysql55/plugin + +%{_mandir}/man1/msql2mysql.1* +%{_mandir}/man1/myisamchk.1* +%{_mandir}/man1/myisamlog.1* +%{_mandir}/man1/myisampack.1* +%{_mandir}/man1/mysql_convert_table_format.1* +%{_mandir}/man1/myisam_ftdump.1* +%{_mandir}/man1/mysql.server.1* +%{_mandir}/man1/mysql_fix_extensions.1* +%{_mandir}/man1/mysql_install_db.1* +%{_mandir}/man1/mysql_plugin.1* +%{_mandir}/man1/mysql_secure_installation.1* +%{_mandir}/man1/mysql_upgrade.1* +%{_mandir}/man1/mysql_zap.1* +%{_mandir}/man1/mysqlbug.1* +%{_mandir}/man1/mysqldumpslow.1* +%{_mandir}/man1/mysqlbinlog.1* +%{_mandir}/man1/mysqlcheck.1* +%{_mandir}/man1/mysqld_multi.1* +%{_mandir}/man1/mysqld_safe.1* +%{_mandir}/man1/mysqlhotcopy.1* +%{_mandir}/man1/mysqlimport.1* +%{_mandir}/man1/mysqlman.1* +%{_mandir}/man1/mysql_setpermission.1* +#%{_mandir}/man1/mysqltest.1* +%{_mandir}/man1/innochecksum.1* +%{_mandir}/man1/perror.1* +%{_mandir}/man1/replace.1* +%{_mandir}/man1/resolve_stack_dump.1* +%{_mandir}/man1/resolveip.1* +%{_mandir}/man1/mysql_tzinfo_to_sql.1* +%{_mandir}/man8/mysqld.8* + +%{_datadir}/mysql/errmsg-utf8.txt +%{_datadir}/mysql/fill_help_tables.sql +%{_datadir}/mysql/mysql_system_tables.sql +%{_datadir}/mysql/mysql_system_tables_data.sql +%{_datadir}/mysql/mysql_test_data_timezone.sql +%{_datadir}/mysql/my-*.cnf +%{_datadir}/mysql/config.*.ini + +%{_datadir}/mysql/english +%lang(cs) %{_datadir}/mysql/czech +%lang(da) %{_datadir}/mysql/danish +%lang(nl) %{_datadir}/mysql/dutch +%lang(et) %{_datadir}/mysql/estonian +%lang(fr) %{_datadir}/mysql/french +%lang(de) %{_datadir}/mysql/german +%lang(el) %{_datadir}/mysql/greek +%lang(hu) %{_datadir}/mysql/hungarian +%lang(it) %{_datadir}/mysql/italian +%lang(ja) %{_datadir}/mysql/japanese +%lang(ko) %{_datadir}/mysql/korean +%lang(no) %{_datadir}/mysql/norwegian +%lang(no) %{_datadir}/mysql/norwegian-ny +%lang(pl) %{_datadir}/mysql/polish +%lang(pt) %{_datadir}/mysql/portuguese +%lang(ro) %{_datadir}/mysql/romanian +%lang(ru) %{_datadir}/mysql/russian +%lang(sr) %{_datadir}/mysql/serbian +%lang(sk) %{_datadir}/mysql/slovak +%lang(es) %{_datadir}/mysql/spanish +%lang(sv) %{_datadir}/mysql/swedish +%lang(uk) %{_datadir}/mysql/ukrainian +%{_datadir}/mysql/charsets + +%if %{with_systemd} +%{_unitdir}/mysqld.service +%{_libexecdir}/mysqld-prepare-db-dir +%{_libexecdir}/mysqld-wait-ready + +%{_prefix}/lib/tmpfiles.d/mysql.conf +%else +/etc/rc.d/init.d/mysqld +%config(noreplace) /etc/sysconfig/mysqld +%endif +%attr(0755,mysql,mysql) %dir /var/run/mysqld +%attr(0755,mysql,mysql) %dir /var/lib/mysql +%attr(0640,mysql,mysql) %config(noreplace) %verify(not md5 size mtime) /var/log/mysqld.log +%config(noreplace) %{_sysconfdir}/logrotate.d/mysqld + +%files devel +%{_bindir}/mysql_config +#{_libdir}/mysql/mysql_config +%defattr(-,root,root) +/usr/include/mysql +/usr/share/aclocal/mysql.m4 +%{_libdir}/mysql55/libmysqlclient.so +%{_libdir}/mysql55/libmysqlclient_r.so + +%files embedded +%defattr(-,root,root) +%doc README COPYING README.mysql-license +%{_libdir}/mysql55/libmysqld.so.* + +%files embedded-devel +%defattr(-,root,root) +%{_libdir}/mysql55/libmysqld.so +%{_bindir}/mysql_client_test_embedded +%{_bindir}/mysqltest_embedded +#%{_mandir}/man1/mysql_client_test_embedded.1* +#%{_mandir}/man1/mysqltest_embedded.1* + +%files bench +%defattr(-,root,root) +%{_datadir}/sql-bench + +%files test +%defattr(-,root,root) +%{_bindir}/mysql_client_test +%{_bindir}/my_safe_process +%attr(-,mysql,mysql) %{_datadir}/mysql-test + +#%{_mandir}/man1/mysql_client_test.1* + +%changelog +* Mon Oct 3 2016 Scott R. Shinn - 5.5.52-36 +- Update to 5.5.52 + +* Tue Aug 23 2016 Scott R. Shinn - 5.5.51-35 +- Update to 5.5.51 + +* Wed Jun 8 2016 Scott R. Shinn - 5.5.50-34 +- Update to 5.5.50 + +* Mon Apr 11 2016 Scott R. Shinn - 5.5.49-33 +- Update to 5.5.49 + +* Fri Mar 18 2016 Scott R. Shinn - 5.5.48-32 +- Update to 5.5.48 + +* Mon Dec 21 2015 Scott R. Shinn - 5.5.47-31 +- Update to 5.5.47 + +* Wed Nov 4 2015 Scott R. Shinn - 5.5.46-30 +- Update to 5.5.46 + +* Fri Jun 26 2015 Scott R. Shinn - 5.5.44-30 +- Update to 5.5.44 + +* Thu Apr 23 2015 Scott R. Shinn - 5.5.43-29 +- Update to 5.5.43 + +* Sun Feb 8 2015 Scott R. Shinn - 5.5.42-28 +- Update to 5.5.42 + +* Sat Nov 29 2014 Scott R. Shinn - 5.5.41-27 +- Update to 5.5.41 + +* Tue Sep 23 2014 Scott R. Shinn - 5.5.40-26 +- Update to 5.5.40 + +* Mon Aug 18 2014 Scott R. Shinn - 5.5.39-25 +- Update to 5.5.39 + +* Mon Jun 9 2014 Scott R. Shinn - 5.5.38-24 +- Update to 5.5.38 + +* Wed Apr 9 2014 Scott R. Shinn - 5.5.37-23 +- Update to 5.5.37 + +* Mon Feb 10 2014 Scott R. Shinn - 5.5.36-22 +- Update to 5.5.36 +- Add 0003_1-Clean-up-stale-pid-files-in-datadir-when-stopping-to.patch +- Add 0005-Use-accessors-and-fix-type-errors.patch + +* Wed Sep 25 2013 Scott R. Shinn - 5.5.34-21 +- Update to 5.5.34 + +* Fri Aug 2 2013 Scott R. Shinn - 5.5.33-20 +- UPdate to 5.5.33 + +* Mon Jul 8 2013 Scott R. Shinn - 5.5.32-19 +- Bugfix #XXX, add run_upgrade event for Plesk systems (Credit: Oleg Neumyvakin) +- Update max_connection2 patch to 5.5.30-b404 + +* Tue Jun 18 2013 Scott R. Shinn - 5.5.32-18 +- Update to 5.5.32 +- Resync with remi +- Update max_connection2 patch to 5.5.30-b403 + +* Thu Apr 18 2013 Scott R. Shinn - 5.5.31-17 +- Update to 5.5.31 + +* Mon Mar 11 2013 Scott R. Shinn - 5.5.30-16 +- Added Provides/Obsoletes against MySQL55 naming conventions + +* Fri Feb 1 2013 Scott R. Shinn - 5.5.30-15 +- Update to 5.5.30 + +* Fri Jan 4 2013 Scott R. Shinn - 5.5.29-14 +- Update to 5.5.29 + +* Wed Nov 21 2012 Scott R. Shinn - 5.5.28-13 +- Update cloudlinux patches + +* Tue Oct 2 2012 Scott R. Shinn - 5.5.28-12 +- Update to 5.5.28 + +* Mon Aug 6 2012 Scott R. Shinn - 5.5.27-11 +- Update to 5.5.27 +- There was no 5.5.26 + +* Mon Jul 23 2012 Scott R. Shinn - 5.5.25a-9 +- Added skip-bdb removal event to %post (source Igor @Parallels) + +* Sun Jul 22 2012 Scott R. Shinn - 5.5.25a-8 +- Update to 5.5.25a +* Thu May 31 2012 Scott R. Shinn - 5.5.25-7 +- Update to 5.5.25 + +* Thu May 10 2012 Scott R. Shinn - 5.5.24-6 +- Update to 5.5.24 + +* Mon Apr 16 2012 Scott R. Shinn - 5.5.23-5 +- Update to 5.5.23 + +* Tue Mar 27 2012 Scott R. Shinn - 5.5.22-4 +- Update to 5.5.22 + +* Mon Feb 21 2012 Scott R. Shinn - 5.5.21-3 +- Update to 5.5.21 + +* Tue Jan 17 2012 Scott R. Shinn - 5.5.20-2 +- Update to 5.5.20 + +* Wed Dec 28 2011 Scott R. Shinn - 5.5.19-1 +- Update to 5.5.19 + +* Tue Nov 22 2011 Scott R. Shinn - 5.5.18-1 +- Update to 5.5.18 + +* Wed Oct 25 2011 Scott R. Shinn - 5.5.17-2 +- Bugfix #XXX, correct perl dependency issue with mysql-test + +* Mon Oct 24 2011 Scott R. Shinn - 5.5.17-1 +- Update to 5.5.17 + +* Wed Oct 12 2011 Scott R. Shinn - 5.5.16-1 +- Update to 5.5.16 +- Refine update routine to only run in plesk environments +- Add mysql-governor patches from cloudlinux + +* Wed Sep 14 2011 Scott R. Shinn - 5.5.15-2 +- Add post upgrade routine to handle mysql database updates internally + +* Mon Aug 1 2011 Scott R. Shinn - 5.5.15-1 +- Update to mysql 5.5.15 + +* Wed Jul 13 2011 Scott R. Shinn - 5.5.14-2 +- Add in Obsoletes & Provides tags against mysql55 & MySQL packages + +* Wed Jul 6 2011 Remi Collet - 5.5.14-1 +- update to MySQL 5.5.14 Community Server GA + http://dev.mysql.com/doc/refman/5.5/en/news-5-5-14.html + +* Thu Jun 2 2011 Tom Lane 5.5.13-1 +- Update to MySQL 5.5.13, for various fixes described at + http://dev.mysql.com/doc/refman/5.5/en/news-5-5-13.html + +* Tue May 31 2011 Remi Collet - 5.5.13-1 +- update to MySQL 5.5.13 Community Server GA + http://dev.mysql.com/doc/refman/5.5/en/news-5-5-13.html + +* Tue May 10 2011 Tom Lane 5.5.12-1 +- Update to MySQL 5.5.12, for various fixes described at + http://dev.mysql.com/doc/refman/5.5/en/news-5-5-12.html + +* Tue May 10 2011 Tom Lane 5.5.10-3 +- Add LSB init block to initscript, to ensure sane ordering at system boot +Resolves: #703214 +- Improve initscript start action to notice when mysqladmin is failing +- Improve initscript start action to notice when mysqladmin is failing + because of configuration problems +Related: #703476 +- Remove exclusion of "gis" regression test, since upstream bug 59908 + is fixed (for some value of "fixed") as of 5.5.10. + +* Mon May 09 2011 Remi Collet - 5.5.12-1 +- update to MySQL 5.5.12 Community Server GA + http://dev.mysql.com/doc/refman/5.5/en/news-5-5-12.html + +* Sat Apr 30 2011 Remi Collet - 5.5.11-1.fc15 +- f15 build +- add Obsoletes for compat-mysql55 + +* Tue Apr 05 2011 Remi Collet - 5.5.11-1 +- update to MySQL 5.5.11 Community Server GA + http://dev.mysql.com/doc/refman/5.5/en/news-5-5-11.html + +* Wed Mar 23 2011 Tom Lane 5.5.10-2 +- Add my_make_scrambled_password to the list of symbols exported by + libmysqlclient.so. Needed at least by pure-ftpd. + +* Mon Mar 21 2011 Tom Lane 5.5.10-1 +- Update to MySQL 5.5.10, for various fixes described at + http://dev.mysql.com/doc/refman/5.5/en/news-5-5-10.html + Note that this includes a rather belated soname version bump for + libmysqlclient.so, from .16 to .18 +- Add tmpfiles.d config file so that /var/run/mysqld is recreated at boot + (only needed in Fedora 15 and later) +Resolves: #658938 + +* Tue Mar 15 2011 Remi Collet - 5.5.10-1 +- update to MySQL 5.5.10 Community Server GA + http://dev.mysql.com/doc/refman/5.5/en/news-5-5-10.html +- provides /etc/sysconfig/mysqld +- fix default my.cnf +- client ABI bump to .18 by upstream + +* Mon Feb 07 2011 Remi Collet - 5.5.9-1 +- sync with rawhide (latest patches for 5.5.8) +- update to MySQL 5.5.9 Community Server GA +- disable main.information_schema test which have strange result + +* Fri Feb 4 2011 Tom Lane 5.5.8-9 +- Support s390/s390x in performance schema's cycle-counting functions + (needed to make regression tests pass on these platforms) + +* Thu Feb 3 2011 Tom Lane 5.5.8-8 +- PPC64 floating-point differences are not masked by -ffloat-store after all, + so let's just disable gis regression test till upstream makes it less picky +Resolves: #674253 +- Add __perllib_requires setting to make rpm 4.9 do what we need + +* Wed Feb 2 2011 Tom Lane 5.5.8-7 +- Work around some portability issues on PPC64 +Resolves: #674253 + +* Thu Jan 20 2011 Tom Lane 5.5.8-6 +- Remove no-longer-needed special switches in CXXFLAGS, per yesterday's + discussion in fedora-devel about -fexceptions. +- Rebuild needed anyway to check compatibility with latest systemtap. + +* Thu Jan 13 2011 Tom Lane 5.5.8-5 +- Fix failure to honor MYSQL_HOME environment variable +Resolves: #669364 + +* Thu Jan 13 2011 Tom Lane 5.5.8-4 +- Fix crash during startup of embedded mysqld library +Resolves: #667365 + +* Sat Jan 08 2011 Remi Collet - 5.5.8-3 +- sync with rawhide + +* Mon Jan 3 2011 Tom Lane 5.5.8-3 +- my_print_help, load_defaults, free_defaults, and handle_options all turn + out to be documented/recommended in Paul DuBois' MySQL book, so we'd better + consider them part of the de-facto API. +Resolves: #666728 + +* Tue Dec 28 2010 Remi Collet - 5.5.8-2 +- sync with rawhide + +* Mon Dec 27 2010 Tom Lane 5.5.8-2 +- Add mysql_client_errors[] to the set of exported libmysqlclient symbols; + needed by PHP. + +* Thu Dec 23 2010 Tom Lane 5.5.8-1 +- Update to MySQL 5.5.8 (major version bump). Note this includes removal + of libmysqlclient_r.so. +* Fri Dec 17 2010 Remi Collet - 5.5.8-1 +- Update to MySQL Community Server 5.5.8 GA +- move from autotools to cmake +- remove EXCEPTIONS-CLIENT (no more provided upstream) +- force soname to .161 (compat-mysql51 provides .16) + +* Wed Nov 10 2010 Remi Collet - 5.5.7-1 +- Update to MySQL Community Server 5.5.7 RC +- add startsos to init script (--skip-grant-tables --skip-networking) + +* Fri Sep 24 2010 Remi Collet - 5.5.6-1 +- Update to MySQL Community Server 5.5.6 RC + +* Sat Aug 28 2010 Tom Lane 5.1.50-2 +- Include my_compiler.h in distribution, per upstream bug #55846. + Otherwise PHP, for example, won't build. + +* Sat Aug 28 2010 Remi Collet - 5.1.50-2 +- sync with rawhide +- add patch for missing header (and notify mysql-owner) + http://lists.mysql.com/commits/116644 + +* Sat Aug 28 2010 Tom Lane 5.1.50-1 +- Update to MySQL 5.1.50, for various fixes described at + http://dev.mysql.com/doc/refman/5.1/en/news-5-1-50.html + http://dev.mysql.com/doc/refman/5.1/en/news-5-1-49.html + +* Fri Aug 20 2010 Remi Collet - 5.1.50-1 +- Update to MySQL 5.1.50 Community Server GA + http://dev.mysql.com/doc/refman/5.1/en/news-5-1-50.html +- add BR perl(Time::HiRes) for EL-4 + +* Fri Jul 23 2010 Remi Collet - 5.1.49-1 +- sync with rawhide +- Update to MySQL 5.1.49 Community Server GA + +* Tue Jul 13 2010 Tom Lane 5.1.48-2 +- Duplicate COPYING and EXCEPTIONS-CLIENT in -libs and -embedded subpackages, + to ensure they are available when any subset of mysql RPMs are installed, + per revised packaging guidelines +- Allow init script's STARTTIMEOUT/STOPTIMEOUT to be overridden from sysconfig +Related: #609734 + +* Fri Jun 25 2010 Remi Collet - 5.1.48-1.1 +- fix useradd command (-N not supported everywhere) + +* Mon Jun 21 2010 Tom Lane 5.1.48-1 +- Update to MySQL 5.1.48, for various fixes described at + http://dev.mysql.com/doc/refman/5.1/en/news-5-1-48.html + including a fix for CVE-2010-2008 +Related: #614214 + +* Thu Jun 17 2010 Remi Collet - 5.1.48-1 +- sync with rawhide +- Update to MySQL 5.1.48 Community Server GA + +* Fri Jun 4 2010 Tom Lane 5.1.47-2 +- Add back "partition" storage engine +Resolves: #597390 +- Fix broken "federated" storage engine plugin +Related: #587170 +- Read all certificates in SSL certificate files, to support chained certs +Related: #598656 + +* Mon May 24 2010 Tom Lane 5.1.47-1 +- Update to MySQL 5.1.47, for various fixes described at + http://dev.mysql.com/doc/refman/5.1/en/news-5-1-47.html + including fixes for CVE-2010-1848, CVE-2010-1849, CVE-2010-1850 +Resolves: #592862 +Resolves: #583717 +- Create mysql group explicitly in pre-server script, to ensure correct GID +Related: #594155 + +* Fri May 21 2010 Remi Collet - 5.1.47-1 +- Update to MySQL 5.1.47 Community Server GA + +* Mon Apr 26 2010 Remi Collet - 5.1.46-1.###.remi +- Update to MySQL 5.1.46 Community Server GA + +* Sat Apr 24 2010 Tom Lane 5.1.46-1 +- Update to MySQL 5.1.46, for various fixes described at + http://dev.mysql.com/doc/refman/5.1/en/news-5-1-46.html + +* Thu Mar 25 2010 Tom Lane 5.1.45-2 +- Fix multiple problems described in upstream bug 52019, because regression + tests fail on PPC if we don't. + +* Thu Mar 18 2010 Remi Collet - 5.1.45-1.###.remi +- Update to MySQL 5.1.45 Community Server GA + +* Fri Feb 19 2010 Remi Collet - 5.1.44-1.###.remi +- Update to MySQL 5.1.44 Community Server GA +- sync with rawhide spec (drop ndb) + +* Sat Feb 13 2010 Tom Lane 5.1.43-2 +- Remove mysql-cluster, which is no longer supported by upstream in this + source distribution. If we want it we'll need a separate SRPM for it. + +* Mon Feb 01 2010 Remi Collet - 5.1.43-1.###.remi +- Update to MySQL 5.1.43 Community Server GA +- sync with rawhide spec + +* Thu Dec 31 2009 Remi Collet - 5.1.42-1.###.remi +- Update to MySQL 5.1.42 Community Server GA + +* Thu Dec 17 2009 Tom Lane 5.1.41-2 +- Stop waiting during "service mysqld start" if mysqld_safe exits +Resolves: #544095 + +* Mon Nov 23 2009 Tom Lane 5.1.41-1 +- Update to MySQL 5.1.41, for various fixes described at + http://dev.mysql.com/doc/refman/5.1/en/news-5-1-41.html + including fixes for CVE-2009-4019 +Related: #540906 +- Don't set old_passwords=1; we aren't being bug-compatible with 3.23 anymore +Resolves: #540735 + +* Wed Nov 18 2009 Remi Collet - 5.1.41-1.###.remi +- Update to MySQL 5.1.41 Community Server GA +- no chm for this version + diff --git a/mysql55/mysql.sysconfig b/mysql55/mysql.sysconfig new file mode 100644 index 0000000..db9a809 --- /dev/null +++ b/mysql55/mysql.sysconfig @@ -0,0 +1,11 @@ +# Configuration file for the mysqld service. + +# Server timeout during service start +STARTTIMEOUT=120 + +# Server timeout during service stop +STOPTIMEOUT=60 + +# Other options to pass to the server (p.e. --federated) +MYOPTIONS= + diff --git a/mysql55/mysql.tmpfiles.d b/mysql55/mysql.tmpfiles.d new file mode 100644 index 0000000..74cd5f8 --- /dev/null +++ b/mysql55/mysql.tmpfiles.d @@ -0,0 +1 @@ +d /var/run/mysqld 0755 mysql mysql - diff --git a/mysql55/mysqld-prepare-db-dir b/mysql55/mysqld-prepare-db-dir new file mode 100644 index 0000000..f73bc66 --- /dev/null +++ b/mysql55/mysqld-prepare-db-dir @@ -0,0 +1,82 @@ +#!/bin/sh + +# This script creates the mysql data directory during first service start. +# In subsequent starts, it does nothing much. + +# extract value of a MySQL option from config files +# Usage: get_mysql_option SECTION VARNAME DEFAULT +# result is returned in $result +# We use my_print_defaults which prints all options from multiple files, +# with the more specific ones later; hence take the last match. +get_mysql_option(){ + result=`/usr/bin/my_print_defaults "$1" | sed -n "s/^--$2=//p" | tail -n 1` + if [ -z "$result" ]; then + # not found, use default + result="$3" + fi +} + +# Defaults here had better match what mysqld_safe will default to +get_mysql_option mysqld datadir "/var/lib/mysql" +datadir="$result" +get_mysql_option mysqld_safe log-error "/var/log/mysqld.log" +errlogfile="$result" + +# Absorb configuration settings from the specified systemd service file, +# or the default "mysqld" service if not specified +SERVICE_NAME="$1" +if [ x"$SERVICE_NAME" = x ] +then + SERVICE_NAME=mysqld.service +fi + +myuser=`systemctl show -p User "${SERVICE_NAME}" | + sed 's/^User=//'` +if [ x"$myuser" = x ] +then + myuser=mysql +fi + +mygroup=`systemctl show -p Group "${SERVICE_NAME}" | + sed 's/^Group=//'` +if [ x"$mygroup" = x ] +then + mygroup=mysql +fi + +# Set up the errlogfile with appropriate permissions +touch "$errlogfile" +chown "$myuser:$mygroup" "$errlogfile" +chmod 0640 "$errlogfile" +[ -x /sbin/restorecon ] && /sbin/restorecon "$errlogfile" + +# Make the data directory +if [ ! -d "$datadir/mysql" ] ; then + # First, make sure $datadir is there with correct permissions + # (note: if it's not, and we're not root, this'll fail ...) + if [ ! -e "$datadir" -a ! -h "$datadir" ] + then + mkdir -p "$datadir" || exit 1 + fi + chown "$myuser:$mygroup" "$datadir" + chmod 0755 "$datadir" + [ -x /sbin/restorecon ] && /sbin/restorecon "$datadir" + + # Now create the database + echo "Initializing MySQL database" + /usr/bin/mysql_install_db --datadir="$datadir" --user="$myuser" + ret=$? + if [ $ret -ne 0 ] ; then + echo "Initialization of MySQL database failed." >&2 + echo "Perhaps /etc/my.cnf is misconfigured." >&2 + # Clean up any partially-created database files + if [ ! -e "$datadir/mysql/user.frm" ] ; then + rm -rf "$datadir"/* + fi + exit $ret + fi + # In case we're running as root, make sure files are owned properly + chown -R "$myuser:$mygroup" "$datadir" +fi + +exit 0 diff --git a/mysql55/mysqld-wait-ready b/mysql55/mysqld-wait-ready new file mode 100644 index 0000000..9e5d3e4 --- /dev/null +++ b/mysql55/mysqld-wait-ready @@ -0,0 +1,56 @@ +#!/bin/sh + +# This script waits for mysqld to be ready to accept connections +# (which can be many seconds or even minutes after launch, if there's +# a lot of crash-recovery work to do). +# Running this as ExecStartPost is useful so that services declared as +# "After mysqld" won't be started until the database is really ready. + +# Service file passes us the daemon's PID (actually, mysqld_safe's PID) +daemon_pid="$1" + +# extract value of a MySQL option from config files +# Usage: get_mysql_option SECTION VARNAME DEFAULT +# result is returned in $result +# We use my_print_defaults which prints all options from multiple files, +# with the more specific ones later; hence take the last match. +get_mysql_option(){ + result=`/usr/bin/my_print_defaults "$1" | sed -n "s/^--$2=//p" | tail -n 1` + if [ -z "$result" ]; then + # not found, use default + result="$3" + fi +} + +# Defaults here had better match what mysqld_safe will default to +get_mysql_option mysqld datadir "/var/lib/mysql" +datadir="$result" +get_mysql_option mysqld socket "/var/lib/mysql/mysql.sock" +socketfile="$result" + +# Wait for the server to come up or for the mysqld process to disappear +ret=0 +while /bin/true; do + RESPONSE=`/usr/bin/mysqladmin --no-defaults --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1` + mret=$? + if [ $mret -eq 0 ]; then + break + fi + # exit codes 1, 11 (EXIT_CANNOT_CONNECT_TO_SERVICE) are expected, + # anything else suggests a configuration error + if [ $mret -ne 1 -a $mret -ne 11 ]; then + ret=1 + break + fi + # "Access denied" also means the server is alive + echo "$RESPONSE" | grep -q "Access denied for user" && break + + # Check process still exists + if ! /bin/kill -0 $daemon_pid 2>/dev/null; then + ret=1 + break + fi + sleep 1 +done + +exit $ret diff --git a/mysql55/mysqld.service b/mysql55/mysqld.service new file mode 100644 index 0000000..3193ce2 --- /dev/null +++ b/mysql55/mysqld.service @@ -0,0 +1,43 @@ +# It's not recommended to modify this file in-place, because it will be +# overwritten during package upgrades. If you want to customize, the +# best way is to create a file "/etc/systemd/system/mysqld.service", +# containing +# .include /lib/systemd/system/mysqld.service +# ...make your changes here... +# For more info about custom unit files, see +# http://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F + +# For example, if you want to increase mysql's open-files-limit to 10000, +# you need to increase systemd's LimitNOFILE setting, so create a file named +# "/etc/systemd/system/mysqld.service" containing: +# .include /lib/systemd/system/mysqld.service +# [Service] +# LimitNOFILE=10000 + +# Note: in F-17 and beyond, /usr/lib/... is recommended in the .include line +# though /lib/... will still work. + +[Unit] +Description=MySQL database server +After=syslog.target +After=network.target + +[Service] +Type=simple +User=mysql +Group=mysql + +ExecStartPre=/usr/libexec/mysqld-prepare-db-dir %n +# Note: we set --basedir to prevent probes that might trigger SELinux alarms, +# per bug #547485 +ExecStart=/usr/bin/mysqld_safe --basedir=/usr +ExecStartPost=/usr/libexec/mysqld-wait-ready $MAINPID + +# Give a reasonable amount of time for the server to start up/shut down +TimeoutSec=300 + +# Place temp files in a secure directory, not /tmp +PrivateTmp=true + +[Install] +WantedBy=multi-user.target diff --git a/mysql55/openssl.pc b/mysql55/openssl.pc new file mode 100644 index 0000000..de480c7 --- /dev/null +++ b/mysql55/openssl.pc @@ -0,0 +1,13 @@ +prefix=/usr +exec_prefix=${prefix} +libdir=${exec_prefix}/lib64/openssl10 +includedir=${prefix}/include/openssl10 +enginesdir=${libdir}/engines-3 +modulesdir=${libdir}/ossl-modules + +Name: OpenSSL +Description: Secure Sockets Layer and cryptography libraries and tools +Version: 1.0.2u +Libs: -L${libdir} -lcrypto -lssl +Libs.private: -lz -ldl -pthread +Cflags: -I${includedir} \ No newline at end of file diff --git a/mysql55/rh-skipped-tests-arm.list b/mysql55/rh-skipped-tests-arm.list new file mode 100644 index 0000000..a6ae9bf --- /dev/null +++ b/mysql55/rh-skipped-tests-arm.list @@ -0,0 +1,8 @@ + +# Disable perfschema.func_file_io and perfschema.func_mutex, which fail +# because cycle counter returns 0 every time on ARM architectures. +# This is caused by missing hardware performance counter support on ARM. +# Discussion about fixing that can be found in RH bug #741325. + +perfschema.func_file_io : rhbz#773116 cycle counter does not work on arm +perfschema.func_mutex : rhbz#773116 cycle counter does not work on arm diff --git a/mysql55/rh-skipped-tests-base.list b/mysql55/rh-skipped-tests-base.list new file mode 100644 index 0000000..8d92952 --- /dev/null +++ b/mysql55/rh-skipped-tests-base.list @@ -0,0 +1,13 @@ +# Disable the outfile_loaddata test, which as of 5.1.38 is giving +# platform-dependent results, with the "expected" results being arguably the +# wrong ones. This is upstream at http://bugs.mysql.com/bug.php?id=46895 +# (note that upstream has also disabled it, but only for Solaris, so we still +# need to disable it here). +# Still broken in 5.5.14, despite alleged fix. + +outfile_loaddata : bug#46895 code wrong, expected results wrong too + +# Disable innodb.innodb, which is showing platform-dependent results +# as of 5.5.9. Upstream at http://bugs.mysql.com/bug.php?id=60155 + +innodb.innodb : bug#60155 has platform-dependent results diff --git a/mysql55/scriptstub.c b/mysql55/scriptstub.c new file mode 100644 index 0000000..de942c1 --- /dev/null +++ b/mysql55/scriptstub.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include + +/* Translate call of myself into call of same-named script in LIBDIR */ +/* The macro LIBDIR must be defined as a double-quoted string */ + +int main (int argc, char **argv) +{ + char *basename; + char *fullname; + char **newargs; + int i; + + basename = strrchr(argv[0], '/'); + if (basename) + basename++; + else + basename = argv[0]; + fullname = malloc(strlen(LIBDIR) + strlen(basename) + 2); + sprintf(fullname, "%s/%s", LIBDIR, basename); + newargs = malloc((argc+1) * sizeof(char *)); + newargs[0] = fullname; + for (i = 1; i < argc; i++) + newargs[i] = argv[i]; + newargs[argc] = NULL; + + execvp(fullname, newargs); + + return 1; +} diff --git a/mysql57/README.mysql-docs b/mysql57/README.mysql-docs new file mode 100644 index 0000000..dd894a7 --- /dev/null +++ b/mysql57/README.mysql-docs @@ -0,0 +1,4 @@ +The official MySQL documentation is not freely redistributable, so we cannot +include it in RHEL or Fedora. You can find it on-line at + +http://dev.mysql.com/doc/ diff --git a/mysql57/README.mysql-license b/mysql57/README.mysql-license new file mode 100644 index 0000000..1282653 --- /dev/null +++ b/mysql57/README.mysql-license @@ -0,0 +1,6 @@ +MySQL is distributed under GPL v2, but there are some licensing exceptions +that allow the client libraries to be linked with a non-GPL application, +so long as the application is under a license approved by Oracle. +For details see + +http://www.mysql.com/about/legal/licensing/foss-exception/ diff --git a/mysql57/filter-requires-mysql.sh b/mysql57/filter-requires-mysql.sh new file mode 100755 index 0000000..82f2dce --- /dev/null +++ b/mysql57/filter-requires-mysql.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +/usr/lib/rpm/perl.req $* | \ + grep -v -e "perl(th" \ + -e "perl(lib::mtr" -e "perl(lib::v1/mtr" -e "perl(mtr" + diff --git a/mysql57/my.cnf b/mysql57/my.cnf new file mode 100644 index 0000000..7184b7f --- /dev/null +++ b/mysql57/my.cnf @@ -0,0 +1,25 @@ +[mysqld] +datadir=/var/lib/mysql +socket=/var/lib/mysql/mysql.sock +user=mysql +# Disabling symbolic-links is recommended to prevent assorted security risks +symbolic-links=0 + +# To allow mysqld to connect to a MySQL Cluster management daemon, uncomment +# these lines and adjust the connectstring as needed. +#ndbcluster +#ndb-connectstring="nodeid=4;host=localhost:1186" + +[mysqld_safe] +log-error=/var/log/mysqld.log +pid-file=/var/run/mysqld/mysqld.pid + +[ndbd] +# If you are running a MySQL Cluster storage daemon (ndbd) on this machine, +# adjust its connection to the management daemon here. +# Note: ndbd init script requires this to include nodeid! +connect-string="nodeid=2;host=localhost:1186" + +[ndb_mgm] +# connection string for MySQL Cluster management tool +connect-string="host=localhost:1186" diff --git a/mysql57/my_config.h b/mysql57/my_config.h new file mode 100644 index 0000000..435a126 --- /dev/null +++ b/mysql57/my_config.h @@ -0,0 +1,29 @@ +/* + * Kluge to support multilib installation of both 32- and 64-bit RPMS: + * we need to arrange that header files that appear in both RPMs are + * identical. Hence, this file is architecture-independent and calls + * in an arch-dependent file that will appear in just one RPM. + * + * To avoid breaking arches not explicitly supported by Red Hat, we + * use this indirection file *only* on known multilib arches. + * + * Note: this may well fail if user tries to use gcc's -I- option. + * But that option is deprecated anyway. + */ +#if defined(__x86_64__) +#include "my_config_x86_64.h" +#elif defined(__i386__) +#include "my_config_i386.h" +#elif defined(__ppc64__) || defined(__powerpc64__) +#include "my_config_ppc64.h" +#elif defined(__ppc__) || defined(__powerpc__) +#include "my_config_ppc.h" +#elif defined(__s390x__) +#include "my_config_s390x.h" +#elif defined(__s390__) +#include "my_config_s390.h" +#elif defined(__sparc__) && defined(__arch64__) +#include "my_config_sparc64.h" +#elif defined(__sparc__) +#include "my_config_sparc.h" +#endif diff --git a/mysql57/mysql-embedded-check.c b/mysql57/mysql-embedded-check.c new file mode 100644 index 0000000..8bf8ca5 --- /dev/null +++ b/mysql57/mysql-embedded-check.c @@ -0,0 +1,26 @@ +/* simple test program to see if we can link the embedded server library */ + +#include +#include +#include + +#include "mysql.h" + +MYSQL *mysql; + +static char *server_options[] = \ + { "mysql_test", "--defaults-file=my.cnf", NULL }; +int num_elements = (sizeof(server_options) / sizeof(char *)) - 1; + +static char *server_groups[] = { "libmysqld_server", + "libmysqld_client", NULL }; + +int main(int argc, char **argv) +{ + mysql_library_init(num_elements, server_options, server_groups); + mysql = mysql_init(NULL); + mysql_close(mysql); + mysql_library_end(); + + return 0; +} diff --git a/mysql57/mysql-install-test.patch b/mysql57/mysql-install-test.patch new file mode 100644 index 0000000..5980aea --- /dev/null +++ b/mysql57/mysql-install-test.patch @@ -0,0 +1,33 @@ +Improve the documentation that will be installed in the mysql-test RPM. + + +diff -Naur mysql-5.1.43.orig/mysql-test/README mysql-5.1.43/mysql-test/README +--- mysql-5.1.43.orig/mysql-test/README 2010-01-15 12:14:43.000000000 -0500 ++++ mysql-5.1.43/mysql-test/README 2010-02-13 21:18:06.000000000 -0500 +@@ -6,6 +6,16 @@ + actually have a co-existing MySQL installation. The tests will not + conflict with it. + ++For use in Red Hat distributions, you should run the script as user mysql, ++so the best bet is something like ++ cd /usr/share/mysql-test ++ sudo -u mysql ./mysql-test-run ++This will use the installed mysql executables, but will run a private copy ++of the server process (using data files within /usr/share/mysql-test), ++so you need not start the mysqld service beforehand. ++To clean up afterwards, remove the created "var" subdirectory, eg ++ sudo -u mysql rm -rf /usr/share/mysql-test/var ++ + All tests must pass. If one or more of them fail on your system, please + read the following manual section for instructions on how to report the + problem: +@@ -25,7 +35,8 @@ + + With no test cases named on the command line, mysql-test-run falls back + to the normal "non-extern" behavior. The reason for this is that some +-tests cannot run with an external server. ++tests cannot run with an external server (because they need to control the ++options with which the server is started). + + + You can create your own test cases. To create a test case, create a new diff --git a/mysql57/mysql.init b/mysql57/mysql.init new file mode 100644 index 0000000..1661f3b --- /dev/null +++ b/mysql57/mysql.init @@ -0,0 +1,209 @@ +#!/bin/sh +# +# mysqld This shell script takes care of starting and stopping +# the MySQL subsystem (mysqld). +# +# chkconfig: - 64 36 +# description: MySQL database server. +# processname: mysqld +# config: /etc/my.cnf +# pidfile: /var/run/mysqld/mysqld.pid + +# Source function library. +. /etc/rc.d/init.d/functions + +# Source networking configuration. +. /etc/sysconfig/network + + +exec="/usr/bin/mysqld_safe" +prog="mysqld" + +# Set timeouts here so they can be overridden from /etc/sysconfig/mysqld +STARTTIMEOUT=120 +STOPTIMEOUT=60 + +[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog + +lockfile=/var/lock/subsys/$prog + + +# extract value of a MySQL option from config files +# Usage: get_mysql_option SECTION VARNAME DEFAULT +# result is returned in $result +# We use my_print_defaults which prints all options from multiple files, +# with the more specific ones later; hence take the last match. +get_mysql_option(){ + result=`/usr/bin/my_print_defaults "$1" | sed -n "s/^--$2=//p" | tail -n 1` + if [ -z "$result" ]; then + # not found, use default + result="$3" + fi +} + +get_mysql_option mysqld datadir "/var/lib/mysql" +datadir="$result" +get_mysql_option mysqld socket "$datadir/mysql.sock" +socketfile="$result" +get_mysql_option mysqld_safe log-error "/var/log/mysqld.log" +errlogfile="$result" +get_mysql_option mysqld_safe pid-file "/var/run/mysqld/mysqld.pid" +mypidfile="$result" + + +start(){ + [ -x $exec ] || exit 5 + # check to see if it's already running + RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1` + if [ $? = 0 ]; then + # already running, do nothing + action $"Starting $prog: " /bin/true + ret=0 + elif echo "$RESPONSE" | grep -q "Access denied for user" + then + # already running, do nothing + action $"Starting $prog: " /bin/true + ret=0 + else + # prepare for start + touch "$errlogfile" + chown mysql:mysql "$errlogfile" + chmod 0640 "$errlogfile" + [ -x /sbin/restorecon ] && /sbin/restorecon "$errlogfile" + if [ ! -d "$datadir/mysql" ] ; then + # First, make sure $datadir is there with correct permissions + if [ ! -e "$datadir" -a ! -h "$datadir" ] + then + mkdir -p "$datadir" || exit 1 + fi + chown mysql:mysql "$datadir" + chmod 0755 "$datadir" + [ -x /sbin/restorecon ] && /sbin/restorecon "$datadir" + # Now create the database + action $"Initializing MySQL database: " /usr/bin/mysql_install_db --datadir="$datadir" --user=mysql + ret=$? + chown -R mysql:mysql "$datadir" + if [ $ret -ne 0 ] ; then + return $ret + fi + fi + chown mysql:mysql "$datadir" + chmod 0755 "$datadir" + # Pass all the options determined above, to ensure consistent behavior. + # In many cases mysqld_safe would arrive at the same conclusions anyway + # but we need to be sure. (An exception is that we don't force the + # log-error setting, since this script doesn't really depend on that, + # and some users might prefer to configure logging to syslog.) + # Note: set --basedir to prevent probes that might trigger SELinux + # alarms, per bug #547485 + $exec --datadir="$datadir" --socket="$socketfile" \ + --pid-file="$mypidfile" \ + --basedir=/usr --user=mysql >/dev/null 2>&1 & + safe_pid=$! + # Spin for a maximum of N seconds waiting for the server to come up; + # exit the loop immediately if mysqld_safe process disappears. + # Rather than assuming we know a valid username, accept an "access + # denied" response as meaning the server is functioning. + ret=0 + TIMEOUT="$STARTTIMEOUT" + while [ $TIMEOUT -gt 0 ]; do + RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1` && break + echo "$RESPONSE" | grep -q "Access denied for user" && break + if ! /bin/kill -0 $safe_pid 2>/dev/null; then + echo "MySQL Daemon failed to start." + ret=1 + break + fi + sleep 1 + let TIMEOUT=${TIMEOUT}-1 + done + if [ $TIMEOUT -eq 0 ]; then + echo "Timeout error occurred trying to start MySQL Daemon." + ret=1 + fi + if [ $ret -eq 0 ]; then + action $"Starting $prog: " /bin/true + touch $lockfile + else + action $"Starting $prog: " /bin/false + fi + fi + return $ret +} + +stop(){ + if [ ! -f "$mypidfile" ]; then + # not running; per LSB standards this is "ok" + action $"Stopping $prog: " /bin/true + return 0 + fi + MYSQLPID=`cat "$mypidfile"` + if [ -n "$MYSQLPID" ]; then + /bin/kill "$MYSQLPID" >/dev/null 2>&1 + ret=$? + if [ $ret -eq 0 ]; then + TIMEOUT="$STOPTIMEOUT" + while [ $TIMEOUT -gt 0 ]; do + /bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break + sleep 1 + let TIMEOUT=${TIMEOUT}-1 + done + if [ $TIMEOUT -eq 0 ]; then + echo "Timeout error occurred trying to stop MySQL Daemon." + ret=1 + action $"Stopping $prog: " /bin/false + else + rm -f $lockfile + rm -f "$socketfile" + action $"Stopping $prog: " /bin/true + fi + else + action $"Stopping $prog: " /bin/false + fi + else + # failed to read pidfile, probably insufficient permissions + action $"Stopping $prog: " /bin/false + ret=4 + fi + return $ret +} + +restart(){ + stop + start +} + +condrestart(){ + [ -e $lockfile ] && restart || : +} + + +# See how we were called. +case "$1" in + start) + start + ;; + stop) + stop + ;; + status) + status $prog + ;; + restart) + restart + ;; + condrestart|try-restart) + condrestart + ;; + reload) + exit 3 + ;; + force-reload) + restart + ;; + *) + echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}" + exit 2 +esac + +exit $? diff --git a/mysql57/mysql.sysconfig b/mysql57/mysql.sysconfig new file mode 100644 index 0000000..db9a809 --- /dev/null +++ b/mysql57/mysql.sysconfig @@ -0,0 +1,11 @@ +# Configuration file for the mysqld service. + +# Server timeout during service start +STARTTIMEOUT=120 + +# Server timeout during service stop +STOPTIMEOUT=60 + +# Other options to pass to the server (p.e. --federated) +MYOPTIONS= + diff --git a/mysql57/mysql.tmpfiles.d b/mysql57/mysql.tmpfiles.d new file mode 100644 index 0000000..74cd5f8 --- /dev/null +++ b/mysql57/mysql.tmpfiles.d @@ -0,0 +1 @@ +d /var/run/mysqld 0755 mysql mysql - diff --git a/mysql57/mysql57.spec b/mysql57/mysql57.spec new file mode 100644 index 0000000..4512f9e --- /dev/null +++ b/mysql57/mysql57.spec @@ -0,0 +1,819 @@ +%define _default_patch_fuzz 2 + +# By default, a build will include the system SSL library. +%{?with_ssl: %global ssl_option -DWITH_SSL=%{with_ssl}} + +%global _root_libdir %{_libdir} +%global _root_includedir %{_includedir} + +%global _prefix /usr +%global _sysconfdir %{_prefix}/etc +%global _libdir %{_prefix}/lib64 +%global _sbindir %{_prefix}/sbin +%global _includedir %{_prefix}/include +%global _datadir %{_prefix}/share +%global _mandir %{_datadir}/man +%global _docdir %{_datadir}/doc +%global _infodir %{_datadir}/inf + +%if 0%{?fedora} >= 15 || 0%{?rhel} >= 7 +%global with_systemd 1 +%else +%global with_systemd 0 +%endif + +%if 0%{?rhel} >= 8 +%global _rundir /run/mysql +%else +%global _rundir /var/run/mysql +%endif + +Name: mysql57 +Version: 5.7.42 +Release: 1%{dist} +Summary: MySQL client programs and shared libraries +Group: Applications/Databases +URL: http://www.mysql.com +# exceptions allow client libraries to be linked with most open source SW, +# not only GPL code. See README.mysql-license +License: GPLv2 with exceptions + +# Regression tests take a long time, you can skip 'em with this +%{!?runselftest:%global runselftest 0} + +# Upstream has a mirror redirector for downloads, so the URL is hard to +# represent statically. You can get the tarball by following a link from +# http://dev.mysql.com/downloads/mysql/ +Source0: mysql-boost-%{version}.tar.gz +# The upstream tarball includes non-free documentation that we cannot ship. +# To remove the non-free documentation, run this script after downloading +# the tarball into the current directory: +# ./generate-tarball.sh $VERSION +# Source1: generate-tarball.sh not used +Source1: mysql.sysconfig +Source2: mysql.init +Source3: my.cnf +Source4: scriptstub.c +Source5: my_config.h +Source6: README.mysql-docs +Source7: README.mysql-license +#Source8: libmysql.version +Source9: mysql-embedded-check.c +Source10: mysql.tmpfiles.d +# systemd files +Source11: mysqld.service +Source12: mysqld-prepare-db-dir +Source13: mysqld-wait-ready + +# Working around perl dependency checking bug in rpm FTTB. Remove later. +Source999: filter-requires-mysql.sh + +Patch3: mysql-install-test.patch +Patch13: mysqld-nowatch.patch + + + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root +BuildRequires: perl, readline-devel, compat-openssl11-devel + +BuildRequires: cmake, ncurses-devel, zlib-devel, libaio-devel, libtirpc-devel, mecab-devel, rpcgen +BuildRequires: gcc gcc-c++ binutils +%if 0%{?fedora} >= 12 +BuildRequires: systemtap-sdt-devel >= 1.3 +%endif +# make test requires time and ps +BuildRequires: time procps +# Socket and Time::HiRes are needed to run regression tests +BuildRequires: perl(Socket), perl(Time::HiRes) +# This is required old EL4 +BuildRequires: bison lz4-devel + +Requires: grep, coreutils +Requires: bash + + + +# When rpm 4.9 is universal, this could be cleaned up: +%global __perl_requires %{SOURCE999} +%global __perllib_requires %{SOURCE999} + +# Community obsoletes +Provides: MySQL MySQL-community mysql-client MySQL-client +Provides: mysql MySQL +Conflicts: mysql <= 5.6, mariadb <= 5.6, MariaDB <= 5.6, mysql55 + + + +# We can use real- prefix to distinguish from other MySQL implementations +# like MariaDB unambiguously +Provides: real-mysql = %{version}-%{release} +Provides: real-mysql%{?_isa} = %{version}-%{release} + +# MySQL (with caps) is upstream's spelling of their own RPMs for mysql +#Conflicts: MySQL + +# mysql-cluster used to be built from this SRPM, but no more +Obsoletes: mysql-cluster < 5.1.44 +# Virtual provides present in upstream's RPM (used by some app) +Provides: mysql-client = %{version}-%{release} + +# When rpm 4.9 is universal, this could be cleaned up: +%global __perl_requires %{SOURCE999} +%global __perllib_requires %{SOURCE999} + +# By default, patch(1) creates backup files when chunks apply with offsets. +# Turn that off to ensure such files don't get included in RPMs (cf bz#884755). +%global _default_patch_flags --no-backup-if-mismatch + +%description +MySQL is a multi-user, multi-threaded SQL database server. MySQL is a +client/server implementation consisting of a server daemon (mysqld) +and many different client programs and libraries. The base package +contains the standard MySQL client programs and generic MySQL files. + +%package libs + +Summary: The shared libraries required for MySQL clients +Group: Applications/Databases +Requires: /sbin/ldconfig +%if 0%{?rhel} == 6 +Requires: mysqlclient16 +%endif +Provides: mysqlclient20 +Obsoletes: mysqlclient20 < %{version}-%{release} +Obsoletes: compat-mysql57 <= %{version} +Provides: real-mysql-libs = %{version}-%{release} +Provides: real-mysql-libs%{?_isa} = %{version}-%{release} + +# Community obsoletes +Obsoletes: compat-MySQL57 <= %{version} +Provides: mysql-libs MySQL-libs +Obsoletes: mysql-libs < %{version}-%{release}, MySQL-libs < %{version}-%{release} +#Conflicts: mysql55-libs + +%if 0%{?rhel} == 5 +# EL-5 mysql 5.0.x have no mysql/mysql-libs +# This circular dep. should make update simpler +Requires: %{name}%{?_isa} = %{version}-%{release} +%endif + +%description libs +The mysql-libs package provides the essential shared libraries for any +MySQL client program or interface. You will need to install this package +to use any other MySQL package or any clients that need to connect to a +MySQL server. + +%package server + +Summary: The MySQL server and related files +Group: Applications/Databases +Requires: real-mysql%{?_isa} = %{version}-%{release} +Requires: real-mysql-libs%{?_isa} = %{version}-%{release} +Requires: coreutils +Requires(pre): /usr/sbin/useradd +Requires(post): chkconfig +Requires(preun): chkconfig +%if %{with_systemd} +# We require this to be present for %%{_prefix}/lib/tmpfiles.d +Requires: systemd-units +# Make sure it's there when scriptlets run, too +Requires(post): systemd-units +Requires(preun): systemd-units +Requires(postun): systemd-units +# This is actually needed for the %%triggerun script but Requires(triggerun) +# is not valid. We can use %%post because this particular %%triggerun script +# should fire just after this package is installed. +Requires(post): systemd-sysv +%else +# This is for /sbin/service +Requires(preun): initscripts +Requires(postun): initscripts +%endif +# mysqlhotcopy needs DBI/DBD support +Requires: perl-DBI, perl-DBD-MySQL +Provides: real-mysql-server = %{version}-%{release} +Provides: real-mysql-server%{?_isa} = %{version}-%{release} +# Community Obsoletes +Provides: mysql-server MySQL-server +Obsoletes: mysql-server < %{version}-%{release}, MySQL-server < %{version}-%{release} +Conflicts: mysql-server <= 5.7, mariadb-server <= 5.7, MySQL-server%{?_isa} <= 5.7, mysql55-server + + +%description server +MySQL is a multi-user, multi-threaded SQL database server. MySQL is a +client/server implementation consisting of a server daemon (mysqld) +and many different client programs and libraries. This package contains +the MySQL server and some accompanying files and directories. + +%package devel + +Summary: Files for development of MySQL applications +Group: Applications/Databases +Requires: real-mysql%{?_isa} = %{version}-%{release} +Requires: real-mysql-libs%{?_isa} = %{version}-%{release} +Requires: compat-openssl10-devel%{?_isa} +Provides: real-mysql-devel = %{version}-%{release} +Provides: real-mysql-devel%{?_isa} = %{version}-%{release} +Provides: mysqlclient18-devel = %{version}-%{release} +# Community Obsoletes +Provides: MySQL-devel MySQL-devel-community mysql-devel MySQL-devel +Obsoletes: MySQL-devel < %{version}-%{release}, MySQL-devel-community < %{version}-%{release}, mysql-devel < %{version}-%{release}, MySQL-devel < %{version}-%{release} + +Conflicts: pkgconfig(mysqlclient) > 5.7 +Conflicts: pkgconfig(mariadb) > 5.7 +Conflicts: pkgconfig(mysqlclient) < 5.7 +Conflicts: pkgconfig(mariadb) < 5.7 + +%description devel +MySQL is a multi-user, multi-threaded SQL database server. This +package contains the libraries and header files that are needed for +developing MySQL client applications. + + +%prep +%setup -q -n mysql-%{version} + +# Can't provide this file (by licence) +rm -f Docs/mysql.info + + +%patch3 -p1 +%patch13 -p1 + + + +# workaround for upstream bug #56342 +rm -f mysql-test/t/ssl_8k_key-master.opt + +# upstream has fallen down badly on symbol versioning, do it ourselves +#cp %{SOURCE8} libmysql/libmysql.version + +%build + +%if 0%{?rhel} == 9 + optflags=$(echo "%{optflags}" | sed -e 's/-O2 / /' -e 's/-Wp,-D_FORTIFY_SOURCE=2/ -Wno-missing-field-initializers -Wno-error -Wno-error=odr -Wno-error=free-nonheap-object /' -e 's:-specs=/usr/lib/rpm/redhat/redhat-annobin-cc1::') +%endif + +# fail quickly and obviously if user tries to build as root +%if %runselftest + if [ x"`id -u`" = x0 ]; then + echo "mysql's regression tests fail if run as root." + echo "If you really need to build the RPM as root, use" + echo "--define='runselftest 0' to skip the regression tests." + exit 1 + fi +%endif +CFLAGS="%{optflags} -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE" + +%if 0%{?rhel} >= 8 +CFLAGS="$CFLAGS -fno-omit-frame-pointer -fno-use-linker-plugin" +%endif + +# MySQL 4.1.10 definitely doesn't work under strict aliasing; also, +# gcc 4.1 breaks MySQL 5.0.16 without -fwrapv +CFLAGS="$CFLAGS -fno-strict-aliasing -fwrapv" +# force PIC mode so that we can build libmysqld.so +CFLAGS="$CFLAGS -fPIC" +# gcc seems to have some bugs on sparc as of 4.4.1, back off optimization +# submitted as bz #529298 +%ifarch sparc sparcv9 sparc64 +CFLAGS=`echo $CFLAGS| sed -e "s|-O2|-O1|g" ` +%endif +CXXFLAGS="$CFLAGS" +export CFLAGS CXXFLAGS + +# The INSTALL_xxx macros have to be specified relative to CMAKE_INSTALL_PREFIX +# so we can't use %%{_datadir} and so forth here. + +%cmake . -DBUILD_CONFIG=mysql_release \ + -DCOMPILATION_COMMENT="MySQL Community Server (GPL)" \ + -DFEATURE_SET="community" \ + -DCMAKE_C_FLAGS="$CFLAGS" \ + -DCMAKE_CXX_FLAGS="$CXXFLAGS" \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DINSTALL_LAYOUT=RPM \ + -DCMAKE_INSTALL_PREFIX="%{_prefix}" \ + -DINSTALL_INCLUDEDIR=include/mysql \ + -DINSTALL_INFODIR=share/info \ + -DINSTALL_LIBDIR="%{_lib}/mysql57" \ + -DINSTALL_MANDIR=share/man \ + -DINSTALL_MYSQLSHAREDIR=share/mysql \ + -DINSTALL_MYSQLTESTDIR=share/mysql-test \ + -DINSTALL_PLUGINDIR="%{_lib}/mysql57/plugin" \ + -DINSTALL_SBINDIR=libexec \ + -DINSTALL_SCRIPTDIR=bin \ + -DINSTALL_SQLBENCHDIR=share \ + -DINSTALL_SUPPORTFILESDIR=share/mysql \ + -DMYSQL_DATADIR="/var/lib/mysql" \ + -DMYSQL_UNIX_ADDR="/var/lib/mysql/mysql.sock" \ + -DENABLED_LOCAL_INFILE=ON \ +%if 0%{?fedora} >= 12 + -DENABLE_DTRACE=ON \ +%endif +%if 0%{?with_systemd} + -DWITH_SYSTEMD=ON \ +%endif +%if 0%{?rhel} >= 9 + -DOPENSSL_INCLUDE_DIR=%{_includedir}/openssl11 \ + -DOPENSSL_LIBRARY=%{_libdir}/openssl11/libssl.so \ + -DCRYPTO_LIBRARY=%{_libdir}/openssl11/libcrypto.so \ +%endif + -DWITH_EMBEDDED_SERVER=OFF \ + -DWITH_EMBEDDED_SHARED_LIBRARY=OFF \ + -DWITH_LZ4=system \ + -DWITH_EDITLINE=bundled \ + -DWITH_MECAB=system \ + -DWITH_READLINE=ON \ + -DWITH_INNODB_MEMCACHED=OFF \ + -DWITH_ZLIB=system \ + %{?ssl_option} \ + -DLOCAL_BOOST_DIR=./boost \ + -DEDITLINE_INCLUDE_DIR=/usr/include + + +gcc $CFLAGS $LDFLAGS -o scriptstub "-DLIBDIR=\"%{_libdir}/mysql57\"" %{SOURCE4} + +%cmake_build + + +# # regular build will make libmysqld.a but not libmysqld.so :-( +# mkdir libmysqld/work +# cd libmysqld/work +# # ar -x ../libmysqld.a +# # these result in missing dependencies: (filed upstream as bug 59104) +# rm -f sql_binlog.cc.o rpl_utility.cc.o +# gcc $CFLAGS $LDFLAGS -shared -Wl,-soname,libmysqld.so.0 -o libmysqld.so.0.0.1 \ +# *.o \ +# %if 0%{?fedora} >= 12 +# ../../probes_mysql.o \ +# %endif +# -lpthread -laio -lcrypt -lssl -lcrypto -lz -lrt -lstdc++ -ldl -lm -lc +# # this is to check that we built a complete library +# cp %{SOURCE9} . +# ln -s libmysqld.so.0.0.1 libmysqld.so.0 +# gcc -I../../include $CFLAGS mysql-embedded-check.c libmysqld.so.0 +# LD_LIBRARY_PATH=. ldd ./a.out +# cd ../.. + +%if %runselftest + # hack to let 32- and 64-bit tests run concurrently on same build machine + case `uname -m` in + ppc64 | s390x | x86_64 | sparc64 ) + MTR_BUILD_THREAD=7 + ;; + *) + MTR_BUILD_THREAD=11 + ;; + esac + export MTR_BUILD_THREAD + + # Sometine, test fails because of this lib. + LD_LIBRARY_PATH=$PWD/libservices + export LD_LIBRARY_PATH + +# make test + + # The cmake build scripts don't provide any simple way to control the + # options for mysql-test-run, so ignore the make target and just call it + # manually. Nonstandard options chosen are: + # --force to continue tests after a failure + # no retries please + # test SSL with --ssl + # avoid redundant test runs with --binlog-format=mixed + # increase timeouts to prevent unwanted failures during mass rebuilds + cd mysql-test + ( + # perl ./mysql-test-run.pl --force --retry=0 --mysqld=--binlog-format=mixed --suite-timeout=720 --testcase-timeout=30 + # Run less test to speed up build process + %{__perl} ./mysql-test-run.pl --force --ssl --mysqld=--binlog-format=mixed --suite=main + ) + # cmake build scripts will install the var cruft if left alone :-( + rm -rf var +%endif + +%install +rm -rf %{buildroot} + +%cmake_install + +# List the installed tree for RPM package maintenance purposes. +find %{buildroot} -print | sed "s|^%{buildroot}||" | sort > ROOTFILES + +# multilib header hacks +# we only apply this to known Red Hat multilib arches, per bug #181335 +case `uname -i` in + i386 | x86_64 | ppc | ppc64 | s390 | s390x | sparc | sparc64 ) + mv %{buildroot}%{_includedir}/mysql/my_config.h %{buildroot}%{_includedir}/mysql/my_config_`uname -i`.h + install -m 644 %{SOURCE5} %{buildroot}%{_includedir}/mysql/ + ;; + *) + ;; +esac + +# cmake generates some completely wacko references to -lprobes_mysql when +# building with dtrace support. Haven't found where to shut that off, +# so resort to this blunt instrument. While at it, let's not reference +# libmysqlclient_r anymore either. +sed -e 's/-lprobes_mysql//' -e 's/-lmysqlclient_r/-lmysqlclient/' \ + %{buildroot}%{_bindir}/mysql_config >mysql_config.tmp +cp -f mysql_config.tmp %{buildroot}%{_bindir}/mysql_config +chmod 755 %{buildroot}%{_bindir}/mysql_config + + +mv %{buildroot}%{_bindir}/mysql_config %{buildroot}%{_libdir}/mysql57/mysql_config +touch %{buildroot}%{_bindir}/mysql_config + +mkdir -p %{buildroot}/var/log +touch %{buildroot}/var/log/mysqld.log + + +mkdir -p %{buildroot}%{_rundir} +install -m 0755 -d %{buildroot}/var/lib/mysql + +mkdir -p %{buildroot}/etc/mysql57 +install -m 0644 %{SOURCE3} %{buildroot}/etc/mysql57/my.cnf +%if %{with_systemd} +sed -i -e '/user=mysql/d' %{buildroot}/etc/mysql57/my.cnf +%endif + +# Remove libmysqld.a, install libmysqld.so +rm -f %{buildroot}%{_libdir}/mysql57/libmysqld.a + +# libmysqlclient_r is no more. Upstream tries to replace it with symlinks +# but that really doesn't work (wrong soname in particular). We'll keep +# just the devel libmysqlclient_r.so link, so that rebuilding without any +# source change is enough to get rid of dependency on libmysqlclient_r. +rm -f %{buildroot}%{_libdir}/mysql57/libmysqlclient_r.so* +ln -s libmysqlclient.so %{buildroot}%{_libdir}/mysql57/libmysqlclient_r.so + + +%if %{with_systemd} +# install systemd unit files and scripts for handling server startup +mkdir -p %{buildroot}%{_unitdir} +#install -m 644 %{SOURCE11} %{buildroot}%{_unitdir}/ +install -m 755 %{SOURCE12} %{buildroot}%{_libexecdir}/ +install -m 755 %{SOURCE13} %{buildroot}%{_libexecdir}/ + +mkdir -p %{buildroot}%{_prefix}/lib/tmpfiles.d +install -m 0644 %{SOURCE10} %{buildroot}%{_prefix}/lib/tmpfiles.d/mysql.conf + +sed 's@/var/run/mysql@%{_rundir}@g' -i %{buildroot}%{_prefix}/lib/tmpfiles.d/mysql.conf + +%else +mkdir -p %{buildroot}/etc/rc.d/init.d +install -m 0755 %{SOURCE2} %{buildroot}/etc/rc.d/init.d/mysqld + +# sysconfig is only provided by remi +mkdir -p %{buildroot}/etc/sysconfig +install -m 0644 %{SOURCE1} %{buildroot}/etc/sysconfig/mysqld +%endif + +mkdir -p %{buildroot}/etc/ld.so.conf.d +echo "%{_libdir}/mysql57" > %{buildroot}/etc/ld.so.conf.d/%{name}-%{_arch}.conf + +# put logrotate script where it needs to be +mkdir -p %{buildroot}%{_sysconfdir}/logrotate.d +mv ${RPM_BUILD_ROOT}%{_datadir}/mysql/mysql-log-rotate %{buildroot}%{_sysconfdir}/logrotate.d/mysqld +chmod 644 %{buildroot}%{_sysconfdir}/logrotate.d/mysqld + +# copy additional docs into build tree so %%doc will find them +cp %{SOURCE6} README.mysql-docs +cp %{SOURCE7} README.mysql-license + +# Remove pkgconfig fileto avoid conflicts +rm -fr %{buildroot}%{_libdir}/mysql57/pkgconfig + +# Remove files that %%doc will install in preferred location +rm -f %{buildroot}/usr/COPYING +rm -f %{buildroot}/usr/README + +# Remove files we don't want installed at all +rm -f %{buildroot}/usr/INSTALL-BINARY +rm -f %{buildroot}/usr/docs/ChangeLog +rm -f %{buildroot}/usr/data/mysql/.empty +rm -f %{buildroot}/usr/data/test/.empty + +rm -f %{buildroot}%{_datadir}/mysql/solaris/* +rm -fr %{buildroot}%{_datadir}/mysql-test +rm -f %{buildroot}%{_bindir}/mysql_client_test +rm -f %{buildroot}%{_bindir}/mysqlxtest + +# should move this to /etc/ ? +rm -f %{buildroot}%{_bindir}/mysqlaccess.conf +rm -f %{buildroot}%{_bindir}/mysql_embedded +rm -f %{buildroot}%{_libdir}/mysql57/*.a +rm -f %{buildroot}%{_datadir}/mysql/binary-configure +rm -f %{buildroot}%{_datadir}/mysql/magic +rm -f %{buildroot}%{_datadir}/mysql/ndb-config-2-node.ini +rm -f %{buildroot}%{_datadir}/mysql/mysql.server +rm -f %{buildroot}%{_datadir}/mysql/mysqld_multi.server +rm -f %{buildroot}%{_mandir}/man1/comp_err.1* +rm -f %{buildroot}%{_mandir}/man1/mysql-stress-test.pl.1* +rm -f %{buildroot}%{_mandir}/man1/mysql-test-run.pl.1* + +%clean +rm -rf %{buildroot} + + +%pre server +/usr/sbin/groupadd -g 27 -o -r mysql >/dev/null 2>&1 || : +%if 0%{?fedora} >= 10 || 0%{?rhel} >= 6 +/usr/sbin/useradd -M -N -g mysql -o -r -d /var/lib/mysql -s /bin/bash \ + -c "MySQL Server" -u 27 mysql >/dev/null 2>&1 || : +%else +# -N options used on Fedora not available on fedora <= 8 and EL <= 5 +/usr/sbin/useradd -M -g mysql -o -r -d /var/lib/mysql -s /bin/bash \ + -c "MySQL Server" -u 27 mysql >/dev/null 2>&1 || : +%endif + +%post devel +%{_sbindir}/update-alternatives --install %{_bindir}/mysql_config \ + mysql_config %{_libdir}/mysql57/mysql_config %{__isa_bits} + +%post libs +/sbin/ldconfig + +%post server +if grep -q skip-bdb /etc/mysql57//my.cnf; then + /usr/bin/perl -p -i -e "s[^skip-bdb][#skip-bdb]gi" /etc/mysql57/my.cnf +fi + +datadir=/var/lib/mysql +socketfile="$datadir/mysql.sock" +mypidfile=/var/run/mysqld/mysqld.pid +errorlogfile=/var/log/mysqld.log + +start_nonsecure() { + /etc/init.d/mysqld stop || : + + # we just want to disable any ^set-variable stuff + if grep -q ^set-variable /etc/mysql57/my.cnf; then + timestamp=$(/bin/date +%m%d%y-%H%M) + cp /etc/mysq57/my.cnf /etc/mysql57/my.cnf-original-$timestamp + /usr/bin/perl -p -i -e "s[^set-variable][#set-variable]gi" /etc/mysql57/my.cnf + /usr/bin/perl -p -i -e "s[^record_buffer][read_buffer_size]gi" /etc/mysql57/my.cnf + /usr/bin/perl -p -i -e "s[^innodb_buffer_pool_read_ahead_rnd][innodb_buffer_pool_read_ahead]gi" /etc/mysql57/my.cnf + /usr/bin/perl -p -i -e "s[^innodb_buffer_pool_read_ahead_seq][innodb_buffer_pool_read_ahead_evicted]gi" /etc/mysql57/my.cnf + fi + # end + + /usr/bin/mysqld_safe --datadir="$datadir" --socket="$socketfile" \ + --log-error="$errlogfile" --pid-file="$mypidfile" \ + --user=mysql --skip-grant-tables >/dev/null 2>&1 & + + STARTTIMEOUT=120 + while [ $STARTTIMEOUT -gt 0 ]; do + if /usr/bin/mysqladmin ping 2>/dev/null; then break; fi + sleep 1 + STARTTIMEOUT=`expr $STARTTIMEOUT - 1` + done +} +run_upgrade() { + start_nonsecure + + # black magic 1: mysqlupgrade does not actually able to upgrade + # InnoDB tables, as REPAIR TABLE do not work on them. + # So they need to be re-created. + # OPTIMIZE TABLE does not work on them as well, but does re-creation + # instead. But we actually want to re-create them! + tmpfile=$(/bin/mktemp) + + no_repair="The storage engine for the table doesn't support repair" + /usr/bin/mysql_upgrade | grep -B1 "$no_repair" | grep -v "$no_repair" | sed -e "s/^\(.*\)$/OPTIMIZE TABLE \\1;/" 2>&1 > $tmpfile + + # black magic 2: after mysql_upgrade, mysqld --skip-grant table + # suddenly wants to authenticate us again.. + + start_nonsecure + /usr/bin/mysql < $tmpfile + rm -f $tmpfile + /etc/init.d/mysqld stop || : + /etc/init.d/mysqld start || : + +} + + +%if 0%{?systemd_post:1} +%systemd_post mysqld.service +%else +if [ $1 = 1 ]; then + # Initial installation +%if %{with_systemd} + /bin/systemctl daemon-reload >/dev/null 2>&1 || : +%else + /sbin/chkconfig --add mysqld +%endif +fi +%endif +/bin/chmod 0755 /var/lib/mysql +/bin/touch /var/log/mysqld.log + +# Handle upgrading from SysV initscript to native systemd unit. +# We can tell if a SysV version of mysql was previously installed by +# checking to see if the initscript is present. +%triggerun server -- mysql-server +%if %{with_systemd} +if [ -f /etc/rc.d/init.d/mysqld ]; then + # Save the current service runlevel info + # User must manually run systemd-sysv-convert --apply mysqld + # to migrate them to systemd targets + /usr/bin/systemd-sysv-convert --save mysqld >/dev/null 2>&1 || : + + # Run these because the SysV package being removed won't do them + /sbin/chkconfig --del mysqld >/dev/null 2>&1 || : + /bin/systemctl try-restart mysqld.service >/dev/null 2>&1 || : +fi +%endif + +%preun server +%if 0%{?systemd_preun:1} +%systemd_preun mysqld.service +%else +if [ $1 = 0 ]; then + # Package removal, not upgrade +%if %{with_systemd} + /bin/systemctl --no-reload disable mysqld.service >/dev/null 2>&1 || : + /bin/systemctl stop mysqld.service >/dev/null 2>&1 || : +%else + /sbin/service mysqld stop >/dev/null 2>&1 + /sbin/chkconfig --del mysqld +%endif +fi +%endif + +%postun libs +if [ $1 = 0 ] ; then + /sbin/ldconfig +fi + +%postun server +%if 0%{?systemd_postun_with_restart:1} +%systemd_postun_with_restart mysqld.service +%else +%if %{with_systemd} +/bin/systemctl daemon-reload >/dev/null 2>&1 || : +if [ $1 -ge 1 ]; then + # Package upgrade, not uninstall + /bin/systemctl try-restart mysqld.service >/dev/null 2>&1 || : +fi +%else +if [ $1 -ge 1 ]; then + /sbin/service mysqld condrestart >/dev/null 2>&1 || : +fi +%endif +%endif + +%postun devel +if [ $1 -eq 0 ] ; then + %{_sbindir}/update-alternatives --remove mysql_config %{_libdir}/mysql57/mysql_config +fi + + +%files +%defattr(-,root,root) +%doc README README.mysql-license README.mysql-docs +%doc Docs + +%{_bindir}/mysql +%{_bindir}/mysqladmin +%{_bindir}/mysqlbinlog +%{_bindir}/mysqlcheck +%{_bindir}/mysqldump +%{_bindir}/mysqlimport +%{_bindir}/mysqlpump +%{_bindir}/mysqlshow +%{_bindir}/mysqlslap +%{_bindir}/my_print_defaults +%{_bindir}/mysql_config_editor + +%{_mandir}/man1/mysql.1* +%{_mandir}/man1/mysql_config.1* +%{_mandir}/man1/mysqladmin.1* +%{_mandir}/man1/mysqldump.1* +%{_mandir}/man1/mysqlpump.1* +%{_mandir}/man1/mysqlshow.1* +%{_mandir}/man1/mysqlslap.1* +%{_mandir}/man1/my_print_defaults.1* +%{_mandir}/man1/mysql_config_editor.1* +%{_libdir}/mysql57/mysql_config + +%files libs +%config(noreplace) /etc/mysql57/my.cnf +%dir %{_libdir}/mysql57 +%{_libdir}/mysql57/libmysqlclient.so.* +/etc/ld.so.conf.d/* + +%files server +%defattr(-,root,root) +%doc redhat-linux-build/Docs/INFO_SRC +%doc redhat-linux-build/Docs/INFO_BIN + +%{_bindir}/myisamchk +%{_bindir}/myisam_ftdump +%{_bindir}/myisamlog +%{_bindir}/myisampack +%{_bindir}/mysql_install_db +%{_bindir}/mysql_plugin +%{_bindir}/mysql_secure_installation +%{_bindir}/mysql_tzinfo_to_sql +%{_bindir}/mysql_upgrade +%{_bindir}/mysql_ssl_rsa_setup +%{_bindir}/mysqldumpslow +%if 0%{?with_systemd} +%{_bindir}/mysqld_pre_systemd +%else +%{_bindir}/mysqld_multi +%{_bindir}/mysqld_safe +%endif +%{_bindir}/lz4_decompress +%{_bindir}/zlib_decompress +%{_bindir}/mysqltest +%{_bindir}/innochecksum +%{_bindir}/perror +%{_bindir}/replace +%{_bindir}/resolve_stack_dump +%{_bindir}/resolveip + + +%{_libexecdir}/mysqld + +%{_libdir}/mysql57/plugin + +%{_mandir}/man1/myisamchk.1* +%{_mandir}/man1/myisamlog.1* +%{_mandir}/man1/myisampack.1* +%{_mandir}/man1/myisam_ftdump.1* +%{_mandir}/man1/mysql.server.1* +%{_mandir}/man1/mysql_install_db.1* +%{_mandir}/man1/mysql_plugin.1* +%{_mandir}/man1/mysql_secure_installation.1* +%{_mandir}/man1/mysql_upgrade.1* +%{_mandir}/man1/mysqldumpslow.1* +%{_mandir}/man1/mysqlbinlog.1* +%{_mandir}/man1/mysqlcheck.1* +%if %{with_systemd} +%exclude %{_mandir}/man1/mysqld_multi.1.gz +%exclude %{_mandir}/man1/mysqld_safe.1.gz +%else +%{_mandir}/man1/mysqld_multi.1* +%{_mandir}/man1/mysqld_safe.1* +%endif +%{_mandir}/man1/lz4_decompress.1.* +%{_mandir}/man1/zlib_decompress.1.* +%{_mandir}/man1/mysql_config_editor.1.* +%{_mandir}/man1/mysqlimport.1* +%{_mandir}/man1/mysqlman.1* +%{_mandir}/man1/innochecksum.1* +%{_mandir}/man1/perror.1* +%{_mandir}/man1/replace.1* +%{_mandir}/man1/resolve_stack_dump.1* +%{_mandir}/man1/resolveip.1* +%{_mandir}/man1/mysql_tzinfo_to_sql.1* +%{_mandir}/man1/mysql_ssl_rsa_setup.1* +%{_mandir}/man8/mysqld.8* + +%{_datadir}/mysql/errmsg-utf8.txt +%{_datadir}/mysql/fill_help_tables.sql +%{_datadir}/mysql/mysql_system_tables.sql +%{_datadir}/mysql/mysql_system_tables_data.sql +%{_datadir}/mysql/mysql_test_data_timezone.sql + +%{_datadir}/mysql/dictionary.txt +%{_datadir}/mysql/charsets/ +%{_datadir}/mysql/*/errmsg.sys +%{_datadir}/mysql/install_rewriter.sql +%{_datadir}/mysql/uninstall_rewriter.sql +%{_datadir}/mysql/mysql_security_commands.sql +%{_datadir}/mysql/mysql_sys_schema.sql +%{_datadir}/mysql/innodb_memcached_config.sql + + +%if %{with_systemd} +%{_unitdir}/mysqld@.service +%{_unitdir}/mysqld.service +%{_libexecdir}/mysqld-prepare-db-dir +%{_libexecdir}/mysqld-wait-ready + +%{_prefix}/lib/tmpfiles.d/mysql.conf +%else +/etc/rc.d/init.d/mysqld +%config(noreplace) /etc/sysconfig/mysqld +%endif +%attr(0755,mysql,mysql) %dir %{_rundir} +%attr(0755,mysql,mysql) %dir /var/lib/mysql +%attr(0640,mysql,mysql) %config(noreplace) %verify(not md5 size mtime) /var/log/mysqld.log +%config(noreplace) %{_sysconfdir}/logrotate.d/mysqld + +%files devel +%{_bindir}/mysql_config +#{_libdir}/mysql/mysql_config +%defattr(-,root,root) +%{_includedir}/mysql +%{_datadir}/aclocal/mysql.m4 +%{_libdir}/mysql57/libmysqlclient.so +%{_libdir}/mysql57/libmysqlclient_r.so + + +%changelog +* Tue Mar 1 2022 Raven - 5.7.36-1 +- initial release \ No newline at end of file diff --git a/mysql57/mysqlclient20.spec b/mysql57/mysqlclient20.spec new file mode 100644 index 0000000..21e3961 --- /dev/null +++ b/mysql57/mysqlclient20.spec @@ -0,0 +1,360 @@ +%define _default_patch_fuzz 2 + +# By default, a build will include the system SSL library. +%{?with_ssl: %global ssl_option -DWITH_SSL=%{with_ssl}} + +%global _root_libdir %{_libdir} +%global _root_includedir %{_includedir} + +%global _prefix /opt/rx +%global _sysconfdir %{_prefix}/etc +%global _libdir %{_prefix}/lib +%global _sbindir %{_prefix}/sbin +%global _includedir %{_prefix}/include +%global _datadir %{_prefix}/share +%global _mandir %{_datadir}/man +%global _docdir %{_datadir}/doc +%global _infodir %{_datadir}/inf + +Name: rx-mysqlclient20 +Version: 5.7.38 +Release: 1%{dist} +Summary: MySQL client programs and shared libraries +Group: Applications/Databases +URL: http://www.mysql.com +# exceptions allow client libraries to be linked with most open source SW, +# not only GPL code. See README.mysql-license +License: GPLv2 with exceptions + +# Regression tests take a long time, you can skip 'em with this +%{!?runselftest:%global runselftest 0} + +# Upstream has a mirror redirector for downloads, so the URL is hard to +# represent statically. You can get the tarball by following a link from +# http://dev.mysql.com/downloads/mysql/ +Source0: mysql-boost-%{version}.tar.gz +# The upstream tarball includes non-free documentation that we cannot ship. +# To remove the non-free documentation, run this script after downloading +# the tarball into the current directory: +# ./generate-tarball.sh $VERSION +# Source1: generate-tarball.sh not used +Source1: mysql.sysconfig +Source2: mysql.init +Source3: my.cnf +Source4: scriptstub.c +Source5: my_config.h +Source6: README.mysql-docs +Source7: README.mysql-license +#Source8: libmysql.version +Source9: mysql-embedded-check.c +Source10: mysql.tmpfiles.d +# Working around perl dependency checking bug in rpm FTTB. Remove later. +Source999: filter-requires-mysql.sh + +Patch3: mysql-install-test.patch +Patch13: mysqld-nowatch.patch + + + +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root +BuildRequires: perl, readline-devel, openssl-devel, boost159-devel +# BuildRequires: openssl10-devel +BuildRequires: cmake3, ncurses-devel, zlib-devel, libaio-devel, libtirpc-devel, mecab-devel +BuildRequires: devtoolset-8-gcc devtoolset-8-gcc-c++ devtoolset-8-make devtoolset-8-build devtoolset-8-binutils +%if 0%{?fedora} >= 12 +BuildRequires: systemtap-sdt-devel >= 1.3 +%endif +# make test requires time and ps +BuildRequires: time procps +# Socket and Time::HiRes are needed to run regression tests +BuildRequires: perl(Socket), perl(Time::HiRes) +# This is required old EL4 +BuildRequires: bison lz4-devel + +Requires: grep, fileutils +Requires: bash + + + +# When rpm 4.9 is universal, this could be cleaned up: +%global __perl_requires %{SOURCE999} +%global __perllib_requires %{SOURCE999} + +%description +MySQL is a multi-user, multi-threaded SQL database server. MySQL is a +client/server implementation consisting of a server daemon (mysqld) +and many different client programs and libraries. The base package +contains the standard MySQL client programs and generic MySQL files. + +%package devel + +Summary: Files for development of MySQL applications +Group: Applications/Databases +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: openssl-devel%{?_isa} + +%description devel +This package contains the libraries and header files that are needed for +developing MySQL applications using client libraries. + + +%prep +%setup -q -n mysql-%{version} + +# Can't provide this file (by licence) +rm -f Docs/mysql.info + + +%patch3 -p1 +%patch13 -p1 + + + +# workaround for upstream bug #56342 +rm -f mysql-test/t/ssl_8k_key-master.opt + +# upstream has fallen down badly on symbol versioning, do it ourselves +#cp %{SOURCE8} libmysql/libmysql.version + +%build +%enable_devtoolset8 + +export LDFLAGS="$LDFLAGS -L%{_root_libdir}/boost159 -L%{_root_libdir}" + + +# fail quickly and obviously if user tries to build as root +%if %runselftest + if [ x"`id -u`" = x0 ]; then + echo "mysql's regression tests fail if run as root." + echo "If you really need to build the RPM as root, use" + echo "--define='runselftest 0' to skip the regression tests." + exit 1 + fi +%endif + +CFLAGS="%{optflags} -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE" +# MySQL 4.1.10 definitely doesn't work under strict aliasing; also, +# gcc 4.1 breaks MySQL 5.0.16 without -fwrapv +CFLAGS="$CFLAGS -fno-strict-aliasing -fwrapv" +# force PIC mode so that we can build libmysqld.so +CFLAGS="$CFLAGS -fPIC" +# gcc seems to have some bugs on sparc as of 4.4.1, back off optimization +# submitted as bz #529298 +%ifarch sparc sparcv9 sparc64 +CFLAGS=`echo $CFLAGS| sed -e "s|-O2|-O1|g" ` +%endif +CXXFLAGS="$CFLAGS" +export CFLAGS CXXFLAGS + +# The INSTALL_xxx macros have to be specified relative to CMAKE_INSTALL_PREFIX +# so we can't use %%{_datadir} and so forth here. + +%cmake3 . -DBUILD_CONFIG=mysql_release \ + -DCOMPILATION_COMMENT="MySQL Community Server (GPL)" \ + -DFEATURE_SET="community" \ + -DINSTALL_LAYOUT=RPM \ + -DCMAKE_INSTALL_PREFIX="%{_prefix}" \ + -DINSTALL_INCLUDEDIR=include/mysql \ + -DINSTALL_INFODIR=share/info \ + -DINSTALL_LIBDIR="lib/mysql" \ + -DINSTALL_MANDIR=share/man \ + -DINSTALL_MYSQLSHAREDIR=share/mysql \ + -DINSTALL_MYSQLTESTDIR=share/mysql-test \ + -DINSTALL_PLUGINDIR="lib/mysql/plugin" \ + -DINSTALL_SBINDIR=libexec \ + -DINSTALL_SCRIPTDIR=bin \ + -DINSTALL_SQLBENCHDIR=share \ + -DINSTALL_SUPPORTFILESDIR=share/mysql \ + -DMYSQL_DATADIR="/var/lib/mysql" \ + -DMYSQL_UNIX_ADDR="/var/lib/mysql/mysql.sock" \ + -DENABLED_LOCAL_INFILE=ON \ +%if 0%{?fedora} >= 12 + -DENABLE_DTRACE=ON \ +%endif + -DWITH_EMBEDDED_SERVER=ON \ + -DWITH_EMBEDDED_SHARED_LIBRARY=ON \ + -DWITH_LZ4=system \ + -DWITH_EDITLINE=bundled \ + -DWITH_MECAB=system \ + -DWITH_READLINE=ON \ + -DWITH_INNODB_MEMCACHED=ON \ + -DWITH_ZLIB=system \ + %{?ssl_option} \ + -DBOOST_INCLUDE_DIR=/usr/include/boost159 \ + -DOPENSSL_INCLUDE_DIR=%{_root_includedir} \ + -DOPENSSL_ROOT_DIR=/usr \ + -DEDITLINE_INCLUDE_DIR=/usr/include + + +gcc $CFLAGS $LDFLAGS -o scriptstub "-DLIBDIR=\"%{_libdir}/mysql\"" %{SOURCE4} + +make %{?_smp_mflags} VERBOSE=1 + +# # regular build will make libmysqld.a but not libmysqld.so :-( +# mkdir libmysqld/work +# cd libmysqld/work +# # ar -x ../libmysqld.a +# # these result in missing dependencies: (filed upstream as bug 59104) +# rm -f sql_binlog.cc.o rpl_utility.cc.o +# gcc $CFLAGS $LDFLAGS -shared -Wl,-soname,libmysqld.so.0 -o libmysqld.so.0.0.1 \ +# *.o \ +# %if 0%{?fedora} >= 12 +# ../../probes_mysql.o \ +# %endif +# -lpthread -laio -lcrypt -lssl -lcrypto -lz -lrt -lstdc++ -ldl -lm -lc +# # this is to check that we built a complete library +# cp %{SOURCE9} . +# ln -s libmysqld.so.0.0.1 libmysqld.so.0 +# gcc -I../../include $CFLAGS mysql-embedded-check.c libmysqld.so.0 +# LD_LIBRARY_PATH=. ldd ./a.out +# cd ../.. + +%if %runselftest + # hack to let 32- and 64-bit tests run concurrently on same build machine + case `uname -m` in + ppc64 | s390x | x86_64 | sparc64 ) + MTR_BUILD_THREAD=7 + ;; + *) + MTR_BUILD_THREAD=11 + ;; + esac + export MTR_BUILD_THREAD + + # Sometine, test fails because of this lib. + LD_LIBRARY_PATH=$PWD/libservices + export LD_LIBRARY_PATH + +# make test + + # The cmake build scripts don't provide any simple way to control the + # options for mysql-test-run, so ignore the make target and just call it + # manually. Nonstandard options chosen are: + # --force to continue tests after a failure + # no retries please + # test SSL with --ssl + # avoid redundant test runs with --binlog-format=mixed + # increase timeouts to prevent unwanted failures during mass rebuilds + cd mysql-test + ( + # perl ./mysql-test-run.pl --force --retry=0 --mysqld=--binlog-format=mixed --suite-timeout=720 --testcase-timeout=30 + # Run less test to speed up build process + %{__perl} ./mysql-test-run.pl --force --ssl --mysqld=--binlog-format=mixed --suite=main + ) + # cmake build scripts will install the var cruft if left alone :-( + rm -rf var +%endif + +%install +rm -rf $RPM_BUILD_ROOT + +make DESTDIR=$RPM_BUILD_ROOT install + +# List the installed tree for RPM package maintenance purposes. +find $RPM_BUILD_ROOT -print | sed "s|^$RPM_BUILD_ROOT||" | sort > ROOTFILES + +# multilib header hacks +# we only apply this to known Red Hat multilib arches, per bug #181335 +case `uname -i` in + i386 | x86_64 | ppc | ppc64 | s390 | s390x | sparc | sparc64 ) + mv $RPM_BUILD_ROOT%{_includedir}/mysql/my_config.h $RPM_BUILD_ROOT%{_includedir}/mysql/my_config_`uname -i`.h + install -m 644 %{SOURCE5} $RPM_BUILD_ROOT%{_includedir}/mysql/ + ;; + *) + ;; +esac + +# cmake generates some completely wacko references to -lprobes_mysql when +# building with dtrace support. Haven't found where to shut that off, +# so resort to this blunt instrument. While at it, let's not reference +# libmysqlclient_r anymore either. +sed -e 's/-lprobes_mysql//' -e 's/-lmysqlclient_r/-lmysqlclient/' \ + ${RPM_BUILD_ROOT}%{_bindir}/mysql_config >mysql_config.tmp +cp -f mysql_config.tmp ${RPM_BUILD_ROOT}%{_bindir}/mysql_config +chmod 755 ${RPM_BUILD_ROOT}%{_bindir}/mysql_config + + +#install -m 0644 %{SOURCE3} $RPM_BUILD_ROOT/etc/my.cnf + +# Remove libmysqld.a, install libmysqld.so +rm -f ${RPM_BUILD_ROOT}%{_libdir}/mysql/libmysqld.a + +# libmysqlclient_r is no more. Upstream tries to replace it with symlinks +# but that really doesn't work (wrong soname in particular). We'll keep +# just the devel libmysqlclient_r.so link, so that rebuilding without any +# source change is enough to get rid of dependency on libmysqlclient_r. +rm -f ${RPM_BUILD_ROOT}%{_libdir}/mysql/libmysqlclient_r.so* +ln -s libmysqlclient.so ${RPM_BUILD_ROOT}%{_libdir}/mysql/libmysqlclient_r.so + + +# Remove files that %%doc will install in preferred location +rm -f ${RPM_BUILD_ROOT}/usr/COPYING +rm -f ${RPM_BUILD_ROOT}/usr/README + +# Remove files we don't want installed at all +rm -rf $RPM_BUILD_ROOT%{_prefix}/mysql-test +rm -f ${RPM_BUILD_ROOT}%{_libdir}/mysql/*.la +rm -f ${RPM_BUILD_ROOT}%{_libdir}/mysql/libmysqld.so* +rm -rf $RPM_BUILD_ROOT%{_datadir}/mysql +rm -rf $RPM_BUILD_ROOT%{_bindir} +rm -rf $RPM_BUILD_ROOT%{_libexecdir} +rm -rf $RPM_BUILD_ROOT%{_infodir}/* +rm -rf $RPM_BUILD_ROOT%{_mandir}/man?/* +rm -rf $RPM_BUILD_ROOT%{_datadir}/sql-bench +rm -rf $RPM_BUILD_ROOT%{_datadir}/mysql-test +rm -rf $RPM_BUILD_ROOT%{_datadir}/aclocal/mysql.m4 + +rm -f ${RPM_BUILD_ROOT}/usr/INSTALL-BINARY +rm -f ${RPM_BUILD_ROOT}/usr/docs/ChangeLog +rm -f ${RPM_BUILD_ROOT}/usr/data/mysql/.empty +rm -f ${RPM_BUILD_ROOT}/usr/data/test/.empty +rm -f ${RPM_BUILD_ROOT}%{_bindir}/mysqlaccess.conf +rm -f ${RPM_BUILD_ROOT}%{_libdir}/mysql/*.a +rm -rf ${RPM_BUILD_ROOT}%{_libdir}/mysql/plugin +rm -f ${RPM_BUILD_ROOT}%{_datadir}/mysql/binary-configure +rm -f ${RPM_BUILD_ROOT}%{_datadir}/mysql/magic +rm -f ${RPM_BUILD_ROOT}%{_datadir}/mysql/ndb-config-2-node.ini +rm -f ${RPM_BUILD_ROOT}%{_datadir}/mysql/mysql.server +rm -f ${RPM_BUILD_ROOT}%{_datadir}/mysql/mysqld_multi.server +rm -f ${RPM_BUILD_ROOT}%{_datadir}/mysql/mysql-log-rotate +rm -f ${RPM_BUILD_ROOT}%{_mandir}/man1/comp_err.1* +rm -f ${RPM_BUILD_ROOT}%{_mandir}/man1/mysql-stress-test.pl.1* +rm -f ${RPM_BUILD_ROOT}%{_mandir}/man1/mysql-test-run.pl.1* + +mkdir -p $RPM_BUILD_ROOT/etc/ld.so.conf.d +echo "%{_libdir}/mysql" > $RPM_BUILD_ROOT/etc/ld.so.conf.d/%{name}-%{_arch}.conf + +# copy additional docs into build tree so %%doc will find them +cp %{SOURCE6} README.mysql-docs +cp %{SOURCE7} README.mysql-license + +# + +%clean +rm -rf $RPM_BUILD_ROOT + + +%post +/sbin/ldconfig + +%postun +if [ $1 = 0 ] ; then + /sbin/ldconfig +fi + + +%files +%defattr(-,root,root) +%{_libdir}/mysql/libmysqlclient.so.20* +/etc/ld.so.conf.d/* + +%files devel +%defattr(-,root,root) +%{_includedir}/mysql +%{_libdir}/pkgconfig/*.pc +%{_libdir}/mysql/libmysqlclient.so +%{_libdir}/mysql/libmysqlclient_r.so + +%changelog +* Tue Mar 1 2022 Raven - 5.7.36-1 +- initial release \ No newline at end of file diff --git a/mysql57/mysqld-nowatch.patch b/mysql57/mysqld-nowatch.patch new file mode 100644 index 0000000..9ca2d12 --- /dev/null +++ b/mysql57/mysqld-nowatch.patch @@ -0,0 +1,51 @@ +Add a --nowatch option to mysqld_safe that causes it to exit after +spawning mysqld. We don't need mysqld_safe to restart mysqld after +a crash, because systemd can do that just fine. + + +diff -Naur mysql-5.5.14.orig/scripts/mysqld_safe.sh mysql-5.5.14/scripts/mysqld_safe.sh +--- mysql-5.5.14.orig/scripts/mysqld_safe.sh 2011-06-21 12:42:40.000000000 -0400 ++++ mysql-5.5.14/scripts/mysqld_safe.sh 2011-07-25 13:52:40.363068060 -0400 +@@ -15,6 +15,7 @@ + KILL_MYSQLD=1; + MYSQLD= + niceness=0 ++nowatch=0 + mysqld_ld_preload= + mysqld_ld_library_path= + +@@ -54,6 +55,7 @@ + --mysqld=FILE Use the specified file as mysqld + --mysqld-version=VERSION Use "mysqld-VERSION" as mysqld + --nice=NICE Set the scheduling priority of mysqld ++ --nowatch Exit after starting mysqld + --plugin-dir=DIR Plugins are under DIR or DIR/VERSION, if + VERSION is given + --skip-kill-mysqld Don't try to kill stray mysqld processes +@@ -140,8 +142,16 @@ + ;; + esac + +- #echo "Running mysqld: [$cmd]" +- eval "$cmd" ++ if test $nowatch -eq 1 ++ then ++ # We'd prefer to exec $cmd here, but SELinux needs to be fixed first ++ #/usr/bin/logger "Running mysqld: $cmd" ++ eval "$cmd &" ++ exit 0 ++ else ++ #echo "Running mysqld: [$cmd]" ++ eval "$cmd" ++ fi + } + + shell_quote_string() { +@@ -198,6 +208,7 @@ + fi + ;; + --nice=*) niceness="$val" ;; ++ --nowatch) nowatch=1 ;; + --open-files-limit=*) open_files="$val" ;; + --open_files_limit=*) open_files="$val" ;; + --skip-kill-mysqld*) KILL_MYSQLD=0 ;; diff --git a/mysql57/mysqld-prepare-db-dir b/mysql57/mysqld-prepare-db-dir new file mode 100644 index 0000000..f73bc66 --- /dev/null +++ b/mysql57/mysqld-prepare-db-dir @@ -0,0 +1,82 @@ +#!/bin/sh + +# This script creates the mysql data directory during first service start. +# In subsequent starts, it does nothing much. + +# extract value of a MySQL option from config files +# Usage: get_mysql_option SECTION VARNAME DEFAULT +# result is returned in $result +# We use my_print_defaults which prints all options from multiple files, +# with the more specific ones later; hence take the last match. +get_mysql_option(){ + result=`/usr/bin/my_print_defaults "$1" | sed -n "s/^--$2=//p" | tail -n 1` + if [ -z "$result" ]; then + # not found, use default + result="$3" + fi +} + +# Defaults here had better match what mysqld_safe will default to +get_mysql_option mysqld datadir "/var/lib/mysql" +datadir="$result" +get_mysql_option mysqld_safe log-error "/var/log/mysqld.log" +errlogfile="$result" + +# Absorb configuration settings from the specified systemd service file, +# or the default "mysqld" service if not specified +SERVICE_NAME="$1" +if [ x"$SERVICE_NAME" = x ] +then + SERVICE_NAME=mysqld.service +fi + +myuser=`systemctl show -p User "${SERVICE_NAME}" | + sed 's/^User=//'` +if [ x"$myuser" = x ] +then + myuser=mysql +fi + +mygroup=`systemctl show -p Group "${SERVICE_NAME}" | + sed 's/^Group=//'` +if [ x"$mygroup" = x ] +then + mygroup=mysql +fi + +# Set up the errlogfile with appropriate permissions +touch "$errlogfile" +chown "$myuser:$mygroup" "$errlogfile" +chmod 0640 "$errlogfile" +[ -x /sbin/restorecon ] && /sbin/restorecon "$errlogfile" + +# Make the data directory +if [ ! -d "$datadir/mysql" ] ; then + # First, make sure $datadir is there with correct permissions + # (note: if it's not, and we're not root, this'll fail ...) + if [ ! -e "$datadir" -a ! -h "$datadir" ] + then + mkdir -p "$datadir" || exit 1 + fi + chown "$myuser:$mygroup" "$datadir" + chmod 0755 "$datadir" + [ -x /sbin/restorecon ] && /sbin/restorecon "$datadir" + + # Now create the database + echo "Initializing MySQL database" + /usr/bin/mysql_install_db --datadir="$datadir" --user="$myuser" + ret=$? + if [ $ret -ne 0 ] ; then + echo "Initialization of MySQL database failed." >&2 + echo "Perhaps /etc/my.cnf is misconfigured." >&2 + # Clean up any partially-created database files + if [ ! -e "$datadir/mysql/user.frm" ] ; then + rm -rf "$datadir"/* + fi + exit $ret + fi + # In case we're running as root, make sure files are owned properly + chown -R "$myuser:$mygroup" "$datadir" +fi + +exit 0 diff --git a/mysql57/mysqld-wait-ready b/mysql57/mysqld-wait-ready new file mode 100644 index 0000000..9e5d3e4 --- /dev/null +++ b/mysql57/mysqld-wait-ready @@ -0,0 +1,56 @@ +#!/bin/sh + +# This script waits for mysqld to be ready to accept connections +# (which can be many seconds or even minutes after launch, if there's +# a lot of crash-recovery work to do). +# Running this as ExecStartPost is useful so that services declared as +# "After mysqld" won't be started until the database is really ready. + +# Service file passes us the daemon's PID (actually, mysqld_safe's PID) +daemon_pid="$1" + +# extract value of a MySQL option from config files +# Usage: get_mysql_option SECTION VARNAME DEFAULT +# result is returned in $result +# We use my_print_defaults which prints all options from multiple files, +# with the more specific ones later; hence take the last match. +get_mysql_option(){ + result=`/usr/bin/my_print_defaults "$1" | sed -n "s/^--$2=//p" | tail -n 1` + if [ -z "$result" ]; then + # not found, use default + result="$3" + fi +} + +# Defaults here had better match what mysqld_safe will default to +get_mysql_option mysqld datadir "/var/lib/mysql" +datadir="$result" +get_mysql_option mysqld socket "/var/lib/mysql/mysql.sock" +socketfile="$result" + +# Wait for the server to come up or for the mysqld process to disappear +ret=0 +while /bin/true; do + RESPONSE=`/usr/bin/mysqladmin --no-defaults --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1` + mret=$? + if [ $mret -eq 0 ]; then + break + fi + # exit codes 1, 11 (EXIT_CANNOT_CONNECT_TO_SERVICE) are expected, + # anything else suggests a configuration error + if [ $mret -ne 1 -a $mret -ne 11 ]; then + ret=1 + break + fi + # "Access denied" also means the server is alive + echo "$RESPONSE" | grep -q "Access denied for user" && break + + # Check process still exists + if ! /bin/kill -0 $daemon_pid 2>/dev/null; then + ret=1 + break + fi + sleep 1 +done + +exit $ret diff --git a/mysql57/mysqld.service b/mysql57/mysqld.service new file mode 100644 index 0000000..3193ce2 --- /dev/null +++ b/mysql57/mysqld.service @@ -0,0 +1,43 @@ +# It's not recommended to modify this file in-place, because it will be +# overwritten during package upgrades. If you want to customize, the +# best way is to create a file "/etc/systemd/system/mysqld.service", +# containing +# .include /lib/systemd/system/mysqld.service +# ...make your changes here... +# For more info about custom unit files, see +# http://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F + +# For example, if you want to increase mysql's open-files-limit to 10000, +# you need to increase systemd's LimitNOFILE setting, so create a file named +# "/etc/systemd/system/mysqld.service" containing: +# .include /lib/systemd/system/mysqld.service +# [Service] +# LimitNOFILE=10000 + +# Note: in F-17 and beyond, /usr/lib/... is recommended in the .include line +# though /lib/... will still work. + +[Unit] +Description=MySQL database server +After=syslog.target +After=network.target + +[Service] +Type=simple +User=mysql +Group=mysql + +ExecStartPre=/usr/libexec/mysqld-prepare-db-dir %n +# Note: we set --basedir to prevent probes that might trigger SELinux alarms, +# per bug #547485 +ExecStart=/usr/bin/mysqld_safe --basedir=/usr +ExecStartPost=/usr/libexec/mysqld-wait-ready $MAINPID + +# Give a reasonable amount of time for the server to start up/shut down +TimeoutSec=300 + +# Place temp files in a secure directory, not /tmp +PrivateTmp=true + +[Install] +WantedBy=multi-user.target diff --git a/mysql57/scriptstub.c b/mysql57/scriptstub.c new file mode 100644 index 0000000..de942c1 --- /dev/null +++ b/mysql57/scriptstub.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include + +/* Translate call of myself into call of same-named script in LIBDIR */ +/* The macro LIBDIR must be defined as a double-quoted string */ + +int main (int argc, char **argv) +{ + char *basename; + char *fullname; + char **newargs; + int i; + + basename = strrchr(argv[0], '/'); + if (basename) + basename++; + else + basename = argv[0]; + fullname = malloc(strlen(LIBDIR) + strlen(basename) + 2); + sprintf(fullname, "%s/%s", LIBDIR, basename); + newargs = malloc((argc+1) * sizeof(char *)); + newargs[0] = fullname; + for (i = 1; i < argc; i++) + newargs[i] = argv[i]; + newargs[argc] = NULL; + + execvp(fullname, newargs); + + return 1; +}