Commit 733c3c24 authored by romanb's avatar romanb

[2.0] Various necessary fixes and adjustments for oracle as well as fixes for...

[2.0] Various necessary fixes and adjustments for oracle as well as fixes for better handling of temporal types. Closed #2452.
parent 6a3aa849
...@@ -520,6 +520,11 @@ abstract class AbstractPlatform ...@@ -520,6 +520,11 @@ abstract class AbstractPlatform
return $sql; return $sql;
} }
public function getCreateTemporaryTableSnippetSql()
{
return "CREATE TEMPORARY TABLE";
}
/** /**
* Gets the SQL to create a sequence on this platform. * Gets the SQL to create a sequence on this platform.
...@@ -1339,6 +1344,18 @@ abstract class AbstractPlatform ...@@ -1339,6 +1344,18 @@ abstract class AbstractPlatform
{ {
throw DoctrineException::getDateTimeTypeDeclarationNotSupported($this); throw DoctrineException::getDateTimeTypeDeclarationNotSupported($this);
} }
/**
* Obtain DBMS specific SQL to be used to create date fields in statements
* like CREATE TABLE.
*
* @param array $fieldDeclaration
* @return string
*/
public function getDateTypeDeclarationSql(array $fieldDeclaration)
{
throw DoctrineException::getDateTypeDeclarationNotSupported($this);
}
/** /**
* Gets the default transaction isolation level of the platform. * Gets the default transaction isolation level of the platform.
...@@ -1529,4 +1546,16 @@ abstract class AbstractPlatform ...@@ -1529,4 +1546,16 @@ abstract class AbstractPlatform
{ {
return $column; return $column;
} }
/**
* Makes any fixes to a name of a schema element (table, sequence, ...) that are required
* by restrictions of the platform, like a maximum length.
*
* @param string $schemaName
* @return string
*/
public function fixSchemaElementName($schemaElementName)
{
return $schemaElementName;
}
} }
\ No newline at end of file
...@@ -266,6 +266,14 @@ class MySqlPlatform extends AbstractPlatform ...@@ -266,6 +266,14 @@ class MySqlPlatform extends AbstractPlatform
{ {
return 'DATETIME'; return 'DATETIME';
} }
/**
* @override
*/
public function getDateTypeDeclarationSql(array $fieldDeclaration)
{
return 'DATE';
}
/** /**
* @override * @override
......
...@@ -182,7 +182,7 @@ class OraclePlatform extends AbstractPlatform ...@@ -182,7 +182,7 @@ class OraclePlatform extends AbstractPlatform
*/ */
public function getDateTimeTypeDeclarationSql(array $fieldDeclaration) public function getDateTimeTypeDeclarationSql(array $fieldDeclaration)
{ {
return 'DATE'; return 'TIMESTAMP(0) WITH TIME ZONE';
} }
/** /**
...@@ -247,7 +247,7 @@ class OraclePlatform extends AbstractPlatform ...@@ -247,7 +247,7 @@ class OraclePlatform extends AbstractPlatform
foreach ($columns as $name => $column) { foreach ($columns as $name => $column) {
if (isset($column['sequence'])) { if (isset($column['sequence'])) {
$sql[] = $this->getCreateSequenceSql($column['sequence'], 1); $sql[] = $this->getCreateSequenceSql($column['sequence'], 1);
} }
if (isset($column['autoincrement']) && $column['autoincrement'] || if (isset($column['autoincrement']) && $column['autoincrement'] ||
...@@ -513,4 +513,23 @@ END;'; ...@@ -513,4 +513,23 @@ END;';
{ {
return strtoupper($column); return strtoupper($column);
} }
public function getCreateTemporaryTableSnippetSql()
{
return "CREATE GLOBAL TEMPORARY TABLE";
}
public function getDateTimeFormatString()
{
return 'Y-m-d H:i:sP';
}
public function fixSchemaElementName($schemaElementName)
{
if (strlen($schemaElementName) > 30) {
// Trim it
return substr($schemaElementName, 0, 30);
}
return $schemaElementName;
}
} }
\ No newline at end of file
...@@ -692,7 +692,15 @@ class PostgreSqlPlatform extends AbstractPlatform ...@@ -692,7 +692,15 @@ class PostgreSqlPlatform extends AbstractPlatform
*/ */
public function getDateTimeTypeDeclarationSql(array $fieldDeclaration) public function getDateTimeTypeDeclarationSql(array $fieldDeclaration)
{ {
return 'TIMESTAMP without time zone'; return 'TIMESTAMP(0) WITH TIME ZONE';
}
/**
* @override
*/
public function getDateTypeDeclarationSql(array $fieldDeclaration)
{
return 'DATE';
} }
/** /**
...@@ -757,14 +765,8 @@ class PostgreSqlPlatform extends AbstractPlatform ...@@ -757,14 +765,8 @@ class PostgreSqlPlatform extends AbstractPlatform
return strtolower($column); return strtolower($column);
} }
/** public function getDateTimeFormatString()
* Gets the format string, as accepted by the date() function, that describes
* the format of a stored datetime value of this platform.
*
* @return string The format string.
*/
/*public function getDateTimeFormatString()
{ {
return 'Y-m-d H:i:s.u'; return 'Y-m-d H:i:sO';
}*/ }
} }
\ No newline at end of file
...@@ -234,6 +234,14 @@ class SqlitePlatform extends AbstractPlatform ...@@ -234,6 +234,14 @@ class SqlitePlatform extends AbstractPlatform
{ {
return 'DATETIME'; return 'DATETIME';
} }
/**
* @override
*/
public function getDateTypeDeclarationSql(array $fieldDeclaration)
{
return 'DATE';
}
/** @override */ /** @override */
protected function _getCommonIntegerTypeDeclarationSql(array $columnDef) protected function _getCommonIntegerTypeDeclarationSql(array $columnDef)
......
...@@ -187,10 +187,10 @@ class OracleSchemaManager extends AbstractSchemaManager ...@@ -187,10 +187,10 @@ class OracleSchemaManager extends AbstractSchemaManager
$password = $params['password']; $password = $params['password'];
$query = 'CREATE USER ' . $username . ' IDENTIFIED BY ' . $password; $query = 'CREATE USER ' . $username . ' IDENTIFIED BY ' . $password;
$result = $this->_conn->exec($query); $result = $this->_conn->executeUpdate($query);
$query = 'GRANT CREATE SESSION, CREATE TABLE, UNLIMITED TABLESPACE, CREATE SEQUENCE, CREATE TRIGGER TO ' . $username; $query = 'GRANT CREATE SESSION, CREATE TABLE, UNLIMITED TABLESPACE, CREATE SEQUENCE, CREATE TRIGGER TO ' . $username;
$result = $this->_conn->exec($query); $result = $this->_conn->executeUpdate($query);
return true; return true;
} }
...@@ -199,7 +199,7 @@ class OracleSchemaManager extends AbstractSchemaManager ...@@ -199,7 +199,7 @@ class OracleSchemaManager extends AbstractSchemaManager
{ {
$sql = $this->_platform->getDropAutoincrementSql($table); $sql = $this->_platform->getDropAutoincrementSql($table);
foreach ($sql as $query) { foreach ($sql as $query) {
$this->_conn->exec($query); $this->_conn->executeUpdate($query);
} }
return true; return true;
......
...@@ -5,7 +5,7 @@ namespace Doctrine\DBAL\Types; ...@@ -5,7 +5,7 @@ namespace Doctrine\DBAL\Types;
use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\DBAL\Platforms\AbstractPlatform;
/** /**
* Type that maps an SQL DATETIME to a PHP Date object. * Type that maps an SQL DATE to a PHP Date object.
* *
* @since 2.0 * @since 2.0
*/ */
......
...@@ -398,7 +398,8 @@ class ClassMetadataFactory ...@@ -398,7 +398,8 @@ class ClassMetadataFactory
// If there is no sequence definition yet, create a default definition // If there is no sequence definition yet, create a default definition
$definition = $class->getSequenceGeneratorDefinition(); $definition = $class->getSequenceGeneratorDefinition();
if ( ! $definition) { if ( ! $definition) {
$definition['sequenceName'] = $class->getTableName() . '_' . $class->getSingleIdentifierColumnName() . '_seq'; $sequenceName = $class->getTableName() . '_' . $class->getSingleIdentifierColumnName() . '_seq';
$definition['sequenceName'] = $this->_targetPlatform->fixSchemaElementName($sequenceName);
$definition['allocationSize'] = 20; $definition['allocationSize'] = 20;
$definition['initialValue'] = 1; $definition['initialValue'] = 1;
$class->setSequenceGeneratorDefinition($definition); $class->setSequenceGeneratorDefinition($definition);
......
...@@ -95,7 +95,7 @@ class MultiTableDeleteExecutor extends AbstractSqlExecutor ...@@ -95,7 +95,7 @@ class MultiTableDeleteExecutor extends AbstractSqlExecutor
'type' => \Doctrine\DBAL\Types\Type::getType($rootClass->getTypeOfColumn($idColumnName)) 'type' => \Doctrine\DBAL\Types\Type::getType($rootClass->getTypeOfColumn($idColumnName))
); );
} }
$this->_createTempTableSql = 'CREATE TEMPORARY TABLE ' . $tempTable . ' (' $this->_createTempTableSql = $platform->getCreateTemporaryTableSnippetSql() . ' ' . $tempTable . ' ('
. $conn->getDatabasePlatform()->getColumnDeclarationListSql($columnDefinitions) . $conn->getDatabasePlatform()->getColumnDeclarationListSql($columnDefinitions)
. ', PRIMARY KEY(' . $idColumnList . '))'; . ', PRIMARY KEY(' . $idColumnList . '))';
$this->_dropTempTableSql = 'DROP TABLE ' . $tempTable; $this->_dropTempTableSql = 'DROP TABLE ' . $tempTable;
......
...@@ -127,8 +127,8 @@ class MultiTableUpdateExecutor extends AbstractSqlExecutor ...@@ -127,8 +127,8 @@ class MultiTableUpdateExecutor extends AbstractSqlExecutor
'type' => \Doctrine\DBAL\Types\Type::getType($rootClass->getTypeOfColumn($idColumnName)) 'type' => \Doctrine\DBAL\Types\Type::getType($rootClass->getTypeOfColumn($idColumnName))
); );
} }
$this->_createTempTableSql = 'CREATE TEMPORARY TABLE ' . $tempTable . ' (' $this->_createTempTableSql = $platform->getCreateTemporaryTableSnippetSql() . ' ' . $tempTable . ' ('
. $conn->getDatabasePlatform()->getColumnDeclarationListSql($columnDefinitions) . $platform->getColumnDeclarationListSql($columnDefinitions)
. ', PRIMARY KEY(' . $idColumnList . '))'; . ', PRIMARY KEY(' . $idColumnList . '))';
$this->_dropTempTableSql = 'DROP TABLE ' . $tempTable; $this->_dropTempTableSql = 'DROP TABLE ' . $tempTable;
} }
......
...@@ -44,7 +44,7 @@ class LifecycleCallbackTest extends \Doctrine\Tests\OrmFunctionalTestCase ...@@ -44,7 +44,7 @@ class LifecycleCallbackTest extends \Doctrine\Tests\OrmFunctionalTestCase
/** /**
* @Entity * @Entity
* @HasLifecycleCallbacks * @HasLifecycleCallbacks
* @Table(name="lifecycle_callback_test_entity") * @Table(name="lc_cb_test_entity")
*/ */
class LifecycleCallbackTestEntity class LifecycleCallbackTestEntity
{ {
......
...@@ -136,7 +136,8 @@ class OptimisticTest extends \Doctrine\Tests\OrmFunctionalTestCase ...@@ -136,7 +136,8 @@ class OptimisticTest extends \Doctrine\Tests\OrmFunctionalTestCase
$test = $q->getSingleResult(); $test = $q->getSingleResult();
// Manually increment the version datetime column // Manually increment the version datetime column
$this->_conn->execute('UPDATE optimistic_timestamp SET version = ? WHERE id = ?', array(date('Y-m-d H:i:s', strtotime($test->version->format('Y-m-d H:i:s')) + 3600), $test->id)); $format = $this->_em->getConnection()->getDatabasePlatform()->getDateTimeFormatString();
$this->_conn->execute('UPDATE optimistic_timestamp SET version = ? WHERE id = ?', array(date($format, strtotime($test->version->format($format)) + 3600), $test->id));
// Try and update the record and it should throw an exception // Try and update the record and it should throw an exception
$test->name = 'Testing again'; $test->name = 'Testing again';
......
...@@ -20,7 +20,7 @@ class NativeQueryTest extends \Doctrine\Tests\OrmFunctionalTestCase ...@@ -20,7 +20,7 @@ class NativeQueryTest extends \Doctrine\Tests\OrmFunctionalTestCase
parent::setUp(); parent::setUp();
if ($this->_em->getConnection()->getDatabasePlatform()->getName() == 'oracle') { if ($this->_em->getConnection()->getDatabasePlatform()->getName() == 'oracle') {
$this->markTestSkipped('The ' . $testClass .' does not work with Oracle due to character casing.'); $this->markTestSkipped('The ' . __CLASS__ .' does not work with Oracle due to character casing.');
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment