/** * Restore the database from a local file. * * @SideEffects: * Restores dump file to local database * * @return bool true on success, false on fail * @throws PermissionFailureException * @throws Exception */ public function execute() { $this->checkPerm(); $fullPath = FileSystemTools::build_path($this->Path, $this->FileName); if (!file_exists($fullPath)) { $this->failed("No such file '{$fullPath}'"); throw new Exception("No such file {$fullPath}"); } // detect if we should use GZIP from the file name terminal extension being '.gz' if (substr($this->FileName, -3) == '.gz') { $this->UseGZIP = true; $command = sprintf("gunzip < %s | %s --host=%s --user=%s --password=%s %s ", $fullPath, Replicant::config()->get('path_to_mysql'), DatabaseTools::getDBCredential('Server'), DatabaseTools::getDBCredential('UserName'), DatabaseTools::getDBCredential('Password'), $this->Database); } else { $command = sprintf("%s --host=%s --user=%s --password=%s %s < %s", Replicant::config()->get('path_to_mysql'), DatabaseTools::getDBCredential('Server'), DatabaseTools::getDBCredential('UserName'), DatabaseTools::getDBCredential('Password'), $this->Database, $fullPath); } $this->step("Restoring database '{$this->UserName}@{$this->RemoteHost}:{$this->Database}' from '{$fullPath}'"); if ($this->system($command, $retval)) { // we need a new one here as existing one will be gone when database // ReplicantActionRestore::create(static::ActionRestore, "", static::ResultMessageSuccess, "Restoring database '$this->UserName@$this->RemoteHost:$this->Database' from '$fullPath'"); $this->success("Restored database '{$this->Database}' from '{$fullPath}'"); return true; } else { $this->failed("Failed, command returned #{$retval}"); return false; } }
/** * Dump database to the local filesystem via mysqldump command and optionally gzipping output. * * @SideEffects: * Dumps database to local filesystem. * * @return bool true on success, false on fail * @throws PermissionFailureException */ public function execute() { $fullPath = FileSystemTools::build_path($this->Path, $this->FileName) . ($this->UseGZIP ? ".gz" : ''); $this->step("Dumping database '{$this->Database}' to '{$fullPath}'"); // local server dump requested, create paths and dump the file. if (!is_dir($this->Path)) { // path doesn't exist, create it recursively $this->step("Creating folder '{$this->Path}'"); if (!FileSystemTools::make_path($this->Path)) { $this->failed("Failed to create path '{$this->Path}'"); return false; } } $excludeTables = ''; if (count(Replicant::config()->get('exclude_tables'))) { $excludeTables = " --ignore-table={$this->Database}." . implode(" --ignore-table={$this->Database}.", Replicant::config()->get('exclude_tables')) . " "; } $command = sprintf("%s --host=%s --user=%s --password=%s %s %s %s %s", Replicant::config()->get('path_to_mysqldump'), DatabaseTools::getDBCredential('Server'), DatabaseTools::getDBCredential('UserName'), DatabaseTools::getDBCredential('Password'), $excludeTables, $this->Database, $this->UseGZIP ? " | gzip > " : " > ", $fullPath); $ok = $this->system($command, $retval); if ($ok) { $this->success("Dumped Database to {$fullPath}"); } else { $this->failed("Execute returned #{$retval}"); } return $ok; }