diff --git a/misc-scripts/test/multidb_sql.pl b/misc-scripts/test/multidb_sql.pl index 7cf901421698242af4a69aae5b1ca4c3f47ff93a..f21b92dfe562b4f420bce2e046d5838b50ff65c8 100644 --- a/misc-scripts/test/multidb_sql.pl +++ b/misc-scripts/test/multidb_sql.pl @@ -12,13 +12,14 @@ use DBI; use Getopt::Long; -my ( $host, $user, $pass, $port, $expression, $dbpattern ); +my ( $host, $user, $pass, $port, $expression, $dbpattern, $file ); GetOptions( "host=s", \$host, "user=s", \$user, "pass=s", \$pass, "port=i", \$port, "expr=s", \$expression, + "file=s", \$file, "dbpattern=s", \$dbpattern ); @@ -31,6 +32,36 @@ if( $port ) { $dsn .= ";port=$port"; } +my @expressions; + +if( $file ) { + local *FH; + if( ! -r $file ) { + die ( "File $file not readable" ); + } + open( FH, "<$file" ); + + my $exp; + + while( my $line = <FH> ) { + if( $line =~ /;$/ ) { + $line =~ s/;$//; + $exp .= " ".$line; + push( @expressions, $exp ); + $exp = ""; + + } else { + $exp .= " ".$line; + } + } + + if( $exp ) { + push( @expressions, $exp ); + } + + close FH; +} + my $db = DBI->connect( $dsn, $user, $pass ); my @dbnames = map {$_->[0] } @{ $db->selectall_arrayref( "show databases" ) }; @@ -44,14 +75,19 @@ for my $dbname ( @dbnames ) { print STDERR "$dbname\n"; - if( ! $expression ) { + if(( ! $expression ) && ( !$file )) { next; } $db->do( "use $dbname" ); - if( $expression =~ /^\s*select/i || - $expression =~ /^\s*show/i || - $expression =~ /^\s*desc/i ) { + if( $file ) { + for my $sql ( @expressions ) { + print STDERR "Do $sql\n"; + $db->do( $sql ); + } + } elsif( $expression =~ /^\s*select/i || + $expression =~ /^\s*show/i || + $expression =~ /^\s*desc/i ) { my $res = $db->selectall_arrayref( $expression ); my @results = map { join( " ", @$_ ) } @$res ; for my $result ( @results ) { @@ -73,8 +109,10 @@ sub usage { -pass password -port port_of_server optional -dbpattern regular expression that the database name has to match - -expr sql statement you want to execute. Has to be a select. + -expr sql statement you want to execute. if omitted, just print database names matching + if select, show or describe prints results + -file Apply sql in file to all databases. Doesnt print results. EOF ;