Author: Frederik Holljen
Date: 2007-03-25 13:13:54 +0200 (Sun, 25 Mar 2007)
New Revision: 4772

Log:
- Implemented issue #10166: Cache PO-definitions


Added:
   trunk/PersistentObject/src/managers/cache_manager.php
   trunk/PersistentObject/tests/managers/cache_manager_test.php
Modified:
   trunk/PersistentObject/ChangeLog
   trunk/PersistentObject/docs/tutorial.txt
   trunk/PersistentObject/src/persistent_autoload.php
   trunk/PersistentObject/tests/suite.php

Modified: trunk/PersistentObject/ChangeLog
===================================================================
--- trunk/PersistentObject/ChangeLog    2007-03-23 05:37:16 UTC (rev 4771)
+++ trunk/PersistentObject/ChangeLog    2007-03-25 11:13:54 UTC (rev 4772)
@@ -10,7 +10,7 @@
 - Fixed issue #10106: ezcPersistentManualGenerator does not quote id columnName
 - Fixed issue #10369: testAddRelatedBirthdayToPerson3UpdateSuccess fails for 
no.
 - Fixed issue #10112: Lots of failures in PersistentObject tests with pgsql.
-
+- Implemented issue #10166: Cache PO-definitions
        
        
 1.2 - Monday 18 December 2006

Modified: trunk/PersistentObject/docs/tutorial.txt
===================================================================
--- trunk/PersistentObject/docs/tutorial.txt    2007-03-23 05:37:16 UTC (rev 
4771)
+++ trunk/PersistentObject/docs/tutorial.txt    2007-03-25 11:13:54 UTC (rev 
4772)
@@ -167,7 +167,7 @@
     <?php
     $session = new ezcPersistentSession(
         ezcDbInstance::get(),
-        new ezcPersistentCodeManager( "path/to/definitions" )
+        new ezcPersistentCacheManager( new ezcPersistentCodeManager( 
"path/to/definitions" ) )
     );
     ?>
 
@@ -176,7 +176,9 @@
 using ezcPersistentCodeManager to load the definitions directly from
 file. You should point it to the location where you saved the person.php
 file. If you have several directories containing definitions, you can use
-the ezcPersistentMultiManager class to add as many as you like.
+the ezcPersistentMultiManager class to add as many as you like. In addition to
+the code manager we use a cache manager. The cache manager makes sure the
+definition is loaded from disk only once.
 
 While it is possible to create a new session each time you want to manipulate a
 persistent object, you will probably want to use the same session each
@@ -185,7 +187,7 @@
 
    <?php
    $session = new ezcPersistentSession( ezcDbInstance::get(),
-                                        new ezcPersistentCodeManager( ... ) );
+                                        new ezcPersistentCacheManager( new 
ezcPersistentCodeManager( ... ) ) );
    ezcPersistentSessionInstance::set( $session ); // set default session
 
    // retrieve the session

Added: trunk/PersistentObject/src/managers/cache_manager.php
===================================================================
--- trunk/PersistentObject/src/managers/cache_manager.php       2007-03-23 
05:37:16 UTC (rev 4771)
+++ trunk/PersistentObject/src/managers/cache_manager.php       2007-03-25 
11:13:54 UTC (rev 4772)
@@ -0,0 +1,70 @@
+<?php
+/**
+ * File containing the ezcPersistentDefinitionCache class
+ *
+ * @package PersistentObject
+ * @version //autogen//
+ * @copyright Copyright (C) 2005-2007 eZ systems as. All rights reserved.
+ * @license http://ez.no/licenses/new_bsd New BSD License
+ */
+
+/**
+ * Caches fetched definition so they don't have to be read from the original 
source
+ * for each use.
+ *
+ * The cache is typically used to wrap around another 
ezcPersistentDefinitionManager
+ * of your choice.
+ *
+ * @package PersistentObject
+ */
+class ezcPersistentCacheManager extends ezcPersistentDefinitionManager
+{
+    /**
+     * Holds the manager that fetches definitions..
+     *
+     * @var ezcPersistentDefinitionManager
+     */
+    private $manager;
+
+    /**
+     * Holds the persistent object definitions that are currently cached.
+     *
+     * @var array( 'className' => ezcPerssitentDefinition )
+     */
+    private $cache = array();
+
+    /**
+     * Constructs a new definition cache.
+     *
+     * @param (ezcPersistentDefinitionManager $manager
+     */
+    public function __construct( ezcPersistentDefinitionManager $manager )
+    {
+        $this->manager = $manager;
+    }
+
+    /**
+     * Returns the definition of the persistent object with the class $class.
+     *
+     * If a definition has been requested already the definition will be 
served from
+     * the cache.
+     *
+     * @throws ezcPersistentDefinitionNotFoundException if no such definition 
can be found.
+     * @param string $class
+     * @return ezcPersistentDefinition
+     */
+    public function fetchDefinition( $class )
+    {
+        if( isset( $this->cache[$class] ) )
+        {
+            return $this->cache[$class];
+        }
+
+        $def = $this->manager->fetchDefinition( $class );
+
+        // cache it
+        $this->cache[$class] = $def;
+        return $def;
+    }
+}
+?>


