Add foreign key support to OC

This commit is contained in:
Piotr Mrowczynski 2017-10-02 12:32:21 +02:00 committed by Joas Schilling
parent d081a1a5ad
commit 6a51c1bc4f
No known key found for this signature in database
GPG Key ID: 7076EA9751AACDDA
2 changed files with 73 additions and 6 deletions

View File

@ -30,6 +30,7 @@ use Doctrine\DBAL\Schema\ColumnDiff;
use Doctrine\DBAL\Schema\Index;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\DBAL\Schema\Table;
use Doctrine\DBAL\Schema\ForeignKeyConstraint;
class OracleMigrator extends NoCheckMigrator {
@ -81,6 +82,27 @@ class OracleMigrator extends NoCheckMigrator {
);
}
/**
* Quote an ForeignKeyConstraint's name but changing the name requires recreating
* the ForeignKeyConstraint instance and copying over all properties.
*
* @param ForeignKeyConstraint $fkc old fkc
* @return ForeignKeyConstraint new fkc instance with new name
*/
protected function quoteForeignKeyConstraint($fkc) {
return new ForeignKeyConstraint(
array_map(function($columnName) {
return $this->connection->quoteIdentifier($columnName);
}, $fkc->getLocalColumns()),
$this->connection->quoteIdentifier($fkc->getForeignTableName()),
array_map(function($columnName) {
return $this->connection->quoteIdentifier($columnName);
}, $fkc->getForeignColumns()),
$fkc->getName(),
$fkc->getOptions()
);
}
/**
* @param Schema $targetSchema
* @param \Doctrine\DBAL\Connection $connection
@ -100,7 +122,9 @@ class OracleMigrator extends NoCheckMigrator {
array_map(function(Index $index) {
return $this->quoteIndex($index);
}, $table->getIndexes()),
$table->getForeignKeys(),
array_map(function(ForeignKeyConstraint $fck) {
return $this->quoteForeignKeyConstraint($fck);
}, $table->getForeignKeys()),
0,
$table->getOptions()
);
@ -158,9 +182,17 @@ class OracleMigrator extends NoCheckMigrator {
return $this->quoteIndex($index);
}, $tableDiff->renamedIndexes);
// TODO handle $tableDiff->addedForeignKeys
// TODO handle $tableDiff->changedForeignKeys
// TODO handle $tableDiff->removedForeignKeys
$tableDiff->addedForeignKeys = array_map(function(ForeignKeyConstraint $fkc) {
return $this->quoteForeignKeyConstraint($fkc);
}, $tableDiff->addedForeignKeys);
$tableDiff->changedForeignKeys = array_map(function(ForeignKeyConstraint $fkc) {
return $this->quoteForeignKeyConstraint($fkc);
}, $tableDiff->changedForeignKeys);
$tableDiff->removedForeignKeys = array_map(function(ForeignKeyConstraint $fkc) {
return $this->quoteForeignKeyConstraint($fkc);
}, $tableDiff->removedForeignKeys);
}
return $schemaDiff;

View File

@ -41,6 +41,9 @@ class MigratorTest extends \Test\TestCase {
/** @var string */
private $tableName;
/** @var string */
private $tableNameTmp;
protected function setUp() {
parent::setUp();
@ -50,11 +53,23 @@ class MigratorTest extends \Test\TestCase {
$this->markTestSkipped('DB migration tests are not supported on OCI');
}
$this->manager = new \OC\DB\MDB2SchemaManager($this->connection);
$this->tableName = strtolower($this->getUniqueID($this->config->getSystemValue('dbtableprefix', 'oc_') . 'test_'));
$this->tableName = $this->getUniqueTableName();
$this->tableNameTmp = $this->getUniqueTableName();
}
private function getUniqueTableName() {
return strtolower($this->getUniqueID($this->config->getSystemValue('dbtableprefix', 'oc_') . 'test_'));
}
protected function tearDown() {
$this->connection->exec('DROP TABLE ' . $this->tableName);
// Try to delete if exists (IF EXISTS NOT SUPPORTED IN ORACLE)
try {
$this->connection->exec('DROP TABLE ' . $this->connection->quoteIdentifier($this->tableNameTmp));
} catch (\Doctrine\DBAL\DBALException $e) {}
try {
$this->connection->exec('DROP TABLE ' . $this->connection->quoteIdentifier($this->tableName));
} catch (\Doctrine\DBAL\DBALException $e) {}
parent::tearDown();
}
@ -200,4 +215,24 @@ class MigratorTest extends \Test\TestCase {
$this->assertTrue(true);
}
public function testAddingForeignKey() {
$startSchema = new Schema([], [], $this->getSchemaConfig());
$table = $startSchema->createTable($this->tableName);
$table->addColumn('id', 'integer', ['autoincrement' => true]);
$table->addColumn('name', 'string');
$table->setPrimaryKey(['id']);
$fkName = "fkc";
$tableFk = $startSchema->createTable($this->tableNameTmp);
$tableFk->addColumn('fk_id', 'integer');
$tableFk->addColumn('name', 'string');
$tableFk->addForeignKeyConstraint($this->tableName, array('fk_id'), array('id'), array(), $fkName);
$migrator = $this->manager->getMigrator();
$migrator->migrate($startSchema);
$this->assertTrue($startSchema->getTable($this->tableNameTmp)->hasForeignKey($fkName));
}
}