################################# Main program #################################
### read commandline options
-my %Options = &ReadOptions('m:p:n:o:t:l:b:iscqdg:');
+my %Options = &ReadOptions('m:p:an:o:t:l:b:iscqdg:');
### read configuration
my %Conf = %{ReadConfig('newsstats.conf')};
warn ("$MySelf: W: Output type forced to '-o pretty' due to usage of '-l'.\n");
};
-### get time period
-my ($StartMonth,$EndMonth) = &GetTimePeriod($Options{'m'},$Options{'p'});
-# reset to one month for 'dump' output type
-if ($Options{'o'} eq 'dump' and $Options{'p'}) {
- warn ("$MySelf: W: You cannot combine time periods (-p) with '-o dump', changing output type to '-o pretty'.\n");
- $Options{'o'} = 'pretty';
-};
-
### init database
my $DBHandle = InitDB(\%Conf,1);
+### get time period
+my ($StartMonth,$EndMonth);
+# if '-a' is set, set start/end month from database
+# FIXME - it doesn't make that much sense to get first/last month from database to query it
+# with a time period that equals no time period ...
+if ($Options{'a'}) {
+ undef($Options{'m'});
+ undef($Options{'p'});
+ my $DBQuery = $DBHandle->prepare(sprintf("SELECT MIN(month),MAX(month) FROM %s.%s",$Conf{'DBDatabase'},$Conf{'DBTableGrps'}));
+ $DBQuery->execute or die sprintf("$MySelf: E: Can't get MIN/MAX month from %s.%s: %s\n",$Conf{'DBDatabase'},$Conf{'DBTableGrps'},$DBI::errstr);
+ ($StartMonth,$EndMonth) = $DBQuery->fetchrow_array;
+} else {
+ ($StartMonth,$EndMonth) = &GetTimePeriod($Options{'m'},$Options{'p'});
+};
+# 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'} !~ /:|\*/) {
+ warn ("$MySelf: W: You cannot combine time periods (-p) with '-o dump', changing output type to '-o dumpgroup'.\n");
+ $Options{'o'} = 'dumpgroup';
+ } else {
+ warn ("$MySelf: W: You cannot combine time periods (-p) with '-o dump', changing output type to '-o pretty'.\n");
+ $Options{'o'} = 'pretty';
+ }
+};
+
### create report
# get list of newsgroups (-n)
my ($QueryGroupList,$QueryThreshold,@GroupList,@Params);
# according to setting of -s
my $WhereClause = sprintf('month BETWEEN ? AND ? AND %s AND %s %s',$QueryGroupList,$QueryThreshold,&SQLHierarchies($Options{'s'}));
-# get lenght of longest newsgroup delivered by query for formatting purposes
+# get length of longest newsgroup delivered by query for formatting purposes
# FIXME
my $MaxLength = &GetMaxLenght($DBHandle,$Conf{'DBTableGrps'},'newsgroup',$WhereClause,$StartMonth,$EndMonth,(@GroupList,@Params));
$DBQuery = $DBHandle->prepare(sprintf("SELECT month,newsgroup,postings FROM %s.%s WHERE %s ORDER BY month,%s",$Conf{'DBDatabase'},$Conf{'DBTableGrps'},$WhereClause,$OrderClause));
} elsif ($Options{'b'}) {
# -b is set (then -l can't be!)
- # set sorting order (-i)
+ # set sorting order (-i): top or flop list?
if ($Options{'i'}) {
$OrderClause = 'postings';
} else {
$DBQuery = $DBHandle->prepare(sprintf("SELECT newsgroup,SUM(postings) AS postings FROM %s.%s WHERE %s GROUP BY newsgroup ORDER BY %s,newsgroup LIMIT ?",$Conf{'DBDatabase'},$Conf{'DBTableGrps'},$WhereClause,$OrderClause));
} else {
# -l must be set now, as all other cases have been taken care of
- # set sorting order (-i)
+ # which kind of level (-i): more than -l x or less than -l x?
my ($Level);
if ($Options{'i'}) {
$Level = '<';
} else {
$Level = '>';
};
- # push level and $StartMonth,$EndMonth - again - to Params
- # FIXME -- together with the query (see below)
- push @Params,$Options{'l'};
- push @Params,$StartMonth,$EndMonth;
- # prepare query: get number of postings per group from groups table for given months and
- # FIXME -- this query is ... in dire need of impromevent
- $DBQuery = $DBHandle->prepare(sprintf("SELECT month,newsgroup,postings FROM %s.%s WHERE newsgroup IN (SELECT newsgroup FROM %s.%s WHERE %s GROUP BY newsgroup HAVING MAX(postings) %s ?) AND %s ORDER BY newsgroup,month",$Conf{'DBDatabase'},$Conf{'DBTableGrps'},$Conf{'DBDatabase'},$Conf{'DBTableGrps'},$WhereClause,$Level,$WhereClause));
+ # prepare and execute query: get list of newsgroups meeting level condition
+ $DBQuery = $DBHandle->prepare(sprintf("SELECT newsgroup FROM %s.%s WHERE %s GROUP BY newsgroup HAVING MAX(postings) %s ?",$Conf{'DBDatabase'},$Conf{'DBTableGrps'},$WhereClause,$Level));
+ $DBQuery->execute($StartMonth,$EndMonth,@GroupList,$Options{'l'})
+ 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);
+ # add newsgroups to a comma-seperated list ready for IN(...) query
+ my $GroupList;
+ while (my ($Newsgroup) = $DBQuery->fetchrow_array) {
+ $GroupList .= ',' if (defined($GroupList) and $GroupList ne '');
+ $GroupList .= "'$Newsgroup'";
+ };
+ $DBQuery = $DBHandle->prepare(sprintf("SELECT month,newsgroup,postings FROM %s.%s WHERE newsgroup IN (%s) AND %s ORDER BY newsgroup,month",$Conf{'DBDatabase'},$Conf{'DBTableGrps'},$GroupList,$WhereClause));
};
# execute query
# output results
# print caption (-c) with time period if -m or -p is set
-# FIXME - month or period should handled differently
-printf ("----- Report from %s to %s\n",$StartMonth,$EndMonth) if $Options{'c'} and ($Options{'m'} or $Options{'p'});
+if ($Options{'c'}) {
+ if ($Options{'p'}) {
+ printf ("----- Report from %s to %s\n",$StartMonth,$EndMonth);
+ } elsif ($Options{'m'}) {
+ printf ("----- Report for %s\n",$StartMonth);
+ };
+};
# print caption (-c) with newsgroup list if -n is set
printf ("----- Newsgroups: %s\n",join(',',split(/:/,$Newsgroups))) if $Options{'c'} and $Options{'n'};
# print caption (-c) with threshold if -t is set, taking -i in account
# -b is set (then -l can't be!)
# we have to read in the query results ourselves, as they do not have standard layout
while (my ($Newsgroup,$Postings) = $DBQuery->fetchrow_array) {
- # we just assign "top x" or "bottom x" instead of a month for the caption
- # FIXME
- print &FormatOutput($Options{'o'}, ($Options{'i'} ? 'Bottom ' : 'Top ').$Options{'b'}, $Newsgroup, $Postings, $MaxLength);
+ # we just assign "top x" or "bottom x" instead of a month for the caption and force an output type of pretty
+ print &FormatOutput('pretty', ($Options{'i'} ? 'Bottom ' : 'Top ').$Options{'b'}, $Newsgroup, $Postings, $MaxLength);
};
} else {
# -l must be set now, as all other cases have been taken care of
+ # print caption (-c) with level, taking -i in account
+ printf ("----- Newsgroups with %s than %u postings over the whole time period\n",$Options{'i'} ? 'less' : 'more',$Options{'l'}) if $Options{'c'};
# we have to read in the query results ourselves, as they do not have standard layout
while (my ($Month,$Newsgroup,$Postings) = $DBQuery->fetchrow_array) {
# we just switch $Newsgroups and $Month for output generation
- # FIXME
print &FormatOutput($Options{'o'}, $Newsgroup, $Month, $Postings, 7);
};
};
=head1 SYNOPSIS
-B<groupstats> [B<-Vhiscqd>] [B<-m> I<YYYY-MM>] [B<-p> I<YYYY-MM:YYYY-MM>] [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<-g> I<database table>]
=head1 REQUIREMENTS
=head2 Configuration
-F<groupstats.pl> will read its configuration from F<newsstats.conf>
+B<groupstats> will read its configuration from F<newsstats.conf>
which should be present in the same directory via Config::Auto.
See doc/INSTALL for an overview of possible configuration options.
=item B<-m> I<YYYY-MM> (month)
Set processing period to a month in YYYY-MM format. Ignored if B<-p>
-is set.
+or B<-a> is set.
=item B<-p> I<YYYY-MM:YYYY-MM> (period)
Set processing period to a time period between two month, each in
-YYYY-MM format, separated by a colon. Overrides B<-m>.
+YYYY-MM format, separated by a colon. Overrides B<-m>. Ignored if
+B<-a> is set.
+
+=item B<-a> (all)
+
+Set no processing period (process whole database). Overrides B<-m>
+and B<-p>.
=item B<-n> I<newsgroup(s)> (newsgroups)