Skip to content

Commit

Permalink
CLI-1257: pull:db fails with too many tables (#1674)
Browse files Browse the repository at this point in the history
* CLI-1257: pull:db fails with too many tables

* fix suffix

* fix tests
  • Loading branch information
danepowell committed Feb 2, 2024
1 parent 4bf61f3 commit 2102937
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 10 deletions.
4 changes: 3 additions & 1 deletion src/Command/Pull/PullCommandBase.php
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,8 @@ private function dropDbTables(string $dbHost, string $dbUser, string $dbName, st
$tables = $this->listTablesQuoted($process->getOutput());
if ($tables) {
$sql = 'DROP TABLE ' . implode(', ', $tables);
$tempnam = $this->localMachineHelper->getFilesystem()->tempnam(sys_get_temp_dir(), 'acli_drop_table_', '.sql');
$this->localMachineHelper->getFilesystem()->dumpFile($tempnam, $sql);
$command = [
'mysql',
'--host',
Expand All @@ -390,7 +392,7 @@ private function dropDbTables(string $dbHost, string $dbUser, string $dbName, st
$dbUser,
$dbName,
'-e',
$sql,
'source ' . $tempnam,
];
$process = $this->localMachineHelper->execute($command, $outputCallback, NULL, FALSE, NULL, ['MYSQL_PWD' => $dbPassword]);
if (!$process->isSuccessful()) {
Expand Down
27 changes: 18 additions & 9 deletions tests/phpunit/src/Commands/Pull/PullDatabaseCommandTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,10 @@ public function testPullDatabases(): void {
$this->mockListSites($sshHelper);
$this->mockGetBackup($environment);
$this->mockExecuteMySqlListTables($localMachineHelper, 'drupal');
$this->mockExecuteMySqlDropDb($localMachineHelper, TRUE);
$this->mockExecuteMySqlImport($localMachineHelper, TRUE, TRUE, 'my_db', 'my_dbdev', 'drupal');
$fs = $this->prophet->prophesize(Filesystem::class);
$this->mockExecuteMySqlDropDb($localMachineHelper, TRUE, $fs);
$this->mockExecuteMySqlImport($localMachineHelper, TRUE, TRUE, 'my_db', 'my_dbdev', 'drupal');
$fs->remove(Argument::type('string'))->shouldBeCalled();
$localMachineHelper->getFilesystem()->willReturn($fs)->shouldBeCalled();

$this->executeCommand([
Expand Down Expand Up @@ -107,10 +108,11 @@ public function testPullDatabaseNoPv(): void {
$this->mockListSites($sshHelper);
$this->mockGetBackup($environment);
$this->mockExecuteMySqlListTables($localMachineHelper, 'drupal');
$this->mockExecuteMySqlDropDb($localMachineHelper, TRUE);
$this->mockExecuteMySqlImport($localMachineHelper, TRUE, FALSE, 'my_db', 'my_dbdev', 'drupal');
$fs = $this->prophet->prophesize(Filesystem::class);
$localMachineHelper->getFilesystem()->willReturn($fs)->shouldBeCalled();
$this->mockExecuteMySqlDropDb($localMachineHelper, TRUE, $fs);
$this->mockExecuteMySqlImport($localMachineHelper, TRUE, FALSE, 'my_db', 'my_dbdev', 'drupal');
$fs->remove(Argument::type('string'))->shouldBeCalled();

$this->executeCommand([
'--no-scripts' => TRUE,
Expand Down Expand Up @@ -208,7 +210,9 @@ public function testPullDatabaseWithMySqlDropError(): void {
$this->mockListSites($sshHelper);
$this->mockGetBackup($environment);
$this->mockExecuteMySqlListTables($localMachineHelper, 'drupal');
$this->mockExecuteMySqlDropDb($localMachineHelper, FALSE);
$fs = $this->prophet->prophesize(Filesystem::class);
$localMachineHelper->getFilesystem()->willReturn($fs)->shouldBeCalled();
$this->mockExecuteMySqlDropDb($localMachineHelper, FALSE, $fs);

$this->expectException(AcquiaCliException::class);
$this->expectExceptionMessage('Unable to drop tables from database');
Expand All @@ -225,7 +229,9 @@ public function testPullDatabaseWithMySqlImportError(): void {
$this->mockListSites($sshHelper);
$this->mockGetBackup($environment);
$this->mockExecuteMySqlListTables($localMachineHelper, 'drupal');
$this->mockExecuteMySqlDropDb($localMachineHelper, TRUE);
$fs = $this->prophet->prophesize(Filesystem::class);
$localMachineHelper->getFilesystem()->willReturn($fs)->shouldBeCalled();
$this->mockExecuteMySqlDropDb($localMachineHelper, TRUE, $fs);
$this->mockExecuteMySqlImport($localMachineHelper, FALSE, TRUE, 'my_db', 'my_dbdev', 'drupal');

$this->expectException(AcquiaCliException::class);
Expand Down Expand Up @@ -286,12 +292,12 @@ protected function setupPullDatabase(bool $mysqlConnectSuccessful, bool $mockIde
// Mock IDE filesystem.
if ($mockIdeFs) {
$this->mockDrupalSettingsRefresh($localMachineHelper);
$this->mockSettingsFiles($fs);
}
$this->mockSettingsFiles($fs);

// Database.
$this->mockExecuteMySqlListTables($localMachineHelper);
$this->mockExecuteMySqlDropDb($localMachineHelper, TRUE);
$this->mockExecuteMySqlDropDb($localMachineHelper, TRUE, $fs);
$this->mockExecuteMySqlImport($localMachineHelper, TRUE, TRUE);
if ($multiDb) {
$this->mockExecuteMySqlListTables($localMachineHelper, 'drupal');
Expand Down Expand Up @@ -357,10 +363,13 @@ protected function mockExecuteMySqlListTables(

protected function mockExecuteMySqlDropDb(
LocalMachineHelper|ObjectProphecy $localMachineHelper,
bool $success
bool $success,
ObjectProphecy $fs
): void {
$localMachineHelper->checkRequiredBinariesExist(["mysql"])->shouldBeCalled();
$process = $this->mockProcess($success);
$fs->tempnam(Argument::type('string'), 'acli_drop_table_', '.sql')->willReturn('something')->shouldBeCalled();
$fs->dumpfile('something', Argument::type('string'))->shouldBeCalled();
$localMachineHelper
->execute(Argument::type('array'), Argument::type('callable'), NULL, FALSE, NULL, ['MYSQL_PWD' => $this->dbPassword])
->willReturn($process->reveal())
Expand Down

0 comments on commit 2102937

Please sign in to comment.