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:
parent
f2ddfd8a92
commit
78389b28e9
17
NewsStats.pm
17
NewsStats.pm
|
@ -304,13 +304,26 @@ sub OutputData {
|
|||
################################################################################
|
||||
### read database query results from DBHandle and print results with formatting
|
||||
### IN : $Format : format specifier
|
||||
### $FileName: file name template (-f): filename-YYYY-MM
|
||||
### $DBQuery : database query handle with executed query,
|
||||
### containing $Month, $Key, $Value
|
||||
### $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) {
|
||||
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);
|
||||
};
|
||||
|
||||
################################################################################
|
||||
|
|
|
@ -26,7 +26,7 @@ use DBI;
|
|||
################################# Main program #################################
|
||||
|
||||
### 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
|
||||
my %Conf = %{ReadConfig('newsstats.conf')};
|
||||
|
@ -39,7 +39,13 @@ $ConfOverride{'DBTableGrps'} = $Options{'g'} if $Options{'g'};
|
|||
### check for incompatible command line options
|
||||
# you can't mix '-t', '-b' and '-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{'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'}) {
|
||||
# drop -t
|
||||
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 ($Options{'o'} eq 'dump' and ($Options{'p'} or $Options{'a'})) {
|
||||
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");
|
||||
$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");
|
||||
$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);
|
||||
|
||||
# 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
|
||||
if ($Options{'c'}) {
|
||||
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'};
|
||||
if (!defined($Options{'b'}) and !defined($Options{'l'})) {
|
||||
# default: neither -b nor -l
|
||||
&OutputData($Options{'o'},$DBQuery,$MaxLength);
|
||||
&OutputData($Options{'o'},$Options{'f'},$DBQuery,$MaxLength);
|
||||
} elsif ($Options{'b'}) {
|
||||
# -b is set (then -l can't be!)
|
||||
# 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
|
||||
|
||||
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
|
||||
|
||||
|
@ -355,7 +365,7 @@ postings every single month will be included. Output will be ordered
|
|||
by newsgroup name, followed by month.
|
||||
|
||||
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)
|
||||
|
||||
|
@ -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
|
||||
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
|
||||
B<-d>. Output format is set to I<pretty> (see below).
|
||||
Overrides B<-t> and B<-l> and can't be used together with B<-q>, B<-d>
|
||||
or B<-f>. Output format is set to I<pretty> (see below).
|
||||
|
||||
=item B<-i> (invert)
|
||||
|
||||
|
@ -404,7 +414,10 @@ format.
|
|||
|
||||
=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)
|
||||
|
||||
|
@ -418,6 +431,20 @@ Change sort order to descending.
|
|||
|
||||
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)
|
||||
|
||||
Override I<DBTableGrps> from F<newsstats.conf>.
|
||||
|
|
Loading…
Reference in a new issue