Utilisateur:Cynddl/checkwiki.cgi

#!/usr/bin/perl -w
# from toolserver.org/~sk/public_html/checkwiki

use strict;
use CGI qw(param);
use CGI::Carp qw(fatalsToBrowser);
use URI::Escape;
use Encode;
use LWP::UserAgent;
use DBI;


#load password
open(PWD, "</home/sk/.mytop");
my $password = '';
do {
	my $test = <PWD>;
	if ($test =~ /^pass=/ ) {
		$password = $test;
		$password =~ s/^pass=//g;
		$password =~ s/\n//g;
	}
}
while (eof(PWD) != 1);
close(PWD);

#Connect to database u_sk
my $dbh = DBI->connect( 'DBI:mysql:u_sk_yarrow:host=sql',
                        'sk',
                        $password,
						{
                          RaiseError => 1,
                          AutoCommit => 1
                        }
                      ) or die "Database connection not made: $DBI::errstr" . DBI->errstr;
print "Content-type: text/html\n\n";
$password = '';


##############
our $param_error = param('error');
our $param_id = param('id');



print <<HTML_HEAD;
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
<head>
<style type="text/css">
body {  
	
	font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif;
	font-size:14px;
	font-style:normal;
	
	/* color:#9A91ff; */
	
	/* background-color:#00077A; */
	/* background-image:url(back.jpg); */
	/* background:url(back_new.jpg) no-repeat fixed top center; */
	/* background:url(../images/back_new.jpg) no-repeat fixed top center; */
	/* background:url(../images/back_schaf2.jpg) no-repeat fixed bottom left; */
	/* background:url(../images/back_schaf3.jpg) no-repeat fixed bottom left; */
	
	background-color:white;
	color:#555555;
	text-decoration:none; 
	line-height:normal; 
	font-weight:normal; 
	font-variant:normal; 
	text-transform:none; 
	margin-left:5%;
	margin-right:5%;
	}
	
h1	{
	/*color:red; */
	font-size:20px;
	}

h2	{
	/*color:red; */
	font-size:16px;
	}
	
a 	{  

	/*nur blau */
	/* color:#80BFBF; */ 
	/* color:#4889c5; */ 
	/* color:#326a9e; */  
	
	color:#4889c5;
	font-weight:bold;
	/*nettes grün */
	/*color:#7CFC00;*/
	
	/* Nette Kombination */
	/*color:#00077A; */
	/*background-color:#eee8fd;*/
	
	
	/* Kein Unterstrich */
	text-decoration:none; 
	
	/*Außenabstand*/
	/*padding:2px;*/
	}

a:hover {  
	background-color:#ffdeff;
	color:red;
	}
	
.nocolor{  
	background-color:white;
	color:white;
	} 
	
a:hover.nocolor{  
	background-color:white;
	color:white;
	}
	
.table{
	font-size:12px; 

	vertical-align:top;

	border-width:thin;
  	border-style:solid;
  	border-color:blue;
  	background-color:#EEEEEE;
  	
  	/*Innenabstand*/
	padding-top:2px;
	padding-bottom:2px;
	padding-left:5px;
	padding-right:5px;
  	
  	/* dünne Rahmen */
  	border-collapse:collapse; 
	
	/*kein Zeilenumbruch
	white-space:nowrap;*/
  	
  	}
	
</style>

<title>Personendaten Verbesserungsvorschläge</title></head>
HTML_HEAD


print "<body><h1>PD Verbesserungsvorschläge</h1>\n";
print "<p>Version 0.1 Alpha</p>\n";

