Commit 06147703 authored by Steve Müller's avatar Steve Müller

optimize table indexes introspection in DB2

parent 390db30f
...@@ -232,7 +232,21 @@ class DB2Platform extends AbstractPlatform ...@@ -232,7 +232,21 @@ class DB2Platform extends AbstractPlatform
*/ */
public function getListTableIndexesSQL($table, $currentDatabase = null) public function getListTableIndexesSQL($table, $currentDatabase = null)
{ {
return "SELECT NAME, COLNAMES, UNIQUERULE FROM SYSIBM.SYSINDEXES WHERE TBNAME = UPPER('" . $table . "')"; return "SELECT idx.INDNAME AS key_name,
idxcol.COLNAME AS column_name,
CASE
WHEN idx.UNIQUERULE = 'P' THEN 1
ELSE 0
END AS primary,
CASE
WHEN idx.UNIQUERULE = 'D' THEN 1
ELSE 0
END AS non_unique
FROM SYSCAT.INDEXES AS idx
JOIN SYSCAT.INDEXCOLUSE AS idxcol
ON idx.INDSCHEMA = idxcol.INDSCHEMA AND idx.INDNAME = idxcol.INDNAME
WHERE idx.TABNAME = UPPER('" . $table . "')
ORDER BY idxcol.COLSEQ ASC";
} }
/** /**
......
...@@ -37,6 +37,7 @@ class Connection extends \Doctrine\DBAL\Connection ...@@ -37,6 +37,7 @@ class Connection extends \Doctrine\DBAL\Connection
const PORTABILITY_EMPTY_TO_NULL = 4; const PORTABILITY_EMPTY_TO_NULL = 4;
const PORTABILITY_FIX_CASE = 8; const PORTABILITY_FIX_CASE = 8;
const PORTABILITY_DB2 = 1;
const PORTABILITY_ORACLE = 9; const PORTABILITY_ORACLE = 9;
const PORTABILITY_POSTGRESQL = 13; const PORTABILITY_POSTGRESQL = 13;
const PORTABILITY_SQLITE = 13; const PORTABILITY_SQLITE = 13;
...@@ -76,6 +77,8 @@ class Connection extends \Doctrine\DBAL\Connection ...@@ -76,6 +77,8 @@ class Connection extends \Doctrine\DBAL\Connection
$params['portability'] = self::PORTABILITY_SQLANYWHERE; $params['portability'] = self::PORTABILITY_SQLANYWHERE;
} else if ($this->_platform->getName() === 'sqlsrv') { } else if ($this->_platform->getName() === 'sqlsrv') {
$params['portability'] = $params['portabililty'] & self::PORTABILITY_SQLSRV; $params['portability'] = $params['portabililty'] & self::PORTABILITY_SQLSRV;
} else if ($this->_platform->getName() === 'db2') {
$params['portability'] = $params['portabililty'] & self::PORTABILITY_DB2;
} else { } else {
$params['portability'] = $params['portability'] & self::PORTABILITY_OTHERVENDORS; $params['portability'] = $params['portability'] & self::PORTABILITY_OTHERVENDORS;
} }
......
...@@ -118,46 +118,14 @@ class DB2SchemaManager extends AbstractSchemaManager ...@@ -118,46 +118,14 @@ class DB2SchemaManager extends AbstractSchemaManager
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
protected function _getPortableTableIndexesList($tableIndexes, $tableName=null) protected function _getPortableTableIndexesList($tableIndexRows, $tableName = null)
{ {
$eventManager = $this->_platform->getEventManager(); foreach ($tableIndexRows as &$tableIndexRow) {
$tableIndexRow = array_change_key_case($tableIndexRow, \CASE_LOWER);
$indexes = array(); $tableIndexRow['primary'] = (boolean) $tableIndexRow['primary'];
foreach($tableIndexes as $indexKey => $data) {
$data = array_change_key_case($data, \CASE_LOWER);
$unique = ($data['uniquerule'] == "D") ? false : true;
$primary = ($data['uniquerule'] == "P");
$indexName = strtolower($data['name']);
$data = array(
'name' => $indexName,
'columns' => explode("+", ltrim($data['colnames'], '+')),
'unique' => $unique,
'primary' => $primary
);
$index = null;
$defaultPrevented = false;
if (null !== $eventManager && $eventManager->hasListeners(Events::onSchemaIndexDefinition)) {
$eventArgs = new SchemaIndexDefinitionEventArgs($data, $tableName, $this->_conn);
$eventManager->dispatchEvent(Events::onSchemaIndexDefinition, $eventArgs);
$defaultPrevented = $eventArgs->isDefaultPrevented();
$index = $eventArgs->getIndex();
}
if ( ! $defaultPrevented) {
$index = new Index($data['name'], $data['columns'], $data['unique'], $data['primary']);
}
if ($index) {
$indexes[$indexKey] = $index;
}
} }
return $indexes; return parent::_getPortableTableIndexesList($tableIndexRows, $tableName);
} }
/** /**
......
...@@ -273,12 +273,12 @@ class SchemaManagerFunctionalTestCase extends \Doctrine\Tests\DbalFunctionalTest ...@@ -273,12 +273,12 @@ class SchemaManagerFunctionalTestCase extends \Doctrine\Tests\DbalFunctionalTest
$this->assertTrue($tableIndexes['primary']->isUnique()); $this->assertTrue($tableIndexes['primary']->isUnique());
$this->assertTrue($tableIndexes['primary']->isPrimary()); $this->assertTrue($tableIndexes['primary']->isPrimary());
$this->assertEquals('test_index_name', $tableIndexes['test_index_name']->getName()); $this->assertEquals('test_index_name', strtolower($tableIndexes['test_index_name']->getName()));
$this->assertEquals(array('test'), array_map('strtolower', $tableIndexes['test_index_name']->getColumns())); $this->assertEquals(array('test'), array_map('strtolower', $tableIndexes['test_index_name']->getColumns()));
$this->assertTrue($tableIndexes['test_index_name']->isUnique()); $this->assertTrue($tableIndexes['test_index_name']->isUnique());
$this->assertFalse($tableIndexes['test_index_name']->isPrimary()); $this->assertFalse($tableIndexes['test_index_name']->isPrimary());
$this->assertEquals('test_composite_idx', $tableIndexes['test_composite_idx']->getName()); $this->assertEquals('test_composite_idx', strtolower($tableIndexes['test_composite_idx']->getName()));
$this->assertEquals(array('id', 'test'), array_map('strtolower', $tableIndexes['test_composite_idx']->getColumns())); $this->assertEquals(array('id', 'test'), array_map('strtolower', $tableIndexes['test_composite_idx']->getColumns()));
$this->assertFalse($tableIndexes['test_composite_idx']->isUnique()); $this->assertFalse($tableIndexes['test_composite_idx']->isUnique());
$this->assertFalse($tableIndexes['test_composite_idx']->isPrimary()); $this->assertFalse($tableIndexes['test_composite_idx']->isPrimary());
......
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