Commit 0c55022f authored by jsor's avatar jsor

Implement alter table event dispatching for postgresql

parent 07e84011
<?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.doctrine-project.org>.
*/
namespace Doctrine\DBAL\Event;
use Doctrine\Common\EventArgs,
Doctrine\DBAL\Platforms\AbstractPlatform,
Doctrine\DBAL\Schema\TableDiff,
Doctrine\DBAL\Schema\Column;
/**
* Event Arguments used when SQL queries for adding table columns are generated inside Doctrine\DBAL\Platform\*Platform.
*
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link www.doctrine-project.com
* @since 2.2
* @version $Revision$
* @author Jan Sorgalla <jsorgalla@googlemail.com>
*/
class SchemaAlterTableAddedColumnEventArgs extends SchemaEventArgs
{
/**
* @var Column
*/
private $_column = null;
/**
* @var TableDiff
*/
private $_tableDiff = null;
/**
* @var AbstractPlatform
*/
private $_platform = null;
/**
* @var array
*/
private $_sql = array();
/**
* @param Column $column
* @param TableDiff $tableDiff
* @param AbstractPlatform $platform
*/
public function __construct(Column $column, TableDiff $tableDiff, AbstractPlatform $platform)
{
$this->_column = $column;
$this->_tableDiff = $tableDiff;
$this->_platform = $platform;
}
/**
* @return Doctrine\DBAL\Schema\Column
*/
public function getColumn()
{
return $this->_column;
}
/**
* @return Doctrine\DBAL\Schema\TableDiff
*/
public function getTableDiff()
{
return $this->_tableDiff;
}
/**
* @return Doctrine\DBAL\Platforms\AbstractPlatform
*/
public function getPlatform()
{
return $this->_platform;
}
/**
* @param string|array $sql
* @return SchemaEventArgs
*/
public function addSql($sql)
{
if (is_array($sql)) {
$this->_sql = array_merge($this->_sql, $sql);
} else {
$this->_sql[] = $sql;
}
return $this;
}
/**
* @return array
*/
public function getSql()
{
return $this->_sql;
}
}
<?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.doctrine-project.org>.
*/
namespace Doctrine\DBAL\Event;
use Doctrine\Common\EventArgs,
Doctrine\DBAL\Platforms\AbstractPlatform,
Doctrine\DBAL\Schema\TableDiff,
Doctrine\DBAL\Schema\ColumnDiff;
/**
* Event Arguments used when SQL queries for changing table columns are generated inside Doctrine\DBAL\Platform\*Platform.
*
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link www.doctrine-project.com
* @since 2.2
* @version $Revision$
* @author Jan Sorgalla <jsorgalla@googlemail.com>
*/
class SchemaAlterTableChangedColumnEventArgs extends SchemaEventArgs
{
/**
* @var ColumnDiff
*/
private $_columnDiff = null;
/**
* @var TableDiff
*/
private $_tableDiff = null;
/**
* @var AbstractPlatform
*/
private $_platform = null;
/**
* @var array
*/
private $_sql = array();
/**
* @param ColumnDiff $columnDiff
* @param TableDiff $tableDiff
* @param AbstractPlatform $platform
*/
public function __construct(ColumnDiff $columnDiff, TableDiff $tableDiff, AbstractPlatform $platform)
{
$this->_columnDiff = $columnDiff;
$this->_tableDiff = $tableDiff;
$this->_platform = $platform;
}
/**
* @return Doctrine\DBAL\Schema\ColumnDiff
*/
public function getColumnDiff()
{
return $this->_columnDiff;
}
/**
* @return Doctrine\DBAL\Schema\TableDiff
*/
public function getTableDiff()
{
return $this->_tableDiff;
}
/**
* @return Doctrine\DBAL\Platforms\AbstractPlatform
*/
public function getPlatform()
{
return $this->_platform;
}
/**
* @param string|array $sql
* @return SchemaEventArgs
*/
public function addSql($sql)
{
if (is_array($sql)) {
$this->_sql = array_merge($this->_sql, $sql);
} else {
$this->_sql[] = $sql;
}
return $this;
}
/**
* @return array
*/
public function getSql()
{
return $this->_sql;
}
}
<?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.doctrine-project.org>.
*/
namespace Doctrine\DBAL\Event;
use Doctrine\Common\EventArgs,
Doctrine\DBAL\Platforms\AbstractPlatform,
Doctrine\DBAL\Schema\TableDiff,
Doctrine\DBAL\Schema\Column;
/**
* Event Arguments used when SQL queries for removing table columns are generated inside Doctrine\DBAL\Platform\*Platform.
*
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link www.doctrine-project.com
* @since 2.2
* @version $Revision$
* @author Jan Sorgalla <jsorgalla@googlemail.com>
*/
class SchemaAlterTableRemovedColumnEventArgs extends SchemaEventArgs
{
/**
* @var Column
*/
private $_column = null;
/**
* @var TableDiff
*/
private $_tableDiff = null;
/**
* @var AbstractPlatform
*/
private $_platform = null;
/**
* @var array
*/
private $_sql = array();
/**
* @param Column $column
* @param TableDiff $tableDiff
* @param AbstractPlatform $platform
*/
public function __construct(Column $column, TableDiff $tableDiff, AbstractPlatform $platform)
{
$this->_column = $column;
$this->_tableDiff = $tableDiff;
$this->_platform = $platform;
}
/**
* @return Doctrine\DBAL\Schema\Column
*/
public function getColumn()
{
return $this->_column;
}
/**
* @return Doctrine\DBAL\Schema\TableDiff
*/
public function getTableDiff()
{
return $this->_tableDiff;
}
/**
* @return Doctrine\DBAL\Platforms\AbstractPlatform
*/
public function getPlatform()
{
return $this->_platform;
}
/**
* @param string|array $sql
* @return SchemaEventArgs
*/
public function addSql($sql)
{
if (is_array($sql)) {
$this->_sql = array_merge($this->_sql, $sql);
} else {
$this->_sql[] = $sql;
}
return $this;
}
/**
* @return array
*/
public function getSql()
{
return $this->_sql;
}
}
<?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.doctrine-project.org>.
*/
namespace Doctrine\DBAL\Event;
use Doctrine\Common\EventArgs,
Doctrine\DBAL\Platforms\AbstractPlatform,
Doctrine\DBAL\Schema\TableDiff,
Doctrine\DBAL\Schema\Column;
/**
* Event Arguments used when SQL queries for renaming table columns are generated inside Doctrine\DBAL\Platform\*Platform.
*
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link www.doctrine-project.com
* @since 2.2
* @version $Revision$
* @author Jan Sorgalla <jsorgalla@googlemail.com>
*/
class SchemaAlterTableRenamedColumnEventArgs extends SchemaEventArgs
{
/**
* @var string
*/
private $_oldColumnName = null;
/**
* @var Column
*/
private $_column = null;
/**
* @var TableDiff
*/
private $_tableDiff = null;
/**
* @var AbstractPlatform
*/
private $_platform = null;
/**
* @var array
*/
private $_sql = array();
/**
* @param string $oldColumnName
* @param Column $column
* @param TableDiff $tableDiff
* @param AbstractPlatform $platform
*/
public function __construct($oldColumnName, Column $column, TableDiff $tableDiff, AbstractPlatform $platform)
{
$this->_oldColumnName = $oldColumnName;
$this->_column = $column;
$this->_tableDiff = $tableDiff;
$this->_platform = $platform;
}
/**
* @return string
*/
public function getOldColumnName()
{
return $this->_oldColumnName;
}
/**
* @return Doctrine\DBAL\Schema\Column
*/
public function getColumn()
{
return $this->_column;
}
/**
* @return Doctrine\DBAL\Schema\TableDiff
*/
public function getTableDiff()
{
return $this->_tableDiff;
}
/**
* @return Doctrine\DBAL\Platforms\AbstractPlatform
*/
public function getPlatform()
{
return $this->_platform;
}
/**
* @param string|array $sql
* @return SchemaEventArgs
*/
public function addSql($sql)
{
if (is_array($sql)) {
$this->_sql = array_merge($this->_sql, $sql);
} else {
$this->_sql[] = $sql;
}
return $this;
}
/**
* @return array
*/
public function getSql()
{
return $this->_sql;
}
}
...@@ -38,5 +38,9 @@ final class Events ...@@ -38,5 +38,9 @@ final class Events
const onSchemaCreateTable = 'onSchemaCreateTable'; const onSchemaCreateTable = 'onSchemaCreateTable';
const onSchemaCreateTableColumn = 'onSchemaCreateTableColumn'; const onSchemaCreateTableColumn = 'onSchemaCreateTableColumn';
const onSchemaDropTable = 'onSchemaDropTable'; const onSchemaDropTable = 'onSchemaDropTable';
const onSchemaAlterTableAddedColumn = 'onSchemaAlterTableAddedColumn';
const onSchemaAlterTableRemovedColumn = 'onSchemaAlterTableRemovedColumn';
const onSchemaAlterTableChangedColumn = 'onSchemaAlterTableChangedColumn';
const onSchemaAlterTableRenamedColumn = 'onSchemaAlterTableRenamedColumn';
const onSchemaColumnDefinition = 'onSchemaColumnDefinition'; const onSchemaColumnDefinition = 'onSchemaColumnDefinition';
} }
...@@ -20,7 +20,12 @@ ...@@ -20,7 +20,12 @@
namespace Doctrine\DBAL\Platforms; namespace Doctrine\DBAL\Platforms;
use Doctrine\DBAL\Schema\TableDiff, use Doctrine\DBAL\Schema\TableDiff,
Doctrine\DBAL\Schema\Table; Doctrine\DBAL\Schema\Table,
Doctrine\DBAL\Events,
Doctrine\DBAL\Event\SchemaAlterTableAddedColumnEventArgs,
Doctrine\DBAL\Event\SchemaAlterTableRemovedColumnEventArgs,
Doctrine\DBAL\Event\SchemaAlterTableChangedColumnEventArgs,
Doctrine\DBAL\Event\SchemaAlterTableRenamedColumnEventArgs;
/** /**
* PostgreSqlPlatform. * PostgreSqlPlatform.
...@@ -380,8 +385,20 @@ class PostgreSqlPlatform extends AbstractPlatform ...@@ -380,8 +385,20 @@ class PostgreSqlPlatform extends AbstractPlatform
{ {
$sql = array(); $sql = array();
$commentsSQL = array(); $commentsSQL = array();
$columnSql = array();
foreach ($diff->addedColumns as $column) { foreach ($diff->addedColumns as $column) {
if (null !== $this->_eventManager && $this->_eventManager->hasListeners(Events::onSchemaAlterTableAddedColumn)) {
$eventArgs = new SchemaAlterTableAddedColumnEventArgs($column, $diff, $this);
$this->_eventManager->dispatchEvent(Events::onSchemaAlterTableAddedColumn, $eventArgs);
$columnSql = array_merge($columnSql, $eventArgs->getSql());
if ($eventArgs->isDefaultPrevented()) {
continue;
}
}
$query = 'ADD ' . $this->getColumnDeclarationSQL($column->getQuotedName($this), $column->toArray()); $query = 'ADD ' . $this->getColumnDeclarationSQL($column->getQuotedName($this), $column->toArray());
$sql[] = 'ALTER TABLE ' . $diff->name . ' ' . $query; $sql[] = 'ALTER TABLE ' . $diff->name . ' ' . $query;
if ($comment = $this->getColumnComment($column)) { if ($comment = $this->getColumnComment($column)) {
...@@ -390,11 +407,33 @@ class PostgreSqlPlatform extends AbstractPlatform ...@@ -390,11 +407,33 @@ class PostgreSqlPlatform extends AbstractPlatform
} }
foreach ($diff->removedColumns as $column) { foreach ($diff->removedColumns as $column) {
if (null !== $this->_eventManager && $this->_eventManager->hasListeners(Events::onSchemaAlterTableRemovedColumn)) {
$eventArgs = new SchemaAlterTableRemovedColumnEventArgs($column, $diff, $this);
$this->_eventManager->dispatchEvent(Events::onSchemaAlterTableRemovedColumn, $eventArgs);
$columnSql = array_merge($columnSql, $eventArgs->getSql());
if ($eventArgs->isDefaultPrevented()) {
continue;
}
}
$query = 'DROP ' . $column->getQuotedName($this); $query = 'DROP ' . $column->getQuotedName($this);
$sql[] = 'ALTER TABLE ' . $diff->name . ' ' . $query; $sql[] = 'ALTER TABLE ' . $diff->name . ' ' . $query;
} }
foreach ($diff->changedColumns AS $columnDiff) { foreach ($diff->changedColumns AS $columnDiff) {
if (null !== $this->_eventManager && $this->_eventManager->hasListeners(Events::onSchemaAlterTableChangedColumn)) {
$eventArgs = new SchemaAlterTableChangedColumnEventArgs($columnDiff, $diff, $this);
$this->_eventManager->dispatchEvent(Events::onSchemaAlterTableChangedColumn, $eventArgs);
$columnSql = array_merge($columnSql, $eventArgs->getSql());
if ($eventArgs->isDefaultPrevented()) {
continue;
}
}
$oldColumnName = $columnDiff->oldColumnName; $oldColumnName = $columnDiff->oldColumnName;
$column = $columnDiff->column; $column = $columnDiff->column;
...@@ -434,6 +473,17 @@ class PostgreSqlPlatform extends AbstractPlatform ...@@ -434,6 +473,17 @@ class PostgreSqlPlatform extends AbstractPlatform
} }
foreach ($diff->renamedColumns as $oldColumnName => $column) { foreach ($diff->renamedColumns as $oldColumnName => $column) {
if (null !== $this->_eventManager && $this->_eventManager->hasListeners(Events::onSchemaAlterTableRenamedColumn)) {
$eventArgs = new SchemaAlterTableRenamedColumnEventArgs($oldColumnName, $column, $diff, $this);
$this->_eventManager->dispatchEvent(Events::onSchemaAlterTableRenamedColumn, $eventArgs);
$columnSql = array_merge($columnSql, $eventArgs->getSql());
if ($eventArgs->isDefaultPrevented()) {
continue;
}
}
$sql[] = 'ALTER TABLE ' . $diff->name . ' RENAME COLUMN ' . $oldColumnName . ' TO ' . $column->getQuotedName($this); $sql[] = 'ALTER TABLE ' . $diff->name . ' RENAME COLUMN ' . $oldColumnName . ' TO ' . $column->getQuotedName($this);
} }
...@@ -441,7 +491,7 @@ class PostgreSqlPlatform extends AbstractPlatform ...@@ -441,7 +491,7 @@ class PostgreSqlPlatform extends AbstractPlatform
$sql[] = 'ALTER TABLE ' . $diff->name . ' RENAME TO ' . $diff->newName; $sql[] = 'ALTER TABLE ' . $diff->name . ' RENAME TO ' . $diff->newName;
} }
return array_merge($sql, $this->_getAlterTableIndexForeignKeySQL($diff), $commentsSQL); return array_merge($sql, $this->_getAlterTableIndexForeignKeySQL($diff), $commentsSQL, $columnSql);
} }
/** /**
......
...@@ -216,6 +216,54 @@ abstract class AbstractPlatformTestCase extends \Doctrine\Tests\DbalTestCase ...@@ -216,6 +216,54 @@ abstract class AbstractPlatformTestCase extends \Doctrine\Tests\DbalTestCase
$this->_platform->getDropTableSQL('TABLE'); $this->_platform->getDropTableSQL('TABLE');
} }
public function testGetAlterTableSqlDispatchEvent()
{
$events = array(
'onSchemaAlterTableAddedColumn',
'onSchemaAlterTableRemovedColumn',
'onSchemaAlterTableChangedColumn',
'onSchemaAlterTableRenamedColumn'
);
$listenerMock = $this->getMock('GetAlterTableSqlDispatchEvenListener', $events);
$listenerMock
->expects($this->once())
->method('onSchemaAlterTableAddedColumn');
$listenerMock
->expects($this->once())
->method('onSchemaAlterTableRemovedColumn');
$listenerMock
->expects($this->once())
->method('onSchemaAlterTableChangedColumn');
$listenerMock
->expects($this->once())
->method('onSchemaAlterTableRenamedColumn');
$eventManager = new EventManager();
$events = array(
Events::onSchemaAlterTableAddedColumn,
Events::onSchemaAlterTableRemovedColumn,
Events::onSchemaAlterTableChangedColumn,
Events::onSchemaAlterTableRenamedColumn
);
$eventManager->addEventListener($events, $listenerMock);
$this->_platform->setEventManager($eventManager);
$tableDiff = new \Doctrine\DBAL\Schema\TableDiff('mytable');
$tableDiff->addedColumns['added'] = new \Doctrine\DBAL\Schema\Column('added', \Doctrine\DBAL\Types\Type::getType('integer'), array());
$tableDiff->removedColumns['removed'] = new \Doctrine\DBAL\Schema\Column('removed', \Doctrine\DBAL\Types\Type::getType('integer'), array());
$tableDiff->changedColumns['changed'] = new \Doctrine\DBAL\Schema\ColumnDiff(
'changed', new \Doctrine\DBAL\Schema\Column(
'changed2', \Doctrine\DBAL\Types\Type::getType('string'), array()
),
array()
);
$tableDiff->renamedColumns['renamed'] = new \Doctrine\DBAL\Schema\Column('renamed2', \Doctrine\DBAL\Types\Type::getType('integer'), array());
$this->_platform->getAlterTableSQL($tableDiff);
}
/** /**
* @group DBAL-42 * @group DBAL-42
*/ */
......
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