if (     $param_error eq ''
	 and $param_id eq '') {
	 
	
print <<EINFUEHRUNGSTEXT;

<h2>Startseite</h2>
<p>Auf dieser Seite werden Verbesserungsvorschläge für die Personendaten in der deutschsprachigen Wikipedia angezeigt.  Für weitere Informationen am besten mal hier reinschauen: <a href="http://de.wikipedia.org/wiki/Wikipedia:Personendaten/Wartung/Fehlerliste">Wikipedia:Personendaten/Wartung/Fehlerliste</a>.</p>

EINFUEHRUNGSTEXT


print 'Aktuell sind <b>'.get_number_all_errors().'</b> Verbesserungsvorschläge in <b>'.get_number_all_article().'</b> Artikeln bekannt. <br />'."\n";


print '<ul>';
print '<li>'.get_number_of_prio(1)." Verbesserungsvorschläge von <a href='http://toolserver.org/~sk/cgi-bin/pd/pd.cgi?error=high'>höchster Priorität</a></li>";
print '<li>'.get_number_of_prio(2)." Verbesserungsvorschläge von <a href='http://toolserver.org/~sk/cgi-bin/pd/pd.cgi?error=middle'>mittlerer Priorität</a></li>";
print '<li>'.get_number_of_prio(3)." Verbesserungsvorschläge von <a href='http://toolserver.org/~sk/cgi-bin/pd/pd.cgi?error=low'>niedriger Priorität</a></li>";
print '</ul>';
print '<ul>';
print "<li><a href='http://toolserver.org/~sk/cgi-bin/pd/pd.cgi?error=top25'>Top 25 Artikel</a></li>";
print '</ul>';
print '<p>Seit dem letzten Update wurden <b>'.get_number_of_ok().'</b> Verbesserungsvorschläge abgearbeitet. </p>'."\n";
print '<p>? Startseite</p>'."\n";	
}

if (   $param_error eq 'high'
	or $param_error eq 'middle'
	or $param_error eq 'low') {


	my $prio = 0;
	my $headline = '';
	if ($param_error eq 'high') {
		$prio = 1;
		$headline = 'Hohe Priorität';
	}
	
	if ($param_error eq 'middle') {
		$prio = 2;
		$headline = 'Mittlere Priorität';
	}
	
	if ($param_error eq 'low') {
		$prio = 3;
		$headline = 'Niedrige Priorität';
	}
	
	
	print '<h2>'.$headline.'</h2>'."\n";
	print '<ul>';
	print get_number_error_and_desc_by_prio($prio);
	print '</ul>';	
	
	print '<p>? <a href="http://toolserver.org/~sk/cgi-bin/pd/pd.cgi">Startseite</a> ? '.$headline.'</p>'."\n";	

	
	
}

if (   $param_error eq 'top25') {
	print '<h2>Top 25</h2>'."\n";
	print get_top25();	
	print '<p>? <a href="http://toolserver.org/~sk/cgi-bin/pd/pd.cgi">Startseite</a> ? Top25</p>'."\n";	

}	


if (    $param_id =~ /^[0-9]+$/
	and $param_error =~ /^[0-9]+$/ ) {
	# Artikel abgearbeitet
	my $sql_text = "update pd_error set ok=1 where id=".$param_id." and error=".$param_error.";";
	my $sth = $dbh->prepare( $sql_text )  ||  die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
	$sth->execute or die $sth->errstr; # hier geschieht die Anfrage an die DB	
}


if (   $param_error =~ /^[0-9]+$/) {
	# Ein konkrete Fehlernummer auflisten
	my $headline = '';
	$headline = get_headline($param_error);
	
	print '<h2>'.$headline.'</h2>'."\n";
	print '<p>'.get_description($param_error).'</p>'."\n";
	print '<p>'.get_number_of_error($param_error).' mal gefunden (Nr. '.$param_error .')</p>'."\n";
	
	print get_article_of_error($param_error);
	
	my $prio = get_prio_of_error($param_error);
	$prio = '<a href="http://toolserver.org/~sk/cgi-bin/pd/pd.cgi?error=high">Höchster Priorität</a>' if ($prio eq '1');
	$prio = '<a href="http://toolserver.org/~sk/cgi-bin/pd/pd.cgi?error=middle">Mittlere Priorität</a>' if ($prio eq '2');
	$prio = '<a href="http://toolserver.org/~sk/cgi-bin/pd/pd.cgi?error=low">Niedrigste Priorität</a>' if ($prio eq '3');
	print '<p>? <a href="http://toolserver.org/~sk/cgi-bin/pd/pd.cgi">Startseite</a> ? '.$prio.' ? '.$headline.'</p>'."\n";	


}

