mysql_find_rows.pl
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:3k
源码类别:

模拟服务器

开发平台:

C/C++

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