#!/usr/bin/perl
+###############################################################################
+=pod
+
+=item B<reporter> --analyst "Analyst Name" --report_title "Report Title"
+
+Generates an asciidoc file in the git working directory that can be converted to
+any appropriate format. The analyst and report parameters are required.
+
+Optional parameters are :
+
+--added_page_title and --added_page_file
+
+If one is used both must be. The added page file can be plain text or asciidoc. This
+adds an extra arbitrary page of notes to the report. Mig assumes the page file is in the mig git directory.
+
+--tags
+
+This will define a set of tags to use, if not set it will default to Circs,
+Holds, Actors, Bibs, Assets & Money.
+
+--debug on
+
+Gives more information about what is happening. Defaults to off.
+
+--reports_xml
+
+Allows you to override the default evergreen_staged_report.xml in the mig-xml folder.
+
+--captions on OR --captions off
+
+Adds the captions tag to asciidoc header to turn off captions in generated output.
+Defaults to off.
+
+=back
+
+=cut
+
+###############################################################################
+
use strict;
use warnings;
);
use Pod::Usage;
use Switch;
+use Getopt::Long;
use Cwd 'abs_path';
+use Cwd qw(getcwd);
use FindBin;
my $mig_bin = "$FindBin::Bin/";
use lib "$FindBin::Bin/";
use open ':encoding(utf8)';
pod2usage(-verbose => 2) if defined $ARGV[0] && $ARGV[0] eq '--help';
+pod2usage(-verbose => 1) if ! $ARGV[1];
my $analyst;
-my $next_arg_is_analyst;
my $report_title;
-my $next_arg_is_report_title;
my $reports_xml;
-my $next_arg_is_reports_xml;
my $tags;
-my $next_arg_is_tags;
my $added_page_title;
-my $next_arg_is_added_page_title;
my $added_page_file;
-my $next_arg_is_added_page_file;
+my $captions = 'off';
my $i = 0;
my $parser = XML::LibXML->new();
my $lines_per_page = 42;
+my $debug = 'off';
+my $workbook;
+my $fh;
+
+my $ret = GetOptions(
+ 'analyst:s' => \$analyst,
+ 'report_title:s' => \$report_title,
+ 'reports_xml:s' => \$reports_xml,
+ 'tags:s' => \$tags,
+ 'added_page_title:s' => \$added_page_title,
+ 'added_page_file:s' => \$added_page_file,
+ 'captions:s' => \$captions,
+ 'debug:s' => \$debug
+);
-foreach my $arg (@ARGV) {
- if ($arg eq '--report_title') {
- $next_arg_is_report_title = 1;
- next;
- }
- if ($next_arg_is_report_title) {
- $report_title = $arg;
- $next_arg_is_report_title = 0;
- next;
- }
- if ($arg eq '--analyst') {
- $next_arg_is_analyst = 1;
- next;
- }
- if ($next_arg_is_analyst) {
- $analyst = $arg;
- $next_arg_is_analyst = 0;
- next;
- }
- if ($arg eq '--reports_xml') {
- $next_arg_is_reports_xml = 1;
- next;
- }
- if ($next_arg_is_reports_xml) {
- $reports_xml = $arg;
- $next_arg_is_reports_xml = 0;
- next;
- }
- if ($arg eq '--tags') {
- $next_arg_is_tags = 1;
- next;
- }
- if ($next_arg_is_tags) {
- $tags = $arg;
- $next_arg_is_tags = 0;
- next;
- }
- if ($arg eq '--added_page_title') {
- $next_arg_is_added_page_title = 1;
- next;
- }
- if ($next_arg_is_added_page_title) {
- $added_page_title = $arg;
- $next_arg_is_added_page_title = 0;
- next;
- }
- if ($arg eq '--added_page_file') {
- $next_arg_is_added_page_file = 1;
- next;
- }
- if ($next_arg_is_added_page_file) {
- $added_page_file = $arg;
- $next_arg_is_added_page_file = 0;
- next;
- }
-}
-
-if (!defined $tags) {$tags = 'Circs.Holds.Actors.Bibs.Assets.Money'};
-if (!defined $analyst) { abort('--analyst must be supplied'); }
+if (!defined $tags) {$tags = 'circs.holds.actors.bibs.assets.money.notices'};
if (!defined $report_title) { abort('--report_title must be supplied'); }
+if (!defined $analyst) { abort('--analyst must be supplied'); }
my $mig_path = abs_path($0);
$mig_path =~ s|[^/]+$||;
-if (!defined $reports_xml) { $reports_xml = $mig_path . '../mig-xml/evergreen_staged_report.xml'; }
- else { $reports_xml = $mig_path . '/../mig-xml/' . $reports_xml; }
-print "$reports_xml \n";
+$reports_xml = find_xml($reports_xml,$mig_path);
+if (!defined $reports_xml) { abort("Can not find xml reports file."); }
my $dom = $parser->parse_file($reports_xml);
if (defined $added_page_file or defined $added_page_title) {
abort('must specify --added_page_file and --added_page_title') unless defined $added_page_file and defined $added_page_title;
}
if (defined $added_page_file) { $added_page_file = $MIGGITDIR . $added_page_file; }
-if ($MIGSCHEMA eq 'full') { $MIGSCHEMA = ''; }
my $dbh = Mig::db_connect();
my $report_file = create_report_name($report_title);
$report_file = $MIGGITDIR . $report_file;
-my $mig_func_schema = $MIGSCHEMA;
-
-open(my $fh, '>', $report_file) or die "Could not open output file!";
-write_title_page($report_title,$fh,$analyst);
+open($fh, '>', $report_file) or abort("Could not open output file $report_file!");
+write_title_page($report_title,$fh,$analyst,$captions);
if (defined $added_page_file and defined $added_page_title) {
print $fh "<<<\n";
print $fh "== $added_page_title\n";
print "$added_page_file\t$added_page_title\n";
- open(my $an,'<:encoding(UTF-8)', $added_page_file) or die "Could not open $added_page_file !";
+ open(my $an,'<:encoding(UTF-8)', $added_page_file) or abort("Could not open $added_page_file!");
while ( my $line = <$an> ) {
print $fh $line;
}
my $fdrop = $func->findvalue('./drop');
my $fcreate = $func->findvalue('./create');
my $fname = $func->findvalue('./name');
- $fdrop =~ s/mig_func_schema/$mig_func_schema/g;
- $fcreate =~ s/mig_func_schema/$mig_func_schema/g;
my $sdrop = $dbh->prepare($fdrop);
my $screate = $dbh->prepare($fcreate);
print "dropping function $fname ... ";
$screate->execute();
}
-
-
+$tags = lc($tags);
my @report_tags = split(/\./,$tags);
foreach my $t (@report_tags) {
print "\n\n=========== Starting to process tag $t\n";
- print "==========================================\n";
- print_section_header(ucfirst($t),$fh);
+ print "==========================================\n\n";
+
+ my @asset_files;
+ foreach my $asset ($dom->findnodes('//asset')) {
+ if (index($asset->findvalue('./tag'),$t) != -1) {
+ push @asset_files, $asset->findvalue('./file');
+ }
+ }
+
+ foreach my $fname (@asset_files) {
+ my $asset_path = $mig_path . '../mig-asc/' . $fname;
+ open my $a, $asset_path or abort("Could not open $fname.");
+ while ( my $l = <$a> ) {
+ print $fh $l;
+ }
+ print $fh "<<<\n";
+ }
+
+ print_section_header(ucfirst($t),$fh);
my $linecount = $lines_per_page;
my $r;
- my @report_names;
+ undef @asset_files;
+ foreach my $asset ($dom->findnodes('//asset')) {
+ if (index($asset->findvalue('./tag'),$t) != -1) {
+ push @asset_files, $asset->findvalue('./file');
+ }
+ }
+ my @report_names;
foreach my $report ($dom->findnodes('//report')) {
if (index($report->findvalue('./tag'),$t) != -1 and $report->findvalue('./iteration') eq '0') {
push @report_names, $report->findvalue('./name');
}
}
-
- print Dumper(@report_names);
#only has one level of failover now but could change to array of hashes and loops
+ #but this keeps it simple and in practice I haven't needed more than two
+
+
foreach my $rname (@report_names) {
my %report0;
my %report1;
my $check_tables0;
my $check_tables1;
- print "\nchecking for $rname ... ";
- %report0 = find_report($dom,$t,$rname,'0');
- $check_tables0 = check_table($report0{query},$MIGSCHEMA);
- if ($check_tables0 == 1) {
- $r = print_query($fh,%report0);
- } else {
- %report1 = find_report($dom,$t,$rname,'1');
- if (defined $report1{query}) {
- $check_tables1 = check_table($report1{query},$MIGSCHEMA);
- if ($check_tables1 == 1) {$r = print_query($fh,%report1);}
+ if ($debug eq 'on') {print "\nchecking for $rname ... ";}
+ %report0 = find_report($dom,$t,$rname,'0',$debug);
+ $check_tables0 = check_table($report0{query},$MIGSCHEMA,$debug,$rname);
+ if ($check_tables0 == 1) { $r = print_query($fh,%report0); } else {
+ %report1 = find_report($dom,$t,$rname,'1',$debug);
+ if (defined $report1{query}) {
+ $check_tables1 = check_table($report1{query},$MIGSCHEMA,$debug,$rname);
+ if ($check_tables1 == 1) { $r = print_query($fh,%report1); }
}
}
}
+
}
-# end of main logic
print "\n";
+
close $fh;
+############ end of main logic
+
+sub find_xml {
+ my $reports_xml = shift;
+ my $mig_path = shift;
+
+ if ($reports_xml =~ m/\//) { return $reports_xml; }
+
+ my $mig_test_file = $mig_path . '/../mig-xml/' . $reports_xml;
+ my $working_test_dir = getcwd();
+ my $working_test_file = $working_test_dir . '/' . $reports_xml;
+
+ if (-e $mig_test_file) { return $mig_test_file; }
+ if (-e $working_test_file) { return $working_test_file; }
+
+ return undef;
+}
+
sub find_report {
my $dom = shift;
my $tag = shift;
my $name = shift;
my $iteration = shift;
+ my $debug = shift;
my %report;
- print "iteration $iteration ";
+ if ($debug eq 'on') {print "iteration $iteration ";}
foreach my $node ($dom->findnodes('//report')) {
if ($node->findvalue('./tag') =~ $tag and $node->findvalue('./iteration') eq $iteration and $node->findvalue('./name') eq $name) {
- print "succeeded ... ";
+ if ($debug eq 'on') {print "succeeded ... \n";}
%report = (
name => $node->findvalue('./name'),
report_title => $node->findvalue('./report_title'),
return %report;
}
}
- print "failed ... ";
+ if ($debug eq 'on') {print "failed ... \n";}
return %report = (
name => "eaten by grue"
);
sub print_section_header {
my $t = shift;
my $fh = shift;
+
$t =~ s/_/ /g;
#$t =~ s/(\w+)/\u$1/g;;
print $fh "<<<\n";
print $fh "== $t Reports\n";
+ return;
}
sub create_report_name {
my $rt = shift;
+
my @abbr = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
my $date = $year . '_' . $abbr[$mon] . '_' . $mday;
- my $report_file = $rt . ' ' . $date . '.asciidoc';
+ my $report_file;
+ $report_file = $rt . ' ' . $date . '.asciidoc';
$report_file =~ s/ /_/g;
return $report_file;
}
my $rt = shift;
my $fh = shift;
my $a = shift;
+ my $captions = shift;
my @abbr = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
my $l = length($report_title);
print $fh "= $rt\n";
print $fh "$mday $abbr[$mon] $year\n";
print $fh "$a\n";
- print $fh ":title-logo-image: image::eolilogosmall.png[pdfwidth=3in]\n";
+ #print $fh ":title-logo-image: image::eolilogosmall.png[pdfwidth=3in]\n";
print $fh ":toc:\n";
+ if ($captions eq 'on') { print $fh ":caption:\n"; }
print $fh "\n";
}
sub check_table {
my $query = shift;
my $MIGSCHEMA = shift;
+ my $debug = shift;
+ my $report_name = shift;
- my $i = 0;
+ if ($debug eq 'on') {print "$query\n";}
+
+ my $i;
my $return_flag = 1;
my @qe = split(/ /,$query);
- my @tables = grep /MIGSCHEMA/, @qe;
+ $i = @qe;
+ $i--;
+ my @tables;
+ while ($i > -1) {
+ if ($qe[$i] eq 'FROM' or $qe[$i] eq 'JOIN') {
+ my $q = $i + 1;
+ if ($qe[$q] ne '(SELECT') {
+ push @tables, $qe[$q];
+ }
+ }
+ $i--;
+ }
+ if ($debug eq 'on') {print "checking tables ... ";}
- print "checking tables ... ";
+ $i = 0;
foreach my $table (@tables) {
- $table =~ s/MIGSCHEMA.//g;
- $table =~ s/\)//g;
- $table =~ s/\<//g;
- my $sql = 'SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = \'' . $MIGSCHEMA . '\' AND table_name = \'' . $table . '\');';
+ my $sql;
+ my $schema;
+ if (index($table,'.') != -1) {
+ $schema = (split /\./,$table)[0];
+ $table = (split /\./,$table)[1];
+ }
+ $table = clean_query_string($table);
+ if (defined $schema) {
+ $schema = clean_query_string($schema);
+ $sql = 'SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = \'' . $schema . '\' AND table_name = \'' . $table . '\');';
+ } else {
+ $sql = 'SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = \'' . $MIGSCHEMA . '\' AND table_name = \'' . $table . '\');';
+ }
my $sth = $dbh->prepare($sql);
$sth->execute();
while (my @row = $sth->fetchrow_array) {
next;
} else {
$return_flag = 0;
+ if ($debug eq 'on') {print "detecting $table failed...\n";}
}
if ($row[0] eq '0') {$return_flag = 0;}
}
}
- if ($return_flag == 1) {print "succeeded ... ";} else {print "failed ... ";}
+ if ($return_flag == 1 and $debug eq 'on') {print "succeeded ...\n";}
+ if ($return_flag == 0) {print "! a table failed the find test for report $report_name\n\n";}
return $return_flag;
}
+sub clean_query_string {
+ my $str = shift;
+
+ $str =~ s/(?!_)[[:punct:]]//g; #remove punct except underscores
+ $str =~ s/\n//g;
+ $str =~ s/\r//g;
+ return $str;
+}
+
sub print_query {
my $fh = shift;
my %report = @_;
my $query = $report{query};
- $query =~ s/MIGSCHEMA/$MIGSCHEMA/g;
- $query =~ s/mig_func_schema/$mig_func_schema/g;
my $sth = $dbh->prepare($query);
$sth->execute();
my $h_length = @h;
my $h_count = 1;
while ($h_count <= $h_length) {
- print $fh "|$h[$h_count-1] ";
+ print $fh "|*$h[$h_count-1]* ";
$h_count++;
}
print $fh "\n";
print "successfully wrote output for $report{name}.\n\n";
}
+sub give_column {
+ my $i = shift;
+ my $col = "";
+
+ do {
+ $col .= chr( ( $i % 26 ) + ord('A') );
+ $i = int( $i / 26 ) - 1;
+ } while ( $i >= 0 );
+
+ return scalar reverse $col;
+}
+
sub abort {
my $msg = shift;
print STDERR "$0: $msg", "\n";