Author: Tobias Schlitt Date: 2007-01-22 17:52:20 +0100 (Mon, 22 Jan 2007) New Revision: 4542
Log: - Fixed issue #9999: idProperty missing in definition file causes unclear error messages. # I had to adjust the manager test cases, which did not have an ID property # defined. Added: trunk/PersistentObject/src/exceptions/definition_missing_id_property.php trunk/PersistentObject/tests/data/persistent_test_object_no_id.php trunk/PersistentObject/tests/data/persistenttestobjectnoid.php Modified: trunk/PersistentObject/ChangeLog trunk/PersistentObject/src/managers/code_manager.php trunk/PersistentObject/src/persistent_autoload.php trunk/PersistentObject/tests/managers/data/simpledefinition.php trunk/PersistentObject/tests/managers/data2/myclass.php trunk/PersistentObject/tests/persistent_session_test.php Modified: trunk/PersistentObject/ChangeLog =================================================================== --- trunk/PersistentObject/ChangeLog 2007-01-22 11:07:09 UTC (rev 4541) +++ trunk/PersistentObject/ChangeLog 2007-01-22 16:52:20 UTC (rev 4542) @@ -1,3 +1,9 @@ +1.3beta1 - [RELEASEDATE] +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- Fixed issue #9999: idProperty missing in definition file causes unclear + error messages. + 1.2 - Monday 18 December 2006 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Added: trunk/PersistentObject/src/exceptions/definition_missing_id_property.php =================================================================== --- trunk/PersistentObject/src/exceptions/definition_missing_id_property.php 2007-01-22 11:07:09 UTC (rev 4541) +++ trunk/PersistentObject/src/exceptions/definition_missing_id_property.php 2007-01-22 16:52:20 UTC (rev 4542) @@ -0,0 +1,30 @@ +<?php +/** + * File containing the ezcPersistentDefinitionMissingIdPropertyException 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 + */ +/** + * Exception thrown, if an object of ezcPersistentObjectDefinition has no idProperty attribute. + * + * @package PersistentObject + * @version //autogen// + */ +class ezcPersistentDefinitionMissingIdPropertyException extends ezcPersistentObjectException +{ + + /** + * Constructs a new ezcPersistentDefinitionMissingIdPropertyException for the class $class. + * + * @param string $class + * @return void + */ + public function __construct( $class ) + { + parent::__construct( "The persistent object definition for the class '$class' does not have an 'idProperty' attribute defined." ); + } +} +?> Property changes on: trunk/PersistentObject/src/exceptions/definition_missing_id_property.php ___________________________________________________________________ Name: svn:eol-style + native Modified: trunk/PersistentObject/src/managers/code_manager.php =================================================================== --- trunk/PersistentObject/src/managers/code_manager.php 2007-01-22 11:07:09 UTC (rev 4541) +++ trunk/PersistentObject/src/managers/code_manager.php 2007-01-22 16:52:20 UTC (rev 4542) @@ -62,6 +62,8 @@ * Returns the definition of the persistent object with the class $class. * * @throws ezcPersistentDefinitionNotFoundException if no such definition can be found. + * @throws ezcPersistentDefinitionMissingIdPropertyException + * if the definition does not have an "idProperty" attribute. * @param string $class * @return ezcPersistentDefinition */ @@ -78,6 +80,10 @@ throw new ezcPersistentDefinitionNotFoundException( $class, "Searched for '" . realpath( dirname( $path ) ) . "/" . basename( $path ) . "'." ); } + if ( isset( $definition->idProperty ) === false ) + { + throw new ezcPersistentDefinitionMissingIdPropertyException( $class ); + } $definition = $this->setupReversePropertyDefinition( $definition ); return $definition; } Modified: trunk/PersistentObject/src/persistent_autoload.php =================================================================== --- trunk/PersistentObject/src/persistent_autoload.php 2007-01-22 11:07:09 UTC (rev 4541) +++ trunk/PersistentObject/src/persistent_autoload.php 2007-01-22 16:52:20 UTC (rev 4542) @@ -45,5 +45,6 @@ 'ezcPersistentMultiManager' => 'PersistentObject/managers/multi_manager.php', 'ezcPersistentCodeManager' => 'PersistentObject/managers/code_manager.php', 'ezcPersistentDefinitionNotFoundException' => 'PersistentObject/exceptions/definition_not_found.php', + 'ezcPersistentDefinitionMissingIdPropertyException' => 'PersistentObject/exceptions/definition_missing_id_property.php', ); ?> Added: trunk/PersistentObject/tests/data/persistent_test_object_no_id.php =================================================================== --- trunk/PersistentObject/tests/data/persistent_test_object_no_id.php 2007-01-22 11:07:09 UTC (rev 4541) +++ trunk/PersistentObject/tests/data/persistent_test_object_no_id.php 2007-01-22 16:52:20 UTC (rev 4542) @@ -0,0 +1,121 @@ +<?php +ezcTestRunner::addFileToFilter( __FILE__ ); + +/** +CREATE TABLE PO_test +( + id integer unsigned not null auto_increment, + type_varchar varchar(20), + type_integer integer, + type_decimal decimal(10,2), + type_text text, + + PRIMARY KEY (id) +) TYPE=InnoDB; + + type_date date, +*/ + +class PersistentTestObjectNoId +{ + public $id = null; + public $varchar = null; + public $integer = null; + public $decimal = null; + public $text = null; + + /** + * Inserts some data to use for testing. + */ + public static function insertCleanData() + { + $db = ezcDbInstance::get(); + $db->exec( "insert into PO_test (id, type_varchar, type_integer, + type_decimal, type_text ) + VALUES ( 1, 'Sweden', 9006405, 449.96, 'Sweden has nice girls!' )" ); + + $db->exec( "insert into PO_test (id, type_varchar, type_integer, + type_decimal, type_text ) + VALUES (2, 'Norway', 4593041, 385.19, 'Norway has brown goat cheese!' )" ); + + $db->exec( "insert into PO_test (id, type_varchar, type_integer, + type_decimal, type_text ) + VALUES (3, 'Ukraine', 47732079, 603.70, 'Ukraine has a long coastline to the black see.' )" ); + + $db->exec( "insert into PO_test (id, type_varchar, type_integer, + type_decimal, type_text ) + VALUES (4, 'Germany', 82443000, 357.02, 'Home of the lederhosen!.' )" ); + } + + /** + * Saves the schema from database to file. + * + * Use this method if you have changed the definition of the persistent object + * and need to update the file on disk. + */ + public function saveSchema() + { + $db = ezcDbInstance::get(); + $schema = ezcDbSchema::createFromDb( $db ); + $schema->writeToFile( 'array', dirname( __FILE__ ) . '/persistent_test_object.dba' ); + } + + /** + * Loads the schema from file into the database. + */ + public static function setupTable() + { + $db = ezcDbInstance::get(); + // Load schema + $schema = ezcDbSchema::createFromFile( 'array', dirname( __FILE__ ) . '/persistent_test_object.dba' ); + $schema->writeToDb( $db ); + + // create sequence if it is a postgres database + if ( $db->getName() == 'pgsql' ) + { + $db->exec( 'CREATE SEQUENCE PO_test_seq START 5' ); + } + + } + + public static function cleanup() + { + $db = ezcDbInstance::get(); + $db->exec( 'DROP TABLE PO_test' ); + if ( $db->getName() == 'pgsql' ) + { + $db->exec( 'DROP SEQUENCE po_test_seq' ); + } + } + + /* + public function saveSqlSchemas() + { + $db = ezcDbInstance::get(); + $schema = ezcDbSchema::createFromFile( 'php', dirname( __FILE__ ) . '/persistent_test_object.dba' ); + $schema->writeToFile( dirname( __FILE__ ) . '/persistent_test_object-pgsql.sql', 'pgsql-file', 'schema' ); + } + */ + + public function setState( array $state ) + { + foreach ( $state as $key => $value ) + { + $this->$key = $value; + } + } + + public function getState() + { + $result = array(); + $result['id'] = $this->id; + $result['decimal'] = $this->decimal; + $result['varchar'] = $this->varchar; + $result['integer'] = $this->integer; + $result['text'] = $this->text; + $result['no_such_var'] = "bah"; // This is here to make sure it does not provoke an error. + return $result; + } +} + +?> Property changes on: trunk/PersistentObject/tests/data/persistent_test_object_no_id.php ___________________________________________________________________ Name: svn:eol-style + native Added: trunk/PersistentObject/tests/data/persistenttestobjectnoid.php =================================================================== --- trunk/PersistentObject/tests/data/persistenttestobjectnoid.php 2007-01-22 11:07:09 UTC (rev 4541) +++ trunk/PersistentObject/tests/data/persistenttestobjectnoid.php 2007-01-22 16:52:20 UTC (rev 4542) @@ -0,0 +1,47 @@ +<?php +ezcTestRunner::addFileToFilter( __FILE__ ); + +/* + * Holds the definition for PersistentTestObject + * This definition is used by the code manager for + * various tests in the system. + */ +// build definition +$def = new ezcPersistentObjectDefinition(); +$def->table = "PO_test"; +$def->class = "PersistentTestObjectNoId"; + +$def->properties['varchar'] = new ezcPersistentObjectProperty; +$def->properties['varchar']->columnName = 'type_varchar'; +$def->properties['varchar']->propertyName = 'varchar'; +$def->properties['varchar']->propertyType = ezcPersistentObjectProperty::PHP_TYPE_STRING; +$def->properties['varchar']->defaultValue = ''; +$def->properties['varchar']->visibility = ezcPersistentObjectProperty::VISIBILITY_PRIVATE; +$def->properties['varchar']->isRequired = false; + +$def->properties['integer'] = new ezcPersistentObjectProperty; +$def->properties['integer']->columnName = 'type_integer'; +$def->properties['integer']->propertyName = 'integer'; +$def->properties['integer']->propertyType = ezcPersistentObjectProperty::PHP_TYPE_INT; +$def->properties['integer']->defaultValue = 0; +$def->properties['integer']->visibility = ezcPersistentObjectProperty::VISIBILITY_PRIVATE; +$def->properties['integer']->isRequired = false; + +$def->properties['decimal'] = new ezcPersistentObjectProperty; +$def->properties['decimal']->columnName = 'type_decimal'; +$def->properties['decimal']->propertyName = 'decimal'; +$def->properties['decimal']->propertyType = ezcPersistentObjectProperty::PHP_TYPE_FLOAT;; +$def->properties['decimal']->defaultValue = 0; +$def->properties['decimal']->visibility = ezcPersistentObjectProperty::VISIBILITY_PRIVATE; +$def->properties['decimal']->isRequired = false; + +$def->properties['text'] = new ezcPersistentObjectProperty; +$def->properties['text']->columnName = 'type_text'; +$def->properties['text']->propertyName = 'text'; +$def->properties['text']->propertyType = ezcPersistentObjectProperty::PHP_TYPE_STRING;; +$def->properties['text']->defaultValue = ''; +$def->properties['text']->visibility = ezcPersistentObjectProperty::VISIBILITY_PRIVATE; +$def->properties['text']->isRequired = false; +return $def; + +?> Property changes on: trunk/PersistentObject/tests/data/persistenttestobjectnoid.php ___________________________________________________________________ Name: svn:eol-style + native Modified: trunk/PersistentObject/tests/managers/data/simpledefinition.php =================================================================== --- trunk/PersistentObject/tests/managers/data/simpledefinition.php 2007-01-22 11:07:09 UTC (rev 4541) +++ trunk/PersistentObject/tests/managers/data/simpledefinition.php 2007-01-22 16:52:20 UTC (rev 4542) @@ -1,5 +1,7 @@ <?php ezcTestRunner::addFileToFilter( __FILE__ ); -return new ezcPersistentObjectDefinition(); +$def = new ezcPersistentObjectDefinition(); +$def->idProperty = new ezcPersistentObjectIdProperty; +return $def; ?> Modified: trunk/PersistentObject/tests/managers/data2/myclass.php =================================================================== --- trunk/PersistentObject/tests/managers/data2/myclass.php 2007-01-22 11:07:09 UTC (rev 4541) +++ trunk/PersistentObject/tests/managers/data2/myclass.php 2007-01-22 16:52:20 UTC (rev 4542) @@ -3,5 +3,6 @@ $def = new ezcPersistentObjectDefinition(); $def->class = 'MyClass'; +$def->idProperty = new ezcPersistentObjectIdProperty; return $def; ?> Modified: trunk/PersistentObject/tests/persistent_session_test.php =================================================================== --- trunk/PersistentObject/tests/persistent_session_test.php 2007-01-22 11:07:09 UTC (rev 4541) +++ trunk/PersistentObject/tests/persistent_session_test.php 2007-01-22 16:52:20 UTC (rev 4542) @@ -10,6 +10,7 @@ ezcTestRunner::addFileToFilter( __FILE__ ); require_once "data/persistent_test_object.php"; +require_once "data/persistent_test_object_no_id.php"; /** * Tests the code manager. @@ -237,6 +238,24 @@ catch ( ezcPersistentObjectException $e ) {} } + public function testMissingIdProperty() + { + $object = new PersistentTestObjectNoId(); + $object->varchar = 'Finland'; + $object->integer = 42; + $object->decimal = 1.42; + $object->text = "Finland has Nokia!"; + try + { + $this->session->save( $object ); + } + catch ( ezcPersistentDefinitionMissingIdPropertyException $e ) + { + return; + } + $this->fail( "Exception not thrown on missing ID property." ); + } + // Save or update public function testSaveOrUpdateSave() -- svn-components mailing list svn-components@lists.ez.no http://lists.ez.no/mailman/listinfo/svn-components