diff --git a/lib/Doctrine/ClassMetadata.php b/lib/Doctrine/ClassMetadata.php index 7e9554aec..6b8a6374c 100644 --- a/lib/Doctrine/ClassMetadata.php +++ b/lib/Doctrine/ClassMetadata.php @@ -31,12 +31,21 @@ class Doctrine_ClassMetadata extends Doctrine_Configurable implements Serializable { /** - * The name of the domain class that is mapped to the database with this metadata. + * The name of the entity class that is mapped to the database with this metadata. * * @var string */ protected $_entityName; + /** + * The name of the entity class that is at the root of the entity inheritance + * hierarchy. If the entity is not part of an inheritance hierarchy this is the same + * as the $_entityName. + * + * @var string + */ + protected $_rootEntityName; + /** * The name of the custom mapper class used for the entity class. * @@ -259,6 +268,7 @@ class Doctrine_ClassMetadata extends Doctrine_Configurable implements Serializab public function __construct($entityName, Doctrine_Connection $conn) { $this->_entityName = $entityName; + $this->_rootEntityName = $entityName; $this->_conn = $conn; $this->_parser = new Doctrine_Relation_Parser($this); $this->_filters[] = new Doctrine_Record_Filter_Standard(); @@ -283,6 +293,11 @@ class Doctrine_ClassMetadata extends Doctrine_Configurable implements Serializab return $this->_entityName; } + public function getRootClassName() + { + return $this->_rootEntityName; + } + /** * @deprecated */ @@ -648,12 +663,23 @@ class Doctrine_ClassMetadata extends Doctrine_Configurable implements Serializab * Gets the identifier (primary key) field(s) of the mapped class. * * @return mixed + * @deprecated Use getIdentifierFieldNames() */ public function getIdentifier() { return $this->_identifier; } + /** + * Gets the identifier (primary key) field(s) of the mapped class. + * + * @return mixed + */ + public function getIdentifierFieldNames() + { + return $this->_identifier; + } + public function setIdentifier(array $identifier) { $this->_identifier = $identifier; @@ -1107,6 +1133,7 @@ class Doctrine_ClassMetadata extends Doctrine_Configurable implements Serializab public function setParentClasses(array $classNames) { $this->_options['parents'] = $classNames; + $this->_rootEntityName = array_pop($classNames); } /** diff --git a/lib/Doctrine/Collection.php b/lib/Doctrine/Collection.php index 6442dcff2..511c7ce70 100644 --- a/lib/Doctrine/Collection.php +++ b/lib/Doctrine/Collection.php @@ -482,7 +482,12 @@ class Doctrine_Collection extends Doctrine_Access implements Countable, Iterator */ public function set($key, $record) { - if( ! $record instanceOf Doctrine_Record) { + if ( ! $record instanceOf Doctrine_Record) { + try { + throw new Exception(); + } catch (Exception $e) { + echo $e->getTraceAsString() . "<br/><br/>"; + } throw new Doctrine_Record_Exception('Value variable in set is not an instance of Doctrine_Record'); } diff --git a/lib/Doctrine/Connection.php b/lib/Doctrine/Connection.php index 2b3ba2e5e..7fe7b8752 100644 --- a/lib/Doctrine/Connection.php +++ b/lib/Doctrine/Connection.php @@ -664,7 +664,7 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun $query .= implode(', ', $a) . ')'; // prepare and execute the statement - + return $this->exec($query, array_values($data)); } @@ -1264,7 +1264,7 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun public function flush() { $this->beginInternalTransaction(); - $this->unitOfWork->saveAll(); + $this->unitOfWork->flush(); $this->commit(); } @@ -1277,9 +1277,9 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun */ public function clear() { + $this->unitOfWork->detachAllManagedEntities(); foreach ($this->_mappers as $mapper) { - $mapper->getRepository()->evictAll(); - $mapper->clear(); + $mapper->clear(); // clear identity map of each mapper } } @@ -1292,6 +1292,7 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun */ public function evictTables() { + $this->clear(); $this->tables = array(); $this->_mappers = array(); $this->exported = array(); diff --git a/lib/Doctrine/Connection/UnitOfWork.php b/lib/Doctrine/Connection/UnitOfWork.php index f2b8af292..dcbe2e5a3 100644 --- a/lib/Doctrine/Connection/UnitOfWork.php +++ b/lib/Doctrine/Connection/UnitOfWork.php @@ -88,20 +88,27 @@ class Doctrine_Connection_UnitOfWork extends Doctrine_Connection_Module { // get the flush tree $tree = $this->buildFlushTree($this->conn->getMappers()); - + + $tree = array_combine($tree, array_fill(0, count($tree), array())); + + foreach ($this->_managedEntities as $oid => $entity) { + $className = $entity->getClassName(); + $tree[$className][] = $entity; + } + // save all records - foreach ($tree as $name) { - $mapper = $this->conn->getMapper($name); - foreach ($mapper->getRepository() as $record) { - $mapper->saveSingleRecord($record); + foreach ($tree as $className => $entities) { + $mapper = $this->conn->getMapper($className); + foreach ($entities as $entity) { + $mapper->saveSingleRecord($entity); } } - + // save all associations - foreach ($tree as $name) { - $mapper = $this->conn->getMapper($name); - foreach ($mapper->getRepository() as $record) { - $mapper->saveAssociations($record); + foreach ($tree as $className => $entities) { + $mapper = $this->conn->getMapper($className); + foreach ($entities as $entity) { + $mapper->saveAssociations($entity); } } } @@ -142,7 +149,7 @@ class Doctrine_Connection_UnitOfWork extends Doctrine_Connection_Module } $nm = $mapper->getComponentName(); - $index = array_search($nm, $tree); + $index = array_search($nm, $tree); if ($index === false) { $tree[] = $nm; @@ -162,7 +169,7 @@ class Doctrine_Connection_UnitOfWork extends Doctrine_Connection_Module foreach ($rels as $rel) { $name = $rel->getTable()->getComponentName(); - $index2 = array_search($name,$tree); + $index2 = array_search($name, $tree); $type = $rel->getType(); // skip self-referenced relations @@ -187,7 +194,7 @@ class Doctrine_Connection_UnitOfWork extends Doctrine_Connection_Module continue; unset($tree[$index2]); - array_splice($tree,$index,0,$name); + array_splice($tree, $index, 0, $name); } else { array_unshift($tree,$name); $index++; @@ -196,8 +203,9 @@ class Doctrine_Connection_UnitOfWork extends Doctrine_Connection_Module $t = $rel->getAssociationFactory(); $n = $t->getComponentName(); - if ($index2 !== false) + if ($index2 !== false) { unset($tree[$index2]); + } array_splice($tree, $index, 0, $name); $index++; @@ -218,7 +226,7 @@ class Doctrine_Connection_UnitOfWork extends Doctrine_Connection_Module } } - return array_values($tree); + return $tree; } /** @@ -234,4 +242,83 @@ class Doctrine_Connection_UnitOfWork extends Doctrine_Connection_Module return $this->flush(); } + /** + * Adds an entity to the pool of managed entities. + * + */ + public function addManagedEntity(Doctrine_Record $entity) + { + $oid = $entity->getOid(); + if ( ! isset($this->_managedEntities[$oid])) { + $this->_managedEntities[$oid] = $entity; + return true; + } + return false; + } + + /** + * get + * @param integer $oid + * @throws Doctrine_Table_Repository_Exception + */ + public function getManagedEntity($oid) + { + if ( ! isset($this->_managedEntities[$oid])) { + throw new Doctrine_Connection_UnitOfWork_Exception("Unknown object identifier '$oid'."); + } + return $this->_managedEntities[$oid]; + } + + /** + * @param integer $oid object identifier + * @return boolean whether ot not the operation was successful + */ + public function detachManagedEntity(Doctrine_Record $entity) + { + $oid = $entity->getOid(); + if ( ! isset($this->_managedEntities[$oid])) { + return false; + } + unset($this->_managedEntities[$oid]); + return true; + } + + /** + * @return integer number of records evicted + */ + public function detachAllManagedEntities() + { + $evicted = 0; + foreach ($this->_managedEntities as $entity) { + if ($this->detachManagedEntity($entity)) { + $evicted++; + } + } + return $evicted; + } + + /** + * contains + * @param integer $oid object identifier + */ + public function isManagedEntity($oid) + { + return isset($this->_managedEntities[$oid]); + } + + /** + * Adds an entity to the identity map. + * + */ + public function addToIdentityMap(Doctrine_Record $entity) + { + $id = implode(' ', $entity->identifier()); + $className = $entity->getClassMetadata()->getRootClassName(); + if (isset($this->_identityMap[$className][$id])) { + return false; + } + $this->_identityMap[$className][$id] = $entity; + return true; + } + } diff --git a/lib/Doctrine/Mapper.php b/lib/Doctrine/Mapper.php index f217e4513..6bdc14235 100644 --- a/lib/Doctrine/Mapper.php +++ b/lib/Doctrine/Mapper.php @@ -58,15 +58,15 @@ class Doctrine_Mapper extends Doctrine_Configurable implements Countable /** * @var array $identityMap first level cache - * @todo Proper identity map implementation & move elsewhere? + * @todo Move to UnitOfWork. */ protected $_identityMap = array(); /** * @var Doctrine_Table_Repository $repository record repository - * @todo Needed? What is it used for? Does the identity map not suffice? + * @todo Move to UnifOfWork together with identity map. */ - protected $_repository; + //protected $_repository; /** @@ -78,11 +78,19 @@ class Doctrine_Mapper extends Doctrine_Configurable implements Countable */ public function __construct($name, Doctrine_ClassMetadata $classMetadata) { + if ($name != $classMetadata->getClassName()) { + try { + throw new Exception(); + } catch (Exception $e) { + echo $e->getTraceAsString() . "<br/><br/>"; + } + } + $this->_domainClassName = $name; $this->_conn = $classMetadata->getConnection(); $this->_classMetadata = $classMetadata; $this->setParent($this->_conn); - $this->_repository = new Doctrine_Table_Repository($this); + //$this->_repository = new Doctrine_Table_Repository($this); if ($classMetadata->getInheritanceType() == Doctrine::INHERITANCETYPE_JOINED) { $this->_mappingStrategy = new Doctrine_Mapper_JoinedStrategy($this); } else { @@ -141,10 +149,10 @@ class Doctrine_Mapper extends Doctrine_Configurable implements Countable * @return Doctrine_Table_Repository * @todo refactor */ - public function getRepository() + /*public function getRepository() { return $this->_repository; - } + }*/ /** * sets the connection for this class @@ -184,6 +192,11 @@ class Doctrine_Mapper extends Doctrine_Configurable implements Countable return $record; } + + public function detach(Doctrine_Record $entity) + { + return $this->_conn->unitOfWork->detachManagedEntity($entity); + } /** * Finds an entity by its primary key. @@ -310,7 +323,7 @@ class Doctrine_Mapper extends Doctrine_Configurable implements Countable */ public function manage(Doctrine_Record $record) { - return $this->getRepository()->add($record); + return $this->_conn->unitOfWork->addManagedEntity($record); } /** @@ -864,17 +877,6 @@ class Doctrine_Mapper extends Doctrine_Configurable implements Countable return true; } - /** - * Updates an entity. - */ - /*protected function _doUpdate(Doctrine_Record $record) - { - $identifier = $this->_convertFieldToColumnNames($record->identifier(), $this->_classMetadata); - $data = $this->_convertFieldToColumnNames($record->getPrepared(), $this->_classMetadata); - $this->_conn->update($this->_classMetadata->getTableName(), $data, $identifier); - $record->assignIdentifier(true); - }*/ - /** * Inserts an entity. * @@ -900,60 +902,6 @@ class Doctrine_Mapper extends Doctrine_Configurable implements Countable return true; } - /** - * Inserts a single entity into the database, without any related entities. - * - * @param Doctrine_Record $record The entity to insert. - */ - /*protected function _doInsert(Doctrine_Record $record) - { - $fields = $record->getPrepared(); - if (empty($fields)) { - return false; - } - - if ($record->getClassMetadata() !== $this->_classMetadata) { - echo $record->getClassMetadata()->getClassname() . ' != ' . $this->_classMetadata->getClassName() . "<br /><br />"; - try { - throw new Exception(); - } catch (Exception $e) { - echo $e->getTraceAsString() . "<br /><br />"; - } - } - - //$class = $record->getClassMetadata(); - $class = $this->_classMetadata; - $identifier = (array) $class->getIdentifier(); - $fields = $this->_convertFieldToColumnNames($fields, $class); - - $seq = $class->getTableOption('sequenceName'); - if ( ! empty($seq)) { - $id = $this->_conn->sequence->nextId($seq); - $seqName = $class->getIdentifier(); - $fields[$seqName] = $id; - $record->assignIdentifier($id); - } - - $this->_conn->insert($class->getTableName(), $fields); - - if (empty($seq) && count($identifier) == 1 && $identifier[0] == $class->getIdentifier() && - $class->getIdentifierType() != Doctrine::IDENTIFIER_NATURAL) { - if (strtolower($this->_conn->getName()) == 'pgsql') { - $seq = $class->getTableName() . '_' . $identifier[0]; - } - - $id = $this->_conn->sequence->lastInsertId($seq); - - if ( ! $id) { - throw new Doctrine_Mapper_Exception("Couldn't get last insert identifier."); - } - - $record->assignIdentifier($id); - } else { - $record->assignIdentifier(true); - } - }*/ - /** * Deletes given entity and all it's related entities. * @@ -999,50 +947,6 @@ class Doctrine_Mapper extends Doctrine_Configurable implements Countable return true; } - /** - * Deletes an entity. - */ - /*protected function _doDelete(Doctrine_Record $record) - { - try { - $this->_conn->beginInternalTransaction(); - $this->_deleteComposites($record); - - $record->state(Doctrine_Record::STATE_TDIRTY); - - $identifier = $this->_convertFieldToColumnNames($record->identifier(), $this->_classMetadata); - $this->_conn->delete($this->_classMetadata->getTableName(), $identifier); - $record->state(Doctrine_Record::STATE_TCLEAN); - - $this->removeRecord($record); - $this->_conn->commit(); - } catch (Exception $e) { - $this->_conn->rollback(); - throw $e; - } - - }*/ - - /** - * deletes all related composites - * this method is always called internally when a record is deleted - * - * @throws PDOException if something went wrong at database level - * @return void - */ - /*protected function _deleteComposites(Doctrine_Record $record) - { - foreach ($this->_classMetadata->getRelations() as $fk) { - if ($fk->isComposite()) { - $obj = $record->get($fk->getAlias()); - if ($obj instanceof Doctrine_Record && - $obj->state() != Doctrine_Record::STATE_LOCKED) { - $obj->delete($this->_conn); - } - } - } - }*/ - public function executeQuery(Doctrine_Query $query) { @@ -1073,16 +977,6 @@ class Doctrine_Mapper extends Doctrine_Configurable implements Countable $this->_mappingStrategy = null; } - /*public function addToWhere($componentAlias, array &$sqlWhereParts, Doctrine_Query $query) - { - - } - - public function addToFrom($sqlString, Doctrine_Query $query) - { - - }*/ - public function getFieldName($columnName) { return $this->_mappingStrategy->getFieldName($columnName); diff --git a/lib/Doctrine/Mapper/DefaultStrategy.php b/lib/Doctrine/Mapper/DefaultStrategy.php index 6df0f1840..dd6dc9f17 100644 --- a/lib/Doctrine/Mapper/DefaultStrategy.php +++ b/lib/Doctrine/Mapper/DefaultStrategy.php @@ -81,7 +81,9 @@ class Doctrine_Mapper_DefaultStrategy extends Doctrine_Mapper_Strategy $fields[$seqName] = $id; $record->assignIdentifier($id); } - + + + //echo $class->getTableName() . "--" . $class->getClassName() . '---' . get_class($record) . "<br/>"; $this->_insertRow($class->getTableName(), $fields); if (empty($seq) && count($identifier) == 1 && diff --git a/lib/Doctrine/Record.php b/lib/Doctrine/Record.php index 662f2da71..3cc4ce5ee 100644 --- a/lib/Doctrine/Record.php +++ b/lib/Doctrine/Record.php @@ -656,7 +656,7 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count } } - $this->_mapper->getRepository()->add($this); + $this->_mapper->manage($this); $this->cleanData($this->_data); $this->_extractIdentifier($this->exists()); @@ -928,6 +928,11 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count { $this->_values[$name] = $value; } + + public function getClassName() + { + return $this->_entityName; + } /** * set @@ -1897,7 +1902,7 @@ abstract class Doctrine_Record extends Doctrine_Record_Abstract implements Count */ public function free() { - $this->_mapper->getRepository()->evict($this->_oid); + $this->_mapper->detach($this); $this->_mapper->removeRecord($this); $this->_data = array(); $this->_id = array(); diff --git a/lib/Doctrine/Relation.php b/lib/Doctrine/Relation.php index 98632a1a0..140a0c3df 100644 --- a/lib/Doctrine/Relation.php +++ b/lib/Doctrine/Relation.php @@ -76,9 +76,6 @@ abstract class Doctrine_Relation implements ArrayAccess 'equal' => false, 'refClass' => false, // the name of the association class (many-many) 'refTable' => false, // the association table object (many-many) - 'refRelationName' => false, - 'refReverseRelationName' => false, - ); /** diff --git a/lib/Doctrine/Table/Exception.php b/lib/Doctrine/Table/Exception.php deleted file mode 100644 index 69a7f8d1e..000000000 --- a/lib/Doctrine/Table/Exception.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php -/* - * $Id$ - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * This software consists of voluntary contributions made by many individuals - * and is licensed under the LGPL. For more information, see - * <http://www.phpdoctrine.org>. - */ -Doctrine::autoload('Doctrine_Exception'); -/** - * thrown when user tries to initialize a new instance of Doctrine_Table, - * while there already exists an instance of that table - * - * @package Doctrine - * @subpackage Table - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.phpdoctrine.org - * @since 1.0 - * @version $Revision$ - * @author Konsta Vesterinen <kvesteri@cc.hut.fi> - */ -class Doctrine_Table_Exception extends Doctrine_Exception -{ - public function __construct($message = "Couldn't initialize table. One instance of this - table already exists. Always use Doctrine_Session::getTable(\$name) - to get on instance of a Doctrine_Table.") { - parent::__construct($message); - } -} \ No newline at end of file diff --git a/lib/Doctrine/Table/Factory.php b/lib/Doctrine/Table/Factory.php deleted file mode 100644 index 291d2e8b3..000000000 --- a/lib/Doctrine/Table/Factory.php +++ /dev/null @@ -1,360 +0,0 @@ -<?php - -/** - * A table factory is used to create table objects and load them with meta data. - * - * @todo Support different drivers for loading the meta data from different sources. - * @package Doctrine - * @deprecated - */ -class Doctrine_Table_Factory -{ - protected $_conn; - protected $_driver; - - public function __construct(Doctrine_Connection $conn /*Doctrine_Table_Factory_Driver $driver*/) - { - $this->_conn = $conn; - //$this->_driver = $driver; - $name = "Doctrine_Table_Factory"; - //call_user_func_array(array($name, 'foobar'), array()); - } - - /** - * Loads the metadata of the class in question and all it's ancestors whose metadata - * is still not loaded. - * - * @param string $name The name of the class for which the metadata should get loaded. - * @param array $tables The metadata collection to which the loaded metadata is added. - */ - public function loadTables($name, array &$tables) - { - $parentClass = $name; - $parentClasses = array(); - $parentClassWithTable = false; - while ($parentClass = get_parent_class($parentClass)) { - if ($parentClass == 'Doctrine_Record') { - break; - } - if (isset($tables[$parentClass])) { - $parentClassWithTable = $parentClass; - break; - } - $class = new ReflectionClass($parentClass); - if ($class->isAbstract()) { - continue; - } - $parentClasses[] = $parentClass; - } - $parentClasses = array_reverse($parentClasses); - $parentClasses[] = $name; - - if ($parentClassWithTable) { - $table = $tables[$parentClassWithTable]; - } else { - $rootClassOfHierarchy = count($parentClasses) > 0 ? array_shift($parentClasses) : $name; - $table = new Doctrine_Table($rootClassOfHierarchy, $this->_conn); - $this->_loadMetaDataFromCode($table, $rootClassOfHierarchy); - $tables[$rootClassOfHierarchy] = $table; - } - - if (count($parentClasses) == 0) { - return $table; - } - //var_dump($parentClasses); - //echo "<br /><br />"; - - // load meta data of subclasses - if ($table->getInheritanceType() == Doctrine::INHERITANCETYPE_JOINED) { - foreach ($parentClasses as $subclass) { - $subTable = new Doctrine_Table($subclass, $this->_conn); - $subTable->setInheritanceType(Doctrine::INHERITANCETYPE_JOINED); - $this->_loadMetaDataFromCode($subTable, $subclass); - $tables[$subclass] = $subTable; - } - } else if ($table->getInheritanceType() == Doctrine::INHERITANCETYPE_SINGLE_TABLE) { - foreach ($parentClasses as $subclass) { - $this->_mergeInto($table, $subclass); - $tables[$subclass] = $table; - } - } else if ($table->getInheritanceType() == Doctrine::INHERITANCETYPE_TABLE_PER_CLASS) { - $parents = array(); - foreach ($parentClasses as $subclass) { - $class = new ReflectionClass($subclass); - if ($class->isAbstract()) { - $parents[] = $subclass; - continue; - } - $subTable = new Doctrine_Table($subclass, $this->_conn); - $subTable->setInheritanceType(Doctrine::INHERITANCETYPE_TABLE_PER_CLASS); - $this->_loadMetaDataFromCode($subTable, $subclass); - $this->_mergeColumnsInto($table, $subTable, true); - foreach ($parents as $parent) { - $this->_mergeColumnsInto($this->_conn->getTable($parent), $subTable, true); - } - // currently relying on parent::setTableDefinition(); - /*foreach ($abstracts as $abstractParent) { - Doctrine_Table_Factory::mergeInto($subTable, $abstractParent); - }*/ - $tables[$subclass] = $subTable; - $parents[] = $subclass; - } - } else { - throw new Doctrine_Table_Factory_Exception("Failed to load meta data. Unknown inheritance type " - . "or no inheritance type specified for hierarchy."); - } - } - - /** - * Initializes the in-memory metadata for the domain class this mapper belongs to. - * Uses reflection and code setup. - */ - protected function _loadMetaDataFromCode(Doctrine_Table $table, $name) - { - if ($name == 'Doctrine_Locator_Injectable') { - try { - throw new Exception(); - } catch (Exception $e) { - echo $e->getTraceAsString() . "<br /><br />"; - } - } - - if ( ! class_exists($name) || empty($name)) { - //try { - throw new Doctrine_Exception("Couldn't find class " . $name); - //} catch (Exception $e) { - // echo $e->getTraceAsString() . "<br /><br />"; - //} - } - $record = new $name($table); - - $names = array(); - $class = $name; - // get parent classes - do { - if ($class === 'Doctrine_Record') { - break; - } - $name = $class; - $names[] = $name; - } while ($class = get_parent_class($class)); - - if ($class === false) { - throw new Doctrine_Table_Exception('Unknown component.'); - } - - // reverse names - $names = array_reverse($names); - // save parents - array_pop($names); - $table->setOption('parents', $names); - - /*echo "<br />"; - var_dump($names); - echo "<br /><br />";*/ - - // set up metadata mapping - if (method_exists($record, 'setTableDefinition')) { - $record->setTableDefinition(); - // get the declaring class of setTableDefinition method - $method = new ReflectionMethod($name, 'setTableDefinition'); - $class = $method->getDeclaringClass(); - } else { - $class = new ReflectionClass($class); - } - - if ($table->getInheritanceType() == Doctrine::INHERITANCETYPE_JOINED) { - $joinedParents = array(); - foreach (array_reverse($names) as $parent) { - $parentTable = $table->getConnection()->getTable($parent); - $parentColumns = $parentTable->getColumns(); - $thisColumns = $table->getColumns(); - - foreach ($parentColumns as $columnName => $definition) { - if ( ! isset($definition['primary'])) { - if (isset($thisColumns[$columnName])) { - continue; - } else { - /*if ( ! isset($parentColumns[$columnName]['owner'])) { - $parentColumns[$columnName]['owner'] = $parentTable->getComponentName(); - } - $joinedParents[] = $parentColumns[$columnName]['owner'];*/ - $joinedParents[] = $parentTable->getComponentName(); - } - }/* else { - //echo "adding primary key $columnName on ".$table->getComponentName().".<br />"; - unset($definition['autoincrement']); - $fullName = $columnName . ' as ' . $parentTable->getFieldName($columnName); - $table->setColumn($fullName, $definition['type'], $definition['length'], $definition, true); - }*/ - } - } - $table->setOption('joinedParents', array_values(array_unique($joinedParents))); - } - - $table->setOption('declaringClass', $class); - - // set the table definition for the given tree implementation - /*if ($table->isTree()) { - $table->getTree()->setTableDefinition(); - }*/ - - $tableName = $table->getOption('tableName'); - if ( ! isset($tableName)) { - $table->setOption('tableName', Doctrine::tableize($class->getName())); - } - - $this->_initIdentifier($table); - - // set up domain class relations - $record->setUp(); - - // if tree, set up tree relations - /*if ($table->isTree()) { - $table->getTree()->setUp(); - }*/ - - return $table; - } - - protected function _mergeInto(Doctrine_Table $table, $domainClassName) - { - if ( ! class_exists($domainClassName) || empty($domainClassName)) { - throw new Doctrine_Exception("Couldn't find class " . $domainClassName); - } - - $record = new $domainClassName($table); - $record->setTableDefinition(); - $record->setUp(); - - } - - protected function _mergeColumnsInto(Doctrine_Table $sourceTable, Doctrine_Table $targetTable, $skipPk = false) - { - - $sourceColumns = $sourceTable->getColumns(); - foreach ($sourceColumns as $columnName => $definition) { - if ($skipPk && isset($definition['primary'])) { - continue; - } - $fullName = $columnName . ' as ' . $sourceTable->getFieldName($columnName); - $targetTable->setColumn($fullName, $definition['type'], $definition['length'], $definition); - } - - } - - protected function _mergeRelationsInto(Doctrine_Table $table, $domainClassName) - { - - - - } - - - /** - * Initializes the table identifier(s)/primary key(s) - * - */ - protected function _initIdentifier(Doctrine_Table $table) - { - switch (count($table->getIdentifier())) { - case 0: - if ($table->getInheritanceType() == Doctrine::INHERITANCETYPE_JOINED && - count($table->getOption('joinedParents')) > 0) { - - $root = current($table->getOption('joinedParents')); - - $rootTable = $table->getConnection()->getTable($root); - - $table->setIdentifier($rootTable->getIdentifier()); - - if ($table->getIdentifierType() !== Doctrine::IDENTIFIER_AUTOINC) { - $table->setIdentifierType($rootTable->getIdentifierType()); - } else { - $table->setIdentifierType(Doctrine::IDENTIFIER_NATURAL); - } - - // add all inherited primary keys - foreach ((array) $table->getIdentifier() as $id) { - $definition = $rootTable->getDefinitionOf($id); - - // inherited primary keys shouldn't contain autoinc - // and sequence definitions - unset($definition['autoincrement']); - unset($definition['sequence']); - - // add the inherited primary key column - $fullName = $rootTable->getColumnName($id) . ' as ' . $id; - $table->setColumn($fullName, $definition['type'], $definition['length'], - $definition, true); - } - } else { - $definition = array('type' => 'integer', - 'length' => 20, - 'autoincrement' => true, - 'primary' => true); - $table->setColumn('id', $definition['type'], $definition['length'], $definition, true); - $table->setIdentifier('id'); - $table->setIdentifierType(Doctrine::IDENTIFIER_AUTOINC); - } - break; - case 1: - foreach ($table->getIdentifier() as $pk) { - $columnName = $table->getColumnName($pk); - $thisColumns = $table->getColumns(); - $e = $thisColumns[$columnName]; - - $found = false; - - foreach ($e as $option => $value) { - if ($found) { - break; - } - - $e2 = explode(':', $option); - - switch (strtolower($e2[0])) { - case 'autoincrement': - case 'autoinc': - $table->setIdentifierType(Doctrine::IDENTIFIER_AUTOINC); - $found = true; - break; - case 'seq': - case 'sequence': - $table->setIdentifierType(Doctrine::IDENTIFIER_SEQUENCE); - $found = true; - - if ($value) { - $table->setOption('sequenceName', $value); - } else { - if (($sequence = $table->getAttribute(Doctrine::ATTR_DEFAULT_SEQUENCE)) !== null) { - $table->setOption('sequenceName', $sequence); - } else { - $table->setOption('sequenceName', $table->getConnection() - ->getSequenceName($this->getOption('tableName'))); - } - } - break; - } - } - $identifierType = $table->getIdentifierType(); - if ( ! isset($identifierType)) { - $table->setIdentifierType(Doctrine::IDENTIFIER_NATURAL); - } - } - - $table->setIdentifier($pk); - - break; - default: - $table->setIdentifierType(Doctrine::IDENTIFIER_COMPOSITE); - } - } - - public static function foobar() - { - echo "bar!"; - } - -} - diff --git a/lib/Doctrine/Table/Factory/Exception.php b/lib/Doctrine/Table/Factory/Exception.php deleted file mode 100644 index 022052827..000000000 --- a/lib/Doctrine/Table/Factory/Exception.php +++ /dev/null @@ -1,3 +0,0 @@ -<?php - -class Doctrine_Table_Factory_Exception extends Doctrine_Table_Exception {} diff --git a/lib/Doctrine/Table/Repository.php b/lib/Doctrine/Table/Repository.php deleted file mode 100644 index 42efd8c5d..000000000 --- a/lib/Doctrine/Table/Repository.php +++ /dev/null @@ -1,163 +0,0 @@ -<?php -/* - * $Id$ - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * This software consists of voluntary contributions made by many individuals - * and is licensed under the LGPL. For more information, see - * <http://www.phpdoctrine.org>. - */ - -/** - * Doctrine_Repository - * each record is added into Doctrine_Repository at the same time they are created, - * loaded from the database or retrieved from the cache - * - * @author Konsta Vesterinen <kvesteri@cc.hut.fi> - * @package Doctrine - * @subpackage Table - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.phpdoctrine.org - * @since 1.0 - * @version $Revision$ - */ -class Doctrine_Table_Repository implements Countable, IteratorAggregate -{ - /** - * @var object Doctrine_Table $table - */ - private $table; - - /** - * @var array $registry - * an array of all records - * keys representing record object identifiers - */ - private $registry = array(); - - /** - * constructor - * - * @param Doctrine_Table $table - */ - public function __construct($mapper) - { - $this->table = $mapper; - } - - /** - * getTable - * - * @return object Doctrine_Table - */ - public function getTable() - { - return $this->table; - } - - /** - * add - * - * @param Doctrine_Record $record record to be added into registry - * @return boolean - */ - public function add(Doctrine_Record $record) - { - $oid = $record->getOID(); - - if (isset($this->registry[$oid])) { - return false; - } - $this->registry[$oid] = $record; - - return true; - } - - /** - * get - * @param integer $oid - * @throws Doctrine_Table_Repository_Exception - */ - public function get($oid) - { - if ( ! isset($this->registry[$oid])) { - throw new Doctrine_Table_Repository_Exception("Unknown object identifier"); - } - return $this->registry[$oid]; - } - - /** - * count - * Doctrine_Registry implements interface Countable - * @return integer the number of records this registry has - */ - public function count() - { - return count($this->registry); - } - - /** - * @param integer $oid object identifier - * @return boolean whether ot not the operation was successful - */ - public function evict($oid) - { - if ( ! isset($this->registry[$oid])) { - return false; - } - unset($this->registry[$oid]); - return true; - } - - /** - * @return integer number of records evicted - */ - public function evictAll() - { - $evicted = 0; - foreach ($this->registry as $oid => $record) { - if ($this->evict($oid)) { - $evicted++; - } - } - return $evicted; - } - - /** - * getIterator - * @return ArrayIterator - */ - public function getIterator() - { - return new ArrayIterator($this->registry); - } - - /** - * contains - * @param integer $oid object identifier - */ - public function contains($oid) - { - return isset($this->registry[$oid]); - } - - /** - * loadAll - * @return void - */ - public function loadAll() - { - $this->table->findAll(); - } -} \ No newline at end of file diff --git a/lib/Doctrine/Table/Repository/Exception.php b/lib/Doctrine/Table/Repository/Exception.php deleted file mode 100644 index 905606784..000000000 --- a/lib/Doctrine/Table/Repository/Exception.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php -/* - * $Id$ - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * This software consists of voluntary contributions made by many individuals - * and is licensed under the LGPL. For more information, see - * <http://www.phpdoctrine.org>. - */ -Doctrine::autoload('Doctrine_Exception'); -/** - * Doctrine_Table_Repository_Exception - * - * @package Doctrine - * @subpackage Table - * @license http://www.opensource.org/licenses/lgpl-license.php LGPL - * @link www.phpdoctrine.org - * @since 1.0 - * @version $Revision$ - * @author Konsta Vesterinen <kvesteri@cc.hut.fi> - */ -class Doctrine_Table_Repository_Exception extends Doctrine_Exception -{ } \ No newline at end of file