groupstats.pl: Add '-f' option.

Add '-f' switch to save monthly reports to a file with
a filename made up by adding year and month to template
submitted via '-f filename': filename-YYYY-MM
Modify OutputData() accordingly.
Ignore '-c' if '-f' is set.
Allow & force '-o dump' if '-f' is set even if a time
period is defined.
Change documentation accodingly.

Fixes #27.

Signed-off-by: Thomas Hochstein <thh@inter.net>
This commit is contained in:
Thomas Hochstein 2010-11-01 15:57:18 +01:00
parent f2ddfd8a92
commit 78389b28e9
2 changed files with 57 additions and 17 deletions

View file

@ -304,13 +304,26 @@ sub OutputData {
################################################################################ ################################################################################
### read database query results from DBHandle and print results with formatting ### read database query results from DBHandle and print results with formatting
### IN : $Format : format specifier ### IN : $Format : format specifier
### $DBQuery: database query handle with executed query, ### $FileName: file name template (-f): filename-YYYY-MM
### $DBQuery : database query handle with executed query,
### containing $Month, $Key, $Value ### containing $Month, $Key, $Value
### $PadGroup: padding length for newsgroups field (optional) for 'pretty' ### $PadGroup: padding length for newsgroups field (optional) for 'pretty'
my ($Format, $DBQuery,$PadGroup) = @_; my ($Format, $FileName, $DBQuery, $PadGroup) = @_;
my ($Handle, $OUT);
our $LastIteration;
while (my ($Month, $Key, $Value) = $DBQuery->fetchrow_array) { while (my ($Month, $Key, $Value) = $DBQuery->fetchrow_array) {
print &FormatOutput($Format, $Month, $Key, $Value, $PadGroup); # set output file handle
if (!$FileName) {
$Handle = *STDOUT{IO}; # set $Handle to a reference to STDOUT
} elsif (!defined($LastIteration) or $LastIteration ne $Month) {
close $OUT if ($LastIteration);
open ($OUT,sprintf('>%s-%s',$FileName,$Month)) or die sprintf("$MySelf: E: Cannot open output file '%s-%s': $!\n",$FileName,$Month);
$Handle = $OUT;
}; };
print $Handle &FormatOutput($Format, $Month, $Key, $Value, $PadGroup);
$LastIteration = $Month;
};
close $OUT if ($FileName);
}; };
################################################################################ ################################################################################

View file

