Improve output padding.
Take 'length' of numbers in account. Change GetMaxLength() accordingly and use that new information in FormatOutput(). Fixes #53. Signed-off-by: Thomas Hochstein <thh@inter.net>
This commit is contained in:
		
							parent
							
								
									d28168419e
								
							
						
					
					
						commit
						b342fcf030
					
				
					 2 changed files with 35 additions and 22 deletions
				
			
		
							
								
								
									
										48
									
								
								NewsStats.pm
									
										
									
									
									
								
							
							
						
						
									
										48
									
								
								NewsStats.pm
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -382,16 +382,17 @@ sub OutputData {
 | 
			
		|||
###      $FileTempl: file name template (--filetemplate): filetempl-YYYY-MM
 | 
			
		||||
###      $DBQuery  : database query handle with executed query,
 | 
			
		||||
###                 containing $Month, $Key, $Value
 | 
			
		||||
###      $PadGroup : padding length for key field (optional) for 'pretty'
 | 
			
		||||
###      $PadField : padding length for key field (optional) for 'pretty'
 | 
			
		||||
###      $PadValue : padding length for value field (optional) for 'pretty'
 | 
			
		||||
  my ($Format, $Comments, $GroupBy, $Precision, $ValidKeys, $FileTempl,
 | 
			
		||||
      $DBQuery, $PadGroup) = @_;
 | 
			
		||||
      $DBQuery, $PadField, $PadValue) = @_;
 | 
			
		||||
  my %ValidKeys = %{$ValidKeys} if $ValidKeys;
 | 
			
		||||
  my ($FileName, $Handle, $OUT);
 | 
			
		||||
  our $LastIteration;
 | 
			
		||||
  
 | 
			
		||||
  # define output types
 | 
			
		||||
  my %LegalOutput;
 | 
			
		||||
  @LegalOutput{('dump',,'list','pretty')} = ();
 | 
			
		||||
  @LegalOutput{('dump','list','pretty')} = ();
 | 
			
		||||
  # bail out if format is unknown
 | 
			
		||||
  &Bleat(2,"Unknown output type '$Format'!") if !exists($LegalOutput{$Format});
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -427,7 +428,7 @@ sub OutputData {
 | 
			
		|||
      $Handle = $OUT;
 | 
			
		||||
    };
 | 
			
		||||
    print $Handle &FormatOutput($Format, $Comments, $Caption, $Key, $Value,
 | 
			
		||||
                                $Precision, $PadGroup);
 | 
			
		||||
                                $Precision, $PadField, $PadValue);
 | 
			
		||||
    $LastIteration = $Caption;
 | 
			
		||||
  };
 | 
			
		||||
  close $OUT if ($FileTempl);
 | 
			
		||||
