*/ class mysqldumpTask extends sfBaseTask { protected function configure() { $this->addOptions(array( new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, 'The environment', 'prod'), )); $this->namespace = 'tools'; $this->name = 'mysqldump'; $this->briefDescription = 'Dumping data to "data/sql" by exec mysqldump'; $this->detailedDescription = 'The [mysqldump|INFO] task dumping data to "data/sql" by exec mysqldump.'; } protected function execute($arguments = array(), $options = array()) { $configHandler = new sfDatabaseConfigHandler(); $databases = $configHandler->evaluate(array($this->configuration->getRootDir().'/config/databases.yml')); foreach ($databases as $name => $database) { $username = $database->getParameter('username'); $password = $database->getParameter('password'); $dbname = $this->getDbnameFromDsn($database->getParameter('dsn')); break; } $outputdir = $this->configuration->getRootDir().'/data/sql'; if(!is_dir($outputdir)) { mkdir($outputdir, 0777, true); } $outputfile = $this->getOutputFilename($outputdir); if(empty($password)) { $passwordParam = ''; } else { $passwordParam = '-p'.$password; } $output = null; exec("mysqldump --default-character-set=utf8 -u{$username} {$passwordParam} -c -t {$dbname} > {$outputfile}", $output); if(count($output) > 0) { var_dump($output); } else { $this->logSection('file+', $outputfile); $this->logSection('mysqldump', ' created dump successfuly'); } } /** * Parsuje DSN a vrátí dbname * * @param string $dsn * @return string */ protected function getDbnameFromDsn($dsn) { $result = explode('=', strstr($dsn, 'dbname=')); return $result[1]; } /** * Rekurzivně vytvoří a vrátí název souboru * * @param string $dir * @param string $name * @param integer $num * @return string */ protected function getOutputFilename($dir, $name = null, $num = 1) { $ext = '.sql'; if(is_null($name)) { $name = 'data_'.date('Y-m-d'); } if($num > 1) { $filename = $dir.DIRECTORY_SEPARATOR.$name.'-'.$num.$ext; } else { $filename = $dir.DIRECTORY_SEPARATOR.$name.$ext; } if(file_exists($filename)) { return $this->getOutputFilename($dir, $name, $num+1); } else { return $filename; } } }