package GenTest::Reporter::inter_backup;

require Exporter;
@ISA = qw(GenTest::Reporter);

use strict;
use GenTest;
use GenTest::Reporter;
use GenTest::Constants;

my $count = 0;
my $file = '/tmp/inter.bak';

sub monitor {
  my $reporter = shift;
  my $dsn = $reporter->dsn();

  # Execute BACKUP periodically
        my $dsn = $reporter->dsn();

        my $dbh = DBI->connect($dsn);

        unlink('/tmp/inter.bak');
        say("Executing BACKUP DATABASE.");
        $dbh->do("BACKUP DATABASE db2 TO '/tmp/inter.bak'");
        $count++;

        if (defined $dbh->err()) {
                return STATUS_DATABASE_CORRUPTION;
        } else {
                return STATUS_OK;
        }
}

my $tables;
sub report {
        my $reporter = shift;
        my $dsn = $reporter->dsn();
        my $dbh = DBI->connect($dsn);

# Check the number of tables in db before performing restore
# Note that it is not possible to check the contents of tables because
# there will be concurrent queries against this database

  $dbh = DBI->connect($dsn) if not defined $dbh;
  $tables = $dbh->selectcol_arrayref("SHOW TABLES") if not defined $tables;
  my $results;

   my $query="SELECT COUNT(table_name) FROM INFORMATION_SCHEMA.TABLES
              WHERE TABLE_SCHEMA='db2'";

 # Execute query
 my ($count_before) = $dbh->selectrow_array($query);

#################################################################
# Dump the database db2 that is being backed up by using
# mysqldump program
#################################################################

our $database = 'db2';
my $file_bak =  '/tmp/db2_dump.bak';
my $file_res= '/tmp/db2_dump_res.bak';
my $mysqldump_result = system("mysqldump --compact --order-by-primary --skip-triggers --skip-extended-insert --no-create-info --host=127.0.0.1 --port=19306 --user=root $database | sort > $file_bak");
 return STATUS_UNKNOWN_ERROR if $mysqldump_result > 0;

# PERFORM RESTORE

        say("Executing RESTORE FROM.");
        $dbh->do("RESTORE FROM '/tmp/inter.bak' OVERWRITE");

        if (defined $dbh->err()) {
                return STATUS_DATABASE_CORRUPTION;
        } else {
                return STATUS_OK;
        }


# Verify the number of tables after restore

# Execute the same query that we executed before restore

my ($count_after) = $dbh->selectrow_array($query);

my $mysqldump_result = system("mysqldump --compact --order-by-primary --skip-triggers --skip-extended-insert --no-create-info --host=127.0.0.1 --port=19306 --user=root $database | sort > $file_res");
 return STATUS_UNKNOWN_ERROR if $mysqldump_result > 0;

        my $diff_result = system("diff --unified $file_bak $file_res");
        $diff_result = $diff_result >> 8;
        return STATUS_UNKNOWN_ERROR if $diff_result > 1;

 if ($diff_result == 1)
 {
 say("Differences between the files were found after query ".$results->[0]->query());
  return STATUS_UNKNOWN_ERROR;
 }
 else
 {
 return STATUS_OK;
 }

}

sub type
{
        return REPORTER_TYPE_PERIODIC | REPORTER_TYPE_SUCCESS;
}

1;


