Release 0.01
[usenet/newsstats.git] / groupstats.pl
index 14d19c6..499e333 100755 (executable)
@@ -1,4 +1,4 @@
-#! /usr/bin/perl -W
+#! /usr/bin/perl
 #
 # groupstats.pl
 #
 #
 # groupstats.pl
 #
@@ -7,7 +7,7 @@
 # 
 # It is part of the NewsStats package.
 #
 # 
 # It is part of the NewsStats package.
 #
-# Copyright (c) 2010-2012 Thomas Hochstein <thh@inter.net>
+# Copyright (c) 2010-2013 Thomas Hochstein <thh@inter.net>
 #
 # It can be redistributed and/or modified under the same terms under 
 # which Perl itself is published.
 #
 # It can be redistributed and/or modified under the same terms under 
 # which Perl itself is published.
@@ -18,6 +18,7 @@ BEGIN {
   push(@INC, dirname($0));
 }
 use strict;
   push(@INC, dirname($0));
 }
 use strict;
+use warnings;
 
 use NewsStats qw(:DEFAULT :TimePeriods :Output :SQLHelper ReadGroupList);
 
 
 use NewsStats qw(:DEFAULT :TimePeriods :Output :SQLHelper ReadGroupList);
 
@@ -99,8 +100,13 @@ my ($CaptionPeriod,$SQLWherePeriod) = &GetTimePeriod($OptMonth);
          "please use 'YYYY-MM', 'YYYY-MM:YYYY-MM' or 'ALL'!") if !$CaptionPeriod;
 # get list of newsgroups and set expression for SQL 'WHERE' clause
 # with placeholders as well as a list of newsgroup to bind to them
          "please use 'YYYY-MM', 'YYYY-MM:YYYY-MM' or 'ALL'!") if !$CaptionPeriod;
 # get list of newsgroups and set expression for SQL 'WHERE' clause
 # with placeholders as well as a list of newsgroup to bind to them
-my ($SQLWhereNewsgroups,@SQLBindNewsgroups) = &SQLGroupList($OptNewsgroups)
-  if $OptNewsgroups;;
+my ($SQLWhereNewsgroups,@SQLBindNewsgroups);
+if ($OptNewsgroups) {
+  ($SQLWhereNewsgroups,@SQLBindNewsgroups) = &SQLGroupList($OptNewsgroups);
+  # bail out if --newsgroups is invalid
+  &Bleat(2,"--newsgroups option has an invalid format!")
+    if !$SQLWhereNewsgroups;
+}
 
 ### build SQL WHERE clause (and HAVING clause, if needed)
 my ($SQLWhereClause,$SQLHavingClause);
 
 ### build SQL WHERE clause (and HAVING clause, if needed)
 my ($SQLWhereClause,$SQLHavingClause);
