]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Drop result ID from data objects on clone(). This keeps the original object working...
authorBrion Vibber <brion@pobox.com>
Mon, 15 Mar 2010 22:41:57 +0000 (15:41 -0700)
committerBrion Vibber <brion@pobox.com>
Mon, 15 Mar 2010 22:58:55 +0000 (15:58 -0700)
This bug was hitting a number of places where we had the pattern:

$db->find();
while($dbo->fetch()) {
  $x = clone($dbo);
  // do anything with $x other than storing it in an array
}

The cloned object's destructor would trigger on the second run through the loop, freeing the database result set -- not really what we wanted.
(Loops that stored the clones into an array were fine, since the clones stay in scope in the array longer than the original does.)

Detaching the database result from the clone lets us work with its data without interfering with the rest of the query.
In the unlikely even that somebody is making clones in the middle of a query, then trying to continue the query with the clone instead of the original object, well they're gonna be broken now.

classes/Safe_DataObject.php

index 021f7b50645ff4118571d3f6b4aa4b4c53eb9442..08bc6846f47bb905ac3893562ee7c5667fb51696 100644 (file)
@@ -42,6 +42,25 @@ class Safe_DataObject extends DB_DataObject
         }
     }
 
+    /**
+     * Magic function called at clone() time.
+     *
+     * We use this to drop connection with some global resources.
+     * This supports the fairly common pattern where individual
+     * items being read in a loop via a single object are cloned
+     * for individual processing, then fall out of scope when the
+     * loop comes around again.
+     *
+     * As that triggers the destructor, we want to make sure that
+     * the original object doesn't have its database result killed.
+     * It will still be freed properly when the original object
+     * gets destroyed.
+     */
+    function __clone()
+    {
+        $this->_DB_resultid = false;
+    }
+
     /**
      * Magic function called at serialize() time.
      *