home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win.exe / DATA1.CAB / Examples / scripts / mysql_find_rows.pl next >
Perl Script  |  2000-11-22  |  3KB  |  149 lines

  1. #!/my/gnu/bin/perl5
  2.  
  3. $version="1.02";
  4.  
  5. use Getopt::Long;
  6.  
  7. $opt_help=$opt_Information=$opt_skip_use_db=0;
  8. $opt_regexp=$opt_dbregexp=".*";
  9. $opt_start_row=1; $opt_rows=9999999999;
  10.  
  11. GetOptions("Information","help","regexp=s","start_row=i","rows=i",
  12.        "dbregexp=s", "skip-use-db")
  13.   || usage();
  14. usage() if ($opt_help || $opt_Information);
  15.  
  16. $query=$search=$database=$set=""; $eoq=0;
  17. while (<>)
  18. {
  19.   next if (length($query) == 0 && /^\#/); # Skipp comments
  20.   $query.=search($_);
  21.   if ($eoq)
  22.   {
  23.     if ($query =~ /^use /i || $query =~ /^SET / ||
  24.     ($query =~ /$opt_regexp/o && $database =~ /$opt_dbregexp/o))
  25.     {
  26.       if ($opt_skip_use_db && $query =~ /^use /i)
  27.       {
  28.     $query="";
  29.     next;
  30.       }
  31.       if ($opt_start_row <= 1)
  32.       {
  33.     if ($database)
  34.     {
  35.       print $database, $set;
  36.       $database=$set="";
  37.     }
  38.     print $query;
  39.     last if (--$opt_rows == 0);
  40.       }
  41.       else
  42.       {
  43.     $opt_start_row--;
  44.     if ($query =~ /^use /)
  45.     {
  46.       $database=$query;
  47.       $set="";
  48.     }
  49.     elsif ($query =~ /^SET/)
  50.     {
  51.       $set=$query;
  52.     }
  53.     else
  54.     {
  55.       $set="";
  56.     }
  57.       }
  58.     }
  59.     $query=""; $search=""; $eoq=0;
  60.   }
  61. }
  62.  
  63. exit 0;
  64.  
  65. sub search
  66. {
  67.   my($row)=shift;
  68.   my($i);
  69.  
  70.   for ($i=0 ; $i < length($row) ; $i++)
  71.   {
  72.     if (length($search))
  73.     {
  74.       if (length($search) > 1)
  75.       {                # Comment
  76.     next if (substr($row,$i,length($search)) ne $search);
  77.     $i+=length($search)-1;
  78.     $search="";
  79.       }
  80.       elsif (substr($row,$i,1) eq '\\') # Escaped char in string
  81.       {
  82.     $i++;
  83.       }
  84.       elsif (substr($row,$i,1) eq $search)
  85.       {
  86.     if (substr($row,$i+1,1) eq $search)    # Double " or '
  87.     {
  88.       $i++;
  89.     }
  90.     else
  91.     {
  92.       $search="";
  93.     }
  94.       }
  95.       next;    
  96.     }
  97.     if (substr($row,$i,2) eq '/*')    # Comment
  98.     {
  99.       $search="*/";
  100.       $i++;
  101.     }
  102.     elsif (substr($row,$i,1) eq "'" || substr($row,$i,1) eq '"')
  103.     {
  104.       $search=substr($row,$i,1);
  105.      }
  106.   }
  107.   $eoq=1 if (!length($search) && $row =~ /;\s*$/);
  108.   return $row;
  109. }
  110.  
  111.  
  112. sub usage
  113. {
  114.     print <<EOF;
  115. $0  Ver $version
  116.  
  117. TCX Datakonsult AB, by Monty.
  118. This software comes with NO WARRANTY: see the file PUBLIC for details.
  119.  
  120. Prints all SQL queries that matches a regexp or contains a 'use
  121. database' or 'set ..' command to stdout.  A SQL query may contain
  122. newlines.  This is useful to find things in a MySQL update log.
  123.  
  124. $0 takes the following options:
  125.  
  126. --help or --Information
  127.   Shows this help
  128.  
  129. --regexp=#
  130.   Print queries that matches this.
  131.  
  132. --start_row=#
  133.   Start output from this row (first row = 1)
  134.  
  135. --skip-use-db
  136.   Don\'t include \'use database\' commands in the output.
  137.  
  138. --rows=#
  139.   Quit after this many rows.
  140.  
  141. Example:
  142.  
  143. $0 --regexp "problem_table" < update.log
  144.  
  145. $0 --regexp "problem_table" update-log.1 update-log.2
  146. EOF
  147.   exit(0);
  148. }
  149.