]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
use caching in geonames plugin
authorEvan Prodromou <evan@status.net>
Fri, 20 Nov 2009 15:58:28 +0000 (07:58 -0800)
committerCraig Andrews <candrews@integralblue.com>
Fri, 20 Nov 2009 20:27:47 +0000 (15:27 -0500)
plugins/GeonamesPlugin.php

index 59232c1c55b376667109a5f249bac358ef710fa0..340a6f0bfa916215f10915a3e097a3017b265b76 100644 (file)
@@ -63,6 +63,14 @@ class GeonamesPlugin extends Plugin
 
     function onLocationFromName($name, $language, &$location)
     {
+        $loc = $this->getCache(array('name' => $name,
+                                     'language' => $language));
+
+        if (!empty($loc)) {
+            $location = $loc;
+            return false;
+        }
+
         $client = HTTPClient::start();
 
         // XXX: break down a name by commas, narrow by each
@@ -87,6 +95,10 @@ class GeonamesPlugin extends Plugin
                 $location->location_id      = $n->geonameId;
                 $location->location_ns      = self::LOCATION_NS;
 
+                $this->setCache(array('name' => $name,
+                                     'language' => $language),
+                                $location);
+
                 // handled, don't continue processing!
                 return false;
             }
@@ -114,6 +126,13 @@ class GeonamesPlugin extends Plugin
             return true;
         }
 
+        $loc = $this->getCache(array('id' => $id));
+
+        if (!empty($loc)) {
+            $location = $loc;
+            return false;
+        }
+
         $client = HTTPClient::start();
 
         $str = http_build_query(array('geonameId' => $id,
@@ -148,6 +167,9 @@ class GeonamesPlugin extends Plugin
                 $location->lat              = $last->lat;
                 $location->lon              = $last->lng;
                 $location->names[$language] = implode(', ', array_reverse($parts));
+
+                $this->setCache(array('id' => $last->geonameId),
+                                $location);
             }
         }
 
@@ -173,6 +195,14 @@ class GeonamesPlugin extends Plugin
 
     function onLocationFromLatLon($lat, $lon, $language, &$location)
     {
+        $loc = $this->getCache(array('lat' => $lat,
+                                     'lon' => $lon));
+
+        if (!empty($loc)) {
+            $location = $loc;
+            return false;
+        }
+
         $client = HTTPClient::start();
 
         $str = http_build_query(array('lat' => $lat,
@@ -211,6 +241,10 @@ class GeonamesPlugin extends Plugin
 
                 $location->names[$language] = implode(', ', $parts);
 
+                $this->setCache(array('lat' => $lat,
+                                      'lon' => $lon),
+                                $location);
+
                 // Success! We handled it, so no further processing
 
                 return false;
@@ -242,9 +276,17 @@ class GeonamesPlugin extends Plugin
             return true;
         }
 
+        $n = $this->getCache(array('id' => $location->location_id,
+                                   'language' => $language));
+
+        if (!empty($n)) {
+            $name = $n;
+            return false;
+        }
+
         $client = HTTPClient::start();
 
-        $str = http_build_query(array('geonameId' => $id,
+        $str = http_build_query(array('geonameId' => $location->location_id,
                                       'lang' => $language));
 
         $result = $client->get('http://ws.geonames.org/hierarchyJSON?'.$str);
@@ -271,6 +313,9 @@ class GeonamesPlugin extends Plugin
 
                 if (count($parts)) {
                     $name = implode(', ', array_reverse($parts));
+                    $this->setCache(array('id' => $location->location_id,
+                                          'language' => $language),
+                                    $name);
                     return false;
                 }
             }
@@ -326,4 +371,44 @@ class GeonamesPlugin extends Plugin
         // it's been filled, so don't process further.
         return false;
     }
+
+    function getCache($attrs)
+    {
+        $c = common_memcache();
+
+        if (!$c) {
+            return null;
+        }
+
+        return $c->get($this->cacheKey($attrs));
+    }
+
+    function setCache($attrs, $loc)
+    {
+        $c = common_memcache();
+
+        if (!$c) {
+            return null;
+        }
+
+        $c->set($this->cacheKey($attrs), $loc);
+    }
+
+    function clearCache($attrs)
+    {
+        $c = common_memcache();
+
+        if (!$c) {
+            return null;
+        }
+
+        $c->delete($this->cacheKey($attrs));
+    }
+
+    function cacheKey($attrs)
+    {
+        return common_cache_key('geonames:'.
+                                implode(',', array_keys($attrs)) . ':'.
+                                common_keyize(implode(',', array_values($attrs))));
+    }
 }