first commit
This commit is contained in:
114
dbcompare.pl
Normal file
114
dbcompare.pl
Normal file
@@ -0,0 +1,114 @@
|
||||
#!/usr/bin/perl -w
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use DBI;
|
||||
use Data::Dumper;
|
||||
use JSON;
|
||||
use Getopt::Long;
|
||||
use File::Slurp qw(:std);
|
||||
use Term::ANSIColor;
|
||||
|
||||
my $inhalt; # Refrenztdaten aus der JSON Datei
|
||||
my $write = 0; # Parameter zum schreiben der Datei
|
||||
my $fileexist = 1; # Existiert die angegene Datei nicht wird sie zu 0 und eine Meldung erscheint
|
||||
my $db = ""; # Datenbankparameter
|
||||
my $user = ""; # Datenbankuser
|
||||
my $pass = ""; # Datenbankpasswort
|
||||
my $file = ""; # Referenzdatei
|
||||
my $server = ""; # Datenbankserver
|
||||
my $result = ""; # ergebnis des Vergleichens
|
||||
|
||||
my %h = ('write' => \$write, 'db' => \$db, 'user' => \$user, 'pass' => \$pass, 'file' => \$file, 'server' => \$server);
|
||||
my $tref;
|
||||
my @tabletmp;
|
||||
GetOptions (\%h, 'write=i', 'db=s', 'user=s', 'pass=s', 'file=s', 'server=s');
|
||||
|
||||
if ( $db eq "" || $user eq "" || $user eq "" || $file eq "" || $server eq "" ) {
|
||||
print "Willkommen zum Vergleich von einer Mysqldatenbank mit einer Refrenzdatei im JSON Format\n";
|
||||
print "es fehlen folgende Parameter\n";
|
||||
print "\n";
|
||||
print "--server -s = Datenbankserver\n" if ($server eq "");
|
||||
print "--db -d = Datenbankname\n" if ($db eq "");
|
||||
print "--user -u = Datenbankuser\n" if ($user eq "");
|
||||
print "--pass -p = Datenbankpasswort\n" if ($pass eq "");
|
||||
print "--file -f = Datei mit Pfadangabe als Referenz\n" if ($file eq "");
|
||||
print "--write -w = über/Schreibt die Refrenzdatei noch im Scriptordner\n" if ($write eq "");
|
||||
exit;
|
||||
}
|
||||
|
||||
my $dbh = DBI->connect("DBI:mysql:$db:$server", $user, $pass)
|
||||
#my $dbh = DBI->connect('DBI:mysql:prod:ares', 'root', 'jagger')
|
||||
or die "Couldn't connect to database: " . DBI->errstr;
|
||||
|
||||
#my @s1 = $dbh->selectall_arrayref("SHOW TABLE STATUS FROM `ats`;", { Slice => {} });
|
||||
my $s1 = $dbh->selectall_arrayref("SHOW FULL TABLES FROM $db;", { Slice => {} });
|
||||
|
||||
# Datei einlesen
|
||||
my $fi = read_file( $file, err_mode => "quiet");
|
||||
|
||||
if ( $fi ) {
|
||||
$inhalt = decode_json($fi);
|
||||
} else {
|
||||
$fileexist = 0;
|
||||
}
|
||||
|
||||
for my $tab ( @{$s1} ) {
|
||||
my $n = $tab->{"Tables_in_$db"};
|
||||
my $s2 = $dbh->selectall_arrayref("DESCRIBE $db.$n" , { Slice => {} });
|
||||
my @tabelle;
|
||||
|
||||
for my $s ( @{$s2} ) {
|
||||
my $f = $s->{Field};
|
||||
$tref->{ $n }->{$f}->{Type} = $s->{Type};
|
||||
$tref->{ $n }->{$f}->{Null} = $s->{Null};
|
||||
$tref->{ $n }->{$f}->{Key} = $s->{Key};
|
||||
$tref->{ $n }->{$f}->{Default} = $s->{Default};
|
||||
$tref->{ $n }->{$f}->{Extra} = $s->{Extra};
|
||||
|
||||
push @tabelle, $s;
|
||||
}
|
||||
push @tabletmp, { 'name' => $n , "col" => [ @tabelle] };
|
||||
}
|
||||
|
||||
for my $ref ( @{$inhalt} ) {
|
||||
my $resulttemp = "";
|
||||
my $name = $ref->{name};
|
||||
for my $col ( @{$ref->{col}} ) {
|
||||
#print Dumper($col, $tref->{ $name }->{$col->{Field}}->{Default}, $tref->{ $name }->{$col->{Field}}->{Key}, $tref->{ $name }->{$col->{Field}}->{Type}, $tref->{ $name }->{$col->{Field}}->{Extra});
|
||||
my $defaultref = defined $col->{Default} ? $col->{Default} : 'Null';
|
||||
my $default = defined $tref->{ $name }->{$col->{Field}}->{Default} ? $tref->{ $name }->{$col->{Field}}->{Default} : 'Null';
|
||||
|
||||
if ( $defaultref ne $default ) {
|
||||
$resulttemp .= "column: $col->{Field} Default: \t\t $defaultref \t $default\n";
|
||||
}
|
||||
if ( $col->{Key} ne $tref->{ $name }->{$col->{Field}}->{Key} ) {
|
||||
$resulttemp .= "column: $col->{Field} Key: \t\t $col->{Key} \t $tref->{ $name }->{$col->{Field}}->{Key}\n";
|
||||
}
|
||||
if ( $col->{Type} ne $tref->{ $name }->{$col->{Field}}->{Type} ) {
|
||||
$resulttemp .= "column: $col->{Field} Type: \t\t $col->{Type} \t $tref->{ $name }->{$col->{Field}}->{Type}\n";
|
||||
}
|
||||
if ( $col->{Extra} ne $tref->{ $name }->{$col->{Field}}->{Extra} ) {
|
||||
$resulttemp .= "column: $col->{Field} Extra: \t\t $col->{Extra} \t $tref->{ $name }->{$col->{Field}}->{Extra}\n";
|
||||
}
|
||||
if ( $col->{Null} ne $tref->{ $name }->{$col->{Field}}->{Null} ) {
|
||||
$resulttemp .= "column: $col->{Field} Null: \t\t $col->{Null} \t $tref->{ $name }->{$col->{Field}}->{Null}\n";
|
||||
}
|
||||
}
|
||||
if ( $resulttemp ne "" ) {
|
||||
$result .= "table: $name\n";
|
||||
$result .= $resulttemp;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ( $write == 1 || $fileexist == 0 ) {
|
||||
write_file($file, encode_json(\@tabletmp) );
|
||||
print "Die angegebene Datei existiert nicht und wird erstellt\n" if ( $fileexist == 0 );
|
||||
print "Datei $file wurde geschrieben\n";
|
||||
} else {
|
||||
print $result eq "" ? "Alles bestens, keine Unterschiede gefunden\n" : $result;
|
||||
}
|
||||
|
||||
$dbh->disconnect;
|
||||
1;
|
||||
Reference in New Issue
Block a user