home *** CD-ROM | disk | FTP | other *** search
/ Acorn User 10 / AU_CD10.iso / Updates / Perl / Perl_Libs / site_perl / WWW / RobotRules / AnyDBM_File.pm
Encoding:
Perl POD Document  |  1997-12-02  |  3.5 KB  |  170 lines

  1. # $Id: AnyDBM_File.pm,v 1.8 1997/12/02 13:27:43 aas Exp $
  2.  
  3. package WWW::RobotRules::AnyDBM_File;
  4.  
  5. require  WWW::RobotRules;
  6. @ISA = qw(WWW::RobotRules);
  7.  
  8. use Carp ();
  9. use AnyDBM_File;
  10. use Fcntl;
  11. use strict;
  12.  
  13. =head1 NAME
  14.  
  15. WWW::RobotRules::AnyDBM_File - Persistent RobotRules
  16.  
  17. =head1 SYNOPSIS
  18.  
  19.  require WWW::RobotRules::AnyDBM_File;
  20.  require LWP::RobotUA;
  21.  
  22.  # Create a robot useragent that uses a diskcaching RobotRules
  23.  my $rules = new WWW::RobotRules::AnyDBM_File 'my-robot/1.0', 'cachefile';
  24.  my $ua = new WWW::RobotUA 'my-robot/1.0', 'me@foo.com', $rules;
  25.  
  26.  # Then just use $ua as usual
  27.  $res = $ua->request($req);
  28.  
  29. =head1 DESCRIPTION
  30.  
  31. This is a subclass of I<WWW::RobotRules> that uses the AnyDBM_File
  32. package to implement persistent diskcaching of F<robots.txt> and host
  33. visit information.
  34.  
  35. The constructor (the new() method) takes an extra argument specifying
  36. the name of the DBM file to use.  If the DBM file already exists, then
  37. you can specify undef as agent name as the name can be obtained from
  38. the DBM database.
  39.  
  40. =cut
  41.  
  42. sub new 
  43.   my ($class, $ua, $file) = @_;
  44.   Carp::croak('WWW::RobotRules::AnyDBM_File filename required') unless $file;
  45.  
  46.   my $self = bless { }, $class;
  47.   $self->{'filename'} = $file;
  48.   tie %{$self->{'dbm'}}, 'AnyDBM_File', $file, O_CREAT|O_RDWR, 0640
  49.     or Carp::croak("Can't open $file: $!");
  50.   
  51.   if ($ua) {
  52.       $self->agent($ua);
  53.   } else {
  54.       # Try to obtain name from DBM file
  55.       $ua = $self->{'dbm'}{"|ua-name|"};
  56.       Carp::croak("No agent name specified") unless $ua;
  57.   }
  58.  
  59.   $self;
  60. }
  61.  
  62. sub agent {
  63.     my($self, $newname) = @_;
  64.     my $old = $self->{'dbm'}{"|ua-name|"};
  65.     if (defined $newname) {
  66.     $newname =~ s!/?\s*\d+.\d+\s*$!!;  # loose version
  67.     unless ($old && $old eq $newname) {
  68.     # Old info is now stale.
  69.         my $file = $self->{'filename'};
  70.         untie %{$self->{'dbm'}};
  71.         tie %{$self->{'dbm'}}, 'AnyDBM_File', $file, O_TRUNC|O_RDWR, 0640;
  72.         $self->{'dbm'}{"|ua-name|"} = $newname;
  73.     }
  74.     }
  75.     $old;
  76. }
  77.  
  78. sub no_visits {
  79.     my ($self, $netloc) = @_;
  80.     my $t = $self->{'dbm'}{"$netloc|vis"};
  81.     return 0 unless $t;
  82.     (split(/;\s*/, $t))[0];
  83. }
  84.  
  85. sub last_visit {
  86.     my ($self, $netloc) = @_;
  87.     my $t = $self->{'dbm'}{"$netloc|vis"};
  88.     return undef unless $t;
  89.     (split(/;\s*/, $t))[1];
  90. }
  91.  
  92. sub fresh_until {
  93.     my ($self, $netloc, $fresh) = @_;
  94.     my $old = $self->{'dbm'}{"$netloc|exp"};
  95.     if ($old) {
  96.     $old =~ s/;.*//;  # remove cleartext
  97.     }
  98.     if (defined $fresh) {
  99.     $fresh .= "; " . localtime($fresh);
  100.     $self->{'dbm'}{"$netloc|exp"} = $fresh;
  101.     }
  102.     $old;
  103. }
  104.  
  105. sub visit {
  106.     my($self, $netloc, $time) = @_;
  107.     $time ||= time;
  108.  
  109.     my $count = 0;
  110.     my $old = $self->{'dbm'}{"$netloc|vis"};
  111.     if ($old) {
  112.     my $last;
  113.     ($count,$last) = split(/;\s*/, $old);
  114.     $time = $last if $last > $time;
  115.     }
  116.     $count++;
  117.     $self->{'dbm'}{"$netloc|vis"} = "$count; $time; " . localtime($time);
  118. }
  119.  
  120. sub push_rules {
  121.     my($self, $netloc, @rules) = @_;
  122.     my $cnt = 1;
  123.     $cnt++ while $self->{'dbm'}{"$netloc|r$cnt"};
  124.  
  125.     foreach (@rules) {
  126.     $self->{'dbm'}{"$netloc|r$cnt"} = $_;
  127.     $cnt++;
  128.     }
  129. }
  130.  
  131. sub clear_rules {
  132.     my($self, $netloc) = @_;
  133.     my $cnt = 1;
  134.     while ($self->{'dbm'}{"$netloc|r$cnt"}) {
  135.     delete $self->{'dbm'}{"$netloc|r$cnt"};
  136.     $cnt++;
  137.     }
  138. }
  139.  
  140. sub rules {
  141.     my($self, $netloc) = @_;
  142.     my @rules = ();
  143.     my $cnt = 1;
  144.     while (1) {
  145.     my $rule = $self->{'dbm'}{"$netloc|r$cnt"};
  146.     last unless $rule;
  147.     push(@rules, $rule);
  148.     $cnt++;
  149.     }
  150.     @rules;
  151. }
  152.  
  153. sub dump
  154. {
  155. }
  156.  
  157. 1;
  158.  
  159. =head1 SEE ALSO
  160.  
  161. L<WWW::RobotRules>, L<LWP::RobotUA>
  162.  
  163. =head1 AUTHORS
  164.  
  165. Hakan Ardo E<lt>hakan@munin.ub2.lu.se>, Gisle Aas E<lt>aas@sn.no>
  166.  
  167. =cut
  168.  
  169.