| 
						 | 
				
			
			@ -443,9 +444,11 @@ sub FormatOutput {
 | 
			
		|||
###      $Key      : newsgroup, client, ... or $Month, as above
 | 
			
		||||
###      $Value    : number of postings with that attribute
 | 
			
		||||
###      $Precision: number of digits right of decimal point (0 or 2)
 | 
			
		||||
###      $PadGroup : padding length for key field (optional) for 'pretty'
 | 
			
		||||
###      $PadField : padding length for key field (optional) for 'pretty'
 | 
			
		||||
###      $PadValue : padding length for value field (optional) for 'pretty'
 | 
			
		||||
### OUT: $Output: formatted output
 | 
			
		||||
  my ($Format, $Comments, $Caption, $Key, $Value, $Precision, $PadGroup) = @_;
 | 
			
		||||
  my ($Format, $Comments, $Caption, $Key, $Value, $Precision, $PadField,
 | 
			
		||||
      $PadValue) = @_;
 | 
			
		||||
  my ($Output);
 | 
			
		||||
  # keep last caption in mind
 | 
			
		||||
  our ($LastIteration);
 | 
			
		||||
| 
						 | 
				
			
			@ -462,8 +465,13 @@ sub FormatOutput {
 | 
			
		|||
    # output as a table
 | 
			
		||||
    $Output = sprintf ("# ----- %s:\n",$Caption)
 | 
			
		||||
      if ($Comments and (!defined($LastIteration) or $Caption ne $LastIteration));
 | 
			
		||||
    $Output .= sprintf ($PadGroup ? sprintf("%%-%us %%10.*f\n",$PadGroup) :
 | 
			
		||||
                        "%s %.*f\n",$Key,$Precision,$Value);
 | 
			
		||||
    # increase $PadValue for numbers with decimal point
 | 
			
		||||
    $PadValue += $Precision+1 if $Precision;
 | 
			
		||||
    # add padding if $PadField is set; $PadValue HAS to be set then
 | 
			
		||||
    $Output .= sprintf ($PadField ?
 | 
			
		||||
                        sprintf("%%-%us%%s %%%u.*f\n",$PadField,$PadValue) :
 | 
			
		||||
                        "%s%s %.*f\n",$Key,$Comments ? ':' : '',
 | 
			
		||||
                        $Precision,$Value);
 | 
			
		||||
  };
 | 
			
		||||
  return $Output;
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -485,26 +493,30 @@ sub SQLHierarchies {
 | 
			
		|||
################################################################################
 | 
			
		||||
sub GetMaxLength {
 | 
			
		||||
################################################################################
 | 
			
		||||
### get length of longest field in future query result
 | 
			
		||||
### IN : $DBHandle    : database handel
 | 
			
		||||
### get length of longest fields in future query result
 | 
			
		||||
### IN : $DBHandle    : database handle
 | 
			
		||||
###      $Table       : table to query
 | 
			
		||||
###      $Field       : field to check
 | 
			
		||||
###      $Field       : field (key!, i.e. month, newsgroup, ...) to check
 | 
			
		||||
###      $Value       : field (value!, i.e. postings) to check
 | 
			
		||||
###      $WhereClause : WHERE clause
 | 
			
		||||
###      $HavingClause: HAVING clause
 | 
			
		||||
###      @BindVars    : bind variables for WHERE clause
 | 
			
		||||
### OUT: $Length: length of longest instnace of $Field
 | 
			
		||||
  my ($DBHandle,$Table,$Field,$WhereClause,$HavingClause,@BindVars) = @_;
 | 
			
		||||
  my $DBQuery = $DBHandle->prepare(sprintf("SELECT MAX(LENGTH(%s)) ".
 | 
			
		||||
                                           "FROM %s %s %s",$Field,$Table,
 | 
			
		||||
                                           $WhereClause,$HavingClause ?
 | 
			
		||||
### OUT: $FieldLength : length of longest instance of $Field
 | 
			
		||||
###      $ValueLength : length of longest instance of $Value
 | 
			
		||||
  my ($DBHandle,$Table,$Field,$Value,$WhereClause,$HavingClause,@BindVars) = @_;
 | 
			
		||||
  my $DBQuery = $DBHandle->prepare(sprintf("SELECT MAX(LENGTH(%s)),".
 | 
			
		||||
                                           "MAX(%s) ".
 | 
			
		||||
                                           "FROM %s %s %s",$Field,,$Value,
 | 
			
		||||
                                           $Table,$WhereClause,$HavingClause ?
 | 
			
		||||
                                           'GROUP BY newsgroup' . $HavingClause .
 | 
			
		||||
                                           ' ORDER BY LENGTH(newsgroup) '.
 | 
			
		||||
                                           'DESC LIMIT 1': ''));
 | 
			
		||||
  $DBQuery->execute(@BindVars) or &Bleat(1,sprintf("Can't get field length ".
 | 
			
		||||
                                                   "for '%s' from table '%s': ".
 | 
			
		||||
                                                   "$DBI::errstr",$Field,$Table));
 | 
			
		||||
  my ($Length) = $DBQuery->fetchrow_array;
 | 
			
		||||
  return $Length;
 | 
			
		||||
  my ($FieldLength,$ValueMax) = $DBQuery->fetchrow_array;
 | 
			
		||||
  my $ValueLength = length($ValueMax) if ($ValueMax);
 | 
			
		||||
  return ($FieldLength,$ValueLength);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
################################################################################
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -154,9 +154,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';
 | 
			
		||||
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);
 | 
			
		||||
| 
						 | 
				
			
			@ -241,7 +242,7 @@ if ($OptCaptions && $OptComments) {
 | 
			
		|||
# output data
 | 
			
		||||
&OutputData($OptFormat,$OptComments,$GroupBy,$Precision,
 | 
			
		||||
            $OptCheckgroupsFile ? $ValidGroups : '',
 | 
			
		||||
            $OptFileTemplate,$DBQuery,$MaxLength);
 | 
			
		||||
            $OptFileTemplate,$DBQuery,$MaxLength,$MaxValLength);
 | 
			
		||||
 | 
			
		||||
### close handles
 | 
			
		||||
$DBHandle->disconnect;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue