114 lines
4.4 KiB
Perl
114 lines
4.4 KiB
Perl
#!/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; |