瀏覽代碼

[#172] Disconnected table will create connected row objects when iterated over

Adam Lundrigan 12 年之前
父節點
當前提交
d418b73b53
共有 2 個文件被更改,包括 39 次插入0 次删除
  1. 4 0
      library/Zend/Db/Table/Rowset/Abstract.php
  2. 35 0
      tests/Zend/Db/Table/Rowset/TestCommon.php

+ 4 - 0
library/Zend/Db/Table/Rowset/Abstract.php

@@ -205,6 +205,7 @@ abstract class Zend_Db_Table_Rowset_Abstract implements SeekableIterator, Counta
                 $this->_connected = true;
             }
         }
+        $this->rewind();
         return $this->_connected;
     }
 
@@ -426,6 +427,9 @@ abstract class Zend_Db_Table_Rowset_Abstract implements SeekableIterator, Counta
                     'readOnly' => $this->_readOnly
                 )
             );
+            if ( $this->_rows[$position] instanceof Zend_Db_Table_Row_Abstract ) {
+                $this->_rows[$position]->setTable($this->getTable());
+            }
         }
 
         // return the row object

+ 35 - 0
tests/Zend/Db/Table/Rowset/TestCommon.php

@@ -339,4 +339,39 @@ abstract class Zend_Db_Table_Rowset_TestCommon extends Zend_Db_Table_TestSetup
         $rowset->getRow(4);
     }
 
+    /**
+     * @group GH-172
+     */
+    public function testTableRowsetContainsDisconnectedRowObjectsWhenDeserialized()
+    {
+        $table = $this->_table['bugs'];
+        $ser = serialize($table->fetchAll('bug_id = 1', 'bug_id ASC'));
+
+        $rowset = unserialize($ser);
+
+        $row = $rowset->current();
+        $this->assertType('Zend_Db_Table_Row_Abstract', $row); 
+        $this->assertFalse($row->isConnected());
+        $this->assertNull($row->getTable());
+    }
+
+    /**
+     * @group GH-172
+     */
+    public function testConnectedRowObjectsAreCreatedByRowsetAfterSetTableIsCalled()
+    {
+        $table = $this->_table['bugs'];
+        $ser = serialize($table->fetchAll('bug_id = 1', 'bug_id ASC'));
+        $rowset = unserialize($ser);
+
+        // Reconnect the rowset
+        $rowset->setTable($table);
+
+        $this->assertTrue($rowset->isConnected());
+        $row = $rowset->current();
+        $this->assertType('Zend_Db_Table_Row_Abstract', $row);
+        $this->assertTrue($row->isConnected());
+        $this->assertSame($row->getTable(), $table);
+    }
+
 }