home *** CD-ROM | disk | FTP | other *** search
/ CLIX - Fazer Clix Custa Nix / CLIX-CD.cdr / mac / lib / WWW / RobotRules / AnyDBM_File.pm
Encoding:
Perl POD Document  |  1997-11-18  |  3.5 KB  |  170 lines  |  [TEXT/McPL]

  1. # $Id: AnyDBM_File.pm,v 1.1 1997/11/18 00:33:58 neeri 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. =head1 SE ALSO
  41.  
  42. L<WWW::RobotRules>, L<LWP::RobotUA>
  43.  
  44. =cut
  45.  
  46. sub new 
  47.   my ($class, $ua, $file) = @_;
  48.   Carp::croak('WWW::RobotRules::AnyDBM_File filename required') unless $file;
  49.  
  50.   my $self = bless { }, $class;
  51.   $self->{'filename'} = $file;
  52.   tie %{$self->{'dbm'}}, 'AnyDBM_File', $file, O_CREAT|O_RDWR, 0640
  53.     or Carp::croak("Can't open $file: $!");
  54.   
  55.   if ($ua) {
  56.       $self->agent($ua);
  57.   } else {
  58.       # Try to obtain name from DBM file
  59.       $ua = $self->{'dbm'}{"|ua-name|"};
  60.       Carp::croak("No agent name specified") unless $ua;
  61.   }
  62.  
  63.   $self;
  64. }
  65.  
  66. sub agent {
  67.     my($self, $newname) = @_;
  68.     my $old = $self->{'dbm'}{"|ua-name|"};
  69.     if (defined $newname) {
  70.     $newname =~ s!/?\s*\d+.\d+\s*$!!;  # loose version
  71.     unless ($old && $old eq $newname) {
  72.     # Old info is now stale.
  73.         my $file = $self->{'filename'};
  74.         untie %{$self->{'dbm'}};
  75.         tie %{$self->{'dbm'}}, 'AnyDBM_File', $file, O_TRUNC|O_RDWR, 0640;
  76.         $self->{'dbm'}{"|ua-name|"} = $newname;
  77.     }
  78.     }
  79.     $old;
  80. }
  81.  
  82. sub no_visits {
  83.     my ($self, $netloc) = @_;
  84.     my $t = $self->{'dbm'}{"$netloc|vis"};
  85.     return 0 unless $t;
  86.     (split(/;\s*/, $t))[0];
  87. }
  88.  
  89. sub last_visit {
  90.     my ($self, $netloc) = @_;
  91.     my $t = $self->{'dbm'}{"$netloc|vis"};
  92.     return undef unless $t;
  93.     (split(/;\s*/, $t))[1];
  94. }
  95.  
  96. sub fresh_until {
  97.     my ($self, $netloc, $fresh) = @_;
  98.     my $old = $self->{'dbm'}{"$netloc|exp"};
  99.     if ($old) {
  100.     $old =~ s/;.*//;  # remove cleartext
  101.     }
  102.     if (defined $fresh) {
  103.     $fresh .= "; " . localtime($fresh);
  104.     $self->{'dbm'}{"$netloc|exp"} = $fresh;
  105.     }
  106.     $old;
  107. }
  108.  
  109. sub visit {
  110.     my($self, $netloc, $time) = @_;
  111.     $time ||= time;
  112.  
  113.     my $count = 0;
  114.     my $old = $self->{'dbm'}{"$netloc|vis"};
  115.     if ($old) {
  116.     my $last;
  117.     ($count,$last) = split(/;\s*/, $old);
  118.     $time = $last if $last > $time;
  119.     }
  120.     $count++;
  121.     $self->{'dbm'}{"$netloc|vis"} = "$count; $time; " . localtime($time);
  122. }
  123.  
  124. sub push_rules {
  125.     my($self, $netloc, @rules) = @_;
  126.     my $cnt = 1;
  127.     $cnt++ while $self->{'dbm'}{"$netloc|r$cnt"};
  128.  
  129.     foreach (@rules) {
  130.     $self->{'dbm'}{"$netloc|r$cnt"} = $_;
  131.     $cnt++;
  132.     }
  133. }
  134.  
  135. sub clear_rules {
  136.     my($self, $netloc) = @_;
  137.     my $cnt = 1;
  138.     while ($self->{'dbm'}{"$netloc|r$cnt"}) {
  139.     delete $self->{'dbm'}{"$netloc|r$cnt"};
  140.     $cnt++;
  141.     }
  142. }
  143.  
  144. sub rules {
  145.     my($self, $netloc) = @_;
  146.     my @rules = ();
  147.     my $cnt = 1;
  148.     while (1) {
  149.     my $rule = $self->{'dbm'}{"$netloc|r$cnt"};
  150.     last unless $rule;
  151.     push(@rules, $rule);
  152.     $cnt++;
  153.     }
  154.     @rules;
  155. }
  156.  
  157. sub dump
  158. {
  159. }
  160.  
  161. 1;
  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.