From bcff4f2e3520eaf170c282ba03d38ba6a4fa95cf Mon Sep 17 00:00:00 2001 From: manuel Date: Mon, 11 Feb 2013 14:23:16 +0100 Subject: initial import --- .gitignore | 29 +++++ AUTHORS | 1 + CMakeLists.txt | 3 + COPYING | 352 ++++++++++++++++++++++++++++++++++++++++++++++++++ Makefile.am | 3 + configure.ac | 67 ++++++++++ m4/ac_mysql.m4 | 102 +++++++++++++++ src/Makefile.am | 8 ++ src/mysql_inc.h | 13 ++ src/table_sizes.cc | 368 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 946 insertions(+) create mode 100644 .gitignore create mode 100644 AUTHORS create mode 100644 CMakeLists.txt create mode 100644 COPYING create mode 100644 Makefile.am create mode 100644 configure.ac create mode 100644 m4/ac_mysql.m4 create mode 100644 src/Makefile.am create mode 100644 src/mysql_inc.h create mode 100644 src/table_sizes.cc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..99dcc0c --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +aclocal.m4 +autom4te.cache/ +config.guess +config.log +config.status +config.sub +configure +depcomp +install-sh +libtool +ltmain.sh +Makefile +Makefile.in +missing + +m4/libtool.m4 +m4/ltoptions.m4 +m4/ltsugar.m4 +m4/ltversion.m4 +m4/lt~obsolete.m4 + +src/config.h +src/config.h.in +src/.deps/ +src/.libs/ +src/stamp-h1 +src/table_sizes.la +src/table_sizes.lo +src/table_sizes.o diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..05f8f7d --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +Manuel Mausz diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..4eeccdd --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,3 @@ +MYSQL_ADD_PLUGIN(table_sizes src/table_sizes.cc + MODULE_ONLY MODULE_OUTPUT_NAME "table_sizes") + diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..2cf6990 --- /dev/null +++ b/COPYING @@ -0,0 +1,352 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +Preamble +======== + +The licenses for most software are designed to take away your freedom +to share and change it. By contrast, the GNU General Public License is +intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. +Our General Public Licenses are designed to make sure that you have +the freedom to distribute copies of free software (and charge for this +service if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone +to deny you these rights or to ask you to surrender the rights. These +restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis +or for a fee, you must give the recipients all the rights that you +have. You must make sure that they, too, receive or can get the source +code. And you must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +Finally, any free program is threatened constantly by software patents. +We wish to avoid the danger that redistributors of a free program will +individually obtain patent licenses, in effect making the program +proprietary. To prevent this, we have made it clear that any patent +must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + 0. This License applies to any program or other work which contains a + notice placed by the copyright holder saying it may be distributed + under the terms of this General Public License. The "Program", + below, refers to any such program or work, and a "work based on + the Program" means either the Program or any derivative work under + copyright law: that is to say, a work containing the Program or a + portion of it, either verbatim or with modifications and/or + translated into another language. (Hereinafter, translation is + included without limitation in the term "modification".) Each + licensee is addressed as "you". + + Activities other than copying, distribution and modification are + not covered by this License; they are outside its scope. The act + of running the Program is not restricted, and the output from the + Program is covered only if its contents constitute a work based on + the Program (independent of having been made by running the + Program). Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's + source code as you receive it, in any medium, provided that you + conspicuously and appropriately publish on each copy an appropriate + copyright notice and disclaimer of warranty; keep intact all the + notices that refer to this License and to the absence of any + warranty; and give any other recipients of the Program a copy of + this License along with the Program. + + You may charge a fee for the physical act of transferring a copy, + and you may at your option offer warranty protection in exchange + for a fee. + + 2. You may modify your copy or copies of the Program or any portion + of it, thus forming a work based on the Program, and copy and + distribute such modifications or work under the terms of Section 1 + above, provided that you also meet all of these conditions: + + a. You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b. You must cause any work that you distribute or publish, that + in whole or in part contains or is derived from the Program + or any part thereof, to be licensed as a whole at no charge + to all third parties under the terms of this License. + + c. If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display + an announcement including an appropriate copyright notice and + a notice that there is no warranty (or else, saying that you + provide a warranty) and that users may redistribute the + program under these conditions, and telling the user how to + view a copy of this License. (Exception: if the Program + itself is interactive but does not normally print such an + announcement, your work based on the Program is not required + to print an announcement.) + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the + Program, and can be reasonably considered independent and separate + works in themselves, then this License, and its terms, do not + apply to those sections when you distribute them as separate + works. But when you distribute the same sections as part of a + whole which is a work based on the Program, the distribution of + the whole must be on the terms of this License, whose permissions + for other licensees extend to the entire whole, and thus to each + and every part regardless of who wrote it. + + Thus, it is not the intent of this section to claim rights or + contest your rights to work written entirely by you; rather, the + intent is to exercise the right to control the distribution of + derivative or collective works based on the Program. + + In addition, mere aggregation of another work not based on the + Program with the Program (or with a work based on the Program) on + a volume of a storage or distribution medium does not bring the + other work under the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, + under Section 2) in object code or executable form under the terms + of Sections 1 and 2 above provided that you also do one of the + following: + + a. Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of + Sections 1 and 2 above on a medium customarily used for + software interchange; or, + + b. Accompany it with a written offer, valid for at least three + years, to give any third-party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a + medium customarily used for software interchange; or, + + c. Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with + such an offer, in accord with Subsection b above.) + + The source code for a work means the preferred form of the work for + making modifications to it. For an executable work, complete + source code means all the source code for all modules it contains, + plus any associated interface definition files, plus the scripts + used to control compilation and installation of the executable. + However, as a special exception, the source code distributed need + not include anything that is normally distributed (in either + source or binary form) with the major components (compiler, + kernel, and so on) of the operating system on which the executable + runs, unless that component itself accompanies the executable. + + If distribution of executable or object code is made by offering + access to copy from a designated place, then offering equivalent + access to copy the source code from the same place counts as + distribution of the source code, even though third parties are not + compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense or distribute the Program is + void, and will automatically terminate your rights under this + License. However, parties who have received copies, or rights, + from you under this License will not have their licenses + terminated so long as such parties remain in full compliance. + + 5. You are not required to accept this License, since you have not + signed it. However, nothing else grants you permission to modify + or distribute the Program or its derivative works. These actions + are prohibited by law if you do not accept this License. + Therefore, by modifying or distributing the Program (or any work + based on the Program), you indicate your acceptance of this + License to do so, and all its terms and conditions for copying, + distributing or modifying the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the + Program), the recipient automatically receives a license from the + original licensor to copy, distribute or modify the Program + subject to these terms and conditions. You may not impose any + further restrictions on the recipients' exercise of the rights + granted herein. You are not responsible for enforcing compliance + by third parties to this License. + + 7. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent + issues), conditions are imposed on you (whether by court order, + agreement or otherwise) that contradict the conditions of this + License, they do not excuse you from the conditions of this + License. If you cannot distribute so as to satisfy simultaneously + your obligations under this License and any other pertinent + obligations, then as a consequence you may not distribute the + Program at all. For example, if a patent license would not permit + royalty-free redistribution of the Program by all those who + receive copies directly or indirectly through you, then the only + way you could satisfy both it and this License would be to refrain + entirely from distribution of the Program. + + If any portion of this section is held invalid or unenforceable + under any particular circumstance, the balance of the section is + intended to apply and the section as a whole is intended to apply + in other circumstances. + + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of + any such claims; this section has the sole purpose of protecting + the integrity of the free software distribution system, which is + implemented by public license practices. Many people have made + generous contributions to the wide range of software distributed + through that system in reliance on consistent application of that + system; it is up to the author/donor to decide if he or she is + willing to distribute software through any other system and a + licensee cannot impose that choice. + + This section is intended to make thoroughly clear what is believed + to be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in + certain countries either by patents or by copyrighted interfaces, + the original copyright holder who places the Program under this + License may add an explicit geographical distribution limitation + excluding those countries, so that distribution is permitted only + in or among countries not thus excluded. In such case, this + License incorporates the limitation as if written in the body of + this License. + + 9. The Free Software Foundation may publish revised and/or new + versions of the General Public License from time to time. Such + new versions will be similar in spirit to the present version, but + may differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the + Program specifies a version number of this License which applies + to it and "any later version", you have the option of following + the terms and conditions either of that version or of any later + version published by the Free Software Foundation. If the Program + does not specify a version number of this License, you may choose + any version ever published by the Free Software Foundation. + + 10. If you wish to incorporate parts of the Program into other free + programs whose distribution conditions are different, write to the + author to ask for permission. For software which is copyrighted + by the Free Software Foundation, write to the Free Software + Foundation; we sometimes make exceptions for this. Our decision + will be guided by the two goals of preserving the free status of + all derivatives of our free software and of promoting the sharing + and reuse of software generally. + + NO WARRANTY + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO + WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE + LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT + HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT + WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT + NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE + QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE + PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY + SERVICING, REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN + WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY + MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE + LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, + INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR + INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF + DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU + OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY + OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS +How to Apply These Terms to Your New Programs +============================================= + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + +To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively convey +the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. + Copyright (C) YYYY NAME OF AUTHOR + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the +appropriate parts of the General Public License. Of course, the +commands you use may be called something other than `show w' and `show +c'; they could even be mouse-clicks or menu items--whatever suits your +program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + SIGNATURE OF TY COON, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, +you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use the +GNU Library General Public License instead of this License. + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..3cb8f22 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,3 @@ +AUTOMAKE_OPTIONS = foreign no-dependencies +ACLOCAL_AMFLAGS = -I m4 +SUBDIRS = src diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..7e6764d --- /dev/null +++ b/configure.ac @@ -0,0 +1,67 @@ +# Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.59) +AC_INIT(mysql-table-sizes-plugin, [dev]) +AC_CANONICAL_TARGET +AC_CONFIG_MACRO_DIR([m4]) + +AM_INIT_AUTOMAKE + +AC_CONFIG_SRCDIR([src/table_sizes.cc]) +AC_CONFIG_HEADER([src/config.h]) + +AC_DEFUN([CHECK_DEBUG], [ + debug_default="no" + AC_ARG_ENABLE(debug, [ --enable-debug=[no/yes] turn on debugging + [default=no]],, enable_debug=$debug_default) + AC_MSG_CHECKING(whether to enable debugging) + + if test "x$enable_debug" = "xyes" + then + CPPFLAGS="$CPPFLAGS -g -D_DEBUG" + AC_MSG_RESULT(yes) + else + CPPFLAGS="$CPPFLAGS -g -O2 -DDBUG_OFF" + AC_MSG_RESULT(no) + fi +]) + +dnl Run tests using C++ compiler +dnl AC_LANG(C++) + +#check debug +CHECK_DEBUG + +#check for mysql src +MYSQL_SRC_TEST +MYSQL_PLUGIN_DIR_TEST +#MYSQL_LIB_SERVICES_TEST +AC_SUBST(MYSQL_INC) +AC_SUBST(MYSQL_PLUGIN_DIR) +#AC_SUBST(MYSQL_LIBSERVICES) + +#check for programs +AC_PROG_CC +AC_PROG_LIBTOOL +AC_PROG_CXX +AC_PROG_CPP + +#we can add the following flags for better error catching: -Werror -Wimplicit +CPPFLAGS="$CPPFLAGS -Werror -Wimplicit" +# From MySQL: Disable exceptions as they seams to create problems with gcc and threads. +CXXFLAGS="$CXXFLAGS -fno-exceptions -fno-rtti" + +#make sure we have const +AC_C_CONST +AC_TYPE_SIZE_T + +#subst the relevant variables +AC_SUBST(CPPFLAGS) +AC_SUBST(CXXLAGS) +AC_SUBST(CFLAGS) + +AC_CONFIG_FILES([ + Makefile + src/Makefile +]) +AC_OUTPUT diff --git a/m4/ac_mysql.m4 b/m4/ac_mysql.m4 new file mode 100644 index 0000000..7a3d484 --- /dev/null +++ b/m4/ac_mysql.m4 @@ -0,0 +1,102 @@ +dnl --------------------------------------------------------------------------- +dnl Macro: MYSQL_SRC_TEST +dnl --------------------------------------------------------------------------- + +dir_resolve() dnl {{{ +{ + pwd=`pwd` + cd "$1" 2>/dev/null || cd "${pwd}/${1}" 2>/dev/null + if test "$?" = "0" + then + echo `pwd -P` + else + echo "$1" + fi +} +dnl }}} + +AC_DEFUN([MYSQL_SRC_TEST], [ + AC_MSG_CHECKING(for mysql source code) + AC_ARG_WITH(mysql, + [AS_HELP_STRING([--with-mysql=PATH], [MySQL src directory required to build.])], + [ + ac_mysql_source_dir=`readlink -e "$withval"` + HEADERS="include/my_dir.h include/mysql/plugin.h include/mysql.h include/mysql_version.h include/config.h include/my_config.h" + for file in $HEADERS + do + if ! test -r "$ac_mysql_source_dir/$file" + then + AC_MSG_ERROR([Failed to find required header file $ac_mysql_source_dir/$file, check the path and make sure you've run './configure .... && cd include && make' in MySQL 5.1 sources dir or 'cmake . && make' in MySQL 5.5 sources dir.]) + fi + done + AC_DEFINE([MYSQL_SRC], [1], [Source directory for MySQL]) + MYSQL_INC="-I$ac_mysql_source_dir/sql -I$ac_mysql_source_dir/include -I$ac_mysql_source_dir/regex -I$ac_mysql_source_dir" + AC_MSG_RESULT(["$ac_mysql_source_dir"]) + ], + [ + AC_MSG_ERROR(["No mysql source provided. Please specify --with-mysql=!"]) + ] + ) +]) + +dnl --------------------------------------------------------------------------- +dnl Macro: MYSQL_PLUGIN_DIR_TEST +dnl --------------------------------------------------------------------------- + +AC_DEFUN([MYSQL_PLUGIN_DIR_TEST], [ + AC_MSG_CHECKING([for mysql plugin dir]) + ac_mysql_plugin_dir= + AC_ARG_WITH([mysql-plugindir], + [AS_HELP_STRING([--with-mysql-plugindir=PATH], [MySQL plugin directory where plugin is to be copied to])], + [ + ac_mysql_plugin_dir=`readlink -e "$withval"` + if test -d "$ac_mysql_plugin_dir" + then + MYSQL_PLUGIN_DIR="$ac_mysql_plugin_dir" + AC_MSG_RESULT([yes: Using $ac_mysql_plugin_dir]) + else + AC_MSG_ERROR([invalid MySQL plugin directory : $ac_mysql_plugin_dir]) + fi + ], + [ + ac_mysql_plugin_dir="/usr/lib/mysql/plugin" + MYSQL_PLUGIN_DIR="$ac_mysql_plugin_dir" + AC_MSG_RESULT([--with-mysql-plugindir was not set. Using $ac_mysql_plugin_dir]) + ] + ) +]) + +dnl --------------------------------------------------------------------------- +dnl Macro: MYSQL_LIB_SERVICES : 5.5 services lib to add to linker +dnl --------------------------------------------------------------------------- + +dnl AC_DEFUN([MYSQL_LIB_SERVICES_TEST], [ +dnl AC_MSG_CHECKING([for mysql libmysqlservices]) +dnl ac_mysql_libservices= +dnl AC_ARG_WITH([mysql-libservices], +dnl [AS_HELP_STRING([--with-mysql-libservices=PATH], [MySQL libmysqlservices.a location (relevant for 5.5 only)])], +dnl [ +dnl ac_mysql_libservices=`readlink -e "$withval"` +dnl if test -f "$ac_mysql_libservices" +dnl then +dnl MYSQL_LIBSERVICES="$ac_mysql_libservices" +dnl AC_MSG_RESULT([yes: Using $ac_mysql_libservices]) +dnl else +dnl AC_MSG_ERROR([invalid MySQL libmysqlservices : $ac_mysql_libservices]) +dnl fi +dnl ], +dnl [ +dnl if test -f "$ac_mysql_source_dir/VERSION" +dnl then +dnl source "$ac_mysql_source_dir/VERSION" +dnl if test "$MYSQL_VERSION_MAJOR.$MYSQL_VERSION_MINOR" = "5.5" +dnl then +dnl AC_MSG_ERROR([no mysql-libservices. Required for MySQL 5.5]) +dnl fi +dnl fi +dnl ac_mysql_libservices="" +dnl MYSQL_LIBSERVICES="$ac_mysql_libservices" +dnl AC_MSG_RESULT([--with-mysql-libservices was not set.]) +dnl ] +dnl ) +dnl ]) diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..7965ee4 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,8 @@ +INCLUDES = $(MYSQL_INC) $(DEPS_CFLAGS) + +pkgplugindir = $(MYSQL_PLUGIN_DIR) + +pkgplugin_LTLIBRARIES = table_sizes.la +table_sizes_la_SOURCES = table_sizes.cc +table_sizes_la_LIBADD = $(DEPS_LIBS) +table_sizes_la_LDFLAGS = -module diff --git a/src/mysql_inc.h b/src/mysql_inc.h new file mode 100644 index 0000000..ca055ca --- /dev/null +++ b/src/mysql_inc.h @@ -0,0 +1,13 @@ +#ifndef MYSQL_INCL_H +#define MYSQL_INCL_H + +#ifndef HAVE_CONFIG_H +#define HAVE_CONFIG_H +#endif + +#define MYSQL_DYNAMIC_PLUGIN +#define MYSQL_SERVER 1 + +#include + +#endif diff --git a/src/table_sizes.cc b/src/table_sizes.cc new file mode 100644 index 0000000..b1fd8b0 --- /dev/null +++ b/src/table_sizes.cc @@ -0,0 +1,368 @@ +/* + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ +#include "mysql_inc.h" +#include +#include +#include +#include + +#define STR_OR_NIL(S) ((S) ? (S) : "") + +typedef struct st_lookup_field_values +{ + LEX_STRING db_value, table_value; + bool wild_db_value, wild_table_value; +} LOOKUP_FIELD_VALUES; + +bool calc_lookup_values_from_cond(THD *thd, COND *cond, TABLE_LIST *table, + LOOKUP_FIELD_VALUES *lookup_field_vals); + +/*----------------------------------------------------------------------------*/ + +static int +make_db_list(THD *thd, List *db_names, + LOOKUP_FIELD_VALUES *lookup_field_vals) +{ + /* + If we have db lookup vaule we just add it to list and + exit from the function. + We don't do this for database names longer than the maximum + path length. + */ + if (lookup_field_vals->db_value.str + && lookup_field_vals->db_value.length < FN_REFLEN) + { + if (db_names->push_back(&lookup_field_vals->db_value)) + return 1; + return 0; + } + + return (find_files(thd, db_names, NullS, + mysql_data_home, NullS, TRUE) != FIND_FILES_OK); +} + +/*----------------------------------------------------------------------------*/ + +struct TABLE_DATA +{ + LEX_STRING name; + longlong size; +}; + +static char *fn_remove_ext(char *name) +{ + char *res = strrchr(name, '.'); + if (res) + return res; + return name + strlen(name); +} + +/* + SYNOPSIS + thd thread handler + tables put found tables and their size in this list + db database name to set in TABLE_LIST structure + path path to database + wild filter for found files + + RETURN + FIND_FILES_OK success + FIND_FILES_OOM out of memory error + FIND_FILES_DIR no such directory, or directory can't be read +*/ +static find_files_result +find_tables(THD *thd, List *tables, + const char *db, const char *path, const char *wild) +{ + char *ext; + MY_DIR *dirp; + FILEINFO *file; + uint file_name_len; + char uname[NAME_LEN + 1]; /* Unencoded name */ +#ifndef NO_EMBEDDED_ACCESS_CHECKS + uint col_access = thd->col_access; +#endif + uint wild_length = 0; + TABLE_LIST table_list; + TABLE_DATA *table_data = NULL; + DBUG_ENTER("find_files"); + + bzero((char *)&table_list, sizeof(table_list)); + + if (!(dirp = my_dir(path, MYF(MY_WANT_STAT)))) + { + if (my_errno == ENOENT) + my_error(ER_BAD_DB_ERROR, MYF(ME_BELL + ME_WAITTANG), db); + else + my_error(ER_CANT_READ_DIR, MYF(ME_BELL + ME_WAITTANG), path, my_errno); + DBUG_RETURN(FIND_FILES_DIR); + } + + for (uint i = 0; i < (uint)dirp->number_off_files; i++) + { + file = dirp->dir_entry + i; + /* skip '.', '..', db.opt and temp files. */ + if ((file->name[0] == '.' && + (!file->name[1] || (file->name[1] == '.' && !file->name[2]))) + || !my_strcasecmp(files_charset_info, file->name, MY_DB_OPT_FILE) + || is_prefix(file->name, tmp_file_prefix)) + continue; + + ext = fn_remove_ext(file->name); + *ext = 0; + file_name_len = filename_to_tablename(file->name, uname, sizeof(uname)); + + if (table_data != NULL + && !my_strcasecmp(files_charset_info, uname, table_data->name.str)) + { + table_data->size += file->mystat->st_size; + continue; + } + + if (wild) + { + if (lower_case_table_names) + { + if (my_wildcmp(files_charset_info, + uname, uname + file_name_len, + wild, wild + wild_length, + wild_prefix, wild_one, wild_many)) + continue; + } + else if (wild_compare(uname, wild, 0)) + continue; + } + +#ifndef NO_EMBEDDED_ACCESS_CHECKS + /* Don't show tables where we don't have any privileges */ + if (db && !(col_access & TABLE_ACLS)) + { + table_list.db = (char*)db; + table_list.db_length = strlen(db); + table_list.table_name = uname; + table_list.table_name_length = file_name_len; + table_list.grant.privilege = col_access; + if (check_grant(thd, TABLE_ACLS, &table_list, TRUE, 1, TRUE)) + continue; + } +#endif + + table_data = new TABLE_DATA(); + table_data->size = file->mystat->st_size; + if (!thd->make_lex_string(&table_data->name, uname, file_name_len, FALSE) + || tables->push_back(table_data)) + { + my_dirend(dirp); + DBUG_RETURN(FIND_FILES_OOM); + } + } + + DBUG_PRINT("info", ("found: %d files", tables->elements)); + my_dirend(dirp); + + //(void)ha_find_files(thd, db, path, wild, dir, files); + + DBUG_RETURN(FIND_FILES_OK); +} + +static int +make_table_list(THD *thd, List *table_names, LEX *lex, + LEX_STRING *db_name) +{ + char path[FN_REFLEN + 1]; + build_table_filename(path, sizeof(path) - 1, db_name->str, "", "", 0); + + find_files_result res = find_tables(thd, table_names, db_name->str, path, + NullS); + if (res != FIND_FILES_OK) + { + /* + Downgrade errors about problems with database directory to warnings. + Another thread may have dropped database, and we may still have a name + for that directory. + */ + if (res == FIND_FILES_DIR) + { + if (sql_command_flags[lex->sql_command] & CF_STATUS_COMMAND) + return 1; + thd->clear_error(); + return 2; + } + return 1; + } + return 0; +} + +/*----------------------------------------------------------------------------*/ + +static struct st_mysql_information_schema info = +{ MYSQL_INFORMATION_SCHEMA_INTERFACE_VERSION }; + +static ST_FIELD_INFO fields_info[] = +{ + {"TABLE_SCHEMA", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}, + {"TABLE_NAME", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, "Name", + SKIP_OPEN_TABLE}, + {"TABLE_SIZE", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, 0, + (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), "Table_size", SKIP_OPEN_TABLE}, + {0, 0, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE} +}; + +static int fill_table(THD *thd, TABLE_LIST *tables, COND *cond) +{ + LEX *lex = thd->lex; + TABLE *table = tables->table; + LOOKUP_FIELD_VALUES lookup_field_vals; +#ifndef NO_EMBEDDED_ACCESS_CHECKS + Security_context *sctx = thd->security_ctx; +#endif + List db_names; + List_iterator_fast it(db_names); + int error = 1; + + DBUG_ENTER("fill_table"); + + bzero((char *)&lookup_field_vals, sizeof(LOOKUP_FIELD_VALUES)); + if (calc_lookup_values_from_cond(thd, cond, tables, &lookup_field_vals)) + { + error = 0; + goto err; + } + + if (lower_case_table_names) + { + /* + We can safely do in-place upgrades here since we are + allocating a new memory buffer for these strings. + */ + if (lookup_field_vals.db_value.str && lookup_field_vals.db_value.str[0]) + my_casedn_str(system_charset_info, lookup_field_vals.db_value.str); + if (lookup_field_vals.table_value.str && lookup_field_vals.table_value.str[0]) + my_casedn_str(system_charset_info, lookup_field_vals.table_value.str); + } + + DBUG_PRINT("INDEX VALUES", ("db_name='%s', table_name='%s'", + STR_OR_NIL(lookup_field_vals.db_value.str), + STR_OR_NIL(lookup_field_vals.table_value.str))); + + if (!lookup_field_vals.wild_db_value && !lookup_field_vals.wild_table_value) + { + /* + if lookup value is empty string then + it's impossible table name or db name + */ + if ((lookup_field_vals.db_value.str + && !lookup_field_vals.db_value.str[0]) + || (lookup_field_vals.table_value.str + && !lookup_field_vals.table_value.str[0])) + { + error= 0; + goto err; + } + } + + /* NOTE: doesn't change the output of EXPLAIN - maybe sometimes later */ + if (lookup_field_vals.db_value.length + && !lookup_field_vals.wild_db_value) + tables->has_db_lookup_value = TRUE; + if (lookup_field_vals.table_value.length + && !lookup_field_vals.wild_table_value) + tables->has_table_lookup_value = TRUE; + + if (lex->describe) + { + /* EXPLAIN SELECT */ + error = 0; + goto err; + } + + if (make_db_list(thd, &db_names, &lookup_field_vals)) + goto err; + + LEX_STRING *db_name; + while (db_name = it++) + { + if ((check_access(thd, SELECT_ACL, db_name->str, &thd->col_access, NULL, 0, 1) + || (!thd->col_access && check_grant_db(thd, db_name->str))) + && !sctx->master_access & (DB_ACLS | SHOW_DB_ACL) + && !acl_get(sctx->host, sctx->ip, sctx->priv_user, db_name->str, 0)) + continue; + + List tables; + int res = make_table_list(thd, &tables, lex, db_name); + if (res) + { + tables.delete_elements(); + if (res == 2) /* Not fatal error, continue */ + continue; + goto err; + } + + TABLE_DATA *table_data; + List_iterator_fast it_tables(tables); + while (table_data = it_tables++) + { + table->field[0]->store(db_name->str, db_name->length, + system_charset_info); + table->field[1]->store(table_data->name.str, table_data->name.length, + system_charset_info); + table->field[2]->set_notnull(); + table->field[2]->store((longlong) table_data->size, TRUE); + if (schema_table_store_record(thd, table)) + { + tables.delete_elements(); + goto err; + } + } + tables.delete_elements(); + } + + error = 0; + +err: + DBUG_RETURN(error); + + return 0; +} + +static int init(void *ptr) +{ + ST_SCHEMA_TABLE *schema_table = (ST_SCHEMA_TABLE*)ptr; + + schema_table->fields_info = fields_info; + schema_table->fill_table = fill_table; + schema_table->idx_field1 = 0; + schema_table->idx_field2 = 1; + schema_table->i_s_requested_object = OPTIMIZE_I_S_TABLE; + return 0; +} + +mysql_declare_plugin(table_sizes) +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &info, /* type-specific descriptor */ + "TABLE_SIZES", /* table name */ + "Manuel Mausz", /* author */ + "Fast INFORMATION_SCHEMA table sizes", /* description */ + PLUGIN_LICENSE_GPL, /* license type */ + init, /* init function */ + NULL, + 0x0010, /* version = 0.1 */ + NULL, /* no status variables */ + NULL, /* no system variables */ + NULL, /* no reserved information */ + 0 /* no flags */ +} +mysql_declare_plugin_end; -- cgit v1.2.3