home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / perl5 / WWW / RobotRules / AnyDBM_File.pm
Encoding:
Perl POD Document  |  2008-04-11  |  3.5 KB  |  171 lines

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