if (    $param_id =~ /^[0-9]+$/
	and $param_error eq '' ) {
	# Details zu einem Artikel anzeigen
	print '<h2>Detailansicht</h2>'."\n";
	my $sql_text = "select title from pd_error where id=".$param_id.";";
	my $sth = $dbh->prepare( $sql_text )  ||  die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
	$sth->execute or die $sth->errstr; 	
		while (my $arrayref = $sth->fetchrow_arrayref()) {	
		foreach(@$arrayref) {
			print '<p>Artikel: <a href="http://de.wikipedia.org/wiki/'.$_.'">'.$_.'</a></p>';
		}
	}

	print get_all_error_of_article($param_id);
	
	print '<p>? <a href="http://toolserver.org/~sk/cgi-bin/pd/pd.cgi">Startseite</a> ? <a href="http://toolserver.org/~sk/cgi-bin/pd/pd.cgi?error=top25">Top25</a> ? Detailansicht</p>'."\n";	



	
}



print '</body>';
print '</html>';

# Datenbank beenden
$dbh->disconnect();

	
	
	
###########################################	



sub get_number_all_article{
	my $sql_text = "select count(a.title) from (select title from pd_error where ok=0 group by title) a;";
	my $result = 0;
	my $sth = $dbh->prepare( $sql_text )  ||  die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
	#print '<p class="smalltext"/>'.$sql_text."</p>\n";					  
	$sth->execute or die $sth->errstr; # hier geschieht die Anfrage an die DB
	while (my $arrayref = $sth->fetchrow_arrayref()) {	
		foreach(@$arrayref) {
			$result = $_;
		}
	}
	return ($result);
}

sub get_number_of_ok{
	my $sql_text = "select count(*) from pd_error where ok=1;";
	my $result = 0;
	my $sth = $dbh->prepare( $sql_text )  ||  die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
	#print '<p class="smalltext"/>'.$sql_text."</p>\n";					  
	$sth->execute or die $sth->errstr; # hier geschieht die Anfrage an die DB
	while (my $arrayref = $sth->fetchrow_arrayref()) {	
		foreach(@$arrayref) {
			$result = $_;
		}
	}
	return ($result);
}


sub get_number_all_errors{
	my $sql_text = "select count(*) from pd_error where ok=0 ;";
	my $result = 0;
	my $sth = $dbh->prepare( $sql_text )  ||  die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
	#print '<p class="smalltext"/>'.$sql_text."</p>\n";					  
	$sth->execute or die $sth->errstr; # hier geschieht die Anfrage an die DB
	while (my $arrayref = $sth->fetchrow_arrayref()) {	
		foreach(@$arrayref) {
			$result = $_;
		}
	}
	return ($result);
}

sub get_number_of_error{
	# Anzahl gefundenen Vorkommen eines Fehlers
	my $error = $_[0];
	my $sql_text = "select count(*) from pd_error where ok=0 and error = ".$error.";";
	my $result = 0;
	my $sth = $dbh->prepare( $sql_text )  ||  die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
	#print '<p class="smalltext"/>'.$sql_text."</p>\n";					  
	$sth->execute or die $sth->errstr; # hier geschieht die Anfrage an die DB
	while (my $arrayref = $sth->fetchrow_arrayref()) {	
		foreach(@$arrayref) {
			$result = $_;
		}
	}
	return ($result);
}

sub get_number_of_prio{
	my $prio = $_[0];
	my $sql_text = "select count(*) from pd_error a join pd_error_desc b on ( a.error = b.id) where b.prio = ".$prio." and ok=0;";
	my $result = 0;
	my $sth = $dbh->prepare( $sql_text )  ||  die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
	#print '<p class="smalltext"/>'.$sql_text."</p>\n";					  
	$sth->execute or die $sth->errstr; # hier geschieht die Anfrage an die DB
	while (my $arrayref = $sth->fetchrow_arrayref()) {	
		foreach(@$arrayref) {
			$result = $_;
		}
	}
	return ($result);
}

