diff options
| -rw-r--r-- | .gitignore | 29 | ||||
| -rw-r--r-- | AUTHORS | 1 | ||||
| -rw-r--r-- | CMakeLists.txt | 3 | ||||
| -rw-r--r-- | COPYING | 352 | ||||
| -rw-r--r-- | Makefile.am | 3 | ||||
| -rw-r--r-- | configure.ac | 67 | ||||
| -rw-r--r-- | m4/ac_mysql.m4 | 102 | ||||
| -rw-r--r-- | src/Makefile.am | 8 | ||||
| -rw-r--r-- | src/mysql_inc.h | 13 | ||||
| -rw-r--r-- | src/table_sizes.cc | 368 |
10 files changed, 946 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..99dcc0c --- /dev/null +++ b/.gitignore | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | aclocal.m4 | ||
| 2 | autom4te.cache/ | ||
| 3 | config.guess | ||
| 4 | config.log | ||
| 5 | config.status | ||
| 6 | config.sub | ||
| 7 | configure | ||
| 8 | depcomp | ||
| 9 | install-sh | ||
| 10 | libtool | ||
| 11 | ltmain.sh | ||
| 12 | Makefile | ||
| 13 | Makefile.in | ||
| 14 | missing | ||
| 15 | |||
| 16 | m4/libtool.m4 | ||
| 17 | m4/ltoptions.m4 | ||
| 18 | m4/ltsugar.m4 | ||
| 19 | m4/ltversion.m4 | ||
| 20 | m4/lt~obsolete.m4 | ||
| 21 | |||
| 22 | src/config.h | ||
| 23 | src/config.h.in | ||
| 24 | src/.deps/ | ||
| 25 | src/.libs/ | ||
| 26 | src/stamp-h1 | ||
| 27 | src/table_sizes.la | ||
| 28 | src/table_sizes.lo | ||
| 29 | src/table_sizes.o | ||
| @@ -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 @@ | |||
| 1 | MYSQL_ADD_PLUGIN(table_sizes src/table_sizes.cc | ||
| 2 | MODULE_ONLY MODULE_OUTPUT_NAME "table_sizes") | ||
| 3 | |||
| @@ -0,0 +1,352 @@ | |||
| 1 | GNU GENERAL PUBLIC LICENSE | ||
| 2 | Version 2, June 1991 | ||
| 3 | |||
| 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc. | ||
| 5 | 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA | ||
| 6 | |||
| 7 | Everyone is permitted to copy and distribute verbatim copies | ||
| 8 | of this license document, but changing it is not allowed. | ||
| 9 | |||
| 10 | Preamble | ||
| 11 | ======== | ||
| 12 | |||
| 13 | The licenses for most software are designed to take away your freedom | ||
| 14 | to share and change it. By contrast, the GNU General Public License is | ||
| 15 | intended to guarantee your freedom to share and change free | ||
| 16 | software--to make sure the software is free for all its users. This | ||
| 17 | General Public License applies to most of the Free Software | ||
| 18 | Foundation's software and to any other program whose authors commit to | ||
| 19 | using it. (Some other Free Software Foundation software is covered by | ||
| 20 | the GNU Library General Public License instead.) You can apply it to | ||
| 21 | your programs, too. | ||
| 22 | |||
| 23 | When we speak of free software, we are referring to freedom, not price. | ||
| 24 | Our General Public Licenses are designed to make sure that you have | ||
| 25 | the freedom to distribute copies of free software (and charge for this | ||
| 26 | service if you wish), that you receive source code or can get it if you | ||
| 27 | want it, that you can change the software or use pieces of it in new | ||
| 28 | free programs; and that you know you can do these things. | ||
| 29 | |||
| 30 | To protect your rights, we need to make restrictions that forbid anyone | ||
| 31 | to deny you these rights or to ask you to surrender the rights. These | ||
| 32 | restrictions translate to certain responsibilities for you if you | ||
| 33 | distribute copies of the software, or if you modify it. | ||
| 34 | |||
| 35 | For example, if you distribute copies of such a program, whether gratis | ||
| 36 | or for a fee, you must give the recipients all the rights that you | ||
| 37 | have. You must make sure that they, too, receive or can get the source | ||
| 38 | code. And you must show them these terms so they know their rights. | ||
| 39 | |||
| 40 | We protect your rights with two steps: (1) copyright the software, and | ||
| 41 | (2) offer you this license which gives you legal permission to copy, | ||
| 42 | distribute and/or modify the software. | ||
| 43 | |||
| 44 | Also, for each author's protection and ours, we want to make certain | ||
| 45 | that everyone understands that there is no warranty for this free | ||
| 46 | software. If the software is modified by someone else and passed on, we | ||
| 47 | want its recipients to know that what they have is not the original, so | ||
| 48 | that any problems introduced by others will not reflect on the original | ||
| 49 | authors' reputations. | ||
| 50 | |||
| 51 | Finally, any free program is threatened constantly by software patents. | ||
| 52 | We wish to avoid the danger that redistributors of a free program will | ||
| 53 | individually obtain patent licenses, in effect making the program | ||
| 54 | proprietary. To prevent this, we have made it clear that any patent | ||
| 55 | must be licensed for everyone's free use or not licensed at all. | ||
| 56 | |||
| 57 | The precise terms and conditions for copying, distribution and | ||
| 58 | modification follow. | ||
| 59 | |||
| 60 | GNU GENERAL PUBLIC LICENSE | ||
| 61 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | ||
| 62 | 0. This License applies to any program or other work which contains a | ||
| 63 | notice placed by the copyright holder saying it may be distributed | ||
| 64 | under the terms of this General Public License. The "Program", | ||
| 65 | below, refers to any such program or work, and a "work based on | ||
| 66 | the Program" means either the Program or any derivative work under | ||
| 67 | copyright law: that is to say, a work containing the Program or a | ||
| 68 | portion of it, either verbatim or with modifications and/or | ||
| 69 | translated into another language. (Hereinafter, translation is | ||
| 70 | included without limitation in the term "modification".) Each | ||
| 71 | licensee is addressed as "you". | ||
| 72 | |||
| 73 | Activities other than copying, distribution and modification are | ||
| 74 | not covered by this License; they are outside its scope. The act | ||
| 75 | of running the Program is not restricted, and the output from the | ||
| 76 | Program is covered only if its contents constitute a work based on | ||
| 77 | the Program (independent of having been made by running the | ||
| 78 | Program). Whether that is true depends on what the Program does. | ||
| 79 | |||
| 80 | 1. You may copy and distribute verbatim copies of the Program's | ||
| 81 | source code as you receive it, in any medium, provided that you | ||
| 82 | conspicuously and appropriately publish on each copy an appropriate | ||
| 83 | copyright notice and disclaimer of warranty; keep intact all the | ||
| 84 | notices that refer to this License and to the absence of any | ||
| 85 | warranty; and give any other recipients of the Program a copy of | ||
| 86 | this License along with the Program. | ||
| 87 | |||
| 88 | You may charge a fee for the physical act of transferring a copy, | ||
| 89 | and you may at your option offer warranty protection in exchange | ||
| 90 | for a fee. | ||
| 91 | |||
| 92 | 2. You may modify your copy or copies of the Program or any portion | ||
| 93 | of it, thus forming a work based on the Program, and copy and | ||
| 94 | distribute such modifications or work under the terms of Section 1 | ||
| 95 | above, provided that you also meet all of these conditions: | ||
| 96 | |||
| 97 | a. You must cause the modified files to carry prominent notices | ||
| 98 | stating that you changed the files and the date of any change. | ||
| 99 | |||
| 100 | b. You must cause any work that you distribute or publish, that | ||
| 101 | in whole or in part contains or is derived from the Program | ||
| 102 | or any part thereof, to be licensed as a whole at no charge | ||
| 103 | to all third parties under the terms of this License. | ||
| 104 | |||
| 105 | c. If the modified program normally reads commands interactively | ||
| 106 | when run, you must cause it, when started running for such | ||
| 107 | interactive use in the most ordinary way, to print or display | ||
| 108 | an announcement including an appropriate copyright notice and | ||
| 109 | a notice that there is no warranty (or else, saying that you | ||
| 110 | provide a warranty) and that users may redistribute the | ||
| 111 | program under these conditions, and telling the user how to | ||
| 112 | view a copy of this License. (Exception: if the Program | ||
| 113 | itself is interactive but does not normally print such an | ||
| 114 | announcement, your work based on the Program is not required | ||
| 115 | to print an announcement.) | ||
| 116 | |||
| 117 | These requirements apply to the modified work as a whole. If | ||
| 118 | identifiable sections of that work are not derived from the | ||
| 119 | Program, and can be reasonably considered independent and separate | ||
| 120 | works in themselves, then this License, and its terms, do not | ||
| 121 | apply to those sections when you distribute them as separate | ||
| 122 | works. But when you distribute the same sections as part of a | ||
| 123 | whole which is a work based on the Program, the distribution of | ||
| 124 | the whole must be on the terms of this License, whose permissions | ||
| 125 | for other licensees extend to the entire whole, and thus to each | ||
| 126 | and every part regardless of who wrote it. | ||
| 127 | |||
| 128 | Thus, it is not the intent of this section to claim rights or | ||
| 129 | contest your rights to work written entirely by you; rather, the | ||
| 130 | intent is to exercise the right to control the distribution of | ||
| 131 | derivative or collective works based on the Program. | ||
| 132 | |||
| 133 | In addition, mere aggregation of another work not based on the | ||
| 134 | Program with the Program (or with a work based on the Program) on | ||
| 135 | a volume of a storage or distribution medium does not bring the | ||
| 136 | other work under the scope of this License. | ||
| 137 | |||
| 138 | 3. You may copy and distribute the Program (or a work based on it, | ||
| 139 | under Section 2) in object code or executable form under the terms | ||
| 140 | of Sections 1 and 2 above provided that you also do one of the | ||
| 141 | following: | ||
| 142 | |||
| 143 | a. Accompany it with the complete corresponding machine-readable | ||
| 144 | source code, which must be distributed under the terms of | ||
| 145 | Sections 1 and 2 above on a medium customarily used for | ||
| 146 | software interchange; or, | ||
| 147 | |||
| 148 | b. Accompany it with a written offer, valid for at least three | ||
| 149 | years, to give any third-party, for a charge no more than your | ||
| 150 | cost of physically performing source distribution, a complete | ||
| 151 | machine-readable copy of the corresponding source code, to be | ||
| 152 | distributed under the terms of Sections 1 and 2 above on a | ||
| 153 | medium customarily used for software interchange; or, | ||
| 154 | |||
| 155 | c. Accompany it with the information you received as to the offer | ||
| 156 | to distribute corresponding source code. (This alternative is | ||
| 157 | allowed only for noncommercial distribution and only if you | ||
| 158 | received the program in object code or executable form with | ||
| 159 | such an offer, in accord with Subsection b above.) | ||
| 160 | |||
| 161 | The source code for a work means the preferred form of the work for | ||
| 162 | making modifications to it. For an executable work, complete | ||
| 163 | source code means all the source code for all modules it contains, | ||
| 164 | plus any associated interface definition files, plus the scripts | ||
| 165 | used to control compilation and installation of the executable. | ||
| 166 | However, as a special exception, the source code distributed need | ||
| 167 | not include anything that is normally distributed (in either | ||
| 168 | source or binary form) with the major components (compiler, | ||
| 169 | kernel, and so on) of the operating system on which the executable | ||
| 170 | runs, unless that component itself accompanies the executable. | ||
| 171 | |||
| 172 | If distribution of executable or object code is made by offering | ||
| 173 | access to copy from a designated place, then offering equivalent | ||
| 174 | access to copy the source code from the same place counts as | ||
| 175 | distribution of the source code, even though third parties are not | ||
| 176 | compelled to copy the source along with the object code. | ||
| 177 | |||
| 178 | 4. You may not copy, modify, sublicense, or distribute the Program | ||
| 179 | except as expressly provided under this License. Any attempt | ||
| 180 | otherwise to copy, modify, sublicense or distribute the Program is | ||
| 181 | void, and will automatically terminate your rights under this | ||
| 182 | License. However, parties who have received copies, or rights, | ||
| 183 | from you under this License will not have their licenses | ||
| 184 | terminated so long as such parties remain in full compliance. | ||
| 185 | |||
| 186 | 5. You are not required to accept this License, since you have not | ||
| 187 | signed it. However, nothing else grants you permission to modify | ||
| 188 | or distribute the Program or its derivative works. These actions | ||
| 189 | are prohibited by law if you do not accept this License. | ||
| 190 | Therefore, by modifying or distributing the Program (or any work | ||
| 191 | based on the Program), you indicate your acceptance of this | ||
| 192 | License to do so, and all its terms and conditions for copying, | ||
| 193 | distributing or modifying the Program or works based on it. | ||
| 194 | |||
| 195 | 6. Each time you redistribute the Program (or any work based on the | ||
| 196 | Program), the recipient automatically receives a license from the | ||
| 197 | original licensor to copy, distribute or modify the Program | ||
| 198 | subject to these terms and conditions. You may not impose any | ||
| 199 | further restrictions on the recipients' exercise of the rights | ||
| 200 | granted herein. You are not responsible for enforcing compliance | ||
| 201 | by third parties to this License. | ||
| 202 | |||
| 203 | 7. If, as a consequence of a court judgment or allegation of patent | ||
| 204 | infringement or for any other reason (not limited to patent | ||
| 205 | issues), conditions are imposed on you (whether by court order, | ||
| 206 | agreement or otherwise) that contradict the conditions of this | ||
| 207 | License, they do not excuse you from the conditions of this | ||
| 208 | License. If you cannot distribute so as to satisfy simultaneously | ||
| 209 | your obligations under this License and any other pertinent | ||
| 210 | obligations, then as a consequence you may not distribute the | ||
| 211 | Program at all. For example, if a patent license would not permit | ||
| 212 | royalty-free redistribution of the Program by all those who | ||
| 213 | receive copies directly or indirectly through you, then the only | ||
| 214 | way you could satisfy both it and this License would be to refrain | ||
| 215 | entirely from distribution of the Program. | ||
| 216 | |||
| 217 | If any portion of this section is held invalid or unenforceable | ||
| 218 | under any particular circumstance, the balance of the section is | ||
| 219 | intended to apply and the section as a whole is intended to apply | ||
| 220 | in other circumstances. | ||
| 221 | |||
| 222 | It is not the purpose of this section to induce you to infringe any | ||
| 223 | patents or other property right claims or to contest validity of | ||
| 224 | any such claims; this section has the sole purpose of protecting | ||
| 225 | the integrity of the free software distribution system, which is | ||
| 226 | implemented by public license practices. Many people have made | ||
| 227 | generous contributions to the wide range of software distributed | ||
| 228 | through that system in reliance on consistent application of that | ||
| 229 | system; it is up to the author/donor to decide if he or she is | ||
| 230 | willing to distribute software through any other system and a | ||
| 231 | licensee cannot impose that choice. | ||
| 232 | |||
| 233 | This section is intended to make thoroughly clear what is believed | ||
| 234 | to be a consequence of the rest of this License. | ||
| 235 | |||
| 236 | 8. If the distribution and/or use of the Program is restricted in | ||
| 237 | certain countries either by patents or by copyrighted interfaces, | ||
| 238 | the original copyright holder who places the Program under this | ||
| 239 | License may add an explicit geographical distribution limitation | ||
| 240 | excluding those countries, so that distribution is permitted only | ||
| 241 | in or among countries not thus excluded. In such case, this | ||
| 242 | License incorporates the limitation as if written in the body of | ||
| 243 | this License. | ||
| 244 | |||
| 245 | 9. The Free Software Foundation may publish revised and/or new | ||
| 246 | versions of the General Public License from time to time. Such | ||
| 247 | new versions will be similar in spirit to the present version, but | ||
| 248 | may differ in detail to address new problems or concerns. | ||
| 249 | |||
| 250 | Each version is given a distinguishing version number. If the | ||
| 251 | Program specifies a version number of this License which applies | ||
| 252 | to it and "any later version", you have the option of following | ||
| 253 | the terms and conditions either of that version or of any later | ||
| 254 | version published by the Free Software Foundation. If the Program | ||
| 255 | does not specify a version number of this License, you may choose | ||
| 256 | any version ever published by the Free Software Foundation. | ||
| 257 | |||
| 258 | 10. If you wish to incorporate parts of the Program into other free | ||
| 259 | programs whose distribution conditions are different, write to the | ||
| 260 | author to ask for permission. For software which is copyrighted | ||
| 261 | by the Free Software Foundation, write to the Free Software | ||
| 262 | Foundation; we sometimes make exceptions for this. Our decision | ||
| 263 | will be guided by the two goals of preserving the free status of | ||
| 264 | all derivatives of our free software and of promoting the sharing | ||
| 265 | and reuse of software generally. | ||
| 266 | |||
| 267 | NO WARRANTY | ||
| 268 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO | ||
| 269 | WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE | ||
| 270 | LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT | ||
| 271 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT | ||
| 272 | WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT | ||
| 273 | NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | ||
| 274 | FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE | ||
| 275 | QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE | ||
| 276 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY | ||
| 277 | SERVICING, REPAIR OR CORRECTION. | ||
| 278 | |||
| 279 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN | ||
| 280 | WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY | ||
| 281 | MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE | ||
| 282 | LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, | ||
| 283 | INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR | ||
| 284 | INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF | ||
| 285 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU | ||
| 286 | OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY | ||
| 287 | OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN | ||
| 288 | ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. | ||
| 289 | |||
| 290 | END OF TERMS AND CONDITIONS | ||
| 291 | How to Apply These Terms to Your New Programs | ||
| 292 | ============================================= | ||
| 293 | |||
| 294 | If you develop a new program, and you want it to be of the greatest | ||
| 295 | possible use to the public, the best way to achieve this is to make it | ||
| 296 | free software which everyone can redistribute and change under these | ||
| 297 | terms. | ||
| 298 | |||
| 299 | To do so, attach the following notices to the program. It is safest to | ||
| 300 | attach them to the start of each source file to most effectively convey | ||
| 301 | the exclusion of warranty; and each file should have at least the | ||
| 302 | "copyright" line and a pointer to where the full notice is found. | ||
| 303 | |||
| 304 | ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. | ||
| 305 | Copyright (C) YYYY NAME OF AUTHOR | ||
| 306 | |||
| 307 | This program is free software; you can redistribute it and/or modify | ||
| 308 | it under the terms of the GNU General Public License as published by | ||
| 309 | the Free Software Foundation; either version 2 of the License, or | ||
| 310 | (at your option) any later version. | ||
| 311 | |||
| 312 | This program is distributed in the hope that it will be useful, | ||
| 313 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 314 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 315 | GNU General Public License for more details. | ||
| 316 | |||
| 317 | You should have received a copy of the GNU General Public License | ||
| 318 | along with this program; if not, write to the Free Software | ||
| 319 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 320 | |||
| 321 | Also add information on how to contact you by electronic and paper mail. | ||
| 322 | |||
| 323 | If the program is interactive, make it output a short notice like this | ||
| 324 | when it starts in an interactive mode: | ||
| 325 | |||
| 326 | Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR | ||
| 327 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | ||
| 328 | This is free software, and you are welcome to redistribute it | ||
| 329 | under certain conditions; type `show c' for details. | ||
| 330 | |||
| 331 | The hypothetical commands `show w' and `show c' should show the | ||
| 332 | appropriate parts of the General Public License. Of course, the | ||
| 333 | commands you use may be called something other than `show w' and `show | ||
| 334 | c'; they could even be mouse-clicks or menu items--whatever suits your | ||
| 335 | program. | ||
| 336 | |||
| 337 | You should also get your employer (if you work as a programmer) or your | ||
| 338 | school, if any, to sign a "copyright disclaimer" for the program, if | ||
| 339 | necessary. Here is a sample; alter the names: | ||
| 340 | |||
| 341 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program | ||
| 342 | `Gnomovision' (which makes passes at compilers) written by James Hacker. | ||
| 343 | |||
| 344 | SIGNATURE OF TY COON, 1 April 1989 | ||
| 345 | Ty Coon, President of Vice | ||
| 346 | |||
| 347 | This General Public License does not permit incorporating your program | ||
| 348 | into proprietary programs. If your program is a subroutine library, | ||
| 349 | you may consider it more useful to permit linking proprietary | ||
| 350 | applications with the library. If this is what you want to do, use the | ||
| 351 | GNU Library General Public License instead of this License. | ||
| 352 | |||
diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..3cb8f22 --- /dev/null +++ b/Makefile.am | |||
| @@ -0,0 +1,3 @@ | |||
| 1 | AUTOMAKE_OPTIONS = foreign no-dependencies | ||
| 2 | ACLOCAL_AMFLAGS = -I m4 | ||
| 3 | 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 @@ | |||
| 1 | # Process this file with autoconf to produce a configure script. | ||
| 2 | |||
| 3 | AC_PREREQ(2.59) | ||
| 4 | AC_INIT(mysql-table-sizes-plugin, [dev]) | ||
| 5 | AC_CANONICAL_TARGET | ||
| 6 | AC_CONFIG_MACRO_DIR([m4]) | ||
| 7 | |||
| 8 | AM_INIT_AUTOMAKE | ||
| 9 | |||
| 10 | AC_CONFIG_SRCDIR([src/table_sizes.cc]) | ||
| 11 | AC_CONFIG_HEADER([src/config.h]) | ||
| 12 | |||
| 13 | AC_DEFUN([CHECK_DEBUG], [ | ||
| 14 | debug_default="no" | ||
| 15 | AC_ARG_ENABLE(debug, [ --enable-debug=[no/yes] turn on debugging | ||
| 16 | [default=no]],, enable_debug=$debug_default) | ||
| 17 | AC_MSG_CHECKING(whether to enable debugging) | ||
| 18 | |||
| 19 | if test "x$enable_debug" = "xyes" | ||
| 20 | then | ||
| 21 | CPPFLAGS="$CPPFLAGS -g -D_DEBUG" | ||
| 22 | AC_MSG_RESULT(yes) | ||
| 23 | else | ||
| 24 | CPPFLAGS="$CPPFLAGS -g -O2 -DDBUG_OFF" | ||
| 25 | AC_MSG_RESULT(no) | ||
| 26 | fi | ||
| 27 | ]) | ||
| 28 | |||
| 29 | dnl Run tests using C++ compiler | ||
| 30 | dnl AC_LANG(C++) | ||
| 31 | |||
| 32 | #check debug | ||
| 33 | CHECK_DEBUG | ||
| 34 | |||
| 35 | #check for mysql src | ||
| 36 | MYSQL_SRC_TEST | ||
| 37 | MYSQL_PLUGIN_DIR_TEST | ||
| 38 | #MYSQL_LIB_SERVICES_TEST | ||
| 39 | AC_SUBST(MYSQL_INC) | ||
| 40 | AC_SUBST(MYSQL_PLUGIN_DIR) | ||
| 41 | #AC_SUBST(MYSQL_LIBSERVICES) | ||
| 42 | |||
| 43 | #check for programs | ||
| 44 | AC_PROG_CC | ||
| 45 | AC_PROG_LIBTOOL | ||
| 46 | AC_PROG_CXX | ||
| 47 | AC_PROG_CPP | ||
| 48 | |||
| 49 | #we can add the following flags for better error catching: -Werror -Wimplicit | ||
| 50 | CPPFLAGS="$CPPFLAGS -Werror -Wimplicit" | ||
| 51 | # From MySQL: Disable exceptions as they seams to create problems with gcc and threads. | ||
| 52 | CXXFLAGS="$CXXFLAGS -fno-exceptions -fno-rtti" | ||
| 53 | |||
| 54 | #make sure we have const | ||
| 55 | AC_C_CONST | ||
| 56 | AC_TYPE_SIZE_T | ||
| 57 | |||
| 58 | #subst the relevant variables | ||
| 59 | AC_SUBST(CPPFLAGS) | ||
| 60 | AC_SUBST(CXXLAGS) | ||
| 61 | AC_SUBST(CFLAGS) | ||
| 62 | |||
| 63 | AC_CONFIG_FILES([ | ||
| 64 | Makefile | ||
| 65 | src/Makefile | ||
| 66 | ]) | ||
| 67 | 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 @@ | |||
| 1 | dnl --------------------------------------------------------------------------- | ||
| 2 | dnl Macro: MYSQL_SRC_TEST | ||
| 3 | dnl --------------------------------------------------------------------------- | ||
| 4 | |||
| 5 | dir_resolve() dnl {{{ | ||
| 6 | { | ||
| 7 | pwd=`pwd` | ||
| 8 | cd "$1" 2>/dev/null || cd "${pwd}/${1}" 2>/dev/null | ||
| 9 | if test "$?" = "0" | ||
| 10 | then | ||
| 11 | echo `pwd -P` | ||
| 12 | else | ||
| 13 | echo "$1" | ||
| 14 | fi | ||
| 15 | } | ||
| 16 | dnl }}} | ||
| 17 | |||
| 18 | AC_DEFUN([MYSQL_SRC_TEST], [ | ||
| 19 | AC_MSG_CHECKING(for mysql source code) | ||
| 20 | AC_ARG_WITH(mysql, | ||
| 21 | [AS_HELP_STRING([--with-mysql=PATH], [MySQL src directory required to build.])], | ||
| 22 | [ | ||
| 23 | ac_mysql_source_dir=`readlink -e "$withval"` | ||
| 24 | HEADERS="include/my_dir.h include/mysql/plugin.h include/mysql.h include/mysql_version.h include/config.h include/my_config.h" | ||
| 25 | for file in $HEADERS | ||
| 26 | do | ||
| 27 | if ! test -r "$ac_mysql_source_dir/$file" | ||
| 28 | then | ||
| 29 | AC_MSG_ERROR([Failed to find required header file $ac_mysql_source_dir/$file, check the path and make sure you've run './configure ..<options>.. && cd include && make' in MySQL 5.1 sources dir or 'cmake . && make' in MySQL 5.5 sources dir.]) | ||
| 30 | fi | ||
| 31 | done | ||
| 32 | AC_DEFINE([MYSQL_SRC], [1], [Source directory for MySQL]) | ||
| 33 | 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" | ||
| 34 | AC_MSG_RESULT(["$ac_mysql_source_dir"]) | ||
| 35 | ], | ||
| 36 | [ | ||
| 37 | AC_MSG_ERROR(["No mysql source provided. Please specify --with-mysql=<mysql source dir>!"]) | ||
| 38 | ] | ||
| 39 | ) | ||
| 40 | ]) | ||
| 41 | |||
| 42 | dnl --------------------------------------------------------------------------- | ||
| 43 | dnl Macro: MYSQL_PLUGIN_DIR_TEST | ||
| 44 | dnl --------------------------------------------------------------------------- | ||
| 45 | |||
| 46 | AC_DEFUN([MYSQL_PLUGIN_DIR_TEST], [ | ||
| 47 | AC_MSG_CHECKING([for mysql plugin dir]) | ||
| 48 | ac_mysql_plugin_dir= | ||
| 49 | AC_ARG_WITH([mysql-plugindir], | ||
| 50 | [AS_HELP_STRING([--with-mysql-plugindir=PATH], [MySQL plugin directory where plugin is to be copied to])], | ||
| 51 | [ | ||
| 52 | ac_mysql_plugin_dir=`readlink -e "$withval"` | ||
| 53 | if test -d "$ac_mysql_plugin_dir" | ||
| 54 | then | ||
| 55 | MYSQL_PLUGIN_DIR="$ac_mysql_plugin_dir" | ||
| 56 | AC_MSG_RESULT([yes: Using $ac_mysql_plugin_dir]) | ||
| 57 | else | ||
| 58 | AC_MSG_ERROR([invalid MySQL plugin directory : $ac_mysql_plugin_dir]) | ||
| 59 | fi | ||
| 60 | ], | ||
| 61 | [ | ||
| 62 | ac_mysql_plugin_dir="/usr/lib/mysql/plugin" | ||
| 63 | MYSQL_PLUGIN_DIR="$ac_mysql_plugin_dir" | ||
| 64 | AC_MSG_RESULT([--with-mysql-plugindir was not set. Using $ac_mysql_plugin_dir]) | ||
| 65 | ] | ||
| 66 | ) | ||
| 67 | ]) | ||
| 68 | |||
| 69 | dnl --------------------------------------------------------------------------- | ||
| 70 | dnl Macro: MYSQL_LIB_SERVICES : 5.5 services lib to add to linker | ||
| 71 | dnl --------------------------------------------------------------------------- | ||
| 72 | |||
| 73 | dnl AC_DEFUN([MYSQL_LIB_SERVICES_TEST], [ | ||
| 74 | dnl AC_MSG_CHECKING([for mysql libmysqlservices]) | ||
| 75 | dnl ac_mysql_libservices= | ||
| 76 | dnl AC_ARG_WITH([mysql-libservices], | ||
| 77 | dnl [AS_HELP_STRING([--with-mysql-libservices=PATH], [MySQL libmysqlservices.a location (relevant for 5.5 only)])], | ||
| 78 | dnl [ | ||
| 79 | dnl ac_mysql_libservices=`readlink -e "$withval"` | ||
| 80 | dnl if test -f "$ac_mysql_libservices" | ||
| 81 | dnl then | ||
| 82 | dnl MYSQL_LIBSERVICES="$ac_mysql_libservices" | ||
| 83 | dnl AC_MSG_RESULT([yes: Using $ac_mysql_libservices]) | ||
| 84 | dnl else | ||
| 85 | dnl AC_MSG_ERROR([invalid MySQL libmysqlservices : $ac_mysql_libservices]) | ||
| 86 | dnl fi | ||
| 87 | dnl ], | ||
| 88 | dnl [ | ||
| 89 | dnl if test -f "$ac_mysql_source_dir/VERSION" | ||
| 90 | dnl then | ||
| 91 | dnl source "$ac_mysql_source_dir/VERSION" | ||
| 92 | dnl if test "$MYSQL_VERSION_MAJOR.$MYSQL_VERSION_MINOR" = "5.5" | ||
| 93 | dnl then | ||
| 94 | dnl AC_MSG_ERROR([no mysql-libservices. Required for MySQL 5.5]) | ||
| 95 | dnl fi | ||
| 96 | dnl fi | ||
| 97 | dnl ac_mysql_libservices="" | ||
| 98 | dnl MYSQL_LIBSERVICES="$ac_mysql_libservices" | ||
| 99 | dnl AC_MSG_RESULT([--with-mysql-libservices was not set.]) | ||
| 100 | dnl ] | ||
| 101 | dnl ) | ||
| 102 | 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 @@ | |||
| 1 | INCLUDES = $(MYSQL_INC) $(DEPS_CFLAGS) | ||
| 2 | |||
| 3 | pkgplugindir = $(MYSQL_PLUGIN_DIR) | ||
| 4 | |||
| 5 | pkgplugin_LTLIBRARIES = table_sizes.la | ||
| 6 | table_sizes_la_SOURCES = table_sizes.cc | ||
| 7 | table_sizes_la_LIBADD = $(DEPS_LIBS) | ||
| 8 | 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 @@ | |||
| 1 | #ifndef MYSQL_INCL_H | ||
| 2 | #define MYSQL_INCL_H | ||
| 3 | |||
| 4 | #ifndef HAVE_CONFIG_H | ||
| 5 | #define HAVE_CONFIG_H | ||
| 6 | #endif | ||
| 7 | |||
| 8 | #define MYSQL_DYNAMIC_PLUGIN | ||
| 9 | #define MYSQL_SERVER 1 | ||
| 10 | |||
| 11 | #include <mysql_version.h> | ||
| 12 | |||
| 13 | #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 @@ | |||
| 1 | /* | ||
| 2 | This program is free software; you can redistribute it and/or modify | ||
| 3 | it under the terms of the GNU General Public License as published by | ||
| 4 | the Free Software Foundation; version 2 of the License. | ||
| 5 | |||
| 6 | This program is distributed in the hope that it will be useful, | ||
| 7 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 8 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 9 | GNU General Public License for more details. | ||
| 10 | |||
| 11 | You should have received a copy of the GNU General Public License | ||
| 12 | along with this program; if not, write to the Free Software | ||
| 13 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 14 | */ | ||
| 15 | #include "mysql_inc.h" | ||
| 16 | #include <sql/sql_show.h> | ||
| 17 | #include <sql/sql_table.h> | ||
| 18 | #include <sql/sql_parse.h> | ||
| 19 | #include <sql/sql_db.h> | ||
| 20 | |||
| 21 | #define STR_OR_NIL(S) ((S) ? (S) : "<nil>") | ||
| 22 | |||
| 23 | typedef struct st_lookup_field_values | ||
| 24 | { | ||
| 25 | LEX_STRING db_value, table_value; | ||
| 26 | bool wild_db_value, wild_table_value; | ||
| 27 | } LOOKUP_FIELD_VALUES; | ||
| 28 | |||
| 29 | bool calc_lookup_values_from_cond(THD *thd, COND *cond, TABLE_LIST *table, | ||
| 30 | LOOKUP_FIELD_VALUES *lookup_field_vals); | ||
| 31 | |||
| 32 | /*----------------------------------------------------------------------------*/ | ||
| 33 | |||
| 34 | static int | ||
| 35 | make_db_list(THD *thd, List<LEX_STRING> *db_names, | ||
| 36 | LOOKUP_FIELD_VALUES *lookup_field_vals) | ||
| 37 | { | ||
| 38 | /* | ||
| 39 | If we have db lookup vaule we just add it to list and | ||
| 40 | exit from the function. | ||
| 41 | We don't do this for database names longer than the maximum | ||
| 42 | path length. | ||
| 43 | */ | ||
| 44 | if (lookup_field_vals->db_value.str | ||
| 45 | && lookup_field_vals->db_value.length < FN_REFLEN) | ||
| 46 | { | ||
| 47 | if (db_names->push_back(&lookup_field_vals->db_value)) | ||
| 48 | return 1; | ||
| 49 | return 0; | ||
| 50 | } | ||
| 51 | |||
| 52 | return (find_files(thd, db_names, NullS, | ||
| 53 | mysql_data_home, NullS, TRUE) != FIND_FILES_OK); | ||
| 54 | } | ||
| 55 | |||
| 56 | /*----------------------------------------------------------------------------*/ | ||
| 57 | |||
| 58 | struct TABLE_DATA | ||
| 59 | { | ||
| 60 | LEX_STRING name; | ||
| 61 | longlong size; | ||
| 62 | }; | ||
| 63 | |||
| 64 | static char *fn_remove_ext(char *name) | ||
| 65 | { | ||
| 66 | char *res = strrchr(name, '.'); | ||
| 67 | if (res) | ||
| 68 | return res; | ||
| 69 | return name + strlen(name); | ||
| 70 | } | ||
| 71 | |||
| 72 | /* | ||
| 73 | SYNOPSIS | ||
| 74 | thd thread handler | ||
| 75 | tables put found tables and their size in this list | ||
| 76 | db database name to set in TABLE_LIST structure | ||
| 77 | path path to database | ||
| 78 | wild filter for found files | ||
| 79 | |||
| 80 | RETURN | ||
| 81 | FIND_FILES_OK success | ||
| 82 | FIND_FILES_OOM out of memory error | ||
| 83 | FIND_FILES_DIR no such directory, or directory can't be read | ||
| 84 | */ | ||
| 85 | static find_files_result | ||
| 86 | find_tables(THD *thd, List<TABLE_DATA> *tables, | ||
| 87 | const char *db, const char *path, const char *wild) | ||
| 88 | { | ||
| 89 | char *ext; | ||
| 90 | MY_DIR *dirp; | ||
| 91 | FILEINFO *file; | ||
| 92 | uint file_name_len; | ||
| 93 | char uname[NAME_LEN + 1]; /* Unencoded name */ | ||
| 94 | #ifndef NO_EMBEDDED_ACCESS_CHECKS | ||
| 95 | uint col_access = thd->col_access; | ||
| 96 | #endif | ||
| 97 | uint wild_length = 0; | ||
| 98 | TABLE_LIST table_list; | ||
| 99 | TABLE_DATA *table_data = NULL; | ||
| 100 | DBUG_ENTER("find_files"); | ||
| 101 | |||
| 102 | bzero((char *)&table_list, sizeof(table_list)); | ||
| 103 | |||
| 104 | if (!(dirp = my_dir(path, MYF(MY_WANT_STAT)))) | ||
| 105 | { | ||
| 106 | if (my_errno == ENOENT) | ||
| 107 | my_error(ER_BAD_DB_ERROR, MYF(ME_BELL + ME_WAITTANG), db); | ||
| 108 | else | ||
| 109 | my_error(ER_CANT_READ_DIR, MYF(ME_BELL + ME_WAITTANG), path, my_errno); | ||
| 110 | DBUG_RETURN(FIND_FILES_DIR); | ||
| 111 | } | ||
| 112 | |||
| 113 | for (uint i = 0; i < (uint)dirp->number_off_files; i++) | ||
| 114 | { | ||
| 115 | file = dirp->dir_entry + i; | ||
| 116 | /* skip '.', '..', db.opt and temp files. */ | ||
| 117 | if ((file->name[0] == '.' && | ||
| 118 | (!file->name[1] || (file->name[1] == '.' && !file->name[2]))) | ||
| 119 | || !my_strcasecmp(files_charset_info, file->name, MY_DB_OPT_FILE) | ||
| 120 | || is_prefix(file->name, tmp_file_prefix)) | ||
| 121 | continue; | ||
| 122 | |||
| 123 | ext = fn_remove_ext(file->name); | ||
| 124 | *ext = 0; | ||
| 125 | file_name_len = filename_to_tablename(file->name, uname, sizeof(uname)); | ||
| 126 | |||
| 127 | if (table_data != NULL | ||
| 128 | && !my_strcasecmp(files_charset_info, uname, table_data->name.str)) | ||
| 129 | { | ||
| 130 | table_data->size += file->mystat->st_size; | ||
| 131 | continue; | ||
| 132 | } | ||
| 133 | |||
| 134 | if (wild) | ||
| 135 | { | ||
| 136 | if (lower_case_table_names) | ||
| 137 | { | ||
| 138 | if (my_wildcmp(files_charset_info, | ||
| 139 | uname, uname + file_name_len, | ||
| 140 | wild, wild + wild_length, | ||
| 141 | wild_prefix, wild_one, wild_many)) | ||
| 142 | continue; | ||
| 143 | } | ||
| 144 | else if (wild_compare(uname, wild, 0)) | ||
| 145 | continue; | ||
| 146 | } | ||
| 147 | |||
| 148 | #ifndef NO_EMBEDDED_ACCESS_CHECKS | ||
| 149 | /* Don't show tables where we don't have any privileges */ | ||
| 150 | if (db && !(col_access & TABLE_ACLS)) | ||
| 151 | { | ||
| 152 | table_list.db = (char*)db; | ||
| 153 | table_list.db_length = strlen(db); | ||
| 154 | table_list.table_name = uname; | ||
| 155 | table_list.table_name_length = file_name_len; | ||
| 156 | table_list.grant.privilege = col_access; | ||
| 157 | if (check_grant(thd, TABLE_ACLS, &table_list, TRUE, 1, TRUE)) | ||
| 158 | continue; | ||
| 159 | } | ||
| 160 | #endif | ||
| 161 | |||
| 162 | table_data = new TABLE_DATA(); | ||
| 163 | table_data->size = file->mystat->st_size; | ||
| 164 | if (!thd->make_lex_string(&table_data->name, uname, file_name_len, FALSE) | ||
| 165 | || tables->push_back(table_data)) | ||
| 166 | { | ||
| 167 | my_dirend(dirp); | ||
| 168 | DBUG_RETURN(FIND_FILES_OOM); | ||
| 169 | } | ||
| 170 | } | ||
| 171 | |||
| 172 | DBUG_PRINT("info", ("found: %d files", tables->elements)); | ||
| 173 | my_dirend(dirp); | ||
| 174 | |||
| 175 | //(void)ha_find_files(thd, db, path, wild, dir, files); | ||
| 176 | |||
| 177 | DBUG_RETURN(FIND_FILES_OK); | ||
| 178 | } | ||
| 179 | |||
| 180 | static int | ||
| 181 | make_table_list(THD *thd, List<TABLE_DATA> *table_names, LEX *lex, | ||
| 182 | LEX_STRING *db_name) | ||
| 183 | { | ||
| 184 | char path[FN_REFLEN + 1]; | ||
| 185 | build_table_filename(path, sizeof(path) - 1, db_name->str, "", "", 0); | ||
| 186 | |||
| 187 | find_files_result res = find_tables(thd, table_names, db_name->str, path, | ||
| 188 | NullS); | ||
| 189 | if (res != FIND_FILES_OK) | ||
| 190 | { | ||
| 191 | /* | ||
| 192 | Downgrade errors about problems with database directory to warnings. | ||
| 193 | Another thread may have dropped database, and we may still have a name | ||
| 194 | for that directory. | ||
| 195 | */ | ||
| 196 | if (res == FIND_FILES_DIR) | ||
| 197 | { | ||
| 198 | if (sql_command_flags[lex->sql_command] & CF_STATUS_COMMAND) | ||
| 199 | return 1; | ||
| 200 | thd->clear_error(); | ||
| 201 | return 2; | ||
| 202 | } | ||
| 203 | return 1; | ||
| 204 | } | ||
| 205 | return 0; | ||
| 206 | } | ||
| 207 | |||
| 208 | /*----------------------------------------------------------------------------*/ | ||
| 209 | |||
| 210 | static struct st_mysql_information_schema info = | ||
| 211 | { MYSQL_INFORMATION_SCHEMA_INTERFACE_VERSION }; | ||
| 212 | |||
| 213 | static ST_FIELD_INFO fields_info[] = | ||
| 214 | { | ||
| 215 | {"TABLE_SCHEMA", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}, | ||
| 216 | {"TABLE_NAME", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, "Name", | ||
| 217 | SKIP_OPEN_TABLE}, | ||
| 218 | {"TABLE_SIZE", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONGLONG, 0, | ||
| 219 | (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), "Table_size", SKIP_OPEN_TABLE}, | ||
| 220 | {0, 0, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE} | ||
| 221 | }; | ||
| 222 | |||
| 223 | static int fill_table(THD *thd, TABLE_LIST *tables, COND *cond) | ||
| 224 | { | ||
| 225 | LEX *lex = thd->lex; | ||
| 226 | TABLE *table = tables->table; | ||
| 227 | LOOKUP_FIELD_VALUES lookup_field_vals; | ||
| 228 | #ifndef NO_EMBEDDED_ACCESS_CHECKS | ||
| 229 | Security_context *sctx = thd->security_ctx; | ||
| 230 | #endif | ||
| 231 | List<LEX_STRING> db_names; | ||
| 232 | List_iterator_fast<LEX_STRING> it(db_names); | ||
| 233 | int error = 1; | ||
| 234 | |||
| 235 | DBUG_ENTER("fill_table"); | ||
| 236 | |||
| 237 | bzero((char *)&lookup_field_vals, sizeof(LOOKUP_FIELD_VALUES)); | ||
| 238 | if (calc_lookup_values_from_cond(thd, cond, tables, &lookup_field_vals)) | ||
| 239 | { | ||
| 240 | error = 0; | ||
| 241 | goto err; | ||
| 242 | } | ||
| 243 | |||
| 244 | if (lower_case_table_names) | ||
| 245 | { | ||
| 246 | /* | ||
| 247 | We can safely do in-place upgrades here since we are | ||
| 248 | allocating a new memory buffer for these strings. | ||
| 249 | */ | ||
| 250 | if (lookup_field_vals.db_value.str && lookup_field_vals.db_value.str[0]) | ||
| 251 | my_casedn_str(system_charset_info, lookup_field_vals.db_value.str); | ||
| 252 | if (lookup_field_vals.table_value.str && lookup_field_vals.table_value.str[0]) | ||
| 253 | my_casedn_str(system_charset_info, lookup_field_vals.table_value.str); | ||
| 254 | } | ||
| 255 | |||
| 256 | DBUG_PRINT("INDEX VALUES", ("db_name='%s', table_name='%s'", | ||
| 257 | STR_OR_NIL(lookup_field_vals.db_value.str), | ||
| 258 | STR_OR_NIL(lookup_field_vals.table_value.str))); | ||
| 259 | |||
| 260 | if (!lookup_field_vals.wild_db_value && !lookup_field_vals.wild_table_value) | ||
| 261 | { | ||
| 262 | /* | ||
| 263 | if lookup value is empty string then | ||
| 264 | it's impossible table name or db name | ||
| 265 | */ | ||
| 266 | if ((lookup_field_vals.db_value.str | ||
| 267 | && !lookup_field_vals.db_value.str[0]) | ||
| 268 | || (lookup_field_vals.table_value.str | ||
| 269 | && !lookup_field_vals.table_value.str[0])) | ||
| 270 | { | ||
| 271 | error= 0; | ||
| 272 | goto err; | ||
| 273 | } | ||
| 274 | } | ||
| 275 | |||
| 276 | /* NOTE: doesn't change the output of EXPLAIN - maybe sometimes later */ | ||
| 277 | if (lookup_field_vals.db_value.length | ||
| 278 | && !lookup_field_vals.wild_db_value) | ||
| 279 | tables->has_db_lookup_value = TRUE; | ||
| 280 | if (lookup_field_vals.table_value.length | ||
| 281 | && !lookup_field_vals.wild_table_value) | ||
| 282 | tables->has_table_lookup_value = TRUE; | ||
| 283 | |||
| 284 | if (lex->describe) | ||
| 285 | { | ||
| 286 | /* EXPLAIN SELECT */ | ||
| 287 | error = 0; | ||
| 288 | goto err; | ||
| 289 | } | ||
| 290 | |||
| 291 | if (make_db_list(thd, &db_names, &lookup_field_vals)) | ||
| 292 | goto err; | ||
| 293 | |||
| 294 | LEX_STRING *db_name; | ||
| 295 | while (db_name = it++) | ||
| 296 | { | ||
| 297 | if ((check_access(thd, SELECT_ACL, db_name->str, &thd->col_access, NULL, 0, 1) | ||
| 298 | || (!thd->col_access && check_grant_db(thd, db_name->str))) | ||
| 299 | && !sctx->master_access & (DB_ACLS | SHOW_DB_ACL) | ||
| 300 | && !acl_get(sctx->host, sctx->ip, sctx->priv_user, db_name->str, 0)) | ||
| 301 | continue; | ||
| 302 | |||
| 303 | List<TABLE_DATA> tables; | ||
| 304 | int res = make_table_list(thd, &tables, lex, db_name); | ||
| 305 | if (res) | ||
| 306 | { | ||
| 307 | tables.delete_elements(); | ||
| 308 | if (res == 2) /* Not fatal error, continue */ | ||
| 309 | continue; | ||
| 310 | goto err; | ||
| 311 | } | ||
| 312 | |||
| 313 | TABLE_DATA *table_data; | ||
| 314 | List_iterator_fast<TABLE_DATA> it_tables(tables); | ||
| 315 | while (table_data = it_tables++) | ||
| 316 | { | ||
| 317 | table->field[0]->store(db_name->str, db_name->length, | ||
| 318 | system_charset_info); | ||
| 319 | table->field[1]->store(table_data->name.str, table_data->name.length, | ||
| 320 | system_charset_info); | ||
| 321 | table->field[2]->set_notnull(); | ||
| 322 | table->field[2]->store((longlong) table_data->size, TRUE); | ||
| 323 | if (schema_table_store_record(thd, table)) | ||
| 324 | { | ||
| 325 | tables.delete_elements(); | ||
| 326 | goto err; | ||
| 327 | } | ||
| 328 | } | ||
| 329 | tables.delete_elements(); | ||
| 330 | } | ||
| 331 | |||
| 332 | error = 0; | ||
| 333 | |||
| 334 | err: | ||
| 335 | DBUG_RETURN(error); | ||
| 336 | |||
| 337 | return 0; | ||
| 338 | } | ||
| 339 | |||
| 340 | static int init(void *ptr) | ||
| 341 | { | ||
| 342 | ST_SCHEMA_TABLE *schema_table = (ST_SCHEMA_TABLE*)ptr; | ||
| 343 | |||
| 344 | schema_table->fields_info = fields_info; | ||
| 345 | schema_table->fill_table = fill_table; | ||
| 346 | schema_table->idx_field1 = 0; | ||
| 347 | schema_table->idx_field2 = 1; | ||
| 348 | schema_table->i_s_requested_object = OPTIMIZE_I_S_TABLE; | ||
| 349 | return 0; | ||
| 350 | } | ||
| 351 | |||
| 352 | mysql_declare_plugin(table_sizes) | ||
| 353 | { | ||
| 354 | MYSQL_INFORMATION_SCHEMA_PLUGIN, | ||
| 355 | &info, /* type-specific descriptor */ | ||
| 356 | "TABLE_SIZES", /* table name */ | ||
| 357 | "Manuel Mausz", /* author */ | ||
| 358 | "Fast INFORMATION_SCHEMA table sizes", /* description */ | ||
| 359 | PLUGIN_LICENSE_GPL, /* license type */ | ||
| 360 | init, /* init function */ | ||
| 361 | NULL, | ||
| 362 | 0x0010, /* version = 0.1 */ | ||
| 363 | NULL, /* no status variables */ | ||
| 364 | NULL, /* no system variables */ | ||
| 365 | NULL, /* no reserved information */ | ||
| 366 | 0 /* no flags */ | ||
| 367 | } | ||
| 368 | mysql_declare_plugin_end; | ||
