diff options
Diffstat (limited to 'scripts/mysql_find_rows.sh')
-rwxr-xr-x | scripts/mysql_find_rows.sh | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/scripts/mysql_find_rows.sh b/scripts/mysql_find_rows.sh new file mode 100755 index 00000000000..3d7bad3323e --- /dev/null +++ b/scripts/mysql_find_rows.sh @@ -0,0 +1,148 @@ +#!@PERL@ + +$version="1.02"; + +use Getopt::Long; + +$opt_help=$opt_Information=$opt_skip_use_db=0; +$opt_regexp=$opt_dbregexp=".*"; +$opt_start_row=1; $opt_rows=9999999999; + +GetOptions("Information","help","regexp=s","start_row=i","rows=i", + "dbregexp=s", "skip-use-db") + || usage(); +usage() if ($opt_help || $opt_Information); + +$query=$search=$database=$set=""; $eoq=0; +while (<>) +{ + next if (length($query) == 0 && /^\#/); # Skipp comments + $query.=search($_); + if ($eoq) + { + if ($query =~ /^use /i || $query =~ /^SET / || + ($query =~ /$opt_regexp/o && $database =~ /$opt_dbregexp/o)) + { + if ($opt_skip_use_db && $query =~ /^use /i) + { + $query=""; + next; + } + if ($opt_start_row <= 1) + { + if ($database) + { + print $database, $set; + $database=$set=""; + } + print $query; + last if (--$opt_rows == 0); + } + else + { + $opt_start_row--; + if ($query =~ /^use /) + { + $database=$query; + $set=""; + } + elsif ($query =~ /^SET/) + { + $set=$query; + } + else + { + $set=""; + } + } + } + $query=""; $search=""; $eoq=0; + } +} + +exit 0; + +sub search +{ + my($row)=shift; + my($i); + + for ($i=0 ; $i < length($row) ; $i++) + { + if (length($search)) + { + if (length($search) > 1) + { # Comment + next if (substr($row,$i,length($search)) ne $search); + $i+=length($search)-1; + $search=""; + } + elsif (substr($row,$i,1) eq '\\') # Escaped char in string + { + $i++; + } + elsif (substr($row,$i,1) eq $search) + { + if (substr($row,$i+1,1) eq $search) # Double " or ' + { + $i++; + } + else + { + $search=""; + } + } + next; + } + if (substr($row,$i,2) eq '/*') # Comment + { + $search="*/"; + $i++; + } + elsif (substr($row,$i,1) eq "'" || substr($row,$i,1) eq '"') + { + $search=substr($row,$i,1); + } + } + $eoq=1 if (!length($search) && $row =~ /;\s*$/); + return $row; +} + + +sub usage +{ + print <<EOF; +$0 Ver $version + +TCX Datakonsult AB, by Monty. +This software comes with NO WARRANTY: see the file PUBLIC for details. + +Prints all SQL queries that matches a regexp or contains a 'use +database' or 'set ..' command to stdout. A SQL query may contain +newlines. This is useful to find things in a MySQL update log. + +$0 takes the following options: + +--help or --Information + Shows this help + +--regexp=# + Print queries that matches this. + +--start_row=# + Start output from this row (first row = 1) + +--skip-use-db + Don\'t include \'use database\' commands in the output. + +--rows=# + Quit after this many rows. + +Example: + +$0 --regexp "problem_table" < update.log + +$0 --regexp "problem_table" update-log.1 update-log.2 +EOF + exit(0); +} |