]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge branch '0.9.x' of git@gitorious.org:statusnet/mainline into 0.9.x
authorEvan Prodromou <evan@status.net>
Sun, 10 Jan 2010 22:18:54 +0000 (14:18 -0800)
committerEvan Prodromou <evan@status.net>
Sun, 10 Jan 2010 22:18:54 +0000 (14:18 -0800)
classes/File.php
classes/File_oembed.php
classes/Memcached_DataObject.php
lib/api.php
lib/snapshot.php
lib/util.php

index 6173f31d6e5025c5d8a4c56284f3b72d83598f37..c527c4ffe92012a2877b434bb83becfd44fc6891 100644 (file)
@@ -80,7 +80,14 @@ class File extends Memcached_DataObject
         if (isset($redir_data['type'])
             && (('text/html' === substr($redir_data['type'], 0, 9) || 'application/xhtml+xml' === substr($redir_data['type'], 0, 21)))
             && ($oembed_data = File_oembed::_getOembed($given_url))) {
+
+            $fo = File_oembed::staticGet('file_id', $file_id);
+
+            if (empty($fo)) {
                 File_oembed::saveNew($oembed_data, $file_id);
+            } else {
+                common_log(LOG_WARNING, "Strangely, a File_oembed object exists for new file $file_id", __FILE__);
+            }
         }
         return $x;
     }
index e41ccfd097eb4d415d02d587f2fc08d6d7e57ecc..11f160718ef21b38ebf6043384b3fc8ffff2dfae 100644 (file)
@@ -115,7 +115,13 @@ class File_oembed extends Memcached_DataObject
         }
         $file_oembed->insert();
         if (!empty($data->thumbnail_url)) {
-            File_thumbnail::saveNew($data, $file_id);
+            $ft = File_thumbnail::staticGet('file_id', $file_id);
+            if (!empty($ft)) {
+                common_log(LOG_WARNING, "Strangely, a File_thumbnail object exists for new file $file_id",
+                           __FILE__);
+            } else {
+                File_thumbnail::saveNew($data, $file_id);
+            }
         }
     }
 }
index 400b05f9776fca066e462e3a812a2a37fc08f7a6..21f6781c2dcf27a4fe4d4862b30ff7a6dcdfec57 100644 (file)
@@ -19,6 +19,8 @@
 
 if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
 
