]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
updateWithKeys now understands multi-column keys
authorMikael Nordfeldth <mmn@hethane.se>
Thu, 28 Jan 2016 15:42:59 +0000 (16:42 +0100)
committerMikael Nordfeldth <mmn@hethane.se>
Thu, 28 Jan 2016 15:42:59 +0000 (16:42 +0100)
and automatically identifies _which_ columns are the right ones,
so for example 'uri' primary keys don't need to be explicitly set

classes/Managed_DataObject.php
plugins/OStatus/classes/HubSub.php
plugins/OStatus/classes/Ostatus_profile.php
plugins/Oembed/OembedPlugin.php
plugins/StoreRemoteMedia/StoreRemoteMediaPlugin.php

index 68de8922ce20f2cc217cf29089004e1e086f519c..c02685e55e30adbdbfe208c605770f94417e400e 100644 (file)
@@ -420,12 +420,16 @@ abstract class Managed_DataObject extends Memcached_DataObject
      * @param DB_DataObject &$orig  Must be "instanceof" $this
      * @param string         $pid   Primary ID column (no escaping is done on column name!)
      */
-    public function updateWithKeys(Managed_DataObject $orig, $pid='id')
+    public function updateWithKeys(Managed_DataObject $orig, $pid=null)
     {
         if (!$orig instanceof $this) {
             throw new ServerException('Tried updating a DataObject with a different class than itself.');
         }
 
+        if ($this->N <1) {
+            throw new ServerException('DataObject must be the result of a query (N>=1) before updateWithKeys()');
+        }
+
         // do it in a transaction
         $this->query('BEGIN');
 
@@ -452,11 +456,23 @@ abstract class Managed_DataObject extends Memcached_DataObject
             return true;
         }
 
-        $qry = sprintf('UPDATE %1$s SET %2$s WHERE %3$s = %4$s',
+        if ($pid === null) {
+            $schema = static::schemaDef();
+            $pid = $schema['primary key'];
+            unset($schema);
+        }
+        $pidWhere = array();
+        foreach((array)$pid as $pidCol) { 
+            $pidWhere[] = sprintf('%1$s = %2$s', $pidCol, $this->_quote($orig->$pidCol));
+        }
+        if (empty($pidWhere)) {
+            throw new ServerException('No primary ID column(s) set for updateWithKeys');
+        }
+
+        $qry = sprintf('UPDATE %1$s SET %2$s WHERE %3$s',
                             common_database_tablename($this->tableName()),
                             implode(', ', $parts),
-                            $pid,
-                            $this->_quote($orig->$pid));
+                            implode(' AND ', $pidWhere));
 
         $result = $this->query($qry);
         if ($result === false) {
index e2b5dc2a6dd0ee28660bcd2a7b2438f991e94cce..a2d6e2e51e834bbf6271e9ebfdaa08c96d702b4b 100644 (file)
@@ -323,7 +323,7 @@ class HubSub extends Managed_DataObject
                 $orig = clone($this);
                 $this->callback = $httpscallback;
                 $this->hashkey = self::hashkey($this->getTopic(), $this->callback);
-                $this->updateWithKeys($orig, 'hashkey');
+                $this->updateWithKeys($orig);
                 return true;
             }
         }
index 2a540e21d2d6f94a65dfdb3e42b373e199818cc2..d08f91330920bf3dd657709faa26ef67174de8ae 100644 (file)
@@ -1853,7 +1853,7 @@ class Ostatus_profile extends Managed_DataObject
         }
 
         common_debug('URIFIX Updating Ostatus_profile URI for '.$orig->uri.' to '.$this->uri);
-        $this->updateWithKeys($orig, 'uri');    // 'uri' is the primary key column
+        $this->updateWithKeys($orig);    // Will use the PID column(s) in the 'UPDATE ... WHERE [unique selector]'
 
         common_debug('URIFIX Subscribing/renewing feedsub for Ostatus_profile '.$this->uri);
         $this->subscribe();
index 23ee6148ea947768040cccf1653cf0dd52161519..184f962652200d2bb3f4981a95a3180c7edc43d7 100644 (file)
@@ -305,7 +305,7 @@ class OembedPlugin extends Plugin
         $thumbnail->width = $info[0];    // array indexes documented on php.net:
         $thumbnail->height = $info[1];   // https://php.net/manual/en/function.getimagesize.php
         // Throws exception on failure.
-        $thumbnail->updateWithKeys($orig, 'file_id');
+        $thumbnail->updateWithKeys($orig);
     }
 
     public function onPluginVersion(array &$versions)
index e3b95410be0a409a1e2101ef8a271c51fa5c4047..34846748e757676a01ed9d861ea2cfa1572db8a8 100644 (file)
@@ -108,7 +108,7 @@ class StoreRemoteMediaPlugin extends Plugin
             $file->width = $info[0];    // array indexes documented on php.net:
             $file->height = $info[1];   // https://php.net/manual/en/function.getimagesize.php
             // Throws exception on failure.
-            $file->updateWithKeys($orig, 'id');
+            $file->updateWithKeys($orig);
         }
         // Get rid of the file from memory
         unset($imgData);