/**
* @param InputInterface $input
* @param OutputInterface $output
*
* @return int|void
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
// communicate early what is required for this command to run (is enabled)
$enabler = new Enabler($this);
$enabler->functionExists('exec');
$enabler->functionExists('passthru');
$enabler->operatingSystemIsNotWindows();
$this->detectDbSettings($output);
/* @var $dbHelper DatabaseHelper */
$dbHelper = $this->getHelper('database');
if (!$input->getOption('stdout') && !$input->getOption('only-command') && !$input->getOption('print-only-filename')) {
$this->writeSection($output, 'Dump MySQL Database');
}
$compressor = $this->getCompressor($input->getOption('compression'));
$fileName = $this->getFileName($input, $output, $compressor);
$stripTables = array();
if ($input->getOption('strip')) {
/* @var $database DatabaseHelper */
$database = $dbHelper;
$stripTables = $database->resolveTables(explode(' ', $input->getOption('strip')), $dbHelper->getTableDefinitions($this->getCommandConfig()));
if (!$input->getOption('stdout') && !$input->getOption('only-command') && !$input->getOption('print-only-filename')) {
$output->writeln('<comment>No-data export for: <info>' . implode(' ', $stripTables) . '</info></comment>');
}
}
$excludeTables = array();
if ($input->getOption('exclude')) {
$excludeTables = $dbHelper->resolveTables(explode(' ', $input->getOption('exclude')), $dbHelper->getTableDefinitions($this->getCommandConfig()));
if (!$input->getOption('stdout') && !$input->getOption('only-command') && !$input->getOption('print-only-filename')) {
$output->writeln('<comment>Excluded: <info>' . implode(' ', $excludeTables) . '</info></comment>');
}
}
$dumpOptions = '';
if (!$input->getOption('no-single-transaction')) {
$dumpOptions = '--single-transaction --quick ';
}
if ($input->getOption('human-readable')) {
$dumpOptions .= '--complete-insert --skip-extended-insert ';
}
if ($input->getOption('add-routines')) {
$dumpOptions .= '--routines ';
}
if ($input->getOption('xml')) {
$dumpOptions .= '--xml ';
}
if ($input->getOption('hex-blob')) {
$dumpOptions .= '--hex-blob ';
}
$execs = array();
$ignore = '';
foreach (array_merge($excludeTables, $stripTables) as $tableName) {
$ignore .= '--ignore-table=' . $this->dbSettings['dbname'] . '.' . $tableName . ' ';
}
$mysqlClientToolConnectionString = $dbHelper->getMysqlClientToolConnectionString();
if (count($stripTables) > 0) {
// dump structure for strip-tables
$exec = 'mysqldump ' . $dumpOptions . '--no-data ' . $mysqlClientToolConnectionString;
$exec .= ' ' . implode(' ', $stripTables);
$exec .= $this->postDumpPipeCommands();
$exec = $compressor->getCompressingCommand($exec);
if (!$input->getOption('stdout')) {
$exec .= ' > ' . escapeshellarg($fileName);
}
$execs[] = $exec;
}
// dump data for all other tables
$exec = 'mysqldump ' . $dumpOptions . $mysqlClientToolConnectionString . ' ' . $ignore;
$exec .= $this->postDumpPipeCommands();
$exec = $compressor->getCompressingCommand($exec);
if (!$input->getOption('stdout')) {
$exec .= (count($stripTables) > 0 ? ' >> ' : ' > ') . escapeshellarg($fileName);
}
$execs[] = $exec;
$this->runExecs($execs, $fileName, $input, $output);
}