On Sat, 15 Dec 2001, Pierre Keller - BCU Lausanne wrote:

> Je crois qu'il existe plusieurs testeurs de liens qui
> travaillent � partir d'une page Web; mais � partir d'une
> base MySQL ?

J'utilise plut�t PostgreSQL: mais l'interfa�age depuis Perl doit �tre le
m�me ou presque. 

1. D�claration des champs pour faire un premier contr�le dans la base
   de donn�es

                        url TEXT CHECK ((url IS NULL)
                                        OR (url LIKE 'http://%')),


   (on pourrait ajouter un test qui soit plus strict selon les
    RFCs, donnez-le moi si vous l'avez �crit :))

2. Faire le test proprement dit:

schaefer@defian:/tmp% wget 2> /dev/null -O /dev/null 
'http://www.alphanet.ch/truc/abcd' && echo trouve
schaefer@defian:/tmp% wget 2> /dev/null -O /dev/null 'http://www.alphanet.ch/' && echo 
trouve trouve

ou client HTTP Perl.

3. Parcourir une base de donn�es

Il y a plusieurs m�thodes, notamment des scripts Perl p.ex. Avec les
routines de base de donn�es (que l'on peut trouver sur Contact DB,
http://www-internal.alphanet.ch/~schaefer/software.html). On peut aussi
directement utiliser l'interface Perl::DBI.

cela donne quelque chose comme: (avec bien s�r l'utilisation de faits
comme NOT NULL, etc, sinon le code devient plus compliqu�)

#! /usr/bin/perl -w

use strict;

use contact;
use LWP::UserAgent;
use HTTP::Request::Common;

my $result = 0; # SUCCESS
my $error_reason = "unknown\n";

my $dbh = &open_database($database,
                         $server,
                         $user,
                         $password,
                         \$error_reason);
if (defined($dbh)) {
   my @titles;
   my @content;

   if (&do_query($dbh,
                 "SELECT id, url FROM lien"
                 \@titles,
                 \@content,
                 undef,
                 undef,
                 \$error_reason)) {
      my $hash_ref;
      foreach $hash_ref (@content) {
         if (!verify_url($hash_ref->{'url'}) {
            print $hash_ref->{'id}', "\n";
         }
      }
   }
   else {
      print STDERR "Query failed: ", $error_reason;
      $result = 1;
   }

   if (!&close_database(\$dbh, \$error_reason)) {
      print STDERR "Disconnect error: ", $error_reason;
      $result = 1;
   }
   
   undef $dbh;
}
else {
   print STDERR "Connect error: ", $error_reason;
   $result = 1;
}

if ($result) {
   print STDERR $0, ": something failed.\n";
   exit $result;
}

# Devrait �tre am�lior� pour distinguer les erreurs.
sub verify_url {
   my ($url) = @_;

   my $ua = LWP::UserAgent->new;
   if (defined($ua)) {
      my $request = HTTP::Request::Common::GET $url;
      if (defined($request)) {
         my $response = $ua->request($request);
         if (defined($response)) {
            if ($response->is_success()) {
               return 1;
            }
         }
      }
   }

   return 0; # fails (any error, not just not found!)
}


--
http://www-internal.alphanet.ch/linux-leman/ avant de poser
une question. Ouais, pour se d�sabonner aussi.

Répondre à