1
0
mirror of synced 2024-12-12 22:36:02 +03:00

[2.0] DC-169 - New method AbstractSchemaManager::createSchema() which creates a schema instance with full tables and sequences, additionally listTables() was rewritten to return a full Table instance instead of just the table names.

This commit is contained in:
beberlei 2009-11-30 23:12:26 +00:00
parent b7652f1f4e
commit e3314dae16
9 changed files with 107 additions and 19 deletions

View File

@ -367,7 +367,7 @@ class MySqlPlatform extends AbstractPlatform
public function getListTablesSql()
{
return 'SHOW TABLES';
return 'SHOW FULL TABLES WHERE Table_type = "BASE TABLE"';
}
public function getListTableColumnsSql($table)

View File

@ -43,14 +43,14 @@ abstract class AbstractSchemaManager
/**
* Holds instance of the Doctrine connection for this schema manager
*
* @var object \Doctrine\DBAL\Connection
* @var \Doctrine\DBAL\Connection
*/
protected $_conn;
/**
* Holds instance of the database platform used for this schema manager
*
* @var string
* @var \Doctrine\DBAL\Platform\AbstractPlatform
*/
protected $_platform;
@ -228,7 +228,7 @@ abstract class AbstractSchemaManager
/**
* List the tables for this connection
*
* @return array $tables
* @return array(int => Table)
*/
public function listTables()
{
@ -236,7 +236,28 @@ abstract class AbstractSchemaManager
$tables = $this->_conn->fetchAll($sql);
return $this->_getPortableTablesList($tables);
$tableNames = $this->_getPortableTablesList($tables);
$tables = array();
foreach ($tableNames AS $tableName) {
$columns = $this->listTableColumns($tableName);
$foreignKeys = array();
if ($this->_platform->supportsForeignKeyConstraints()) {
$foreignKeys = $this->listTableForeignKeys($tableName);
}
$indexes = $this->listTableIndexes($tableName);
$idGeneratorType = Table::ID_NONE;
foreach ($columns AS $column) {
if ($column->hasPlatformOption('autoincrement') && $column->getPlatformOption('autoincrement')) {
$idGeneratorType = Table::ID_IDENTITY;
}
}
$tables[] = new Table($tableName, $columns, $indexes, $foreignKeys, $idGeneratorType, array());
}
return $tables;
}
/**
@ -1028,4 +1049,20 @@ abstract class AbstractSchemaManager
$this->_conn->executeUpdate($query);
}
}
/**
* Create a schema instance for the current database.
*
* @return Schema
*/
public function createSchema()
{
$sequences = array();
if($this->_platform->supportsSequences()) {
$sequences = $this->listSequences();
}
$tables = $this->listTables();
return new Schema($tables, $sequences);
}
}

View File

@ -44,7 +44,7 @@ class MySqlSchemaManager extends AbstractSchemaManager
protected function _getPortableTableDefinition($table)
{
return end($table);
return array_shift($table);
}
protected function _getPortableUserDefinition($user)

View File

@ -201,25 +201,30 @@ class PostgreSqlSchemaManager extends AbstractSchemaManager
$scale = null;
$dbType = strtolower($tableColumn['type']);
$autoincrement = false;
switch ($dbType) {
case 'smallint':
case 'int2':
$type = 'smallint';
$length = null;
break;
case 'serial':
case 'serial4':
$autoincrement = true;
// break missing intentionally
case 'int':
case 'int4':
case 'integer':
case 'serial':
case 'serial4':
$type = 'integer';
$length = null;
break;
case 'bigint':
case 'int8':
case 'bigserial':
case 'serial8':
$autoincrement = true;
// break missing intentionally
case 'bigint':
case 'int8':
$type = 'bigint';
$length = null;
break;
@ -320,7 +325,9 @@ class PostgreSqlSchemaManager extends AbstractSchemaManager
'scale' => $scale,
'fixed' => $fixed,
'unsigned' => false,
'platformDetails' => array(),
'platformDetails' => array(
'autoincrement' => $autoincrement,
),
);
return new Column($tableColumn['field'], \Doctrine\DBAL\Types\Type::getType($type), $options);

View File

