aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet/Geocode.pm
diff options
context:
space:
mode:
authorMatthew Somerville <matthew@mysociety.org>2015-01-23 14:35:00 +0000
committerMatthew Somerville <matthew-github@dracos.co.uk>2015-02-13 11:38:05 +0000
commit0dc3e4f2c0b6e90c2b67fab5aaf7c9c3d2b1f971 (patch)
treebd9ced8416bd5c8bc65a595bff805bbc2c0ff709 /perllib/FixMyStreet/Geocode.pm
parent04117b8be30b5d82d50cdc047ac4e7c19864f8ed (diff)
Expire cached geolocations after a week.
And refactor geoloction caching code into one function (except for Zurich which has its own SOAP based system).
Diffstat (limited to 'perllib/FixMyStreet/Geocode.pm')
-rw-r--r--perllib/FixMyStreet/Geocode.pm26
1 files changed, 26 insertions, 0 deletions
diff --git a/perllib/FixMyStreet/Geocode.pm b/perllib/FixMyStreet/Geocode.pm
index b5be152a8..616df87b0 100644
--- a/perllib/FixMyStreet/Geocode.pm
+++ b/perllib/FixMyStreet/Geocode.pm
@@ -7,6 +7,11 @@
package FixMyStreet::Geocode;
use strict;
+use Digest::MD5 qw(md5_hex);
+use Encode;
+use File::Slurp;
+use File::Path ();
+use LWP::Simple qw($ua);
use URI::Escape;
use FixMyStreet::Geocode::Bing;
use FixMyStreet::Geocode::Google;
@@ -55,4 +60,25 @@ sub escape {
return $s;
}
+sub cache {
+ my ($type, $url, $args, $re) = @_;
+ my $cache_dir = FixMyStreet->config('GEO_CACHE') . $type . '/';
+ my $cache_file = $cache_dir . md5_hex($url);
+ my $js;
+ if (-s $cache_file && -M $cache_file <= 7) {
+ $js = File::Slurp::read_file($cache_file);
+ } else {
+ $url .= '&' . $args if $args;
+ $ua->timeout(15);
+ $js = LWP::Simple::get($url);
+ $js = encode_utf8($js) if utf8::is_utf8($js);
+ File::Path::mkpath($cache_dir);
+ if ($js && (!$re || $js !~ $re)) {
+ File::Slurp::write_file($cache_file, $js);
+ }
+ }
+ $js = JSON->new->utf8->allow_nonref->decode($js) if $js;
+ return $js;
+}
+
1;