@ -26,7 +26,7 @@ use DBI;
################################# Main program ################################# ################################# Main program #################################
### read commandline options ### read commandline options
my %Options = &ReadOptions('m:p:an:o:t:l:b:iscqdg:'); my %Options = &ReadOptions('m:p:an:o:t:l:b:iscqdf:g:');
### read configuration ### read configuration
my %Conf = %{ReadConfig('newsstats.conf')}; my %Conf = %{ReadConfig('newsstats.conf')};
@ -39,7 +39,13 @@ $ConfOverride{'DBTableGrps'} = $Options{'g'} if $Options{'g'};
### check for incompatible command line options ### check for incompatible command line options
# you can't mix '-t', '-b' and '-l' # you can't mix '-t', '-b' and '-l'
# -b/-l take preference over -t, and -b takes preference over -l # -b/-l take preference over -t, and -b takes preference over -l
# you can't use '-f' with '-b' or '-l'
if ($Options{'b'} or $Options{'l'}) { if ($Options{'b'} or $Options{'l'}) {
if ($Options{'f'}) {
# drop -f
warn ("$MySelf: W: You cannot save the report to monthly files when using top lists (-b) or levels (-l). Filename template '-f $Options{'f'}' was ignored.\n");
undef($Options{'f'});
};
if ($Options{'t'}) { if ($Options{'t'}) {
# drop -t # drop -t
warn ("$MySelf: W: You cannot combine thresholds (-t) and top lists (-b) or levels (-l). Threshold '-t $Options{'t'}' was ignored.\n"); warn ("$MySelf: W: You cannot combine thresholds (-t) and top lists (-b) or levels (-l). Threshold '-t $Options{'t'}' was ignored.\n");
@ -91,9 +97,11 @@ if ($Options{'a'}) {
# if time period is more than one month: set output type to '-o pretty' or '-o dumpgroup' # if time period is more than one month: set output type to '-o pretty' or '-o dumpgroup'
if ($Options{'o'} eq 'dump' and ($Options{'p'} or $Options{'a'})) { if ($Options{'o'} eq 'dump' and ($Options{'p'} or $Options{'a'})) {
if (defined($Options{'n'}) and $Options{'n'} !~ /:|\*/) { if (defined($Options{'n'}) and $Options{'n'} !~ /:|\*/) {
# just one newsgroup is defined
warn ("$MySelf: W: You cannot combine time periods (-p) with '-o dump', changing output type to '-o dumpgroup'.\n"); warn ("$MySelf: W: You cannot combine time periods (-p) with '-o dump', changing output type to '-o dumpgroup'.\n");
$Options{'o'} = 'dumpgroup'; $Options{'o'} = 'dumpgroup';
} else { } elsif (!defined($Options{'f'})) {
# more than one newsgroup - and no file output
warn ("$MySelf: W: You cannot combine time periods (-p) with '-o dump', changing output type to '-o pretty'.\n"); warn ("$MySelf: W: You cannot combine time periods (-p) with '-o dump', changing output type to '-o pretty'.\n");
$Options{'o'} = 'pretty'; $Options{'o'} = 'pretty';
} }
@ -190,6 +198,8 @@ $DBQuery->execute($StartMonth,$EndMonth,@GroupList,@Params)
or die sprintf("$MySelf: E: Can't get groups data for %s to %s from %s.%s: %s\n",$StartMonth,$EndMonth,$Conf{'DBDatabase'},$Conf{'DBTableGrps'},$DBI::errstr); or die sprintf("$MySelf: E: Can't get groups data for %s to %s from %s.%s: %s\n",$StartMonth,$EndMonth,$Conf{'DBDatabase'},$Conf{'DBTableGrps'},$DBI::errstr);
# output results # output results
# reset caption (-c) if -f is set
undef($Options{'c'}) if $Options{'f'};
# print caption (-c) with time period if -m or -p is set # print caption (-c) with time period if -m or -p is set
if ($Options{'c'}) { if ($Options{'c'}) {
if ($Options{'p'}) { if ($Options{'p'}) {
@ -204,7 +214,7 @@ printf ("----- Newsgroups: %s\n",join(',',split(/:/,$Newsgroups))) if $Options{'
printf ("----- Threshold: %s %u\n",$Options{'i'} ? '<' : '>',$Options{'t'}) if $Options{'c'} and $Options{'t'}; printf ("----- Threshold: %s %u\n",$Options{'i'} ? '<' : '>',$Options{'t'}) if $Options{'c'} and $Options{'t'};
if (!defined($Options{'b'}) and !defined($Options{'l'})) { if (!defined($Options{'b'}) and !defined($Options{'l'})) {
# default: neither -b nor -l # default: neither -b nor -l
&OutputData($Options{'o'},$DBQuery,$MaxLength); &OutputData($Options{'o'},$Options{'f'},$DBQuery,$MaxLength);
} elsif ($Options{'b'}) { } elsif ($Options{'b'}) {
# -b is set (then -l can't be!) # -b is set (then -l can't be!)
# we have to read in the query results ourselves, as they do not have standard layout # we have to read in the query results ourselves, as they do not have standard layout
@ -236,7 +246,7 @@ groupstats - create reports on newsgroup usage
=head1 SYNOPSIS =head1 SYNOPSIS
B<groupstats> [B<-Vhiscqd>] [B<-m> I<YYYY-MM> | B<-p> I<YYYY-MM:YYYY-MM> | B<-a>] [B<-n> I<newsgroup(s)>] [B<-t> I<threshold>] [B<-l> I<level>] [B<-b> I<number>] [B<-o> I<output type>] [B<-g> I<database table>] B<groupstats> [B<-Vhiscqd>] [B<-m> I<YYYY-MM> | B<-p> I<YYYY-MM:YYYY-MM> | B<-a>] [B<-n> I<newsgroup(s)>] [B<-t> I<threshold>] [B<-l> I<level>] [B<-b> I<number>] [B<-o> I<output type>] [B<-f> I<filename template>] [B<-g> I<database table>]
=head1 REQUIREMENTS =head1 REQUIREMENTS
@ -355,7 +365,7 @@ postings every single month will be included. Output will be ordered
by newsgroup name, followed by month. by newsgroup name, followed by month.
This setting will be ignored if B<-b> is set. Overrides B<-t> and This setting will be ignored if B<-b> is set. Overrides B<-t> and
can't be used together with B<-q> or B<-d>. can't be used together with B<-q>, B<-d> or B<-f>.
=item B<-b> I<n> (best of) =item B<-b> I<n> (best of)
@ -364,8 +374,8 @@ whole reporting period. Can be inverted by the B<-i> switch so that a
list of the I<n> newsgroups with the least postings over the whole list of the I<n> newsgroups with the least postings over the whole
period is generated. Output will be ordered by sum of postings. period is generated. Output will be ordered by sum of postings.
Overrides B<-t> and B<-l> and can't be used together with B<-q> or Overrides B<-t> and B<-l> and can't be used together with B<-q>, B<-d>
B<-d>. Output format is set to I<pretty> (see below). or B<-f>. Output format is set to I<pretty> (see below).
=item B<-i> (invert) =item B<-i> (invert)
@ -404,7 +414,10 @@ format.
=item B<-c> (captions) =item B<-c> (captions)
Add captions to output (reporting period, newsgroups list, threshold). Add captions to output (reporting period, newsgroups list, threshold
and so on).
This setting will be ignored if B<-f> is set.
=item B<-q> (quantity of postings) =item B<-q> (quantity of postings)
@ -418,6 +431,20 @@ Change sort order to descending.
Cannot be used with B<-l> or B<-b>. Cannot be used with B<-l> or B<-b>.
=item B<-f> I<filename template> (output file)
Save output to file instead of dumping it to STDOUT. B<groupstats>
will create one file for each month, with filenames composed by
adding year and month to the I<filename template>, for example
with B<-f> I<stats>:
stats-2010-01
stats-2010-02
... and so on
This setting will be ignored if B<-l> or B<-b> is set. Output format
is set to I<dump> (see above).
=item B<-g> I<table> (postings per group table) =item B<-g> I<table> (postings per group table)
Override I<DBTableGrps> from F<newsstats.conf>. Override I<DBTableGrps> from F<newsstats.conf>.