-
-
Notifications
You must be signed in to change notification settings - Fork 400
/
ImportCommand.php
105 lines (90 loc) · 3.43 KB
/
ImportCommand.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<?php
namespace N98\Magento\Command\Database;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class ImportCommand extends AbstractDatabaseCommand
{
protected function configure()
{
$this
->setName('db:import')
->addArgument('filename', InputArgument::OPTIONAL, 'Dump filename')
->addOption('compression', 'c', InputOption::VALUE_REQUIRED, 'The compression of the specified file')
->addOption('only-command', null, InputOption::VALUE_NONE, 'Print only mysql command. Do not execute')
->addOption('only-if-empty', null, InputOption::VALUE_NONE, 'Imports only if database is empty')
->setDescription('Imports database with mysql cli client according to database defined in local.xml');
$help = <<<HELP
Imports an SQL file with mysql cli client into current configured database.
You need to have MySQL client tools installed on your system.
HELP;
}
/**
* @param \Symfony\Component\Console\Input\InputInterface $input
* @param \Symfony\Component\Console\Output\OutputInterface $output
* @return int|void
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
$this->detectDbSettings($output);
$this->writeSection($output, 'Import MySQL Database');
$fileName = $this->checkFilename($input);
$compressor = $this->getCompressor($input->getOption('compression'));
// create import command
$exec = $compressor->getDecompressingCommand(
'mysql ' . $this->getHelper('database')->getMysqlClientToolConnectionString(),
$fileName
);
if ($input->getOption('only-command')) {
$output->writeln($exec);
} else {
if ($input->getOption('only-if-empty')
&& count($this->getHelper('database')->getTables()) > 0
) {
$output->writeln('<comment>Skip import. Database is not empty</comment>');
return;
}
$this->doImport($output, $fileName, $exec);
}
}
public function asText() {
return parent::asText() . "\n" .
$this->getCompressionHelp();
}
/**
* @param InputInterface $input
*
* @return mixed
* @throws \InvalidArgumentException
*/
protected function checkFilename(InputInterface $input)
{
$fileName = $input->getArgument('filename');
if (!file_exists($fileName)) {
throw new \InvalidArgumentException('File does not exist');
}
return $fileName;
}
/**
* @param OutputInterface $output
* @param string $fileName
* @param string $exec
*
* @return void
*/
protected function doImport(OutputInterface $output, $fileName, $exec)
{
$returnValue = null;
$commandOutput = null;
$output->writeln(
'<comment>Importing SQL dump <info>' . $fileName . '</info> to database <info>'
. $this->dbSettings['dbname'] . '</info>'
);
exec($exec, $commandOutput, $returnValue);
if ($returnValue > 0) {
$output->writeln('<error>' . implode(PHP_EOL, $commandOutput) . '</error>');
}
$output->writeln('<info>Finished</info>');
}
}