diff --git a/bin/clientstats.pl b/bin/clientstats.pl index 0f7ae20..b94fa16 100644 --- a/bin/clientstats.pl +++ b/bin/clientstats.pl @@ -215,10 +215,14 @@ while (my ($Month, $Key, $Value) = $DBQuery->fetchrow_array) { # output client versions if ($OptVersions) { ### get client versions - # $SQLWhereClause without 'ALL' version + # $SQLWhereClause without 'ALL' version, with client and month set $SQLWhereClause = SQLBuildClause('where',$SQLWherePeriod,$SQLWhereNames, - $ExcludeSums,"version != 'ALL'","client = '$Client'", + $ExcludeSums,"version != 'ALL'", + 'client = ?','month = ?', &SQLSetBounds('default',$LowBound,$UppBound)); + # push client and month to @SQLVersBindNames + my @SQLVersBindNames = @SQLBindNames; + push (@SQLVersBindNames, ($Client, $Month)); # save length of longest client my $ClientMaxLenght = $MaxLength; @@ -227,7 +231,7 @@ while (my ($Month, $Key, $Value) = $DBQuery->fetchrow_array) { # for formatting purposes my ($MaxLength,$MaxValLength) = &GetMaxLength($DBHandle,$Conf{'DBTable'}, 'version','postings',$SQLWhereClause, - '',@SQLBindNames); + '',@SQLVersBindNames); if ($MaxLength) { # add lenght of '- ' $MaxLength += 2; @@ -242,7 +246,7 @@ while (my ($Month, $Key, $Value) = $DBQuery->fetchrow_array) { $SQLWhereClause,$SQLGroupClause, $SQLOrderClause)); # execute query - $DBVersQuery->execute(@SQLBindNames) + $DBVersQuery->execute(@SQLVersBindNames) or &Bleat(2,sprintf("Can't get version data for %s from %s.%s: %s\n", $CaptionPeriod,$Conf{'DBDatabase'},$Conf{'DBTable'}, $DBI::errstr)); diff --git a/bin/gatherstats.pl b/bin/gatherstats.pl index 9b02bfa..55c2dad 100755 --- a/bin/gatherstats.pl +++ b/bin/gatherstats.pl @@ -497,9 +497,15 @@ sub ClientStats { foreach (@Clients) { # filter agents for User-Agent with multiple agents next if $#Clients && exists($DropAgent{lc($_->{'agent'})}); + # remove whitespace + $_->{'agent'} =~ s/^\s+|\s+$//g; + $_->{'version'} =~ s/^\s+|\s+$//g if $_->{'version'}; # encode to utf-8, if necessary $_->{'agent'} = encode('UTF-8', $_->{'agent'}) if $_->{'agent'} =~ /[\x80-\x{ffff}]/; $_->{'version'} = encode('UTF-8', $_->{'version'}) if $_->{'version'} and $_->{'version'} =~ /[\x80-\x{ffff}]/; + # truncate overlong clients or versions + $_->{'agent'} = substr($_->{'agent'}, 0, 150) if length($_->{'agent'}) > 150; + $_->{'version'} = substr($_->{'version'}, 0, 50) if $_->{'version'} and length($_->{'version'}) > 50; # special cases # Mozilla $_->{'agent'} = 'Mozilla' if $_->{'agent'} eq '•Mozilla'; @@ -661,8 +667,7 @@ sub RemoveComments { # remove superfluous whitespace in header # and whitespace around header $Header =~ s/\s+/ /g; - $Header =~ s/^\s+//; - $Header =~ s/\s+$//; + $Header =~ s/^\s+|\s+$//g; return $Header; } diff --git a/bin/postingstats.pl b/bin/postingstats.pl index a9d1e9a..e517a45 100644 --- a/bin/postingstats.pl +++ b/bin/postingstats.pl @@ -134,7 +134,7 @@ wenn Sie ermittelbar sind; daher kann die Summe der Newsreader-Versionen kleiner sein als die Postingzahl fuer den Newsreader. Ausserdem koennen an einem Beitrag mehrere Clients beteiligt sein, bspw. der Newsreader und ein lokaler Server wie der Hamster. Daher kann die Summe aller -Newsreader groesser sein als die Summer der Postings; auch ergeben die +Newsreader groesser sein als die Summe der Postings; auch ergeben die Prozentzahlen dementsprechend in der Summe mehr als 100%. CLIENTSOUT diff --git a/doc/ChangeLog b/doc/ChangeLog index c829e19..ef17bfc 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -9,7 +9,10 @@ NewsStats 0.4.0 (unreleased) * Add clientstats (for clients). * Add ClientStats to postingstats. * gatherstats: Don't die on parsing errors. - * DBClnts: set version length to to 50. + * DBClnts: set version length to 50. + * gatherstats: Truncate overlong clients or versions. + * gatherstats: Remove whitespace from client and version. + * Fix version queries. NewsStats 0.3.0 (2025-05-18) * Extract GroupStats (in gatherstats) to subroutine.