Files
scripts/dbcompare.pl
2025-06-03 23:03:08 +02:00

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;