sub get_number_error_and_desc_by_prio{
	my $prio = $_[0];
	my $sql_text = " select count(*), b.id,  b.name from pd_error a join pd_error_desc b on ( a.error = b.id) where b.prio = ".$prio." and a.ok=0 group by b.id order by b.name;";
	my $result = '';
	my $sth = $dbh->prepare( $sql_text )  ||  die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
	#print '<p class="smalltext"/>'.$sql_text."</p>\n";					  
	$sth->execute or die $sth->errstr; # hier geschieht die Anfrage an die DB
	$result .= '<table class="table">';
	$result .= '<tr><th class="table">Anzahl</th><th class="table">Beschreibung</th><th class="table">Nummer</th>'."\n";
	while (my $arrayref = $sth->fetchrow_arrayref()) {	
		my @output;
		my $i = 0;
		my $j = 0;
		foreach(@$arrayref) {
			#print $_."\n";
			$output[$i][$j] = $_;
			$j = $j +1;
			if ($j == 3) {
				$j= 0;
				$i ++;
			}
			#print $_."\n";
		}
		my $number_of_error = $i;
		for (my $i = 0; $i< $number_of_error; $i++) {		
			$result .= '<tr><td class="table" align="right"  valign="middle">'.$output[$i][0].'</td><td class="table"><a href="http://toolserver.org/~sk/cgi-bin/pd/pd.cgi?error='.$output[$i][1].'">'.$output[$i][2].'</a></td><td class="table" align="right"  valign="middle">'.$output[$i][1]."</td></tr>\n";	
		}
	}
	$result .= '</table>';
	return ($result);
}

sub get_headline{
	my $error = $_[0];
	my $sql_text = " select name from pd_error_desc where id = ".$error.";";
	my $result = '';
	my $sth = $dbh->prepare( $sql_text )  ||  die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
	#print '<p class="smalltext"/>'.$sql_text."</p>\n";					  
	$sth->execute or die $sth->errstr; # hier geschieht die Anfrage an die DB
	while (my $arrayref = $sth->fetchrow_arrayref()) {	
		foreach(@$arrayref) {
			$result = $_;
		}
	}
	return ($result);
}


sub get_description{
	my $error = $_[0];
	my $sql_text = " select text from pd_error_desc where id = ".$error.";";
	my $result = '';
	my $sth = $dbh->prepare( $sql_text )  ||  die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
	#print '<p class="smalltext"/>'.$sql_text."</p>\n";					  
	$sth->execute or die $sth->errstr; # hier geschieht die Anfrage an die DB
	while (my $arrayref = $sth->fetchrow_arrayref()) {	
		foreach(@$arrayref) {
			$result = $_;
		}
	}
	return ($result);
}

sub get_prio_of_error{
	my $error = $_[0];
	my $sql_text = " select prio from pd_error_desc where id = ".$error.";";
	my $result = '';
	my $sth = $dbh->prepare( $sql_text )  ||  die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
	#print '<p class="smalltext"/>'.$sql_text."</p>\n";					  
	$sth->execute or die $sth->errstr; # hier geschieht die Anfrage an die DB
	while (my $arrayref = $sth->fetchrow_arrayref()) {	
		foreach(@$arrayref) {
			$result = $_;
		}
	}
	return ($result);
}

