Author: Frederik Holljen Date: 2007-03-03 16:48:45 +0100 (Sat, 03 Mar 2007) New Revision: 4708
Log: - Fixed issue #10106: ezcPersistentManualGenerator does not quote id columnName Added: trunk/PersistentObject/tests/data/keywordtest/like.php trunk/PersistentObject/tests/data/keywordtest/table.dba trunk/PersistentObject/tests/data/keywordtest/where.php trunk/PersistentObject/tests/data/keywordtest/where_class.php Modified: trunk/PersistentObject/ChangeLog trunk/PersistentObject/src/interfaces/identifier_generator.php trunk/PersistentObject/src/persistent_session.php trunk/PersistentObject/tests/data/keywordtest/table.php trunk/PersistentObject/tests/data/keywordtest/table_class.php trunk/PersistentObject/tests/keyword_test.php trunk/PersistentObject/tests/suite.php Modified: trunk/PersistentObject/ChangeLog =================================================================== --- trunk/PersistentObject/ChangeLog 2007-03-02 05:53:39 UTC (rev 4707) +++ trunk/PersistentObject/ChangeLog 2007-03-03 15:48:45 UTC (rev 4708) @@ -7,6 +7,7 @@ behaviour (INSERT violating NULL contraint does give an error...) - Fixed issue #010153: Persistent Object and manual generator (negative and 0 primary keys) +- Fixed issue #10106: ezcPersistentManualGenerator does not quote id columnName 1.2 - Monday 18 December 2006 Modified: trunk/PersistentObject/src/interfaces/identifier_generator.php =================================================================== --- trunk/PersistentObject/src/interfaces/identifier_generator.php 2007-03-02 05:53:39 UTC (rev 4707) +++ trunk/PersistentObject/src/interfaces/identifier_generator.php 2007-03-03 15:48:45 UTC (rev 4708) @@ -32,7 +32,7 @@ /** * Check if the object is persistent already * - * Called in the beginning of the save process. + * Called in the beginning of the save and update methods. * * Persistent objects that are being saved must not exist in the database already. * Modified: trunk/PersistentObject/src/persistent_session.php =================================================================== --- trunk/PersistentObject/src/persistent_session.php 2007-03-02 05:53:39 UTC (rev 4707) +++ trunk/PersistentObject/src/persistent_session.php 2007-03-03 15:48:45 UTC (rev 4708) @@ -190,8 +190,9 @@ // create and execute query $q = $this->database->createDeleteQuery(); - $q->deleteFrom( $def->table ) - ->where( $q->expr->eq( $def->idProperty->columnName, $q->bindValue( $idValue ) ) ); + $q->deleteFrom( $this->database->quoteIdentifier( $def->table ) ) + ->where( $q->expr->eq( $this->database->quoteIdentifier( $def->idProperty->columnName ), + $q->bindValue( $idValue ) ) ); try { @@ -243,7 +244,7 @@ // init query $q = $this->database->createDeleteQuery(); $q->setAliases( $this->generateAliasMap( $def ) ); - $q->deleteFrom( $def->table ); + $q->deleteFrom( $this->database->quoteIdentifier( $def->table ) ); return $q; } @@ -283,10 +284,6 @@ * The query is initialized to update the correct table and * it is only neccessary to set the correct values. * - * Example: - * <code> - * </code> - * * @throws ezcPersistentDefinitionNotFoundException if there is no such persistent class. * @param string $class * @return ezcQueryUpdate @@ -298,7 +295,7 @@ // init query $q = $this->database->createUpdateQuery(); $q->setAliases( $this->generateAliasMap( $def ) ); - $q->update( $def->table ); + $q->update( $this->database->quoteIdentifier( $def->table ) ); return $q; } @@ -354,7 +351,8 @@ // init query $q = $this->database->createSelectQuery(); $q->setAliases( $this->generateAliasMap( $def ) ); - $q->select( $this->getColumnsFromDefinition( $def ) )->from( $def->table ); + $q->select( $this->getColumnsFromDefinition( $def ) ) + ->from( $this->database->quoteIdentifier( $def->table ) ); return $q; } @@ -517,7 +515,7 @@ } break; case "ezcPersistentManyToManyRelation": - $query->from( $relation->relationTable ); + $query->from( $this->database->quoteIdentifier( $relation->relationTable ) ); foreach ( $relation->columnMap as $map ) { $query->where( @@ -591,7 +589,7 @@ break; case "ezcPersistentManyToManyRelation": $q = $this->database->createInsertQuery(); - $q->insertInto( $relation->relationTable ); + $q->insertInto( $this->database->quoteIdentifier( $relation->relationTable ) ); foreach ( $relation->columnMap as $map ) { $q->set( @@ -665,7 +663,7 @@ break; case "ezcPersistentManyToManyRelation": $q = $this->database->createDeleteQuery(); - $q->deleteFrom( $relation->relationTable ); + $q->deleteFrom( $this->database->quoteIdentifier( $relation->relationTable ) ); foreach ( $relation->columnMap as $map ) { $q->where( @@ -782,8 +780,9 @@ $def = $this->definitionManager->fetchDefinition( get_class( $pObject ) ); // propagate exception $q = $this->database->createSelectQuery(); - $q->select( $this->getColumnsFromDefinition( $def ) )->from( $def->table ) - ->where( $q->expr->eq( $def->idProperty->columnName, + $q->select( $this->getColumnsFromDefinition( $def ) ) + ->from( $this->database->quoteIdentifier( $def->table ) ) + ->where( $q->expr->eq( $this->database->quoteIdentifier( $def->idProperty->columnName ), $q->bindValue( $id ) ) ); try { @@ -888,7 +887,7 @@ // set up and execute the query $q = $this->database->createInsertQuery(); - $q->insertInto( $def->table ); + $q->insertInto( $this->database->quoteIdentifier( $def->table ) ); foreach ( $state as $name => $value ) { if ( $name != $def->idProperty->propertyName ) // skip the id field @@ -992,7 +991,7 @@ // set up and execute the query $q = $this->database->createUpdateQuery(); - $q->update( $def->table ); + $q->update( $this->database->quoteIdentifier( $def->table ) ); foreach ( $state as $name => $value ) { if ( $name != $def->idProperty->propertyName ) // skip the id field @@ -1001,7 +1000,8 @@ $q->set( $this->database->quoteIdentifier( $def->properties[$name]->columnName ), $q->bindValue( $value ) ); } } - $q->where( $q->expr->eq( $def->idProperty->columnName, $q->bindValue( $idValue ) ) ); + $q->where( $q->expr->eq( $this->database->quoteIdentifier( $def->idProperty->columnName ), + $q->bindValue( $idValue ) ) ); try { $stmt = $q->prepare(); Added: trunk/PersistentObject/tests/data/keywordtest/like.php =================================================================== --- trunk/PersistentObject/tests/data/keywordtest/like.php 2007-03-02 05:53:39 UTC (rev 4707) +++ trunk/PersistentObject/tests/data/keywordtest/like.php 2007-03-03 15:48:45 UTC (rev 4708) @@ -0,0 +1,30 @@ +<?php +ezcTestRunner::addFileToFilter( __FILE__ ); + +/* + * Holds the definition for the class Where + * This definition is used by the keywords test. + */ +// build definition +$def = new ezcPersistentObjectDefinition(); +$def->table = "where"; +$def->class = "Like"; + +$def->idProperty = new ezcPersistentObjectIdProperty; +$def->idProperty->columnName = 'like'; +$def->idProperty->propertyName = 'like'; +$def->idProperty->visibility = ezcPersistentObjectProperty::VISIBILITY_PRIVATE; +$def->idProperty->generator = new ezcPersistentGeneratorDefinition( 'ezcPersistentSequenceGenerator', + array( 'sequence' => 'PO_test_seq' ) ); + +$def->properties['update'] = new ezcPersistentObjectProperty; +$def->properties['update']->columnName = 'update'; +$def->properties['update']->propertyName = 'update'; +$def->properties['update']->propertyType = ezcPersistentObjectProperty::PHP_TYPE_INT; +$def->properties['update']->defaultValue = 0; +$def->properties['update']->visibility = ezcPersistentObjectProperty::VISIBILITY_PRIVATE; +$def->properties['update']->isRequired = false; + +return $def; + +?> Property changes on: trunk/PersistentObject/tests/data/keywordtest/like.php ___________________________________________________________________ Name: svn:eol-style + native Added: trunk/PersistentObject/tests/data/keywordtest/table.dba =================================================================== --- trunk/PersistentObject/tests/data/keywordtest/table.dba 2007-03-02 05:53:39 UTC (rev 4707) +++ trunk/PersistentObject/tests/data/keywordtest/table.dba 2007-03-03 15:48:45 UTC (rev 4708) @@ -0,0 +1,113 @@ +<?php return array ( + 0 => + array ( + 'as' => + ezcDbSchemaTable::__set_state(array( + 'fields' => + array ( + 'and' => + ezcDbSchemaField::__set_state(array( + 'type' => 'integer', + 'length' => 0, + 'notNull' => false, + 'default' => NULL, + 'autoIncrement' => false, + 'unsigned' => false, + )), + 'or' => + ezcDbSchemaField::__set_state(array( + 'type' => 'integer', + 'length' => 0, + 'notNull' => false, + 'default' => NULL, + 'autoIncrement' => false, + 'unsigned' => false, + )), + ), + 'indexes' => + array ( + ), + )), + 'table' => + ezcDbSchemaTable::__set_state(array( + 'fields' => + array ( + 'from' => + ezcDbSchemaField::__set_state(array( + 'type' => 'integer', + 'length' => 0, + 'notNull' => true, + 'default' => NULL, + 'autoIncrement' => true, + 'unsigned' => false, + )), + 'select' => + ezcDbSchemaField::__set_state(array( + 'type' => 'integer', + 'length' => 0, + 'notNull' => false, + 'default' => NULL, + 'autoIncrement' => false, + 'unsigned' => false, + )), + ), + 'indexes' => + array ( + 'primary' => + ezcDbSchemaIndex::__set_state(array( + 'indexFields' => + array ( + 'from' => + ezcDbSchemaIndexField::__set_state(array( + 'sorting' => NULL, + )), + ), + 'primary' => true, + 'unique' => true, + )), + ), + )), + 'where' => + ezcDbSchemaTable::__set_state(array( + 'fields' => + array ( + 'like' => + ezcDbSchemaField::__set_state(array( + 'type' => 'integer', + 'length' => 0, + 'notNull' => true, + 'default' => NULL, + 'autoIncrement' => true, + 'unsigned' => false, + )), + 'update' => + ezcDbSchemaField::__set_state(array( + 'type' => 'integer', + 'length' => 0, + 'notNull' => false, + 'default' => NULL, + 'autoIncrement' => false, + 'unsigned' => false, + )), + ), + 'indexes' => + array ( + 'primary' => + ezcDbSchemaIndex::__set_state(array( + 'indexFields' => + array ( + 'like' => + ezcDbSchemaIndexField::__set_state(array( + 'sorting' => NULL, + )), + ), + 'primary' => true, + 'unique' => true, + )), + ), + )), + ), + 1 => + array ( + ), +); ?> \ No newline at end of file Modified: trunk/PersistentObject/tests/data/keywordtest/table.php =================================================================== --- trunk/PersistentObject/tests/data/keywordtest/table.php 2007-03-02 05:53:39 UTC (rev 4707) +++ trunk/PersistentObject/tests/data/keywordtest/table.php 2007-03-03 15:48:45 UTC (rev 4708) @@ -2,9 +2,8 @@ ezcTestRunner::addFileToFilter( __FILE__ ); /* - * Holds the definition for PersistentTestObject - * This definition is used by the code manager for - * various tests in the system. + * Holds the definition for Table + * This definition is used by the keywords test. */ // build definition $def = new ezcPersistentObjectDefinition(); @@ -26,6 +25,27 @@ $def->properties['select']->visibility = ezcPersistentObjectProperty::VISIBILITY_PRIVATE; $def->properties['select']->isRequired = false; +$def->relations["Where"] = new ezcPersistentOneToManyRelation( + "table", + "where" +); +$def->relations["Where"]->columnMap = array( + new ezcPersistentSingleTableMap( + "from", + "update" + ), + ); + +$def->relations["Like"] = new ezcPersistentManyToManyRelation( + "table", + "where", + "as" +); + +$def->relations["Like"]->columnMap = array( + new ezcPersistentDoubleTableMap( "from", "and", "or", "like" ), +); + return $def; ?> Modified: trunk/PersistentObject/tests/data/keywordtest/table_class.php =================================================================== --- trunk/PersistentObject/tests/data/keywordtest/table_class.php 2007-03-02 05:53:39 UTC (rev 4707) +++ trunk/PersistentObject/tests/data/keywordtest/table_class.php 2007-03-03 15:48:45 UTC (rev 4708) @@ -8,6 +8,19 @@ `select` integer, PRIMARY KEY (`from`) ) TYPE=InnoDB; + +CREATE TABLE `where` +( + `like` integer unsigned not null auto_increment, + `update` integer, + PRIMARY KEY (`like`) +) TYPE=InnoDB; + +CREATE TABLE `as` +( + `and` integer, + `or` integer +) TYPE=InnoDB; */ class Table @@ -32,7 +45,7 @@ { $db = ezcDbInstance::get(); $schema = ezcDbSchema::createFromDb( $db ); -// $schema->writeToFile( 'array', dirname( __FILE__ ) . '/table.dba' ); + $schema->writeToFile( 'array', dirname( __FILE__ ) . '/table.dba' ); } /** @@ -57,6 +70,8 @@ { $db = ezcDbInstance::get(); $db->exec( 'DROP TABLE' . $db->quoteIdentifier( 'table' ) ); + $db->exec( 'DROP TABLE' . $db->quoteIdentifier( 'where' ) ); + $db->exec( 'DROP TABLE' . $db->quoteIdentifier( 'as' ) ); if ( $db->getName() == 'pgsql' ) { $db->exec( 'DROP SEQUENCE po_test_seq' ); Added: trunk/PersistentObject/tests/data/keywordtest/where.php =================================================================== --- trunk/PersistentObject/tests/data/keywordtest/where.php 2007-03-02 05:53:39 UTC (rev 4707) +++ trunk/PersistentObject/tests/data/keywordtest/where.php 2007-03-03 15:48:45 UTC (rev 4708) @@ -0,0 +1,30 @@ +<?php +ezcTestRunner::addFileToFilter( __FILE__ ); + +/* + * Holds the definition for the class Where + * This definition is used by the keywords test. + */ +// build definition +$def = new ezcPersistentObjectDefinition(); +$def->table = "where"; +$def->class = "Where"; + +$def->idProperty = new ezcPersistentObjectIdProperty; +$def->idProperty->columnName = 'like'; +$def->idProperty->propertyName = 'like'; +$def->idProperty->visibility = ezcPersistentObjectProperty::VISIBILITY_PRIVATE; +$def->idProperty->generator = new ezcPersistentGeneratorDefinition( 'ezcPersistentSequenceGenerator', + array( 'sequence' => 'PO_test_seq' ) ); + +$def->properties['update'] = new ezcPersistentObjectProperty; +$def->properties['update']->columnName = 'update'; +$def->properties['update']->propertyName = 'update'; +$def->properties['update']->propertyType = ezcPersistentObjectProperty::PHP_TYPE_INT; +$def->properties['update']->defaultValue = 0; +$def->properties['update']->visibility = ezcPersistentObjectProperty::VISIBILITY_PRIVATE; +$def->properties['update']->isRequired = false; + +return $def; + +?> Property changes on: trunk/PersistentObject/tests/data/keywordtest/where.php ___________________________________________________________________ Name: svn:eol-style + native Added: trunk/PersistentObject/tests/data/keywordtest/where_class.php =================================================================== --- trunk/PersistentObject/tests/data/keywordtest/where_class.php 2007-03-02 05:53:39 UTC (rev 4707) +++ trunk/PersistentObject/tests/data/keywordtest/where_class.php 2007-03-03 15:48:45 UTC (rev 4708) @@ -0,0 +1,29 @@ +<?php +// Relation class for keywords test. Like is the identifier. Both values are ints. +class Where +{ + public $like = null; + public $update = null; + + public function setState( array $state ) + { + foreach ( $state as $key => $value ) + { + $this->$key = $value; + } + } + + public function getState() + { + $result = array(); + $result['like'] = $this->like; + $result['update'] = $this->update; + return $result; + } +} + +class Like extends Where +{ +} + +?> Property changes on: trunk/PersistentObject/tests/data/keywordtest/where_class.php ___________________________________________________________________ Name: svn:eol-style + native Modified: trunk/PersistentObject/tests/keyword_test.php =================================================================== --- trunk/PersistentObject/tests/keyword_test.php 2007-03-02 05:53:39 UTC (rev 4707) +++ trunk/PersistentObject/tests/keyword_test.php 2007-03-03 15:48:45 UTC (rev 4708) @@ -10,9 +10,12 @@ ezcTestRunner::addFileToFilter( __FILE__ ); require_once "data/keywordtest/table_class.php"; +require_once "data/keywordtest/where_class.php"; /** - * Tests the code manager. + * These tests tests for the usage of keywords for table and column names. + * Basically this means that we are testing that all table and column names + * are properly escaped. * * @package PersistentObject * @subpackage Tests @@ -33,15 +36,15 @@ $this->markTestSkipped( 'There was no database configured' ); } -// Table::setupTable(); - Table::saveSchema(); -// $this->session = new ezcPersistentSession( ezcDbInstance::get(), -// new ezcPersistentCodeManager( dirname( __FILE__ ) . "/data/keywordtest" ) ); + Table::setupTable(); +// Table::saveSchema(); + $this->session = new ezcPersistentSession( ezcDbInstance::get(), + new ezcPersistentCodeManager( dirname( __FILE__ ) . "/data/keywordtest" ) ); } protected function tearDown() { -// Table::cleanup(); + Table::cleanup(); } public static function suite() @@ -49,9 +52,199 @@ return new PHPUnit_Framework_TestSuite( 'ezcPersistentKeywordTest' ); } + // Test saving a valid object public function testSave() { + $object = new Table(); + $object->select = 42; + $this->session->save( $object ); + + $this->assertEquals( 1, $object->from ); + + $object2 = $this->session->loadIfExists( 'Table', 1 ); + $this->assertNotEquals( NULL, $object2 ); + $this->assertEquals( 42, $object2->select ); } + + public function testUpdate() + { + $object = new Table(); + $object->select = 42; + $this->session->save( $object ); + + $this->assertEquals( 1, $object->from ); + + $object2 = $this->session->loadIfExists( 'Table', 1 ); + $this->assertNotEquals( NULL, $object2 ); + $this->assertEquals( 42, $object2->select ); + + $object2->select = 99; + $this->session->update( $object2 ); + + $object3 = $this->session->loadIfExists( 'Table', 1 ); + $this->assertNotEquals( NULL, $object3 ); + $this->assertEquals( 99, $object3->select ); + } + + public function testSaveOrUpdateSave() + { + $object = new Table(); + $object->select = 42; + $this->session->saveOrUpdate( $object ); + + $this->assertEquals( 1, $object->from ); + + $object2 = $this->session->loadIfExists( 'Table', 1 ); + $this->assertNotEquals( NULL, $object2 ); + $this->assertEquals( 42, $object2->select ); + } + + public function testSaveOrUpdateUpdate() + { + $object = new Table(); + $object->select = 42; + $this->session->save( $object ); + + $this->assertEquals( 1, $object->from ); + + $object2 = $this->session->loadIfExists( 'Table', 1 ); + $this->assertNotEquals( NULL, $object2 ); + $this->assertEquals( 42, $object2->select ); + + $object2->select = 99; + $this->session->saveOrUpdate( $object2 ); + + $object3 = $this->session->loadIfExists( 'Table', 1 ); + $this->assertNotEquals( NULL, $object3 ); + $this->assertEquals( 99, $object3->select ); + } + + public function testDelete() + { + $object = new Table(); + $object->select = 42; + $this->session->save( $object ); + + $this->assertEquals( 1, $object->from ); + + $object2 = $this->session->loadIfExists( 'Table', 1 ); + $this->assertNotEquals( NULL, $object2 ); + $this->assertEquals( 42, $object2->select ); + + $this->session->delete( $object2 ); + + $this->assertNull( $this->session->loadIfExists( 'Table', 1 ) ); + } + + public function test1NGetRelatedObject() + { + $object = new Table(); + $object->select = 42; + $this->session->save( $object ); + + $rel = new Where(); + $rel->update = 1; // correct relation + $this->session->save( $rel ); + + $relation = $this->session->getRelatedObjects( $object, "Where" ); + $this->assertNotNull( $relation ); + } + + public function test1NGetRelatedObjects() + { + $object = new Table(); + $object->select = 42; + $this->session->save( $object ); + + $rel = new Where(); + $rel->update = 1; // correct relation + $this->session->save( $rel ); + + $relations = $this->session->getRelatedObjects( $object, "Where" ); + $this->assertEquals( 1, count( $relations ) ); + } + + public function test1NAddAndRemoveRelatedObject() + { + $object = new Table(); + $object->select = 42; + $this->session->save( $object ); + + $rel = new Where(); + $rel->update = 1; // correct relation + $this->session->save( $rel ); + // First let's remove the old relation + $this->session->removeRelatedObject( $object, $rel ); + + // Let's create a new object to relate to + $object2 = new Table(); + $object2->select = 99; + $this->session->save( $object2 ); // id 2 + + $this->session->addRelatedObject( $object2, $rel ); + $this->session->update( $rel ); + + // test that it worked + $relations = $this->session->getRelatedObjects( $object, "Where" ); + $this->assertEquals( 0, count( $relations ) ); + + $relations = $this->session->getRelatedObjects( $object2, "Where" ); + $this->assertEquals( 1, count( $relations ) ); + } + + public function testNMAddRelatedObject() + { + $object = new Table(); + $object->select = 42; + $this->session->save( $object ); + + $rel = new Like(); + $this->session->save( $rel ); + + $this->session->addRelatedObject( $object, $rel ); + } + + public function testNMgetRelatedObject() + { + $object = new Table(); + $object->select = 42; + $this->session->save( $object ); + + $rel = new Like(); + $this->session->save( $rel ); + + $this->session->addRelatedObject( $object, $rel ); + $this->assertNotNull( $this->session->getRelatedObject( $object, "Like" ) ); + } + + public function testNMgetRelatedObjects() + { + $object = new Table(); + $object->select = 42; + $this->session->save( $object ); + + $rel = new Like(); + $this->session->save( $rel ); + + $this->session->addRelatedObject( $object, $rel ); + $this->assertEquals( 1, count( $this->session->getRelatedObjects( $object, "Like" ) ) ); + } + + public function testNMRemoveRelatedObject() + { + $object = new Table(); + $object->select = 42; + $this->session->save( $object ); + + $rel = new Like(); + $this->session->save( $rel ); + + + $this->session->addRelatedObject( $object, $rel ); + $this->session->removeRelatedObject( $object, $rel ); + + $this->assertEquals( 0, count( $this->session->getRelatedObjects( $object, "Like" ) ) ); + } } ?> Modified: trunk/PersistentObject/tests/suite.php =================================================================== --- trunk/PersistentObject/tests/suite.php 2007-03-02 05:53:39 UTC (rev 4707) +++ trunk/PersistentObject/tests/suite.php 2007-03-03 15:48:45 UTC (rev 4708) @@ -47,7 +47,7 @@ $this->addTest( ezcPersistentOneToOneRelationTest::suite() ); $this->addTest( ezcPersistentManyToOneRelationTest::suite() ); $this->addTest( ezcPersistentManyToManyRelationTest::suite() ); -// $this->addTest( ezcPersistentKeywordTest::suite() ); + $this->addTest( ezcPersistentKeywordTest::suite() ); } public static function suite() -- svn-components mailing list svn-components@lists.ez.no http://lists.ez.no/mailman/listinfo/svn-components