fill_help_tables.sh
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:15k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. #!@PERL@
  2. #
  3. # Copyright (C) 2003 MySQL AB
  4. # For a more info consult the file COPYRIGHT distributed with this file.
  5. #
  6. # This script generates the SQL statements required by mysql_install_db to
  7. # fill up the tables for the server-side online function help, which can be
  8. # invoked with "help <function>" from the MySQL client.
  9. #
  10. # Usage:
  11. #   fill_help_tables OPTIONS  < manual.texi > fill_help_tables.sql
  12. #  
  13. #  --help           display this helpscreen and exit
  14. #  --verbose        print information about help completeness to STDERR
  15. #  --lexems=path    path to file with lexems. it is used with verbose option.
  16. #                       default value is ../sql/lex.h
  17. # Examples:
  18. #  ./fill_help_tables --help
  19. #  ./fill_help_tables --verbose < manual.texi > fill_help_tables.sql
  20. #  ./fill_help_tables < manual.texi > fill_help_tables.sql
  21. # Please note, that you first need to update Docs/manual.texi with the
  22. # manual file from the separate "mysqldoc" BitKeeper-Tree! The manual.texi
  23. # included in the source tree is just an empty stub file - the full manual
  24. # is now maintained in a separate tree.
  25. #
  26. # extra tags in manual.texi:
  27. #
  28. # @c help_category <category_name>[@<parent_category_name>]
  29. #
  30. # @c description_for_help_topic <topic_name>  <keyword1> <keyword2>
  31. # ....
  32. # @c end_description_for_help_topic
  33. #
  34. # @c example_for_help_topic <topic_name>
  35. # @example
  36. # ....
  37. # @end example
  38. #
  39. #
  40. # Original version by Victor Vagin <vva@mysql.com>
  41. #
  42. use strict;
  43. use Getopt::Long;
  44. my $insert_portion_size= 15;
  45. my $error_prefix= "---- help parsing errors :";
  46. my $path_to_lex_file= "../sql/lex.h";
  47. my $verbose_option= 0;
  48. my $help_option= 0;
  49. my $cur_line= 0;
  50. my $count_errors= 0;
  51. GetOptions(
  52.   "help",$help_option,
  53.   "verbose",$verbose_option,
  54.   "lexems=s",$path_to_lex_file
  55. );
  56. if ($help_option ne 0)
  57. {
  58.   print <<_HELP;
  59. This script generates the SQL statements required by mysql_install_db to
  60. fill up the tables for the server-side online function help, which can be
  61. invoked with "help <function>" from the MySQL client.
  62. Usage:
  63.   fill_help_tables OPTIONS  < manual.texi > fill_help_tables.sql
  64.   
  65.   --help           display this helpscreen and exit
  66.   --verbose        print information about help completeness to STDERR
  67.   --lexems=path    path to file with lexems. it is used with verbose option.
  68.                        default value is ../sql/lex.h
  69. Examples:
  70.   ./fill_help_tables --help
  71.   ./fill_help_tables --verbose < manual.texi > fill_help_tables.sql
  72.   ./fill_help_tables < manual.texi > fill_help_tables.sql
  73.     
  74. _HELP
  75.   exit;
  76. }
  77. my $current_category= "";
  78. my $current_parent_category= "";
  79. my $next_example_for_topic= "";
  80. my %topics; 
  81. my %categories;
  82. my %keywords;
  83. $categories{Contents}->{__parent_category__}= "";
  84. sub print_error
  85. {
  86.   my ($text)= @_;
  87.   if ($count_errors==0)
  88.   {
  89.     print STDERR "$error_prefixn";
  90.   }
  91.   print STDERR "line $cur_line : $text";
  92.   $count_errors++;
  93. }
  94. sub add_topic_to_category
  95. {
  96.   my ($topic_name)= @_;
  97.   $categories{$current_category}->{$topic_name}= $topics{$topic_name};
  98.   my $category= $categories{$current_category};
  99.   $category->{__name__}= $current_category;
  100.     
  101.   if (exists($category->{__parent_category__}))
  102.   {
  103.     my $old_parent= $category->{__parent_category__};
  104.     if ($old_parent ne $current_parent_category)
  105.     {
  106.       print_error "wrong parent for $current_categoryn";
  107.     }
  108.   }
  109.   if ($current_parent_category ne "")
  110.   {
  111.     $category->{__parent_category__}= $current_parent_category;
  112.   }
  113.     
  114.   if (exists($topics{$topic_name}->{category}))
  115.   {
  116.     my $old_category= $topics{$topic_name}->{category};
  117.     if ($old_category ne $category)
  118.     {
  119.       print_error "wrong category for $topic_name (first one's "$old_category->{__name__}" second one's "$current_category")n";
  120.     }
  121.   }
  122.     
  123.   $topics{$topic_name}->{category}= $category;    
  124. }
  125. sub add_example
  126. {
  127.   my ($topic_name,$example)= @_;
  128.     
  129.   $topic_name=~ tr/a-z/A-Z/;
  130.   if (exists($topics{$topic_name}->{example}))
  131.   {
  132.     print_error "double example for $topic_namen";
  133.   }
  134.     
  135.   $topics{$topic_name}->{example}= $example;    
  136.   add_topic_to_category($topic_name);
  137. }
  138. sub add_description
  139. {
  140.   my ($topic_name,$description)= @_;
  141.     
  142.   $topic_name=~ tr/a-z/A-Z/;
  143.     
  144.   if (exists($topics{$topic_name}->{description}))
  145.   {
  146.     print_error "double description for $topic_namen";
  147.   }
  148.   $topics{$topic_name}->{description}= $description;
  149.   add_topic_to_category($topic_name);
  150. }
  151. sub add_keyword
  152. {
  153.   my ($topic_name,$keyword)= @_;
  154.     
  155.   $topic_name=~ tr/a-z/A-Z/;
  156.   $keyword=~ tr/a-z/A-Z/; 
  157.     
  158.   push(@{$topics{$topic_name}->{keywords}},$keyword);
  159.   if (exists($keywords{$keyword}->{$topic_name}))
  160.   {
  161.     print_error "double keyword $keyword for $topic_namen";
  162.   }
  163.   $keywords{$keyword}->{$topic_name}= $topics{$topic_name};
  164. }
  165. sub prepare_name
  166. {
  167.   my ($a)= @_;
  168.     
  169.   $a =~ s/(@itemize @bullet)/  /g;
  170.   $a =~ s/(@end itemize)/  /g;
  171.   $a =~ s/(@end multitable)/  /g;
  172.   $a =~ s/(@end table)/  /g;
  173.   $a =~ s/(@cindex(.*?)n)/  /g;
  174.   $a =~ s/(@multitable @columnfractions(.*?)n)/  /g;
  175.   $a =~ s/(@node(.*?)n)/  /g;
  176.   $a =~ s/(@tab)/t/g;
  177.   $a =~ s/@item/  /g;
  178.   $a =~ s/@minus{}/-/g;
  179.   $a =~ s/@dots{}/.../g;
  180.   $a =~ s/@var{((.|n)+?)}/$1/go;
  181.   $a =~ s/@command{((.|n)+?)}/$1/go;
  182.   $a =~ s/@code{((.|n)+?)}/$1/go;
  183.   $a =~ s/@strong{(.+?)}/$1/go;
  184.   $a =~ s/@samp{(.+?)}/'$1'/go;
  185.   $a =~ s/@emph{((.|n)+?)}//$1//go;
  186.   $a =~ s/@xref{((.|n)+?)}/See also : [$1]/go;
  187.   $a =~ s/@ref{((.|n)+?)}/[$1]/go;
  188.   $a =~ s/'/''/g;
  189.   $a =~ s/\/\\/g;
  190.   $a =~ s/`/``/g;
  191.   $a =~ s/@table @code/  /g;
  192.   $a =~ s/()//g;
  193.   $a =~ s/"/\"/g;
  194.   $a =~ s/((w|s)+)(([+-=></%*!<>s]+))/$3/gxs;
  195.   $a =~ s/([+-=></%*!<>s]+)(((w|s)+))/$1/gxs;
  196.   $a =~ s/((w|s)+)((.+))/$1/gxs;
  197.   
  198.   $a =~ s/((s)+)$//g;
  199.     
  200.   return $a;
  201. }
  202. sub prepare_description
  203. {
  204.   my ($a)= @_;
  205.   $a =~ s/(@itemize @bulletn)//g;
  206.   $a =~ s/(@c help_keyword (.*?)n)//g;
  207.   $a =~ s/(@end itemizen)//g;
  208.   $a =~ s/(@end examplen)//g;
  209.   $a =~ s/(@examplen)//g;
  210.   $a =~ s/(@{)/{/g;
  211.   $a =~ s/(@})/}/g;
  212.   $a =~ s/(@end multitable)/  /g;
  213.   $a =~ s/(@end table)/  /g;
  214.   $a =~ s/(@cindex(.*?)n)//g;
  215.   $a =~ s/(@findex(.*?)n)//g;
  216.   $a =~ s/(@table(.*?)n)//g;
  217.   $a =~ s/(@multitable @columnfractions(.*?)n)/  /g;
  218.   $a =~ s/(@node(.*?)n)/  /g;
  219.   $a =~ s/(@tab)/t/g;
  220.   $a =~ s/@itemx/  /g;
  221.   $a =~ s/(@itemn(s*?))(S)/ --- $3/g;
  222.   $a =~ s/(@item)/  /g;
  223.   $a =~ s/(@tindexs(.*?)n)//g;
  224.   $a =~ s/(@cs(.*?)n)//g;
  225.   $a =~ s/@minus{}/-/g;
  226.   $a =~ s/@dots{}/.../g;
  227.   $a =~ s/@var{((.|n)+?)}/$1/go;
  228.   $a =~ s/@command{((.|n)+?)}/$1/go;
  229.   $a =~ s/@code{((.|n)+?)}/$1/go;
  230.   $a =~ s/@strong{(.+?)}/$1/go;
  231.   $a =~ s/@samp{(.+?)}/'$1'/go;
  232.   $a =~ s/@emph{((.|n)+?)}//$1//go;
  233.   $a =~ s/@xref{((.|n)+?)}/See also : [$1]/go;
  234.   $a =~ s/@ref{((.|n)+?)}/[$1]/go;
  235.   $a =~ s/@w{((.|n)+?)}/$1/go;
  236.   $a =~ s/@strong{((.|n)+?)}/n!!!!n$1n!!!!n/go;
  237.   $a =~ s/@file{((.|n)+?)}/*$1/go;
  238.   $a =~ s/\/\\/g;
  239.   $a =~ s/nn$/n/g;
  240.   $a =~ s/nn$/n/g;
  241.   $a =~ s/nn$/n/g;
  242.   $a =~ s/nn$/n/g;
  243.   $a =~ s/nn$/n/g;
  244.   $a =~ s/n/\n/g;
  245.   $a =~ s/"/\"/g;
  246.   $a =~ s/@table @code/  /g;
  247.   return $a;
  248. }
  249. sub prepare_example
  250. {
  251.   my ($a)= @_;
  252.   $a =~ s/(^@c for_help_topic(.*?)n)//g;
  253.   $a =~ s/@var{((.|n)+?)}/$1/go;
  254.   $a =~ s/@dots{}/.../g;
  255.   $a =~ s/\/\\/g;
  256.   $a =~ s/(@{)/{/g;
  257.   $a =~ s/(@})/}/g;
  258.   $a =~ s/(@@)/@/g;
  259.   $a =~ s/(n*?)$//g;
  260.   $a =~ s/n/\n/g;
  261.   $a =~ s/"/\"/g;
  262.     
  263.   return $a;
  264. }
  265. sub parse_example
  266. {
  267.   return if (!($_=~/@example/));
  268.   return if ($next_example_for_topic eq "");
  269.     
  270.   my $topic_name= $next_example_for_topic;
  271.   $next_example_for_topic= "";
  272.   my $text= "";
  273.     
  274.   while (<>)
  275.   {
  276.     $cur_line++;
  277.     last if ($_=~/@end example/);
  278.     $text .= $_;
  279.   }
  280.     
  281.   $text= prepare_example($text);
  282.   $topic_name= prepare_name($topic_name);
  283.   add_example($topic_name,$text) if ($topic_name ne "");
  284. }
  285. sub parse_example_for_topic
  286. {
  287.   my ($for_topic)= m|@c example_for_help_topic (.+?)$|;
  288.   return if ($for_topic eq "");
  289.     
  290.   $next_example_for_topic= $for_topic;    
  291. }
  292. sub parse_description
  293. {
  294.   my ($topic_description)= m|@c description_for_help_topic (.+?)$|;
  295.   return if ($topic_description eq "");
  296.     
  297.   my ($topic_name,$topic_keywords)= split(/  /,$topic_description);
  298.     
  299.   if ($topic_name eq "" || $topic_keywords eq "")
  300.   {
  301.     $topic_name= $topic_description;
  302.   }
  303.   else
  304.   {
  305.     my $keyword;
  306.     foreach $keyword (split(/ /,$topic_keywords))
  307.     {
  308.       add_keyword($topic_name,$keyword) if ($keyword ne "");
  309.     }
  310.   }
  311.     
  312.   my $text= "";
  313.     
  314.   while (<>)
  315.   {
  316.     $cur_line++;
  317.     last if ($_=~/@c end_description_for_help_topic/);
  318.     $text .= $_;
  319.   }
  320.     
  321.   $text= prepare_description($text);
  322.   $topic_name= prepare_name($topic_name);
  323.   add_description($topic_name,$text);
  324. }
  325. sub parse_category
  326. {
  327.   my ($c_name,$pc_name)= m|@c help_category (.+?)@(.+?)$|;
  328.   if ($pc_name ne "")
  329.   {
  330.     $current_category= prepare_name($c_name);
  331.     $current_parent_category= prepare_name($pc_name);
  332.   }
  333.   else
  334.   {
  335.     my ($c_name)=m|@c help_category (.+?)$|;
  336.     return if ($c_name eq "");
  337.     $current_category= prepare_name($c_name);
  338.     $current_parent_category= "Contents"
  339.   }
  340. }
  341. # parse manual:
  342. while (<>)
  343. {
  344.   parse_example_for_topic ();
  345.   parse_example           ();
  346.   parse_description       ();
  347.   parse_category          ();
  348.   $cur_line++;
  349. }
  350. # test results of parsing:
  351. sub print_bad_names
  352. {
  353.   my($names,$prompt)= @_;
  354.   if (scalar(@{$names}))
  355.   {
  356.     print STDERR "n-------------- $prompt : nn";
  357.     my $name;
  358.     foreach $name (@{$names})
  359.     {
  360.       print STDERR "$namen";
  361.     }
  362.     print STDERR "n";
  363.   }
  364. }
  365. sub print_verbose_errors
  366. {
  367.   my($name_of_log_file)= @_;
  368.   my @without_help;
  369.   my @description_with_at;
  370.   my @example_with_at;
  371.   my @without_description;
  372.   my @without_example;
  373.     
  374.   print STDERR "n-------------- parameters of help completeness : nn";
  375.     
  376.   my $count_lex= 0;
  377.   if (!open (TLEX,"<$path_to_lex_file"))
  378.   {
  379.     print STDERR "Error opening lex file "$path_to_lex_file" $!n";
  380.   }
  381.   else
  382.   {
  383.     for (<TLEX>)
  384.     {
  385.       my ($a,$lex,$b)=m|(.+?)"(.+?)"(.+?)$|;
  386.       next if ($lex eq "");
  387.       $count_lex++;
  388.       next if (exists($topics{$lex}) || exists($keywords{$lex}));
  389.       push(@without_help,$lex);
  390.     }
  391.     close(TLEX);
  392.     print STDERR "number of lexems in "$path_to_lex_file" - $count_lexn";
  393.   }
  394.     
  395.   my $name;
  396.   my @topic_names= keys(%topics);
  397.   foreach $name (@topic_names)
  398.   {
  399.     my $topic= $topics{$name};
  400.     push(@description_with_at,$name) if ($topic->{description}=~/@/);
  401.     push(@example_with_at,$name) if ($topic->{example}=~/@/);
  402.     push(@without_description,$name) if (!exists($topic->{description}));
  403.     push(@without_example,$name) if (!exists($topic->{example}));
  404.   }
  405.     
  406.   my $count_categories= scalar(keys(%categories));
  407.   print STDERR "number of help categories          - ",$count_categories,"n";
  408.   my $count_topics= scalar(@topic_names);
  409.   print STDERR "number of help topics              - ",$count_topics,"n";
  410.   my $count_keywords= scalar(keys(%keywords));
  411.   print STDERR "number of help keywords            - ",$count_keywords,"n";
  412.     
  413.   my $count_without_help= scalar(@without_help);
  414.   my $percent_without_help= $count_lex ?
  415.                             int (($count_without_help/$count_lex)*100) :
  416.                             "100";
  417.   print_bad_names(@without_help,"lexems without help (".
  418.                             $count_without_help." ~ ".
  419.                             $percent_without_help."%)");
  420.   print_bad_names(@description_with_at,
  421.           " topics below have symbol '@' in their descriptions.n".
  422.           "it's probably the litter from 'texi' tags (script needs fixing)");
  423.   print_bad_names(@example_with_at,
  424.           " topics below have symbol '@' in their examples.n".
  425.           "it's probably the litter from 'texi' tags (script needs fixing)");
  426.   print_bad_names(@without_description,"topics without description");
  427.     
  428.   my $count_without_example= scalar(@without_example);
  429.   my $percent_without_example= $count_topics ?
  430.                             int (($count_without_example/$count_topics)*100) :
  431.                             "100";
  432.   print_bad_names(@without_example,"topics without example (".
  433.                             $count_without_example." ~ ".
  434.                             $percent_without_example."%)");
  435. }
  436. print_verbose_errors if ($verbose_option ne 0);
  437. # output result 
  438. sub print_insert_header
  439. {
  440.   my($count,$header)= @_;
  441.     
  442.   if ($count % $insert_portion_size ne 0) {
  443.     print ",";
  444.   } else {
  445.     print ";n" if ($count ne 0);
  446.     print "$header";
  447.   }
  448. }
  449. print <<EOF;
  450. -- Copyright (C) 2000-2005 MySQL AB
  451. -- 
  452. -- This program is free software; you can redistribute it and/or modify
  453. -- it under the terms of the GNU General Public License as published by
  454. -- the Free Software Foundation; either version 2 of the License, or
  455. -- (at your option) any later version.
  456. -- 
  457. -- This program is distributed in the hope that it will be useful,
  458. -- but WITHOUT ANY WARRANTY; without even the implied warranty of
  459. -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  460. -- GNU General Public License for more details.
  461. -- 
  462. -- You should have received a copy of the GNU General Public License
  463. -- along with this program; if not, write to the Free Software
  464. -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  465. EOF
  466. print "delete from help_topic;n";
  467. print "delete from help_category;n";
  468. print "delete from help_keyword;n";
  469. print "delete from help_relation;nn";
  470. my @category_names= keys(%categories);
  471. if (scalar(@category_names))
  472. {
  473.   my $cat_name;
  474.   my $count= 0;
  475.   foreach $cat_name (@category_names)
  476.   {
  477.     $categories{$cat_name}->{__id__}= $count;
  478.     $count++;
  479.   }
  480.   my $header= "insert into help_category ".
  481.             "(help_category_id,name,parent_category_id) values ";
  482.   $count= 0;
  483.   foreach $cat_name (@category_names)
  484.   {
  485.     print_insert_header($count,$header);
  486.     my $parent_cat_name= $categories{$cat_name}->{__parent_category__};
  487.     my $parent_cat_id= $parent_cat_name eq "" 
  488.         ? "-1" : $categories{$parent_cat_name}->{__id__};
  489.     print "($count,"$cat_name",$parent_cat_id)";
  490.     $count++;
  491.   }
  492.   printf ";nn";
  493. }
  494. my @topic_names= keys(%topics);
  495. if (scalar(@topic_names))
  496. {
  497.   my $header= "insert into help_topic ".
  498.       "(help_topic_id,help_category_id,name,description,example) values ";
  499.   my $topic_name;
  500.   my $count= 0;
  501.   foreach $topic_name (@topic_names)
  502.   {
  503.     print_insert_header($count,$header);
  504.     my $topic= $topics{$topic_name};
  505.     print "($count,";
  506.     print "$topic->{category}->{__id__},";
  507.     print ""$topic_name",";
  508.     print ""$topic->{description}",";
  509.     print ""$topic->{example}")";
  510.     $topics{$topic_name}->{__id__}= $count;
  511.     $count++;
  512.   }
  513.   printf ";nn";
  514. }
  515. my @keywords_names= keys(%keywords);
  516. if (scalar(@keywords_names))
  517. {
  518.   my $header= "insert into help_keyword (help_keyword_id,name) values ";
  519.   my $keyword_name;
  520.   my $count= 0;
  521.   foreach $keyword_name (@keywords_names)
  522.   {
  523.     print_insert_header($count,$header);
  524.     print "($count,"$keyword_name")";
  525.     $count++;
  526.   }
  527.   printf ";nn";
  528.     
  529.   $header= "insert into help_relation ".
  530. "(help_topic_id,help_keyword_id) values ";
  531.   $count= 0;
  532.   my $count_keyword= 0;
  533.   foreach $keyword_name (@keywords_names)
  534.   {
  535.     my $topic_name;
  536.     foreach $topic_name (keys(%{$keywords{$keyword_name}}))
  537.     {
  538.       print_insert_header($count,$header);
  539.       print "($topics{$topic_name}->{__id__},$count_keyword)";
  540.       $count++;
  541.     }
  542.     $count_keyword++;
  543.   }
  544.   printf ";nn";
  545. }
  546. if ($count_errors)
  547. {
  548.   print STDERR "$count_errors errors !!!n";
  549.   exit 1;
  550. }