diff --git a/misc/maintenance/audit_database.pl b/misc/maintenance/audit_database.pl new file mode 100755 index 0000000000..d84d9af93f --- /dev/null +++ b/misc/maintenance/audit_database.pl @@ -0,0 +1,81 @@ +#!/usr/bin/perl + +use Modern::Perl; +use SQL::Translator; +use SQL::Translator::Diff; +use Getopt::Long; + +use C4::Context; + +my $filename = "./installer/data/mysql/kohastructure.sql"; + +GetOptions( + "filename=s" => \$filename, +) or die("Error in command line arguments\n"); + +if ( ! -f $filename ){ + die("Filename '$filename' does not exist\n"); +} + +my $sql_schema = get_kohastructure({ filename => $filename, }); +my $db_schema = get_db(); + +if ($sql_schema && $db_schema){ + my $diff = SQL::Translator::Diff->new({ + output_db => 'MySQL', + source_schema => $db_schema, + target_schema => $sql_schema, + no_batch_alters => 1, + })->compute_differences->produce_diff_sql; + + print $diff; + print "\n"; + print "WARNING!!!\n"; + print "These commands are only suggestions! They are not a replacement for updatedatabase.pl!\n"; + print "Review the database, updatedatabase.pl, and kohastructure.sql before making any changes!\n"; + print "\n"; +} + +sub get_db { + my $database_name = C4::Context->config("database"); + print "Parsing schema for database '$database_name'\n"; + my $dbh = C4::Context->dbh; + my $parser = SQL::Translator->new( + parser => 'DBI', + parser_args => { + dbh => $dbh, + }, + ); + my $schema = $parser->translate(); + + #NOTE: Hack the schema to remove autoincrement + #Otherwise, that difference will cause options for all tables to be reset unnecessarily + my @tables = $schema->get_tables(); + foreach my $table (@tables){ + my @new_options = (); + my $replace_options = 0; + my $options = $table->{options}; + foreach my $hashref (@$options){ + if ( $hashref->{AUTO_INCREMENT} ){ + $replace_options = 1; + } + else { + push(@new_options,$hashref); + } + } + if ($replace_options){ + @{$table->{options}} = @new_options; + } + } + return $schema; +} + +sub get_kohastructure { + my ($args) = @_; + my $filename = $args->{filename}; + print "Parsing schema for file '$filename'\n"; + my $translator = SQL::Translator->new(); + $translator->parser("MySQL"); + my $schema = $translator->translate($filename); + return $schema; +}