# #=============================================================================== # # FILE: Cache.pm # # DESCRIPTION: # # FILES: --- # BUGS: --- # NOTES: --- # AUTHOR: Pavel Boldin (), # COMPANY: # VERSION: 1.0 # CREATED: 14.07.2009 03:52:32 MSD # REVISION: --- #=============================================================================== package POE::Component::Client::Whois::Smart::Cache; use strict; use warnings; use Data::Dumper; use Net::Whois::Raw::Common; sub initialize { # die "fuck"; 1; } sub query_order { 0; } sub query { my $class = shift; my $query_list = shift; my $heap = shift; my $args_ref = shift; my @my_queries; @$query_list = grep { ! _check_from_cache( $_, $heap, $args_ref ) } @$query_list; } sub _check_from_cache { my ($q, $heap, $args_ref) = @_; my $result = Net::Whois::Raw::Common::get_from_cache( $q, $heap->{params}->{ cache_dir }, $heap->{params}->{ cache_time }, ); return unless $result; #warn Dumper $result; my $request = { %$args_ref }; my @res; foreach (@$result) { $_->{server} = delete $_->{srv }; $_->{whois } = delete $_->{text}; my (undef, $error) = Net::Whois::Raw::Common::process_whois( $q, $_->{server}, $_->{whois}, 1 ); $_->{error} = $error if $error; push @res, $_; } $request->{cache } = \@res; $request->{from_cache} = 1; $heap->{result}->{ $q } = \@res; return 1; } sub _on_done_order { 10; } sub _on_done { my $class = shift; my $heap = shift; foreach my $query (keys %{$heap->{result}}) { my $num = $heap->{params}->{referral} == 0 ? 0 : -1; my $result = $heap->{result}{ $query }->[ $num ]; #warn $query; if ( $heap->{params}->{cache_dir} && !$result->{from_cache} && ($result->{server} || '') ne 'directi') { Net::Whois::Raw::Common::write_to_cache( $query, $heap->{result}->{$query}, $heap->{params}->{cache_dir} ); } } } 1;