1
0
mirror of synced 2025-03-04 20:03:21 +03:00

Merge branch 'hotfix/#1294-avoid-connection-with-detached-metadata-backport-to-2.4' into 2.4

This commit is contained in:
Marco Pivetta 2015-02-04 23:46:22 +00:00
commit e05930e714
2 changed files with 49 additions and 11 deletions

View File

@ -78,7 +78,6 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory
protected function initialize() protected function initialize()
{ {
$this->driver = $this->em->getConfiguration()->getMetadataDriverImpl(); $this->driver = $this->em->getConfiguration()->getMetadataDriverImpl();
$this->targetPlatform = $this->em->getConnection()->getDatabasePlatform();
$this->evm = $this->em->getEventManager(); $this->evm = $this->em->getEventManager();
$this->initialized = true; $this->initialized = true;
} }
@ -432,9 +431,9 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory
{ {
$idGenType = $class->generatorType; $idGenType = $class->generatorType;
if ($idGenType == ClassMetadata::GENERATOR_TYPE_AUTO) { if ($idGenType == ClassMetadata::GENERATOR_TYPE_AUTO) {
if ($this->targetPlatform->prefersSequences()) { if ($this->getTargetPlatform()->prefersSequences()) {
$class->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_SEQUENCE); $class->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_SEQUENCE);
} else if ($this->targetPlatform->prefersIdentityColumns()) { } else if ($this->getTargetPlatform()->prefersIdentityColumns()) {
$class->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_IDENTITY); $class->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_IDENTITY);
} else { } else {
$class->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_TABLE); $class->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_TABLE);
@ -450,19 +449,23 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory
$sequenceName = null; $sequenceName = null;
$fieldName = $class->identifier ? $class->getSingleIdentifierFieldName() : null; $fieldName = $class->identifier ? $class->getSingleIdentifierFieldName() : null;
if ($this->targetPlatform instanceof Platforms\PostgreSQLPlatform) { if ($this->getTargetPlatform() instanceof Platforms\PostgreSQLPlatform) {
$columnName = $class->getSingleIdentifierColumnName(); $columnName = $class->getSingleIdentifierColumnName();
$quoted = isset($class->fieldMappings[$fieldName]['quoted']) || isset($class->table['quoted']); $quoted = isset($class->fieldMappings[$fieldName]['quoted']) || isset($class->table['quoted']);
$sequenceName = $class->getTableName() . '_' . $columnName . '_seq'; $sequenceName = $class->getTableName() . '_' . $columnName . '_seq';
$definition = array( $definition = array(
'sequenceName' => $this->targetPlatform->fixSchemaElementName($sequenceName) 'sequenceName' => $this->getTargetPlatform()->fixSchemaElementName($sequenceName)
); );
if ($quoted) { if ($quoted) {
$definition['quoted'] = true; $definition['quoted'] = true;
} }
$sequenceName = $this->em->getConfiguration()->getQuoteStrategy()->getSequenceName($definition, $class, $this->targetPlatform); $sequenceName = $this
->em
->getConfiguration()
->getQuoteStrategy()
->getSequenceName($definition, $class, $this->getTargetPlatform());
} }
$generator = ($fieldName && $class->fieldMappings[$fieldName]['type'] === 'bigint') $generator = ($fieldName && $class->fieldMappings[$fieldName]['type'] === 'bigint')
@ -483,7 +486,7 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory
$quoted = isset($class->fieldMappings[$fieldName]['quoted']) || isset($class->table['quoted']); $quoted = isset($class->fieldMappings[$fieldName]['quoted']) || isset($class->table['quoted']);
$sequenceName = $class->getTableName() . '_' . $columnName . '_seq'; $sequenceName = $class->getTableName() . '_' . $columnName . '_seq';
$definition = array( $definition = array(
'sequenceName' => $this->targetPlatform->fixSchemaElementName($sequenceName), 'sequenceName' => $this->getTargetPlatform()->fixSchemaElementName($sequenceName),
'allocationSize' => 1, 'allocationSize' => 1,
'initialValue' => 1, 'initialValue' => 1,
); );
@ -496,7 +499,7 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory
} }
$sequenceGenerator = new \Doctrine\ORM\Id\SequenceGenerator( $sequenceGenerator = new \Doctrine\ORM\Id\SequenceGenerator(
$this->em->getConfiguration()->getQuoteStrategy()->getSequenceName($definition, $class, $this->targetPlatform), $this->em->getConfiguration()->getQuoteStrategy()->getSequenceName($definition, $class, $this->getTargetPlatform()),
$definition['allocationSize'] $definition['allocationSize']
); );
$class->setIdGenerator($sequenceGenerator); $class->setIdGenerator($sequenceGenerator);
@ -569,4 +572,16 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory
{ {
return isset($class->isMappedSuperclass) && $class->isMappedSuperclass === false; return isset($class->isMappedSuperclass) && $class->isMappedSuperclass === false;
} }
/**
* @return Platforms\AbstractPlatform
*/
private function getTargetPlatform()
{
if (!$this->targetPlatform) {
$this->targetPlatform = $this->em->getConnection()->getDatabasePlatform();
}
return $this->targetPlatform;
}
} }

View File

@ -192,15 +192,38 @@ class ClassMetadataFactoryTest extends \Doctrine\Tests\OrmTestCase
$rootMetadata = $cmf->getMetadataFor('Doctrine\Tests\Models\JoinedInheritanceType\RootClass'); $rootMetadata = $cmf->getMetadataFor('Doctrine\Tests\Models\JoinedInheritanceType\RootClass');
} }
protected function _createEntityManager($metadataDriver) public function testGetAllMetadataWorksWithBadConnection()
{
// DDC-3551
$conn = $this->getMockBuilder('Doctrine\DBAL\Connection')
->disableOriginalConstructor()
->getMock();
$mockDriver = new MetadataDriverMock();
$em = $this->_createEntityManager($mockDriver, $conn);
$conn->expects($this->any())
->method('getDatabasePlatform')
->will($this->throwException(new \Exception('Exception thrown in test when calling getDatabasePlatform')));
$cmf = new ClassMetadataFactory();
$cmf->setEntityManager($em);
// getting all the metadata should work, even if get DatabasePlatform blows up
$metadata = $cmf->getAllMetadata();
// this will just be an empty array - there was no error
$this->assertEquals(array(), $metadata);
}
protected function _createEntityManager($metadataDriver, $conn = null)
{ {
$driverMock = new DriverMock(); $driverMock = new DriverMock();
$config = new \Doctrine\ORM\Configuration(); $config = new \Doctrine\ORM\Configuration();
$config->setProxyDir(__DIR__ . '/../../Proxies'); $config->setProxyDir(__DIR__ . '/../../Proxies');
$config->setProxyNamespace('Doctrine\Tests\Proxies'); $config->setProxyNamespace('Doctrine\Tests\Proxies');
$eventManager = new EventManager(); $eventManager = new EventManager();
$conn = new ConnectionMock(array(), $driverMock, $config, $eventManager); if (!$conn) {
$mockDriver = new MetadataDriverMock(); $conn = new ConnectionMock(array(), $driverMock, $config, $eventManager);
}
$config->setMetadataDriverImpl($metadataDriver); $config->setMetadataDriverImpl($metadataDriver);
return EntityManagerMock::create($conn, $config, $eventManager); return EntityManagerMock::create($conn, $config, $eventManager);