DBD-Amazon

 view release on metacpan or  search on metacpan

lib/SQL/Amazon/Request/Request.pm  view on Meta::CPAN

	return $url_roots{$obj->{_locale}} ? $obj : undef;
}

sub send_request {
	my ($obj, $store, $reqids) = @_;
	$obj->{_warnmsg} = undef;
	$obj->{_errmsg} = undef;
	my $url_params = $obj->{url_params}; 
	my %reqhash = %$url_params;
	foreach (keys %$url_params) {
		delete $url_params->{$_}
			unless (defined($url_params->{$_}) &&
				($url_params->{$_} ne ''));
	}

	while (1) {
		my $currpage = $url_params->{ItemPage};
		last if ($currpage > $obj->{_max_pages});
		my ($cache_req, $lastpage) = $obj->check_cache;
		
		if ($cache_req) {
			DBI->trace_msg("[SQL::Amazon::Request::Request::send_request] Request satisfied from cache.\n", 3)
				if $ENV{DBD_AMZN_DEBUG};
			$reqids->{$cache_req} = 1;
			$obj->advance_request_page;
			$lastpage ? last : next;
		}
		my $dbgname = $ENV{DBD_AMZN_SRC};

		if ($dbgname) {
			$dbgname .= $url_params->{ResponseGroup} . 
				'/reqno' . $obj->{_reqno} . 'page' . $currpage . '.xml'
				if (substr($dbgname, -1, 1) eq '/');
		}
		sleep 1
			while (defined($last_time) && (time() - $last_time == 0));
		my $xml;
		if ($dbgname && -e $dbgname) {
			DBI->trace_msg("[SQL::Amazon::Request::Request::send_request] Loading XML from $dbgname.\n", 3)
				if $ENV{DBD_AMZN_DEBUG};

			eval { $xml = XMLin($dbgname); };
			if ($@) {
				print STDERR "Can't read local version of $dbgname: $@\n";
			}
		}

		unless (defined($xml)) {
			if ($ENV{DBD_AMZN_DEBUG}) {
				my $tracemsg = '';
				$tracemsg .= "$_=$url_params->{$_}&"
					foreach (keys %$url_params);
				chop $tracemsg;
				DBI->trace_msg("[SQL::Amazon::Request::Request::send_request] Posting ECS request:\n$tracemsg\n", 3);
			}

			my $resp = $obj->{_lwp}->post($url_roots{$obj->{_locale}}, $url_params);
	
			if ($dbgname && (! -e $dbgname)) {
				open(XMLF, ">$dbgname") || die $!;
				print XMLF $resp->decoded_content;
				close XMLF;
			}
		
			$obj->{_errstr} = 'Amazon ECS request failed: Unknown reason.',
			return undef
				unless $resp;

			$obj->{_errstr} = 'Amazon ECS request failed: ' . $resp->status_line,
			return undef
				unless $resp->is_success;
			$xml = XMLin($resp->decoded_content);
		}
	
		$obj->{_errstr} = 'Unable to parse Amazon ECS response.',
		return undef 
			unless $xml;
		$last_time = time();
		return undef
			if $obj->has_errors($xml);
		last
			unless $obj->process_results($xml, $store, $reqids);
	}
	$obj->{url_params} = \%reqhash;
	return $obj;		
}
sub check_cache {
	my $obj = shift;
	
	my $url_params = $obj->{url_params};
	
	my @req = ();
	push @req, $_ . '=' . $url_params->{$_}
		foreach (sort keys %$url_params);
	my $req = join('&', @req);

	return (undef, undef)
		unless $reqcache{$req};
	
	delete $reqcache{$req},
	return (undef, undef)
		if ($reqcache{$req}[2] < time());
	$reqcache{$req}[2] = time() + AMZN_CACHE_TIME_LIMIT;
}
sub add_to_cache {
	my ($obj, $reqid, $lastpage) = @_;
	
	my $url_params = $obj->{url_params};
	
	my @req = ();
	push @req, $_ . '=' . $url_params->{$_}
		foreach (sort keys %$url_params);

	my $req = join('&', @req);
	
	$reqcache{$req} = [ $reqid, $lastpage, time() + AMZN_CACHE_TIME_LIMIT ];
	return $obj;
}

sub errstr { return shift->{_errstr}; }

sub warnstr { return shift->{_warnstr}; }
sub equals {
	my ($obj, $request) = @_;
	
	return undef 
		unless (ref $obj eq ref $request);
	my $myparms = $obj->{url_params};
	my $otherparms = $request->{url_params};
	foreach (%$myparms) {
		return undef 
			unless ($otherparms->{$_} &&



( run in 1.220 second using v1.01-cache-2.11-cpan-39bf76dae61 )