Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/private/DB/MigrationService.php2
-rw-r--r--tests/lib/DB/MigrationsTest.php44
2 files changed, 45 insertions, 1 deletions
diff --git a/lib/private/DB/MigrationService.php b/lib/private/DB/MigrationService.php
index 6ad74a58591..e7361cb4cab 100644
--- a/lib/private/DB/MigrationService.php
+++ b/lib/private/DB/MigrationService.php
@@ -634,6 +634,8 @@ class MigrationService {
if ($isUsingDefaultName && \strlen($table->getName()) - $prefixLength >= 23) {
throw new \InvalidArgumentException('Primary index name on "' . $table->getName() . '" is too long.');
}
+ } elseif (!$primaryKey instanceof Index) {
+ throw new \InvalidArgumentException('Table "' . $table->getName() . '" has no primary key and therefor will not behave sane in clustered setups.');
}
}
diff --git a/tests/lib/DB/MigrationsTest.php b/tests/lib/DB/MigrationsTest.php
index 507f3d0e228..f22de8c5e6e 100644
--- a/tests/lib/DB/MigrationsTest.php
+++ b/tests/lib/DB/MigrationsTest.php
@@ -246,6 +246,8 @@ class MigrationsTest extends \Test\TestCase {
->method('getName')
->willReturn(\str_repeat('a', 30));
+ $primaryKey = $this->createMock(Index::class);
+
$table->expects($this->once())
->method('getColumns')
->willReturn([$column]);
@@ -257,7 +259,7 @@ class MigrationsTest extends \Test\TestCase {
->willReturn([$foreignKey]);
$table->expects($this->once())
->method('getPrimaryKey')
- ->willReturn(null);
+ ->willReturn($primaryKey);
$schema = $this->createMock(Schema::class);
$schema->expects($this->once())
@@ -607,6 +609,46 @@ class MigrationsTest extends \Test\TestCase {
}
+ public function testEnsureOracleConstraintsNoPrimaryKey() {
+ $this->expectException(\InvalidArgumentException::class);
+
+ $table = $this->createMock(Table::class);
+ $table->expects($this->atLeastOnce())
+ ->method('getName')
+ ->willReturn(\str_repeat('a', 30));
+ $table->expects($this->once())
+ ->method('getColumns')
+ ->willReturn([]);
+ $table->expects($this->once())
+ ->method('getIndexes')
+ ->willReturn([]);
+ $table->expects($this->once())
+ ->method('getForeignKeys')
+ ->willReturn([]);
+ $table->expects($this->once())
+ ->method('getPrimaryKey')
+ ->willReturn(null);
+
+ $schema = $this->createMock(Schema::class);
+ $schema->expects($this->once())
+ ->method('getTables')
+ ->willReturn([$table]);
+ $schema->expects($this->once())
+ ->method('getSequences')
+ ->willReturn([]);
+
+ $sourceSchema = $this->createMock(Schema::class);
+ $sourceSchema->expects($this->any())
+ ->method('getTable')
+ ->willThrowException(new SchemaException());
+ $sourceSchema->expects($this->any())
+ ->method('hasSequence')
+ ->willReturn(false);
+
+ self::invokePrivate($this->migrationService, 'ensureOracleConstraints', [$sourceSchema, $schema, 3]);
+ }
+
+
public function testEnsureOracleConstraintsTooLongSequenceName() {
$this->expectException(\InvalidArgumentException::class);