### get time period
my ($StartMonth,$EndMonth) = &GetTimePeriod($Options{'m'},$Options{'p'});
-# reset to one month for 'dump' output type
+# 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'}) {
- warn ("$MySelf: W: You cannot combine time periods (-p) with '-o dump', changing output type to '-o pretty'.\n");
- $Options{'o'} = 'pretty';
+ 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';
+ }
};
### init database
# 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