@ -65,7 +65,7 @@ class Schema extends AbstractAsset
*/
protected function _addTable(Table $table)
{
$tableName = $table->getName();
$tableName = strtolower($table->getName());
if(isset($this->_tables[$tableName])) {
throw SchemaException::tableAlreadyExists($tableName);
}
@ -78,7 +78,7 @@ class Schema extends AbstractAsset
*/
protected function _addSequence(Sequence $sequence)
{
$seqName = $sequence->getName();
$seqName = strtolower($sequence->getName());
if (isset($this->_sequences[$seqName])) {
throw SchemaException::sequenceAlreadyExists($seqName);
}
@ -101,6 +101,7 @@ class Schema extends AbstractAsset
*/
public function getTable($tableName)
{
$tableName = strtolower($tableName);
if (!isset($this->_tables[$tableName])) {
throw SchemaException::tableDoesNotExist($tableName);
}
@ -116,6 +117,7 @@ class Schema extends AbstractAsset
*/
public function hasTable($tableName)
{
$tableName = strtolower($tableName);
return isset($this->_tables[$tableName]);
}
@ -125,6 +127,7 @@ class Schema extends AbstractAsset
*/
public function hasSequence($sequenceName)
{
$sequenceName = strtolower($sequenceName);
return isset($this->_sequences[$sequenceName]);
}
@ -135,6 +138,7 @@ class Schema extends AbstractAsset
*/
public function getSequence($sequenceName)
{
$sequenceName = strtolower($sequenceName);
if(!$this->hasSequence($sequenceName)) {
throw SchemaException::sequenceDoesNotExist($sequenceName);
}
@ -187,6 +191,7 @@ class Schema extends AbstractAsset
*/
public function dropTable($tableName)
{
$tableName = strtolower($tableName);
$table = $this->getTable($tableName);
unset($this->_tables[$tableName]);
return $this;
@ -213,6 +218,7 @@ class Schema extends AbstractAsset
*/
public function dropSequence($sequenceName)
{
$sequenceName = strtolower($sequenceName);
unset($this->_sequences[$sequenceName]);
return $this;
}

View File

@ -251,7 +251,7 @@ class SqliteSchemaManager extends AbstractSchemaManager
'precision' => $precision,
'scale' => $scale,
'platformDetails' => array(
'primary' => (bool) $tableColumn['pk'],
'autoincrement' => (bool) $tableColumn['pk'],
),
);

View File

@ -215,6 +215,7 @@ class Table extends AbstractAsset
*/
public function renameColumn($oldColumnName, $newColumnName)
{
$columnName = strtolower($columnName);
$column = $this->getColumn($oldColumnName);
$this->dropColumn($oldColumnName);
@ -231,6 +232,7 @@ class Table extends AbstractAsset
*/
public function changeColumn($columnName, array $options)
{
$columnName = strtolower($columnName);
$column = $this->getColumn($columnName);
$column->setOptions($options);
return $this;
@ -244,6 +246,7 @@ class Table extends AbstractAsset
*/
public function dropColumn($columnName)
{
$columnName = strtolower($columnName);
$column = $this->getColumn($columnName);
unset($this->_columns[$columnName]);
return $this;
@ -320,7 +323,7 @@ class Table extends AbstractAsset
*/
protected function _addColumn(Column $column)
{
$columnName = $column->getName();
$columnName = strtolower($column->getName());
if (isset($this->_columns[$columnName])) {
throw SchemaException::columnAlreadyExists($this->_name, $columnName);
}
@ -415,6 +418,7 @@ class Table extends AbstractAsset
*/
public function hasColumn($columnName)
{
$columnName = strtolower($columnName);
return isset($this->_columns[$columnName]);
}
@ -426,6 +430,7 @@ class Table extends AbstractAsset
*/
public function getColumn($columnName)
{
$columnName = strtolower($columnName);
if (!$this->hasColumn($columnName)) {
throw SchemaException::columnDoesNotExist($columnName);
}

View File

@ -73,6 +73,7 @@ class OracleSchemaManagerTest extends SchemaManagerFunctionalTestCase
$this->_sm->renameTable('list_tables_test', 'list_tables_test_new_name');
$tables = $this->_sm->listTables();
$this->assertEquals(true, in_array('LIST_TABLES_TEST_NEW_NAME', $tables));
$this->assertHasTable($tables, 'list_tables_test_new_name');
}
}

View File

@ -63,8 +63,19 @@ class SchemaManagerFunctionalTestCase extends \Doctrine\Tests\DbalFunctionalTest
$tables = $this->_sm->listTables();
$this->assertType('array', $tables);
$tables = \array_map('strtolower', $tables);
$this->assertEquals(true, in_array('list_tables_test', $tables));
$this->assertTrue(count($tables) > 0);
$foundTable = false;
foreach ($tables AS $table) {
$this->assertType('Doctrine\DBAL\Schema\Table', $table);
if (strtolower($table->getName()) == 'list_tables_test') {
$foundTable = true;
$this->assertTrue($table->hasColumn('id'));
$this->assertTrue($table->hasColumn('test'));
$this->assertTrue($table->hasColumn('foreign_key_test'));
}
}
}
public function testListTableColumns()
@ -287,6 +298,15 @@ class SchemaManagerFunctionalTestCase extends \Doctrine\Tests\DbalFunctionalTest
$this->assertTrue($found, "'test_create_view' View was not found in listViews().");
}
public function testCreateSchema()
{
$this->createTestTable('test_table');
$schema = $this->_sm->createSchema();
$this->assertTrue($schema->hasTable('test_table'));
}
/**
* @var \Doctrine\DBAL\Schema\AbstractSchemaManager
*/
@ -338,4 +358,16 @@ class SchemaManagerFunctionalTestCase extends \Doctrine\Tests\DbalFunctionalTest
$this->_sm->dropAndCreateTable($name, $columns, $options);
}
protected function assertHasTable($tables, $tableName)
{
$foundTable = false;
foreach ($tables AS $table) {
$this->assertType('Doctrine\DBAL\Schema\Table', $table, 'No Table instance was found in tables array.');
if (strtolower($table->getName()) == 'list_tables_test_new_name') {
$foundTable = true;
}
}
$this->assertTrue($foundTable, "Could not find new table");
}
}