Property changes on: trunk/PersistentObject/src/managers/cache_manager.php
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: trunk/PersistentObject/src/persistent_autoload.php
===================================================================
--- trunk/PersistentObject/src/persistent_autoload.php  2007-03-23 05:37:16 UTC 
(rev 4771)
+++ trunk/PersistentObject/src/persistent_autoload.php  2007-03-25 11:13:54 UTC 
(rev 4772)
@@ -44,6 +44,7 @@
     'ezcPersistentDefinitionManager'                    => 
'PersistentObject/interfaces/definition_manager.php',
     'ezcPersistentMultiManager'                         => 
'PersistentObject/managers/multi_manager.php',
     'ezcPersistentCodeManager'                          => 
'PersistentObject/managers/code_manager.php',
+    'ezcPersistentCacheManager'                         => 
'PersistentObject/managers/cache_manager.php',
     'ezcPersistentDefinitionNotFoundException'          => 
'PersistentObject/exceptions/definition_not_found.php',
     'ezcPersistentDefinitionMissingIdPropertyException' => 
'PersistentObject/exceptions/definition_missing_id_property.php',
 );

Added: trunk/PersistentObject/tests/managers/cache_manager_test.php
===================================================================
--- trunk/PersistentObject/tests/managers/cache_manager_test.php        
2007-03-23 05:37:16 UTC (rev 4771)
+++ trunk/PersistentObject/tests/managers/cache_manager_test.php        
2007-03-25 11:13:54 UTC (rev 4772)
@@ -0,0 +1,60 @@
+<?php
+/**
+ * @copyright Copyright (C) 2005-2007 eZ systems as. All rights reserved.
+ * @license http://ez.no/licenses/new_bsd New BSD License
+ * @version //autogentag//
+ * @filesource
+ * @package PersistentObject
+ * @subpackage Tests
+ */
+
+/**
+ * Tests the cache manager.
+ *
+ * @package PersistentObject
+ * @subpackage Tests
+ */
+class ezcPersistentCacheManagerTest extends ezcTestCase
+{
+    private $manager = null;
+
+    protected function setUp()
+    {
+        $this->manager = new ezcPersistentCacheManager( new 
ezcPersistentCodeManager( dirname( __FILE__ ) . "/data/" ) );
+    }
+
+    public function testFetchValid()
+    {
+        $def = $this->manager->fetchDefinition( "SimpleDefinition" );
+        $this->assertEquals( true, $def instanceof 
ezcPersistentObjectDefinition );
+    }
+
+    public function testFetchCache()
+    {
+        $def = $this->manager->fetchDefinition( "SimpleDefinition" );
+        $this->assertEquals( true, $def instanceof 
ezcPersistentObjectDefinition );
+        $def2 = $this->manager->fetchDefinition( "SimpleDefinition" );
+        $this->assertEquals( true, $def2 instanceof 
ezcPersistentObjectDefinition );
+        $this->assertEquals( $def, $def2 );
+    }
+
+    public function testInvalidClass()
+    {
+        try
+        {
+            $this->manager->fetchDefinition( "NoSuchClass" );
+        }
+        catch ( Exception $e )
+        {
+            return;
+        }
+        $this->fail( "Fetching a non-existent definition did not throw an 
exception." );
+    }
+
+    public static function suite()
+    {
+        return new PHPUnit_Framework_TestSuite( 
'ezcPersistentCacheManagerTest' );
+    }
+}
+
+?>


Property changes on: 
trunk/PersistentObject/tests/managers/cache_manager_test.php
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: trunk/PersistentObject/tests/suite.php
===================================================================
--- trunk/PersistentObject/tests/suite.php      2007-03-23 05:37:16 UTC (rev 
4771)
+++ trunk/PersistentObject/tests/suite.php      2007-03-25 11:13:54 UTC (rev 
4772)
@@ -13,6 +13,7 @@
  * Including the tests
  */
 require_once( 'managers/code_manager_test.php' );
+require_once( 'managers/cache_manager_test.php' );
 require_once( 'managers/multi_manager_test.php' );
 require_once( 'persistent_session_test.php' );
 require_once( 'find_iterator_test.php' );
@@ -37,6 +38,7 @@
         $this->setName("PersistentObject");
 
         $this->addTest( ezcPersistentCodeManagerTest::suite() );
+        $this->addTest( ezcPersistentCacheManagerTest::suite() );
         $this->addTest( ezcPersistentMultiManagerTest::suite() );
         $this->addTest( ezcPersistentSessionTest::suite() );
         $this->addTest( ezcPersistentFindIteratorTest::suite() );

-- 
svn-components mailing list
svn-components@lists.ez.no
http://lists.ez.no/mailman/listinfo/svn-components

Reply via email to