@@ -154,9 +160,10 @@ if ($OptReportType and $OptReportType ne 'default') {
 ### get length of longest newsgroup name delivered by query
 ### for formatting purposes
 my $Field = ($GroupBy eq 'month') ? 'newsgroup' : 'month';
 ### get length of longest newsgroup name delivered by query
 ### for formatting purposes
 my $Field = ($GroupBy eq 'month') ? 'newsgroup' : 'month';
-my $MaxLength = &GetMaxLength($DBHandle,$Conf{'DBTableGrps'},
-                              $Field,$SQLWhereClause,$SQLHavingClause,
-                              @SQLBindNewsgroups);
+my ($MaxLength,$MaxValLength) = &GetMaxLength($DBHandle,$Conf{'DBTableGrps'},
+                                              $Field,'postings',$SQLWhereClause,
+                                              $SQLHavingClause,
+                                              @SQLBindNewsgroups);
 
 ### build and execute SQL query
 my ($DBQuery);
 
 ### build and execute SQL query
 my ($DBQuery);
@@ -193,8 +200,8 @@ if ($OptBoundType and $OptBoundType ne 'default') {
 $DBQuery = $DBHandle->prepare(sprintf('SELECT %s FROM %s.%s %s %s %s',
                                       $SQLSelect,
                                       $Conf{'DBDatabase'},$Conf{'DBTableGrps'},
 $DBQuery = $DBHandle->prepare(sprintf('SELECT %s FROM %s.%s %s %s %s',
                                       $SQLSelect,
                                       $Conf{'DBDatabase'},$Conf{'DBTableGrps'},
-                                      $SQLWhereClause,$SQLGroupClause,$
-                                      SQLOrderClause));
+                                      $SQLWhereClause,$SQLGroupClause,
+                                      $SQLOrderClause));
 
 # execute query
 $DBQuery->execute(@SQLBindNewsgroups)
 
 # execute query
 $DBQuery->execute(@SQLBindNewsgroups)
@@ -241,7 +248,7 @@ if ($OptCaptions && $OptComments) {
 # output data
 &OutputData($OptFormat,$OptComments,$GroupBy,$Precision,
             $OptCheckgroupsFile ? $ValidGroups : '',
 # output data
 &OutputData($OptFormat,$OptComments,$GroupBy,$Precision,
             $OptCheckgroupsFile ? $ValidGroups : '',
-            $OptFileTemplate,$DBQuery,$MaxLength);
+            $OptFileTemplate,$DBQuery,$MaxLength,$MaxValLength);
 
 ### close handles
 $DBHandle->disconnect;
 
 ### close handles
 $DBHandle->disconnect;
@@ -372,6 +379,9 @@ Restrict output to those newgroups present in a file in checkgroups format
 (one newgroup name per line; everything after the first whitespace on each
 line is ignored). All other newsgroups will be removed from output.
 
 (one newgroup name per line; everything after the first whitespace on each
 line is ignored). All other newsgroups will be removed from output.
 
+Contrary to B<gatherstats>, I<filename> is not a template, but refers to
+a single file in checkgroups format.
+
 =item B<-r>, B<--report> I<default|average|sums>
 
 Choose the report type: I<default>, I<average> or I<sums>
 =item B<-r>, B<--report> I<default|average|sums>
 
 Choose the report type: I<default>, I<average> or I<sums>
@@ -429,8 +439,8 @@ you'll get the following result:
 
 de.comp.datenbanken.misc has not been considered even though it has 38
 postings in total, because it has less than 25 postings in every single
 
 de.comp.datenbanken.misc has not been considered even though it has 38
 postings in total, because it has less than 25 postings in every single
-month. If you want to list all newsgroups with more than 25 postings U<in
-total>, you'll have to set the boundary type to I<sum>, see below.
+month. If you want to list all newsgroups with more than 25 postings
+I<in total>, you'll have to set the boundary type to I<sum>, see below.
 
 A boundary type of I<level> will show only those newsgroups - at all -
 that satisfy the boundaries in each and every single month. With the above
 
 A boundary type of I<level> will show only those newsgroups - at all -
 that satisfy the boundaries in each and every single month. With the above
@@ -442,10 +452,10 @@ you'll get this result:
     de.comp.datenbanken.ms-access        293
 
 de.comp.datenbanken.mysql has not been considered because it had less than
     de.comp.datenbanken.ms-access        293
 
 de.comp.datenbanken.mysql has not been considered because it had less than
-25 postings in 2012-02.
+25 postings in 2012-02 (only).
 
 You can use that to get a list of newsgroups that have more (or less) then
 
 You can use that to get a list of newsgroups that have more (or less) then
-x postings during the whole reporting period.
+x postings in every month during the whole reporting period.
 
 A boundary type of I<average> will show only those newsgroups - at all -that
 satisfy the boundaries on average. With the above list of newsgroups and
 
 A boundary type of I<average> will show only those newsgroups - at all -that
 satisfy the boundaries on average. With the above list of newsgroups and
This page took 0.012767 seconds and 4 git commands to generate.