sub get_article_of_error{
	my $error = $_[0];
	#my $sql_text = " select title, hinweis, id from pd_error where error = ".$error." and ok=0 order by title limit 25;";
	my $sql_text =	 "select a.title, a.hinweis, a.id from (
		 select title, hinweis, id ,
		 replace(replace (REVERSE (title),')',''),'.','') Test
		 from pd_error
		where error = ".$error."
		 and ok = 0
		 order by Test
		 limit 25)a order by a.title;";
	
	
	my $result = '';
	my $sth = $dbh->prepare( $sql_text )  ||  die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
	#print '<p class="smalltext"/>'.$sql_text."</p>\n";					  
	$sth->execute or die $sth->errstr; # hier geschieht die Anfrage an die DB
	$result .= '<table class="table">';
	$result .= '<tr><th class="table">Artikel</th><th class="table">Hinweis</th><th class="table">Abarbeitung</th>'."\n";
	while (my $arrayref = $sth->fetchrow_arrayref()) {	
		my @output;
		my $i = 0;
		my $j = 0;
		foreach(@$arrayref) {
			#print $_."\n";
			$output[$i][$j] = $_;
			$j = $j +1;
			if ($j == 3) {
				$j= 0;
				$i ++;
			}
			#print $_."\n";
		}
		my $number_of_error = $i;
		for (my $i = 0; $i< $number_of_error; $i++) {		
			$result .= '<tr><td class="table"><a href="http://de.wikipedia.org/wiki/'.$output[$i][0].'">'.$output[$i][0].'</a></td><td class="table">'.$output[$i][1].'</td><td class="table">';
			
			$result .= "<a href='http://toolserver.org/~sk/cgi-bin/pd/pd.cgi?error=".$error."&id=".$output[$i][2]."'>Erledigt</a>";
			$result .= "</td></tr>\n";	
		}
	}
	$result .= '</table>';
	return ($result);
}


sub get_top25{
	my $sql_text = "select title, count(*), id from pd_error group by title order by count(*) desc, title limit 25;";
	my $sth = $dbh->prepare( $sql_text )  ||  die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
	#print '<p class="smalltext"/>'.$sql_text."</p>\n";					  
	$sth->execute or die $sth->errstr; # hier geschieht die Anfrage an die DB
	my $result = '';
	$result .= '<table class="table">';
	$result .= '<tr><th class="table">Fehleranzahl</th><th class="table">Artikel</th></tr>'."\n";
	
	while (my $arrayref = $sth->fetchrow_arrayref()) {	
		my @output;
		my $i = 0;
		my $j = 0;
		foreach(@$arrayref) {
			#print $_."\n";
			$output[$i][$j] = $_;
			$j = $j +1;
			if ($j == 3) {
				$j= 0;
				$i ++;
			}
			#print $_."\n";
		}
		my $number_of_error = $i;
		for (my $i = 0; $i< $number_of_error; $i++) {		
			$result .= '<tr><td class="table">'.$output[$i][1].'</td><td class="table"><a href="http://de.wikipedia.org/wiki/'.$output[$i][0].'">'.$output[$i][0].'</a></td>';
			$result .= '<td class="table" align="middle"  valign="middle"><a href="http://toolserver.org/~sk/cgi-bin/pd/pd.cgi?id='.$output[$i][2].'">Details</a></td>';
			$result .= '</tr>'."\n";	
		}
	}
	$result .= '</table>';
	return ($result);
}


sub get_all_error_of_article{
	my $id = $_[0];
	my $sql_text = "select a.error, b.name, a.hinweis, a.id from pd_error a join pd_error_desc b on ( a.error = b.id) where a.title = (select title from pd_error where id = ".$id.");";
	my $sth = $dbh->prepare( $sql_text )  ||  die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
	#print '<p class="smalltext"/>'.$sql_text."</p>\n";					  
	$sth->execute or die $sth->errstr; # hier geschieht die Anfrage an die DB
	my $result = '';
	$result .= '<table class="table">';
	$result .= '<tr><th class="table">Fehler</th><th class="table">Hinweis</th><th class="table">Abarbeitung</th></tr>'."\n";
	
	while (my $arrayref = $sth->fetchrow_arrayref()) {	
		my @output;
		my $i = 0;
		my $j = 0;
		foreach(@$arrayref) {
			#print $_."\n";
			$output[$i][$j] = $_;
			$j = $j +1;
			if ($j == 4) {
				$j= 0;
				$i ++;
			}
			#print $_."\n";
		}
		my $number_of_error = $i;
		for (my $i = 0; $i< $number_of_error; $i++) {		
			$result .= '<tr><td class="table">'.$output[$i][1].'</td><td class="table">'.$output[$i][2].'</td>';
			
			#$result .= "<td><a href='http://toolserver.org/~sk/cgi-bin/pd/pd.cgi?error=".$output[$i][0]."&id=".$output[$i][3]."'>Erledigt</a></td>";
			$result .= "</tr>\n";		
		}
	}
	$result .= '</table>';
	return ($result);
}