#!/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;