+require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
+
 class Memcached_DataObject extends DB_DataObject
 {
     /**
@@ -66,6 +68,7 @@ class Memcached_DataObject extends DB_DataObject
         // Clear this out so we don't accidentally break global
         // state in *this* process.
         $this->_DB_resultid = null;
+
         // We don't have any local DBO refs, so clear these out.
         $this->_link_loaded = false;
     }
@@ -90,42 +93,30 @@ class Memcached_DataObject extends DB_DataObject
             unset($i);
         }
         $i = Memcached_DataObject::getcached($cls, $k, $v);
-        if ($i === false) { // false == cache miss
+        if ($i) {
+            return $i;
+        } else {
             $i = DB_DataObject::factory($cls);
             if (empty($i)) {
-                $i = false;
-                return $i;
+                return false;
             }
             $result = $i->get($k, $v);
             if ($result) {
-                // Hit!
                 $i->encache();
+                return $i;
             } else {
-                // save the fact that no such row exists
-                $c = self::memcache();
-                if (!empty($c)) {
-                    $ck = self::cachekey($cls, $k, $v);
-                    $c->set($ck, null);
-                }
-                $i = false;
+                return false;
             }
         }
-        return $i;
     }
 
-    /**
-     * @fixme Should this return false on lookup fail to match staticGet?
-     */
-    function pkeyGet($cls, $kv)
+    function &pkeyGet($cls, $kv)
     {
         $i = Memcached_DataObject::multicache($cls, $kv);
-        if ($i !== false) { // false == cache miss
+        if ($i) {
             return $i;
         } else {
-            $i = DB_DataObject::factory($cls);
-            if (empty($i)) {
-                return false;
-            }
+            $i = new $cls();
             foreach ($kv as $k => $v) {
                 $i->$k = $v;
             }
@@ -133,11 +124,6 @@ class Memcached_DataObject extends DB_DataObject
                 $i->encache();
             } else {
                 $i = null;
-                $c = self::memcache();
-                if (!empty($c)) {
-                    $ck = self::multicacheKey($cls, $kv);
-                    $c->set($ck, null);
-                }
             }
             return $i;
         }
@@ -146,9 +132,6 @@ class Memcached_DataObject extends DB_DataObject
     function insert()
     {
         $result = parent::insert();
-        if ($result) {
-            $this->encache(); // in case of cached negative lookups
-        }
         return $result;
     }
 
@@ -188,23 +171,21 @@ class Memcached_DataObject extends DB_DataObject
         if (!$c) {
             return false;
         } else {
-            return $c->get(Memcached_DataObject::cacheKey($cls, $k, $v));
+            $obj = $c->get(Memcached_DataObject::cacheKey($cls, $k, $v));
+            if (0 == strcasecmp($cls, 'User')) {
+                // Special case for User
+                if (is_object($obj->id)) {
+                    common_log(LOG_ERR, "User " . $obj->nickname . " was cached with User as ID; deleting");
+                    $c->delete(Memcached_DataObject::cacheKey($cls, $k, $v));
+                    return false;
+                }
+            }
+            return $obj;
         }
     }
 
     function keyTypes()
     {
-        // ini-based classes return number-indexed arrays. handbuilt
-        // classes return column => keytype. Make this uniform.
-
-        $keys = $this->keys();
-
-        $keyskeys = array_keys($keys);
-
-        if (is_string($keyskeys[0])) {
-            return $keys;
-        }
-
         global $_DB_DATAOBJECT;
         if (!isset($_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"])) {
             $this->databaseStructure();
@@ -216,90 +197,73 @@ class Memcached_DataObject extends DB_DataObject
     function encache()
     {
         $c = $this->memcache();
-
         if (!$c) {
             return false;
-        }
-
-        $keys = $this->_allCacheKeys();
-
-        foreach ($keys as $key) {
-            $c->set($key, $this);
+        } else if ($this->tableName() == 'user' && is_object($this->id)) {
+            // Special case for User bug
+            $e = new Exception();
+            common_log(LOG_ERR, __METHOD__ . ' caching user with User object as ID ' .
+                       str_replace("\n", " ", $e->getTraceAsString()));
+            return false;
+        } else {
+            $pkey = array();
+            $pval = array();
+            $types = $this->keyTypes();
+            ksort($types);
+            foreach ($types as $key => $type) {
+                if ($type == 'K') {
+                    $pkey[] = $key;
+                    $pval[] = $this->$key;
+                } else {
+                    $c->set($this->cacheKey($this->tableName(), $key, $this->$key), $this);
+                }
+            }
+            # XXX: should work for both compound and scalar pkeys
+            $pvals = implode(',', $pval);
+            $pkeys = implode(',', $pkey);
+            $c->set($this->cacheKey($this->tableName(), $pkeys, $pvals), $this);
         }
     }
 
     function decache()
     {
         $c = $this->memcache();
-
         if (!$c) {
             return false;
-        }
-
-        $keys = $this->_allCacheKeys();
-
-        foreach ($keys as $key) {
-            $c->delete($key, $this);
-        }
-    }
-
-    function _allCacheKeys()
-    {
-        $ckeys = array();
-
-        $types = $this->keyTypes();
-        ksort($types);
-
-        $pkey = array();
-        $pval = array();
-
-        foreach ($types as $key => $type) {
-
-            assert(!empty($key));
-
-            if ($type == 'U') {
-                if (empty($this->$key)) {
-                    continue;
+        } else {
+            $pkey = array();
+            $pval = array();
+            $types = $this->keyTypes();
+            ksort($types);
+            foreach ($types as $key => $type) {
+                if ($type == 'K') {
+                    $pkey[] = $key;
+                    $pval[] = $this->$key;
+                } else {
+                    $c->delete($this->cacheKey($this->tableName(), $key, $this->$key));
                 }
-                $ckeys[] = $this->cacheKey($this->tableName(), $key, $this->$key);
-            } else if ($type == 'K' || $type == 'N') {
-                $pkey[] = $key;
-                $pval[] = $this->$key;
-            } else {
-                throw new Exception("Unknown key type $key => $type for " . $this->tableName());
             }
+            # should work for both compound and scalar pkeys
+            # XXX: comma works for now but may not be safe separator for future keys
+            $pvals = implode(',', $pval);
+            $pkeys = implode(',', $pkey);
+            $c->delete($this->cacheKey($this->tableName(), $pkeys, $pvals));
         }
-
-        assert(count($pkey) > 0);
-
-        // XXX: should work for both compound and scalar pkeys
-        $pvals = implode(',', $pval);
-        $pkeys = implode(',', $pkey);
-
-        $ckeys[] = $this->cacheKey($this->tableName(), $pkeys, $pvals);
-
-        return $ckeys;
     }
 
     function multicache($cls, $kv)
     {
         ksort($kv);
-        $c = self::memcache();
+        $c = Memcached_DataObject::memcache();
         if (!$c) {
             return false;
         } else {
-            return $c->get(self::multicacheKey($cls, $kv));
+            $pkeys = implode(',', array_keys($kv));
+            $pvals = implode(',', array_values($kv));
+            return $c->get(Memcached_DataObject::cacheKey($cls, $pkeys, $pvals));
         }
     }
 
-    static function multicacheKey($cls, $kv)
-    {
-        ksort($kv);
-        $pkeys = implode(',', array_keys($kv));
-        $pvals = implode(',', array_values($kv));
-        return self::cacheKey($cls, $pkeys, $pvals);
-    }
-
     function getSearchEngine($table)
     {
         require_once INSTALLDIR.'/lib/search_engines.php';
@@ -334,8 +298,7 @@ class Memcached_DataObject extends DB_DataObject
         $key_part = common_keyize($cls).':'.md5($qry);
         $ckey = common_cache_key($key_part);
         $stored = $c->get($ckey);
-
-        if ($stored !== false) {
+        if ($stored) {
             return new ArrayWrapper($stored);
         }
 
index a6aea5d6d68df8998152107399683ced599f34ca..d21851d503c4bcb1ef14085c5dc899979d108757 100644 (file)
@@ -140,12 +140,14 @@ class ApiAction extends Action
 
         // Note: some profiles don't have an associated user
 
+        $defaultDesign = Design::siteDesign();
+
         if (!empty($user)) {
             $design = $user->getDesign();
         }
 
         if (empty($design)) {
-            $design = Design::siteDesign();
+            $design = $defaultDesign;
         }
 
         $color = Design::toWebColor(empty($design->backgroundcolor) ? $defaultDesign->backgroundcolor : $design->backgroundcolor);
index 2a10c6b9359d503dce7c7829f8d5aeff2c4b2f10..a16087ac00da648d6b3f43307be0c776a1b688b4 100644 (file)
@@ -173,8 +173,12 @@ class Snapshot
         // XXX: Use OICU2 and OAuth to make authorized requests
 
         $reporturl = common_config('snapshot', 'reporturl');
-        $request = HTTPClient::start();
-        $request->post($reporturl, null, $this->stats);
+        try {
+            $request = HTTPClient::start();
+            $request->post($reporturl, null, $this->stats);
+        } catch (Exception $e) {
+            common_log(LOG_WARNING, "Error in snapshot: " . $e->getMessage());
+        }
     }
 
     /**
index 50bd0e2ac938de026a3d4b5187823773136a62d0..a4281121ebd4d05d936b273630f7ea590dd1933f 100644 (file)
@@ -119,6 +119,11 @@ function common_language()
 
 function common_munge_password($password, $id)
 {
+    if (is_object($id) || is_object($password)) {
+        $e = new Exception();
+        common_log(LOG_ERR, __METHOD__ . ' object in param to common_munge_password ' .
+                   str_replace("\n", " ", $e->getTraceAsString()));
+    }
     return md5($password . $id);
 }