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