home *** CD-ROM | disk | FTP | other *** search
/ PC World 2002 July & August / PCWorld_2002-07-08_cd.bin / Komunik / MySQL / mysql / data1.cab / Development / bench / print-limit-table < prev    next >
Text File  |  2002-02-21  |  12KB  |  365 lines

  1. #!/usr/bin/perl
  2. # Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  3. #
  4. # This library is free software; you can redistribute it and/or
  5. # modify it under the terms of the GNU Library General Public
  6. # License as published by the Free Software Foundation; either
  7. # version 2 of the License, or (at your option) any later version.
  8. #
  9. # This library is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12. # Library General Public License for more details.
  13. #
  14. # You should have received a copy of the GNU Library General Public
  15. # License along with this library; if not, write to the Free
  16. # Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  17. # MA 02111-1307, USA
  18. #
  19. # Output a html table with a compare of all servers
  20. #
  21. $cmp_server="mysql";        # Get limit names from here
  22. $full_html=1;
  23. $opt_txt=0;
  24.  
  25. if ($#ARGV < 0)
  26. {
  27.   @ARGV=glob("limits/*.cfg");
  28.   $skip_header=0;
  29. }
  30. else
  31. {
  32.   $skip_header=1;
  33. }
  34.  
  35. foreach (@ARGV)
  36. {
  37.   /([^\/\.]*)\.cfg$/;
  38.   $server=$1;
  39.   if ($server eq $cmp_server)
  40.   {
  41.     unshift(@limits,read_config_data($server,$_));
  42.   }
  43.   else
  44.   {
  45.     push(@limits,read_config_data($server,$_));
  46.   }
  47. }
  48.  
  49. @global_limits= sort keys(%all_limits);
  50. find_match('group_functions|functions');    # Don't report these
  51.  
  52. if ($full_html)
  53. {
  54.   if (!$skip_header)
  55.   {
  56.     print "<!doctype HTML public \"-//W3O//DTD W3 HTML3.0//EN\"><HTML>";
  57.   }
  58.   print <<EOF;
  59. <!doctype HTML public \"-//W3O//DTD W3 HTML3.0//EN\"><HTML>
  60. <HEAD><TITLE>Database comparison table</TITLE></HEAD>
  61. <BODY>
  62. <center><h3>Database comparison table generated with <B>crash-me</B></h3></center>
  63. <table><tr><td><IMG SRC="icons/mysql-03.gif" ALT=logo></td>
  64. <td>You can get a copy of <B>crash-me</B> from the MySQL 3.23 distribution at
  65. <A HREF="http://www.mysql.com">http://www.mysql.com</A>.
  66. </td></tr></table>
  67. <br>
  68. <strong>crash-me</strong> is a program that automatically detects
  69. limits and capabilities in a SQL server. We at TCX have worked very
  70. hard to make crash-me as fair and accurate as possible, but there is
  71. always a small possibility that some particular tests fails for some
  72. database, even if the database has the capability. We are always
  73. willing to correct this as soon as this comes to our attention.  Some
  74. tests may fail because the database in questions does not follow
  75. <B>ANSI SQL 99</B> or <B>ODBC 3.0</B> but in this case we regard this
  76. as a failure in the database.
  77. <br><br>
  78. Note that crash-me test the <B>ODBC</B> functionality by executing
  79. SQL commands through the perl DBD driver.  As some SQL servers implements
  80. the <B>ODBC</B> functionality in the <B>ODBC</B> driver, crash-me may
  81. tell you that the SQL server doesn\'t support some functionality, even
  82. if this is supported when you are using the SQL server through <B>ODBC</B>.
  83. <br><br>
  84. Note that even if crash-me reports that some feature is missing, not
  85. supported, or doesn\'t work it doesn\'t mean that the SQL server
  86. doesn\'t follow the SQL standard or that you can\'t do the operation
  87. in some other way.  crash-me just tells you how the SQL server works
  88. if you send it some specific query.  The result is however often useful
  89. for applications writers that tries to write portable code and needs to be
  90. aware of the differences between different SQL servers.
  91. <br><br>
  92. TCX is trying to add as much tests to the crash-me program as they can
  93. but it\'s always possible that some database vendor specific functions
  94. / queries aren\'t tested. If you find some entries not tested on a
  95. database please let us know and try to patch the crash-me program your
  96. self or give us some example queries so we can add those entries. We
  97. are always open for suggestions for adding things to the crash-me
  98. program.  The crash-me program is also our input reference for the
  99. MySQL benchmark program.<br>
  100.  
  101. <B>Note:</B>
  102. The crash-me table is generated from databases started with default
  103. parameters.  If this is not the case, this is noted in the comment row.
  104. Some detected limits may also be configurable, OS dependent, depend of the
  105. Perl DBI driver or depending on the license of the used database version.
  106. <BR><BR>
  107. The following markers are used in the comparison table
  108. <table border=1>
  109. <tr><th>Marker</th><th>Description</th></tr>
  110. <tr><td><IMG SRC=\"images/ok.gif\" WIDTH=20 HEIGHT=16 ALT=\"yes\"></td>
  111. <td>Function is supported</td></tr>
  112. <tr><td><IMG SRC=\"images/no.gif\" WIDTH=14 HEIGHT=14 ALT=\"no\"></td>
  113. <td>Function is not supported</td></tr>
  114. <tr><td><IMG SRC=\"images/error.gif\" WIDTH=20 HEIGHT=16 ALT=\"error\"></td>
  115. <td>Function exists but didn\'t return expected result. This usually means that
  116. the database is using some non standard extension for the option in question</td></tr>
  117. <tr><td>ignored</td><td>Function doesn\'t give an error from the server but it
  118. doesn\'t do anything.  One can probably do the same action with some other
  119. command</td></tr>
  120. <tr><td>nonstandard</td><td>Function exists but doesn\'t work according to
  121. <B>ANSI SQL 92</B> or <B>ODBC 3.0</B></td></tr>
  122. <tr><td> </td><td>Not relevant or not tested with the database</td></tr>
  123. <tr><td>+number</td><td>At least <b>number</b> operations is supported</td></tr>
  124. <tr><td><IMG SRC=\"images/warning.gif\" WIDTH=28 HEIGHT=28 ALT=\"warning\"></td>
  125. <td><B>Anyone with normal access to the database server can take it down, possible
  126. forever!</B></td> </table>
  127.  
  128. <center><h3>The <B>crash-me</B> comparisons</h3></center>
  129. EOF
  130. }
  131.  
  132. print "<TABLE BORDER=2><TR ALIGN=left>\n";
  133. #
  134. # printer server names
  135. #
  136.  
  137. $columns=$#limits+2;
  138. print "<th>Function</th>\n";
  139. foreach $server (@limits)
  140. {
  141.   print "<td>$server->[1]->{'server_version'}</td>";
  142.   $server->[1]->{'server_version'} =~ /^(\S*)/;
  143.   push(@server_names,$1);
  144. }
  145. find_match("server_version");        # Mark used
  146. print "</tr>\n";
  147.  
  148. print_match("Crash-me information",'crash_me|operating_system|user_comment',undef(),1);
  149. print_match("ANSI SQL 92 types","type_sql");
  150. print_match("ODBC 3.0 types","type_odbc");
  151. print_match("Other types","type_extra");
  152. print_match("Constraints and type modifiers","constraint|foreign|primary|unique|default","alter|max_unique");
  153. print_match("ANSI SQL 92 functions","func_sql","group");
  154. print_match("ODBC 3.0 functions","func_odbc","group");
  155. print_match("Other functions","func_extra","group");
  156. print_match("Functions in WHERE","func_where","group");
  157. print_match("ANSI SQL 92 group functions","group_func_sql");
  158. print_match("Other group functions","group_func");
  159. print_match("Function use","NEG|minus_neg|like|null.*expr");
  160. print_match("Order by and group by","order|having|group");
  161. print_match("Join methods",'join|subqueries|multi_table|select_table_update');
  162. print_match("String handling","string|select_constant|quote_with|double_quotes|end_space");
  163. print_match("Quoting","quote");
  164. print_match("Name limits","name","alter");
  165. print_match("Index limits",'index|primary|unique');
  166. print_match("Type limits",'char|float|text_size|date|end_space','atomic');
  167. print_match("Expressions",'expression|conditions|select_limit|binary|hex|cast|logical|true_false');
  168. print_match("Comments",'comment');
  169. print_match("ALTER TABLE",'alter');
  170. print_match("CREATE and DROP",'create|drop|rowid|temporary|domains|truncate');
  171. print_match("SELECT",'alias|compute|select|table_wildcard');
  172. print_match("Sets",'intersect|minus|union|except');
  173. print_match("INSERT",'insert');
  174. print_options("Other features");
  175. print_match("Other limits",'\S');
  176.  
  177. print "</table>\n";
  178.  
  179. if ($full_html)
  180. {
  181.   print <<EOF;
  182. <BR>
  183. This information is provided by TCX so one can get the real limitations from
  184. the database server (not the information from sales managers!). Hopefully the
  185. above information will make it easier for you to find a database server that
  186. has the functionality you need and that you can rely on!
  187. <BR><BR>
  188. TCX will continue to extend <b>crash-me</b> and add more database servers
  189. to the above chart. We are also very interested in new tests so if you have
  190. any suggestions, please mail us (or even better, send us code).
  191. <BR>
  192. We are also working on the <B>MySQL</B> <A HREF ="/benchmark.html">benchmark</A>
  193. to help users see how fast a database is when doing different typical things.
  194. <br> 
  195. <IMG SRC="images/eyesleft.gif" HEIGHT=9 WIDTH=582 ALT="=============================================="> 
  196. <ADDRESS> You can direct questions about crash-me and the benchmark to the
  197. <A HREF=\"http://www.tcx.se/mail.html\">MySQL mailing list</A>. 
  198. </ADDRESS> 
  199. </BODY></HTML> 
  200. EOF
  201. } exit 0;
  202.  
  203.  
  204. sub read_config_data
  205. {
  206.   my ($server,$file)=@_;
  207.   my (%limits,%prompts);
  208.   open(CONFIG_FILE,"<$file") ||
  209.       die "Can't open configure file $file\n";
  210.   while (<CONFIG_FILE>)
  211.   {
  212.     chomp;
  213.     if (/^(\S+)=([^\#]*[^\#\s])\s*(\# .*)*$/)
  214.     {
  215.       $all_limits{$1}=1;
  216.       $limits{$1}=$2;
  217.       $prompts{$1}=length($3) ? substr($3,2) : "";
  218.     }
  219.     elsif (!/^\s*$/ && !/^\#/)
  220.     {
  221.       die "Wrong config row: $_\n";
  222.     }
  223.   }
  224.   close CONFIG_FILE;
  225.   return ([$server,\%limits,\%prompts]);
  226. }
  227.  
  228.  
  229. sub find_match
  230. {
  231.   my ($find,$find_not)=@_;
  232.   my ($key,@res);
  233.  
  234.   foreach $key (@global_limits)
  235.   {
  236.     if ($key =~ /$find/ && (!defined($find_not) || !($key =~ /$find_not/)))
  237.     {
  238.       push(@res,$key);
  239.       $key="";
  240.     }
  241.   }
  242.   return @res;
  243. }
  244.  
  245.  
  246. sub print_match
  247. {
  248.   my ($header,$match,$not_match,$no_server_names)=@_;
  249.   my ($key);
  250.   if ($opt_txt)
  251.   {
  252.     print "\n$header\n";
  253.   }
  254.   else
  255.   {
  256.     print "<tr><th colspan=$columns ALIGN=center>$header</th></tr>\n";
  257.   }
  258.   print_server_names() if (!$no_server_names);
  259.   foreach $key (find_match($match,$not_match))
  260.   {
  261.     print_key($key,$key eq "crash_me_safe" ? 1: 0);
  262.   }
  263. }
  264.  
  265.  
  266. sub print_options
  267. {
  268.   my ($header)=@_;
  269.   if ($opt_txt)
  270.   {
  271.     print "\n$header\n";
  272.   }
  273.   else
  274.   {
  275.     print "<tr><th colspan=$columns ALIGN=center>$header</th></tr>\n";
  276.   }
  277.   print_server_names();
  278.   foreach $key (@global_limits)
  279.   {
  280.     if ($key && !($limits[0]->[1]{$key} =~ /^\d+$/))
  281.     {
  282.       print_key($key,0);
  283.       $key="";
  284.     }
  285.   }
  286. }
  287.  
  288.  
  289. sub print_key
  290. {
  291.   my ($key,$fatal)=@_;
  292.   my ($i,$server,$option,$tmp);
  293.   $option=$key;
  294.   for ($i=0 ; $i < $columns ; $i++)
  295.   {
  296.     if ($limits[$i]->[2]{$key})
  297.     {
  298.       $option=$limits[$i]->[2]{$key};
  299.       last;
  300.     }
  301.   }
  302.   $option =~ s/>/>\;/g; 
  303.   $option =~ s/</<\;/g; 
  304.  
  305.   if ($opt_txt)
  306.   {
  307.     print "\n$option\t";
  308.     foreach $server (@limits)
  309.     {
  310.       $tmp=$server->[1]->{$key};
  311.       $tmp="yes"  if ($tmp eq "yes");
  312.       $tmp="no"   if ($tmp eq "no" && !$fatal);
  313.       $tmp="warning" if ($tmp eq "no" && $fatal);
  314.       $tmp="error" if ($tmp eq "error");
  315.       $tmp="" if (!defined($tmp) || $tmp eq "");
  316.       print "\t$tmp";
  317.     }
  318.   }
  319.   else
  320.   {
  321.     $option =~ s/ / /g;
  322.     print "<tr><td>$option</td>";
  323.     foreach $server (@limits)
  324.     {
  325.       $tmp=$server->[1]->{$key};
  326.       $tmp="<IMG SRC=\"images/ok.gif\" WIDTH=20 HEIGHT=16 ALT=\"yes\">" if ($tmp eq "yes" && !$fatal);
  327.       $tmp="<IMG SRC=\"images/thumbs_up.gif\" ALT=\"yes\">" if ($tmp eq "yes" && $fatal);
  328.       $tmp="<IMG SRC=\"images/no.gif\" WIDTH=14 HEIGHT=14 ALT=\"no\">" if ($tmp eq "no" && !$fatal);
  329.       $tmp="<IMG SRC=\"images/warning.gif\" WIDTH=28 HEIGHT=28 ALT=\"warning\">" if ($tmp eq "no" && $fatal);
  330.       $tmp="<IMG SRC=\"images/error.gif\" WIDTH=20 HEIGHT=16 ALT=\"error\">" if ($tmp eq "error");
  331.       $tmp=" " if (!defined($tmp) || $tmp eq "");
  332.       print "<td>$tmp</td>";
  333.     }
  334.     print"</tr>\n";
  335.   }
  336. }
  337.  
  338.  
  339. sub print_server_names
  340. {
  341.   my ($server);
  342.  
  343.   if ($opt_txt)
  344.   {
  345.     my $tab;
  346.     $tab="";
  347.     foreach $server (@server_names)
  348.     {
  349.       print "$tab$server";
  350.       $tab="\t";
  351.     }
  352.     print "\n";
  353.   }
  354.   else
  355.   {
  356.     print "<tr><th></th>";
  357.     foreach $server (@server_names)
  358.     {
  359.       print "<th>$server</th>";
  360.     }
  361.     print "</tr>\n";
  362.   }
  363. }
  364.  
  365.